sendfun_sdk/launchpad/
migrate.rs1use crate::constants::{
2 ATA_PROGRAM_ID, DEX_PROGRAM_ID, LAUNCHPAD_PROGRAM_ID, NEXUS_PROGRAM_ID,
3 SYSTEM_PROGRAM_ID, TOKEN_2022_PROGRAM_ID,
4};
5use crate::launchpad::accounts::BondingCurve;
6use solana_address::Address;
7
8#[derive(Clone, Debug)]
9pub struct BuildMigrateParams<'a> {
10 pub caller: &'a Address,
11 pub curve: &'a BondingCurve,
12 pub curve_key: &'a Address,
13 pub quote_token_program: &'a Address,
14}
15
16#[must_use]
17pub fn build_migrate_instruction(
18 p: &BuildMigrateParams<'_>,
19) -> solana_instruction::Instruction {
20 build_migrate_instruction_from_parts(&BuildMigrateFromPartsParams {
21 caller: p.caller,
22 bonding_curve: p.curve_key,
23 base_mint: &p.curve.base_mint,
24 quote_mint: &p.curve.quote_mint,
25 creator_fee_config: &p.curve.creator_fee_config,
26 quote_token_program: p.quote_token_program,
27 })
28}
29
30#[derive(Clone, Debug)]
31pub struct BuildMigrateFromPartsParams<'a> {
32 pub caller: &'a Address,
33 pub bonding_curve: &'a Address,
34 pub base_mint: &'a Address,
35 pub quote_mint: &'a Address,
36 pub creator_fee_config: &'a Address,
38 pub quote_token_program: &'a Address,
39}
40
41#[must_use]
42pub fn build_migrate_instruction_from_parts(
43 p: &BuildMigrateFromPartsParams<'_>,
44) -> solana_instruction::Instruction {
45 let base_mint = p.base_mint;
46 let quote_mint = p.quote_mint;
47
48 let (base_vault, _) = crate::utils::find_associated_token_pda(
49 p.bonding_curve,
50 base_mint,
51 &TOKEN_2022_PROGRAM_ID,
52 );
53 let (quote_vault, _) = crate::utils::find_associated_token_pda(
54 p.bonding_curve,
55 quote_mint,
56 p.quote_token_program,
57 );
58
59 let (pool, _) = crate::dex::pda::find_pool_pda(base_mint, quote_mint);
60 let (lp_mint, _) = crate::dex::pda::find_lp_mint_pda(base_mint, quote_mint);
61 let (pool_base_vault, _) = crate::utils::find_associated_token_pda(
62 &pool,
63 base_mint,
64 &TOKEN_2022_PROGRAM_ID,
65 );
66 let (pool_quote_vault, _) = crate::utils::find_associated_token_pda(
67 &pool,
68 quote_mint,
69 p.quote_token_program,
70 );
71 let (pool_lp_account, _) = crate::utils::find_associated_token_pda(
72 &pool,
73 &lp_mint,
74 &TOKEN_2022_PROGRAM_ID,
75 );
76
77 let migrate = super::instructions::Migrate {
78 caller: *p.caller,
79 bonding_curve: *p.bonding_curve,
80 base_mint: *base_mint,
81 quote_mint: *quote_mint,
82 base_vault,
83 quote_vault,
84 dex_program: DEX_PROGRAM_ID,
85 migration_authority: super::pda::MIGRATION_AUTHORITY_ADDRESS,
86 pool,
87 lp_mint,
88 pool_base_vault,
89 pool_quote_vault,
90 pool_lp_account,
91 dex_event_authority: crate::dex::pda::EVENT_AUTHORITY_ADDRESS,
92 nexus_program: NEXUS_PROGRAM_ID,
93 creator_fee_config: *p.creator_fee_config,
94 base_token_program: TOKEN_2022_PROGRAM_ID,
95 quote_token_program: *p.quote_token_program,
96 associated_token_program: ATA_PROGRAM_ID,
97 system_program: SYSTEM_PROGRAM_ID,
98 event_authority: super::pda::EVENT_AUTHORITY_ADDRESS,
99 program: LAUNCHPAD_PROGRAM_ID,
100 };
101 migrate.instruction()
102}