light_ctoken_types/instruction/
transfer.rs

1pub use light_compressed_account::instruction_data::{
2    compressed_proof::CompressedProof, cpi_context::CompressedCpiContext,
3};
4use light_sdk_types::instruction::PackedStateTreeInfo;
5
6use crate::{AnchorDeserialize, AnchorSerialize};
7
8#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize, PartialEq)]
9pub struct PackedMerkleContext {
10    pub merkle_tree_pubkey_index: u8,
11    pub nullifier_queue_pubkey_index: u8,
12    pub leaf_index: u32,
13    pub proof_by_index: bool,
14}
15
16#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize, PartialEq)]
17pub struct TokenAccountMeta {
18    pub amount: u64,
19    pub delegate_index: Option<u8>,
20    pub packed_tree_info: PackedStateTreeInfo,
21    pub lamports: Option<u64>,
22    /// Placeholder for TokenExtension tlv data (unimplemented)
23    pub tlv: Option<Vec<u8>>,
24}
25
26#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize, PartialEq)]
27pub struct InputTokenDataWithContextOnchain {
28    pub amount: u64,
29    pub delegate_index: Option<u8>,
30    pub merkle_context: PackedMerkleContext,
31    pub root_index: u16,
32    pub lamports: Option<u64>,
33    /// Placeholder for TokenExtension tlv data (unimplemented)
34    pub tlv: Option<Vec<u8>>,
35}
36
37impl From<TokenAccountMeta> for InputTokenDataWithContextOnchain {
38    fn from(input: TokenAccountMeta) -> Self {
39        Self {
40            amount: input.amount,
41            delegate_index: input.delegate_index,
42            merkle_context: PackedMerkleContext {
43                merkle_tree_pubkey_index: input.packed_tree_info.merkle_tree_pubkey_index,
44                nullifier_queue_pubkey_index: input.packed_tree_info.queue_pubkey_index,
45                leaf_index: input.packed_tree_info.leaf_index,
46                proof_by_index: input.packed_tree_info.prove_by_index,
47            },
48            root_index: input.packed_tree_info.root_index,
49            lamports: input.lamports,
50            tlv: input.tlv,
51        }
52    }
53}
54
55/// Struct to provide the owner when the delegate is signer of the transaction.
56#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)]
57pub struct DelegatedTransfer {
58    pub owner: [u8; 32],
59    /// Index of change compressed account in output compressed accounts. In
60    /// case that the delegate didn't spend the complete delegated compressed
61    /// account balance the change compressed account will be delegated to her
62    /// as well.
63    pub delegate_change_account_index: Option<u8>,
64}
65
66#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)]
67pub struct CompressedTokenInstructionDataTransfer {
68    pub proof: Option<CompressedProof>,
69    pub mint: [u8; 32],
70    /// Is required if the signer is delegate,
71    /// -> delegate is authority account,
72    /// owner = Some(owner) is the owner of the token account.
73    pub delegated_transfer: Option<DelegatedTransfer>,
74    pub input_token_data_with_context: Vec<InputTokenDataWithContextOnchain>,
75    pub output_compressed_accounts: Vec<PackedTokenTransferOutputData>,
76    pub is_compress: bool,
77    pub compress_or_decompress_amount: Option<u64>,
78    pub cpi_context: Option<CompressedCpiContext>,
79    pub lamports_change_account_merkle_tree_index: Option<u8>,
80    pub with_transaction_hash: bool,
81}
82
83#[derive(Clone, Debug, PartialEq, Eq, AnchorSerialize, AnchorDeserialize)]
84pub struct PackedTokenTransferOutputData {
85    pub owner: [u8; 32],
86    pub amount: u64,
87    pub lamports: Option<u64>,
88    pub merkle_tree_index: u8,
89    /// Placeholder for TokenExtension tlv data (unimplemented)
90    pub tlv: Option<Vec<u8>>,
91}
92
93#[derive(Clone, Copy, Debug, PartialEq, Eq, AnchorSerialize, AnchorDeserialize)]
94pub struct TokenTransferOutputData {
95    pub owner: [u8; 32],
96    pub amount: u64,
97    pub lamports: Option<u64>,
98    pub merkle_tree: [u8; 32],
99}