create_pool.rs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. use crate::{
  2. accounts::{
  3. CustodySigner,
  4. FromCustodyTokenAccount,
  5. FromCustodyTokenAccountDerivationData,
  6. MigrationPool,
  7. MigrationPoolDerivationData,
  8. ShareMint,
  9. ShareMintDerivationData,
  10. ToCustodyTokenAccount,
  11. ToCustodyTokenAccountDerivationData,
  12. },
  13. types::SplMint,
  14. };
  15. use borsh::{
  16. BorshDeserialize,
  17. BorshSerialize,
  18. };
  19. use solana_program::program::invoke_signed;
  20. use solitaire::{
  21. processors::seeded::Seeded,
  22. CreationLamports::Exempt,
  23. *,
  24. };
  25. #[derive(FromAccounts)]
  26. pub struct CreatePool<'b> {
  27. pub payer: Mut<Signer<Info<'b>>>,
  28. pub pool: Mut<MigrationPool<'b, { AccountState::Uninitialized }>>,
  29. pub from_mint: Data<'b, SplMint, { AccountState::Initialized }>,
  30. pub to_mint: Data<'b, SplMint, { AccountState::Initialized }>,
  31. pub from_token_custody: Mut<FromCustodyTokenAccount<'b, { AccountState::Uninitialized }>>,
  32. pub to_token_custody: Mut<ToCustodyTokenAccount<'b, { AccountState::Uninitialized }>>,
  33. pub pool_mint: Mut<ShareMint<'b, { AccountState::Uninitialized }>>,
  34. pub custody_signer: CustodySigner<'b>,
  35. }
  36. #[derive(BorshDeserialize, BorshSerialize, Default)]
  37. pub struct CreatePoolData {}
  38. pub fn create_pool(
  39. ctx: &ExecutionContext,
  40. accs: &mut CreatePool,
  41. _data: CreatePoolData,
  42. ) -> Result<()> {
  43. // Create from custody account
  44. accs.from_token_custody.create(
  45. &FromCustodyTokenAccountDerivationData {
  46. pool: *accs.pool.info().key,
  47. },
  48. ctx,
  49. accs.payer.key,
  50. Exempt,
  51. )?;
  52. let init_ix = spl_token::instruction::initialize_account(
  53. &spl_token::id(),
  54. accs.from_token_custody.info().key,
  55. accs.from_mint.info().key,
  56. accs.custody_signer.info().key,
  57. )?;
  58. invoke_signed(&init_ix, ctx.accounts, &[])?;
  59. // Create to custody account
  60. accs.to_token_custody.create(
  61. &ToCustodyTokenAccountDerivationData {
  62. pool: *accs.pool.info().key,
  63. },
  64. ctx,
  65. accs.payer.key,
  66. Exempt,
  67. )?;
  68. let init_ix = spl_token::instruction::initialize_account(
  69. &spl_token::id(),
  70. accs.to_token_custody.info().key,
  71. accs.to_mint.info().key,
  72. accs.custody_signer.info().key,
  73. )?;
  74. invoke_signed(&init_ix, ctx.accounts, &[])?;
  75. // Create to pool mint
  76. accs.pool_mint.create(
  77. &ShareMintDerivationData {
  78. pool: *accs.pool.info().key,
  79. },
  80. ctx,
  81. accs.payer.key,
  82. Exempt,
  83. )?;
  84. let init_ix = spl_token::instruction::initialize_mint(
  85. &spl_token::id(),
  86. accs.pool_mint.info().key,
  87. accs.custody_signer.info().key,
  88. None,
  89. accs.from_mint.decimals,
  90. )?;
  91. invoke_signed(&init_ix, ctx.accounts, &[])?;
  92. // Set fields on pool
  93. accs.pool.from = *accs.from_mint.info().key;
  94. accs.pool.to = *accs.to_mint.info().key;
  95. // Create pool
  96. accs.pool.create(
  97. &MigrationPoolDerivationData {
  98. from: *accs.from_mint.info().key,
  99. to: *accs.to_mint.info().key,
  100. },
  101. ctx,
  102. accs.payer.key,
  103. Exempt,
  104. )?;
  105. Ok(())
  106. }