carbon_token_2022_decoder/instructions/
update_metadata_pointer.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))]
17#[derive(Debug, Clone, PartialEq)]
18pub struct UpdateMetadataPointer {
19 pub metadata_pointer_discriminator: u8,
20 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}