lib.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. use {
  2. borsh::{BorshDeserialize, BorshSerialize},
  3. mpl_token_metadata::instruction as mpl_instruction,
  4. solana_program::{
  5. account_info::{next_account_info, AccountInfo},
  6. entrypoint,
  7. entrypoint::ProgramResult,
  8. msg,
  9. program::invoke,
  10. program_pack::Pack,
  11. pubkey::Pubkey,
  12. rent::Rent,
  13. system_instruction,
  14. sysvar::Sysvar,
  15. },
  16. spl_token::{instruction as token_instruction, state::Mint},
  17. };
  18. #[derive(BorshSerialize, BorshDeserialize, Debug)]
  19. pub struct CreateTokenArgs {
  20. pub token_title: String,
  21. pub token_symbol: String,
  22. pub token_uri: String,
  23. pub token_decimals: u8,
  24. }
  25. entrypoint!(process_instruction);
  26. fn process_instruction(
  27. _program_id: &Pubkey,
  28. accounts: &[AccountInfo],
  29. instruction_data: &[u8],
  30. ) -> ProgramResult {
  31. let args = CreateTokenArgs::try_from_slice(instruction_data)?;
  32. let accounts_iter = &mut accounts.iter();
  33. let mint_account = next_account_info(accounts_iter)?;
  34. let mint_authority = next_account_info(accounts_iter)?;
  35. let metadata_account = next_account_info(accounts_iter)?;
  36. let payer = next_account_info(accounts_iter)?;
  37. let rent = next_account_info(accounts_iter)?;
  38. let system_program = next_account_info(accounts_iter)?;
  39. let token_program = next_account_info(accounts_iter)?;
  40. let token_metadata_program = next_account_info(accounts_iter)?;
  41. // First create the account for the Mint
  42. //
  43. msg!("Creating mint account...");
  44. msg!("Mint: {}", mint_account.key);
  45. invoke(
  46. &system_instruction::create_account(
  47. payer.key,
  48. mint_account.key,
  49. (Rent::get()?).minimum_balance(Mint::LEN),
  50. Mint::LEN as u64,
  51. token_program.key,
  52. ),
  53. &[
  54. mint_account.clone(),
  55. payer.clone(),
  56. system_program.clone(),
  57. token_program.clone(),
  58. ],
  59. )?;
  60. // Now initialize that account as a Mint (standard Mint)
  61. //
  62. msg!("Initializing mint account...");
  63. msg!("Mint: {}", mint_account.key);
  64. invoke(
  65. &token_instruction::initialize_mint(
  66. token_program.key,
  67. mint_account.key,
  68. mint_authority.key,
  69. Some(mint_authority.key),
  70. args.token_decimals,
  71. )?,
  72. &[
  73. mint_account.clone(),
  74. mint_authority.clone(),
  75. token_program.clone(),
  76. rent.clone(),
  77. ],
  78. )?;
  79. // Now create the account for that Mint's metadata
  80. //
  81. msg!("Creating metadata account...");
  82. msg!("Metadata account address: {}", metadata_account.key);
  83. invoke(
  84. &mpl_instruction::create_metadata_accounts_v3(
  85. *token_metadata_program.key,
  86. *metadata_account.key,
  87. *mint_account.key,
  88. *mint_authority.key,
  89. *payer.key,
  90. *mint_authority.key,
  91. args.token_title,
  92. args.token_symbol,
  93. args.token_uri,
  94. None,
  95. 0,
  96. true,
  97. false,
  98. None,
  99. None,
  100. None,
  101. ),
  102. &[
  103. metadata_account.clone(),
  104. mint_account.clone(),
  105. mint_authority.clone(),
  106. payer.clone(),
  107. token_metadata_program.clone(),
  108. rent.clone(),
  109. ],
  110. )?;
  111. msg!("Token mint created successfully.");
  112. Ok(())
  113. }