carbon_token_2022_decoder/instructions/
initialize_transfer_hook.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))]
22#[derive(Debug, Clone, PartialEq)]
23pub struct InitializeTransferHook {
24 pub transfer_hook_discriminator: u8,
25 pub authority: Option<Pubkey>,
27 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}