carbon_token_2022_decoder/instructions/
update_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 UpdateTransferHook {
24 pub transfer_hook_discriminator: u8,
25 pub program_id: Option<Pubkey>,
27}
28
29#[derive(Debug, Clone, borsh::BorshSerialize, CarbonDeserialize, PartialEq)]
30pub struct UpdateTransferHookDeser {
31 pub transfer_hook_discriminator: u8,
32 pub program_id: spl_pod::optional_keys::OptionalNonZeroPubkey,
33}
34
35#[derive(Debug, Clone, PartialEq)]
36#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
37pub struct UpdateTransferHookInstructionAccounts {
38 pub mint: solana_pubkey::Pubkey,
39 pub authority: solana_pubkey::Pubkey,
40 pub remaining: Vec<solana_instruction::AccountMeta>,
41}
42
43impl UpdateTransferHook {
44 pub fn decode(data: &[u8]) -> Option<Self> {
45 if data.len() < 2 {
46 return None;
47 }
48 let discriminator = &data[0..1];
49 if discriminator != [36] {
50 return None;
51 }
52 let transfer_hook_discriminator = data[1];
53 if transfer_hook_discriminator != 1 {
54 return None;
55 }
56
57 let data_slice = data;
58
59 let data_slice = &data_slice[1..];
60
61 let transfer_hook = UpdateTransferHookDeser::deserialize(data_slice)?;
62
63 Some(UpdateTransferHook {
64 transfer_hook_discriminator: transfer_hook.transfer_hook_discriminator,
65 program_id: transfer_hook.program_id.into(),
66 })
67 }
68}
69
70impl ArrangeAccounts for UpdateTransferHook {
71 type ArrangedAccounts = UpdateTransferHookInstructionAccounts;
72
73 fn arrange_accounts(
74 accounts: &[solana_instruction::AccountMeta],
75 ) -> Option<Self::ArrangedAccounts> {
76 let mut iter = accounts.iter();
77
78 let mint = next_account(&mut iter)?;
79 let authority = next_account(&mut iter)?;
80
81 let remaining = iter.as_slice();
82
83 Some(UpdateTransferHookInstructionAccounts {
84 mint,
85 authority,
86 remaining: remaining.to_vec(),
87 })
88 }
89}