carbon_token_2022_decoder/instructions/
initialize_group_member_pointer.rs1use carbon_core::account_utils::next_account;
8use carbon_core::borsh;
9use carbon_core::deserialize::ArrangeAccounts;
10use carbon_core::deserialize::CarbonDeserialize;
11use carbon_core::CarbonDeserialize;
12use solana_pubkey::Pubkey;
13
14#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23#[derive(Debug, Clone, PartialEq)]
24pub struct InitializeGroupMemberPointer {
25 pub group_member_pointer_discriminator: u8,
26 pub authority: Option<Pubkey>,
28 pub member_address: Option<Pubkey>,
30}
31
32#[derive(Debug, Clone, borsh::BorshSerialize, CarbonDeserialize, PartialEq)]
33pub struct InitializeGroupMemberPointerDeser {
34 pub group_member_pointer_discriminator: u8,
35 pub authority: spl_pod::optional_keys::OptionalNonZeroPubkey,
36 pub member_address: spl_pod::optional_keys::OptionalNonZeroPubkey,
37}
38
39#[derive(Debug, Clone, PartialEq)]
40#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
41pub struct InitializeGroupMemberPointerInstructionAccounts {
42 pub mint: solana_pubkey::Pubkey,
43 pub remaining: Vec<solana_instruction::AccountMeta>,
44}
45
46impl InitializeGroupMemberPointer {
47 pub fn decode(data: &[u8]) -> Option<Self> {
48 if data.len() < 2 {
49 return None;
50 }
51 let discriminator = &data[0..1];
52 if discriminator != [41] {
53 return None;
54 }
55 let group_member_pointer_discriminator = data[1];
56 if group_member_pointer_discriminator != 0 {
57 return None;
58 }
59
60 let data_slice = data;
61
62 let data_slice = &data_slice[1..];
63
64 let group_member_pointer = InitializeGroupMemberPointerDeser::deserialize(data_slice)?;
65
66 Some(InitializeGroupMemberPointer {
67 group_member_pointer_discriminator: group_member_pointer
68 .group_member_pointer_discriminator,
69 authority: group_member_pointer.authority.into(),
70 member_address: group_member_pointer.member_address.into(),
71 })
72 }
73}
74
75impl ArrangeAccounts for InitializeGroupMemberPointer {
76 type ArrangedAccounts = InitializeGroupMemberPointerInstructionAccounts;
77
78 fn arrange_accounts(
79 accounts: &[solana_instruction::AccountMeta],
80 ) -> Option<Self::ArrangedAccounts> {
81 let mut iter = accounts.iter();
82
83 let mint = next_account(&mut iter)?;
84
85 let remaining = iter.as_slice();
86
87 Some(InitializeGroupMemberPointerInstructionAccounts {
88 mint,
89 remaining: remaining.to_vec(),
90 })
91 }
92}