mint_spl.rs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. use {
  2. borsh::{
  3. BorshDeserialize,
  4. BorshSerialize,
  5. },
  6. solana_program::{
  7. account_info::{next_account_info, AccountInfo},
  8. entrypoint::ProgramResult,
  9. msg,
  10. program::invoke,
  11. },
  12. spl_token::{
  13. instruction as token_instruction,
  14. },
  15. spl_associated_token_account::{
  16. instruction as associated_token_account_instruction,
  17. },
  18. };
  19. #[derive(BorshSerialize, BorshDeserialize, Debug)]
  20. pub struct MintSplArgs {
  21. pub quantity: u64,
  22. }
  23. pub fn mint_spl(
  24. accounts: &[AccountInfo],
  25. args: MintSplArgs,
  26. ) -> ProgramResult {
  27. let accounts_iter = &mut accounts.iter();
  28. let mint_account = next_account_info(accounts_iter)?;
  29. let mint_authority = next_account_info(accounts_iter)?;
  30. let associated_token_account = next_account_info(accounts_iter)?;
  31. let payer = next_account_info(accounts_iter)?;
  32. let system_program = next_account_info(accounts_iter)?;
  33. let token_program = next_account_info(accounts_iter)?;
  34. let associated_token_program = next_account_info(accounts_iter)?;
  35. if associated_token_account.lamports() == 0 {
  36. msg!("Creating associated token account...");
  37. invoke(
  38. &associated_token_account_instruction::create_associated_token_account(
  39. &payer.key,
  40. &payer.key,
  41. &mint_account.key,
  42. ),
  43. &[
  44. mint_account.clone(),
  45. associated_token_account.clone(),
  46. payer.clone(),
  47. system_program.clone(),
  48. token_program.clone(),
  49. associated_token_program.clone(),
  50. ]
  51. )?;
  52. } else {
  53. msg!("Associated token account exists.");
  54. }
  55. msg!("Associated Token Address: {}", associated_token_account.key);
  56. msg!("Minting {} tokens to associated token account...", args.quantity);
  57. invoke(
  58. &token_instruction::mint_to(
  59. &token_program.key,
  60. &mint_account.key,
  61. &associated_token_account.key,
  62. &mint_authority.key,
  63. &[&mint_authority.key],
  64. args.quantity,
  65. )?,
  66. &[
  67. mint_account.clone(),
  68. mint_authority.clone(),
  69. associated_token_account.clone(),
  70. token_program.clone(),
  71. ],
  72. )?;
  73. msg!("Tokens minted to wallet successfully.");
  74. Ok(())
  75. }