carbon_token_2022_decoder/instructions/
update_metadata_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/// Update the metadata pointer address. Only supported for mints that
15/// include the `MetadataPointer` extension.
16#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
17#[derive(Debug, Clone, PartialEq)]
18pub struct UpdateMetadataPointer {
19    pub metadata_pointer_discriminator: u8,
20    /// The new account address that holds the metadata.
21    pub metadata_address: Option<Pubkey>,
22}
23
24#[derive(Debug, Clone, borsh::BorshSerialize, CarbonDeserialize, PartialEq)]
25pub struct UpdateMetadataPointerDeser {
26    pub metadata_pointer_discriminator: u8,
27    pub metadata_address: spl_pod::optional_keys::OptionalNonZeroPubkey,
28}
29
30#[derive(Debug, Clone, PartialEq)]
31#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
32pub struct UpdateMetadataPointerInstructionAccounts {
33    pub mint: solana_pubkey::Pubkey,
34    pub metadata_pointer_authority: solana_pubkey::Pubkey,
35    pub remaining: Vec<solana_instruction::AccountMeta>,
36}
37
38impl UpdateMetadataPointer {
39    pub fn decode(data: &[u8]) -> Option<Self> {
40        if data.len() < 2 {
41            return None;
42        }
43        let discriminator = &data[0..1];
44        if discriminator != [39] {
45            return None;
46        }
47        let metadata_pointer_discriminator = data[1];
48        if metadata_pointer_discriminator != 1 {
49            return None;
50        }
51
52        let data_slice = data;
53
54        let data_slice = &data_slice[1..];
55
56        let metadata_pointer = UpdateMetadataPointerDeser::deserialize(data_slice)?;
57
58        Some(UpdateMetadataPointer {
59            metadata_pointer_discriminator: metadata_pointer.metadata_pointer_discriminator,
60            metadata_address: metadata_pointer.metadata_address.into(),
61        })
62    }
63}
64
65impl ArrangeAccounts for UpdateMetadataPointer {
66    type ArrangedAccounts = UpdateMetadataPointerInstructionAccounts;
67
68    fn arrange_accounts(
69        accounts: &[solana_instruction::AccountMeta],
70    ) -> Option<Self::ArrangedAccounts> {
71        let mut iter = accounts.iter();
72
73        let mint = next_account(&mut iter)?;
74        let metadata_pointer_authority = next_account(&mut iter)?;
75
76        let remaining = iter.as_slice();
77
78        Some(UpdateMetadataPointerInstructionAccounts {
79            mint,
80            metadata_pointer_authority,
81            remaining: remaining.to_vec(),
82        })
83    }
84}