carbon_wavebreak_decoder/instructions/
create_presale.rs1use {
3 crate::types::GraduationMethod,
4 carbon_core::{account_utils::next_account, deserialize::ArrangeAccounts},
5};
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7#[derive(Debug, Clone, borsh::BorshSerialize, borsh::BorshDeserialize, PartialEq)]
8pub struct CreatePresale {
9 pub name: String,
10 pub symbol: String,
11 pub uri: String,
12 pub token_price: Option<u128>,
13 pub graduation_target: Option<u64>,
14 pub graduation_methods: Option<[GraduationMethod; 8]>,
15 pub launch_time: Option<i64>,
16 pub graduation_time: Option<i64>,
17 pub min_reserve_bps: Option<u16>,
18 pub base_allocation_bps: Option<u16>,
19}
20
21#[derive(Debug, Clone, PartialEq)]
22#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23pub struct CreatePresaleInstructionAccounts {
24 pub creator: solana_pubkey::Pubkey,
25 pub bonding_curve: solana_pubkey::Pubkey,
26 pub base_mint: solana_pubkey::Pubkey,
27 pub quote_mint: solana_pubkey::Pubkey,
28 pub quote_vault: solana_pubkey::Pubkey,
29 pub mint_config: solana_pubkey::Pubkey,
30 pub metadata: solana_pubkey::Pubkey,
31 pub system_program: solana_pubkey::Pubkey,
32 pub base_token_program: solana_pubkey::Pubkey,
33 pub quote_token_program: solana_pubkey::Pubkey,
34 pub ata_program: solana_pubkey::Pubkey,
35 pub metaplex_program: solana_pubkey::Pubkey,
36 pub remaining: Vec<solana_instruction::AccountMeta>,
37}
38
39impl CreatePresale {
40 pub fn decode(data: &[u8]) -> Option<Self> {
41 if data.is_empty() {
42 return None;
43 }
44 let discriminator = &data[0..1];
45 if discriminator != [42] {
46 return None;
47 }
48
49 let mut data_slice = data;
50
51 data_slice = &data_slice[1..];
52
53 borsh::BorshDeserialize::deserialize(&mut data_slice).ok()
54 }
55}
56
57impl ArrangeAccounts for CreatePresale {
58 type ArrangedAccounts = CreatePresaleInstructionAccounts;
59
60 fn arrange_accounts(
61 accounts: &[solana_instruction::AccountMeta],
62 ) -> Option<Self::ArrangedAccounts> {
63 let mut iter = accounts.iter();
64
65 let creator = next_account(&mut iter)?;
66 let bonding_curve = next_account(&mut iter)?;
67 let base_mint = next_account(&mut iter)?;
68 let quote_mint = next_account(&mut iter)?;
69 let quote_vault = next_account(&mut iter)?;
70 let mint_config = next_account(&mut iter)?;
71 let metadata = next_account(&mut iter)?;
72 let system_program = next_account(&mut iter)?;
73 let base_token_program = next_account(&mut iter)?;
74 let quote_token_program = next_account(&mut iter)?;
75 let ata_program = next_account(&mut iter)?;
76 let metaplex_program = next_account(&mut iter)?;
77
78 let remaining = iter.as_slice();
79
80 Some(CreatePresaleInstructionAccounts {
81 creator,
82 bonding_curve,
83 base_mint,
84 quote_mint,
85 quote_vault,
86 mint_config,
87 metadata,
88 system_program,
89 base_token_program,
90 quote_token_program,
91 ata_program,
92 metaplex_program,
93 remaining: remaining.to_vec(),
94 })
95 }
96}