carbon_token_2022_decoder/instructions/
update_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/// Update the transfer hook program id. Only supported for mints that
15/// include the `TransferHook` extension.
16///
17/// Accounts expected by this instruction:
18///
19///   0. `[writable]` The mint.
20///   1. `[signer]` The transfer hook authority.
21#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22#[derive(Debug, Clone, PartialEq)]
23pub struct UpdateTransferHook {
24    pub transfer_hook_discriminator: u8,
25    /// The program id that performs logic during transfers
26    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}