carbon_token_program_decoder/instructions/
approve_checked.rs1use carbon_core::{account_utils::next_account, deserialize::ArrangeAccounts};
3#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Debug, Clone, borsh::BorshSerialize, borsh::BorshDeserialize, PartialEq)]
10pub struct ApproveChecked {
11 pub amount: u64,
13 pub decimals: u8,
15}
16
17#[derive(Debug, Clone, PartialEq)]
18#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
19pub struct ApproveCheckedInstructionAccounts {
20 pub source: solana_pubkey::Pubkey,
21 pub mint: solana_pubkey::Pubkey,
22 pub delegate: solana_pubkey::Pubkey,
23 pub owner: solana_pubkey::Pubkey,
24 pub remaining: Vec<solana_instruction::AccountMeta>,
25}
26
27impl ApproveChecked {
28 pub fn decode(data: &[u8]) -> Option<Self> {
29 if data.is_empty() {
30 return None;
31 }
32 let discriminator = &data[0..1];
33 if discriminator != [13] {
34 return None;
35 }
36
37 let mut data_slice = data;
38
39 data_slice = &data_slice[1..];
40
41 borsh::BorshDeserialize::deserialize(&mut data_slice).ok()
42 }
43}
44
45impl ArrangeAccounts for ApproveChecked {
46 type ArrangedAccounts = ApproveCheckedInstructionAccounts;
47
48 fn arrange_accounts(
49 accounts: &[solana_instruction::AccountMeta],
50 ) -> Option<Self::ArrangedAccounts> {
51 let mut iter = accounts.iter();
52
53 let source = next_account(&mut iter)?;
54 let mint = next_account(&mut iter)?;
55 let delegate = next_account(&mut iter)?;
56 let owner = next_account(&mut iter)?;
57
58 let remaining = iter.as_slice();
59
60 Some(ApproveCheckedInstructionAccounts {
61 source,
62 mint,
63 delegate,
64 owner,
65 remaining: remaining.to_vec(),
66 })
67 }
68}