transfer.rs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. use solana_program::msg;
  2. use steel::{transfer as transfer_spl_tokens, *};
  3. use transfer_tokens_api::prelude::*;
  4. pub fn process_transfer(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
  5. // parse args.
  6. let args = Transfer::try_from_bytes(data)?;
  7. let quantity = u64::from_le_bytes(args.quantity);
  8. // Load accounts.
  9. let [sender_info, recipient_info, mint_info, sender_token_account_info, recipient_token_account_info, token_program, associated_token_program, system_program] =
  10. accounts
  11. else {
  12. return Err(ProgramError::NotEnoughAccountKeys);
  13. };
  14. // validation
  15. sender_info.is_signer()?;
  16. mint_info.as_mint()?;
  17. sender_token_account_info
  18. .is_writable()?
  19. .as_associated_token_account(sender_info.key, mint_info.key)?;
  20. token_program.is_program(&spl_token::ID)?;
  21. associated_token_program.is_program(&spl_associated_token_account::ID)?;
  22. system_program.is_program(&system_program::ID)?;
  23. if recipient_token_account_info.lamports() == 0 {
  24. msg!("Creating associated token account for recipient...");
  25. create_associated_token_account(
  26. sender_info,
  27. recipient_info,
  28. recipient_token_account_info,
  29. mint_info,
  30. system_program,
  31. token_program,
  32. associated_token_program,
  33. )?;
  34. } else {
  35. msg!("Associated token account exists.");
  36. }
  37. msg!(
  38. "Recipient Associated Token Address: {}",
  39. recipient_token_account_info.key
  40. );
  41. msg!("Transferring {} tokens...", quantity);
  42. msg!("Mint: {}", mint_info.key);
  43. msg!("Owner Token Address: {}", sender_token_account_info.key);
  44. msg!(
  45. "Recipient Token Address: {}",
  46. recipient_token_account_info.key
  47. );
  48. transfer_spl_tokens(
  49. sender_info,
  50. sender_token_account_info,
  51. recipient_token_account_info,
  52. token_program,
  53. quantity,
  54. )?;
  55. msg!("Tokens transferred successfully.");
  56. Ok(())
  57. }