carbon_token_2022_decoder/instructions/
initialize_transfer_hook.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 transfer hook program.
15///
16/// Fails if the mint has already been initialized, so must be called before `InitializeMint`.
17///
18/// The mint must have exactly enough space allocated for the base mint (82 bytes),
19/// plus 83 bytes of padding, 1 byte reserved for the account type,
20/// then space required for this extension, plus any others.
21#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22#[derive(Debug, Clone, PartialEq)]
23pub struct InitializeTransferHook {
24    pub transfer_hook_discriminator: u8,
25    /// The public key for the account that can update the program id
26    pub authority: Option<Pubkey>,
27    /// The program id that performs logic during transfers
28    pub program_id: Option<Pubkey>,
29}
30
31#[derive(Debug, Clone, borsh::BorshSerialize, CarbonDeserialize, PartialEq)]
32pub struct InitializeTransferHookDeser {
33    pub transfer_hook_discriminator: u8,
34    pub authority: spl_pod::optional_keys::OptionalNonZeroPubkey,
35    pub program_id: spl_pod::optional_keys::OptionalNonZeroPubkey,
36}
37
38#[derive(Debug, Clone, PartialEq)]
39#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
40pub struct InitializeTransferHookInstructionAccounts {
41    pub mint: solana_pubkey::Pubkey,
42    pub remaining: Vec<solana_instruction::AccountMeta>,
43}
44
45impl InitializeTransferHook {
46    pub fn decode(data: &[u8]) -> Option<Self> {
47        if data.len() < 2 {
48            return None;
49        }
50        let discriminator = &data[0..1];
51        if discriminator != [36] {
52            return None;
53        }
54        let transfer_hook_discriminator = data[1];
55        if transfer_hook_discriminator != 0 {
56            return None;
57        }
58
59        let data_slice = data;
60
61        let data_slice = &data_slice[1..];
62
63        let transfer_hook = InitializeTransferHookDeser::deserialize(data_slice)?;
64
65        Some(InitializeTransferHook {
66            transfer_hook_discriminator: transfer_hook.transfer_hook_discriminator,
67            authority: transfer_hook.authority.into(),
68            program_id: transfer_hook.program_id.into(),
69        })
70    }
71}
72
73impl ArrangeAccounts for InitializeTransferHook {
74    type ArrangedAccounts = InitializeTransferHookInstructionAccounts;
75
76    fn arrange_accounts(
77        accounts: &[solana_instruction::AccountMeta],
78    ) -> Option<Self::ArrangedAccounts> {
79        let mut iter = accounts.iter();
80
81        let mint = next_account(&mut iter)?;
82
83        let remaining = iter.as_slice();
84
85        Some(InitializeTransferHookInstructionAccounts {
86            mint,
87            remaining: remaining.to_vec(),
88        })
89    }
90}