get_account_data_size.rs 912 B

12345678910111213141516171819202122232425262728293031
  1. use {
  2. super::check_account_owner,
  3. pinocchio::{
  4. account_info::AccountInfo, program::set_return_data, program_error::ProgramError,
  5. ProgramResult,
  6. },
  7. spl_token_interface::{
  8. error::TokenError,
  9. state::{account::Account, load, mint::Mint, Transmutable},
  10. },
  11. };
  12. #[inline(always)]
  13. pub fn process_get_account_data_size(accounts: &[AccountInfo]) -> ProgramResult {
  14. let [mint_info, _remaining @ ..] = accounts else {
  15. return Err(ProgramError::NotEnoughAccountKeys);
  16. };
  17. // Make sure the mint is valid.
  18. check_account_owner(mint_info)?;
  19. // SAFETY: single immutable borrow to `mint_info` account data and
  20. // `load` validates that the mint is initialized.
  21. let _ = unsafe {
  22. load::<Mint>(mint_info.borrow_data_unchecked()).map_err(|_| TokenError::InvalidMint)?
  23. };
  24. set_return_data(&Account::LEN.to_le_bytes());
  25. Ok(())
  26. }