revoke.rs 922 B

1234567891011121314151617181920212223242526272829
  1. use pinocchio::{
  2. account_info::AccountInfo, program_error::ProgramError, pubkey::Pubkey, ProgramResult,
  3. };
  4. use token_interface::{error::TokenError, state::account::Account};
  5. use super::validate_owner;
  6. #[inline(never)]
  7. pub fn process_revoke(program_id: &Pubkey, accounts: &[AccountInfo]) -> ProgramResult {
  8. let [source_account_info, owner_info, remaning @ ..] = accounts else {
  9. return Err(ProgramError::NotEnoughAccountKeys);
  10. };
  11. let source_account = bytemuck::try_from_bytes_mut::<Account>(unsafe {
  12. source_account_info.borrow_mut_data_unchecked()
  13. })
  14. .map_err(|_error| ProgramError::InvalidAccountData)?;
  15. if source_account.is_frozen() {
  16. return Err(TokenError::AccountFrozen.into());
  17. }
  18. validate_owner(program_id, &source_account.owner, owner_info, remaning)?;
  19. source_account.delegate.clear();
  20. source_account.delegated_amount = 0.into();
  21. Ok(())
  22. }