Skip to main content

sendfun_sdk/launchpad/
migrate.rs

1use 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	/// From `BondingCurve::creator_fee_config`; `migrate` pins the slot to it.
37	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}