create_pool.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. use solana_program::program_pack::Pack;
  2. use spl_token::state::Mint;
  3. use steel::*;
  4. use token_swap_api::prelude::*;
  5. pub fn process_create_pool(accounts: &[AccountInfo<'_>], _data: &[u8]) -> ProgramResult {
  6. // Load accounts.
  7. let [payer_info, amm_info, pool_info, pool_authority_info, mint_liquidity_info, mint_a_info, mint_b_info, pool_account_a_info, pool_account_b_info, token_program, system_program, associated_token_program, rent_sysvar] =
  8. accounts
  9. else {
  10. return Err(ProgramError::NotEnoughAccountKeys);
  11. };
  12. // Check payer account is signer.
  13. payer_info.is_signer()?;
  14. token_program.is_program(&spl_token::ID)?;
  15. system_program.is_program(&system_program::ID)?;
  16. associated_token_program.is_program(&ASSOCIATED_TOKEN_PROGRAM_ID)?;
  17. // Check amm account is owned by token_swap_api::ID.
  18. amm_info.has_owner(&token_swap_api::ID)?;
  19. // Check pool account is owned by token_swap_api::ID.
  20. pool_info.is_empty()?.is_writable()?.has_seeds(
  21. &[
  22. amm_info.key.as_ref(),
  23. mint_a_info.key.as_ref(),
  24. mint_b_info.key.as_ref(),
  25. ],
  26. &token_swap_api::ID,
  27. )?;
  28. // Check pool_authority account
  29. pool_authority_info.is_empty()?.has_seeds(
  30. &[
  31. amm_info.key.as_ref(),
  32. mint_a_info.key.as_ref(),
  33. mint_b_info.key.as_ref(),
  34. AUTHORITY_SEED,
  35. ],
  36. &token_swap_api::ID,
  37. )?;
  38. // Check mint_liquidity account
  39. mint_liquidity_info.is_empty()?.is_writable()?.has_seeds(
  40. &[
  41. amm_info.key.as_ref(),
  42. mint_a_info.key.as_ref(),
  43. mint_b_info.key.as_ref(),
  44. LIQUIDITY_SEED,
  45. ],
  46. &token_swap_api::ID,
  47. )?;
  48. // Verify mint_a and mint_b is a mint account.
  49. let _mint_a = mint_a_info.as_mint()?;
  50. let _mint_b = mint_b_info.as_mint()?;
  51. // Verify pool_account_a and pool_account_b is
  52. pool_account_a_info.is_empty()?.is_writable()?;
  53. pool_account_b_info.is_empty()?.is_writable()?;
  54. // init pool account
  55. create_account::<Pool>(
  56. pool_info,
  57. system_program,
  58. payer_info,
  59. &token_swap_api::ID,
  60. &[
  61. amm_info.key.as_ref(),
  62. mint_a_info.key.as_ref(),
  63. mint_b_info.key.as_ref(),
  64. ],
  65. )?;
  66. // get mint_liquidity_info bump to save
  67. let (_, bump) = pool_authority_pda(*amm_info.key, *mint_a_info.key, *mint_b_info.key);
  68. let pool_info_data = pool_info.as_account_mut::<Pool>(&token_swap_api::ID)?;
  69. pool_info_data.amm = *amm_info.key;
  70. pool_info_data.mint_a = *mint_a_info.key;
  71. pool_info_data.mint_b = *mint_b_info.key;
  72. pool_info_data.pool_authority_bump = bump;
  73. let (_, bump) = mint_liquidity_pda(*amm_info.key, *mint_a_info.key, *mint_b_info.key);
  74. // allocate mint_liquidity account
  75. allocate_account_with_bump(
  76. mint_liquidity_info,
  77. system_program,
  78. payer_info,
  79. Mint::LEN,
  80. &spl_token::ID,
  81. &[
  82. amm_info.key.as_ref(),
  83. mint_a_info.key.as_ref(),
  84. mint_b_info.key.as_ref(),
  85. LIQUIDITY_SEED,
  86. ],
  87. bump,
  88. )?;
  89. // init mint_liquidity account
  90. solana_program::program::invoke(
  91. &spl_token::instruction::initialize_mint(
  92. &spl_token::ID,
  93. mint_liquidity_info.key,
  94. pool_authority_info.key,
  95. Some(pool_authority_info.key),
  96. 9,
  97. )?,
  98. &[
  99. token_program.clone(),
  100. mint_liquidity_info.clone(),
  101. pool_authority_info.clone(),
  102. rent_sysvar.clone(),
  103. ],
  104. )?;
  105. create_associated_token_account(
  106. payer_info,
  107. pool_authority_info,
  108. pool_account_a_info,
  109. mint_a_info,
  110. system_program,
  111. token_program,
  112. associated_token_program,
  113. )?;
  114. create_associated_token_account(
  115. payer_info,
  116. pool_authority_info,
  117. pool_account_b_info,
  118. mint_b_info,
  119. system_program,
  120. token_program,
  121. associated_token_program,
  122. )?;
  123. Ok(())
  124. }