create.rs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. use solana_program::msg;
  2. use solana_program::program_pack::Pack;
  3. use spl_token::state::Mint;
  4. use spl_token_minter_api::prelude::*;
  5. use steel::*;
  6. pub fn process_create(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult {
  7. // parse args.
  8. let args = Create::try_from_bytes(data)?;
  9. let token_name = String::from_utf8(args.token_name.to_vec()).expect("Invalid UTF-8");
  10. let token_symbol = String::from_utf8(args.token_symbol.to_vec()).expect("Invalid UTF-8");
  11. let token_uri = String::from_utf8(args.token_uri.to_vec()).expect("Invalid UTF-8");
  12. // Load accounts.
  13. let [payer_info, mint_info, metadata_info, system_program, token_program, metadata_program, rent_sysvar] =
  14. accounts
  15. else {
  16. return Err(ProgramError::NotEnoughAccountKeys);
  17. };
  18. // validation
  19. payer_info.is_signer()?;
  20. mint_info.is_empty()?.is_writable()?;
  21. system_program.is_program(&system_program::ID)?;
  22. token_program.is_program(&spl_token::ID)?;
  23. rent_sysvar.is_sysvar(&sysvar::rent::ID)?;
  24. // First create the account for the Mint
  25. //
  26. msg!("Creating mint account...");
  27. msg!("Mint: {}", mint_info.key);
  28. solana_program::program::invoke(
  29. &solana_program::system_instruction::create_account(
  30. payer_info.key,
  31. mint_info.key,
  32. (solana_program::rent::Rent::get()?).minimum_balance(Mint::LEN),
  33. Mint::LEN as u64,
  34. token_program.key,
  35. ),
  36. &[
  37. mint_info.clone(),
  38. payer_info.clone(),
  39. system_program.clone(),
  40. token_program.clone(),
  41. ],
  42. )?;
  43. // Now initialize that account as a Mint (standard Mint)
  44. //
  45. msg!("Initializing mint account...");
  46. msg!("Mint: {}", mint_info.key);
  47. solana_program::program::invoke(
  48. &spl_token::instruction::initialize_mint(
  49. token_program.key,
  50. mint_info.key,
  51. payer_info.key,
  52. Some(payer_info.key),
  53. 9, // 9 Decimals for the default SPL Token standard
  54. )?,
  55. &[
  56. mint_info.clone(),
  57. payer_info.clone(),
  58. token_program.clone(),
  59. rent_sysvar.clone(),
  60. ],
  61. )?;
  62. // Now create the account for that Mint's metadata
  63. //
  64. msg!("Creating metadata account...");
  65. msg!("Metadata account address: {}", metadata_info.key);
  66. mpl_token_metadata::instructions::CreateMetadataAccountV3Cpi {
  67. __program: metadata_program,
  68. metadata: metadata_info,
  69. mint: mint_info,
  70. mint_authority: payer_info,
  71. payer: payer_info,
  72. update_authority: (payer_info, true),
  73. system_program,
  74. rent: Some(rent_sysvar),
  75. __args: mpl_token_metadata::instructions::CreateMetadataAccountV3InstructionArgs {
  76. data: mpl_token_metadata::types::DataV2 {
  77. name: token_name,
  78. symbol: token_symbol,
  79. uri: token_uri,
  80. seller_fee_basis_points: 0,
  81. creators: None,
  82. collection: None,
  83. uses: None,
  84. },
  85. is_mutable: true,
  86. collection_details: None,
  87. },
  88. }
  89. .invoke()?;
  90. msg!("Token mint created successfully.");
  91. Ok(())
  92. }