carbon_token_2022_decoder/instructions/
initialize_group_member_pointer.rs

1//! This code was AUTOGENERATED using the Codama library.
2//! Please DO NOT EDIT THIS FILE, instead use visitors
3//! to add features, then rerun Codama to update it.
4//!
5//! <https://github.com/codama-idl/codama>
6//!
7use 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/// Initialize a new mint with a group member pointer
15///
16/// Fails if the mint has already been initialized, so must be called before
17/// `InitializeMint`.
18///
19/// The mint must have exactly enough space allocated for the base mint (82
20/// bytes), plus 83 bytes of padding, 1 byte reserved for the account type,
21/// then space required for this extension, plus any others.
22#[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    /// The public key for the account that can update the group member address.
27    pub authority: Option<Pubkey>,
28    /// The account address that holds the member.
29    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}