light_token/instruction/
compressible.rs

1use light_token_interface::{instructions::extensions::CompressToPubkey, state::TokenDataVersion};
2use solana_account_info::AccountInfo;
3use solana_pubkey::Pubkey;
4
5use crate::instruction::{COMPRESSIBLE_CONFIG_V1, RENT_SPONSOR};
6
7/// Parameters for creating compressible ctoken accounts.
8///
9/// Compressible accounts have sponsored rent and can be compressed to compressed
10/// token accounts when their lamports balance is insufficient.
11///
12/// Default values are:
13/// - 24 hours rent
14/// - lamports for 3 hours rent (paid on transfer when account rent is insufficient to cover the next 2 epochs)
15/// - Protocol rent sponsor
16/// - TokenDataVersion::ShaFlat token data hashing (only sha is supported for compressible accounts)
17///
18/// # Example
19/// ```rust
20/// use light_token::instruction::CompressibleParams;
21///
22/// let params = CompressibleParams::new();
23/// ```
24#[derive(Debug, Clone)]
25pub struct CompressibleParams {
26    pub token_account_version: TokenDataVersion,
27    pub pre_pay_num_epochs: u8,
28    /// Number of lamports transferred on a write operation (eg transfer) when account rent is insufficient to cover the next 2 rent-epochs.
29    /// Default: 766 lamports for 3 hours rent.
30    /// These lamports keep the ctoken account perpetually funded when used.
31    pub lamports_per_write: Option<u32>,
32    pub compress_to_account_pubkey: Option<CompressToPubkey>,
33    pub compressible_config: Pubkey,
34    pub rent_sponsor: Pubkey,
35    pub compression_only: bool,
36}
37
38impl Default for CompressibleParams {
39    fn default() -> Self {
40        Self {
41            compressible_config: COMPRESSIBLE_CONFIG_V1,
42            rent_sponsor: RENT_SPONSOR,
43            pre_pay_num_epochs: 16,
44            lamports_per_write: Some(766),
45            compress_to_account_pubkey: None,
46            token_account_version: TokenDataVersion::ShaFlat,
47            compression_only: false,
48        }
49    }
50}
51
52impl CompressibleParams {
53    /// Creates a new `CompressibleParams` with default values.
54    /// - 24 hours rent
55    /// - 3 hours top up (paid on transfer when account rent is insufficient to cover the next 2 epochs)
56    /// - Protocol rent sponsor
57    /// - TokenDataVersion::ShaFlat token data hashing (only sha is supported for compressible accounts)
58    pub fn new() -> Self {
59        Self::default()
60    }
61
62    /// Creates default params for ATAs (compression_only = true).
63    /// ATAs are always compression_only.
64    pub fn default_ata() -> Self {
65        Self {
66            compression_only: true,
67            ..Self::default()
68        }
69    }
70
71    /// Sets the destination pubkey for compression.
72    pub fn compress_to_pubkey(mut self, compress_to: CompressToPubkey) -> Self {
73        self.compress_to_account_pubkey = Some(compress_to);
74        self
75    }
76}
77
78/// Parameters for creating compressible ctoken accounts via CPI.
79///
80/// # Example
81/// ```rust,no_run
82/// # use light_token::instruction::CompressibleParamsCpi;
83/// # use solana_account_info::AccountInfo;
84/// // Use ctoken::COMPRESSIBLE_CONFIG_V1 or ctoken::config_pda() to get the protocol config.
85/// // Use ctoken::RENT_SPONSOR or ctoken::rent_sponsor_pda() to get the protocol rent sponsor.
86/// # let compressible_config: AccountInfo = todo!();
87/// # let rent_sponsor: AccountInfo = todo!();
88/// # let system_program: AccountInfo = todo!();
89/// let params = CompressibleParamsCpi::new(
90///     compressible_config,
91///     rent_sponsor,
92///     system_program,
93/// );
94/// ```
95pub struct CompressibleParamsCpi<'info> {
96    pub compressible_config: AccountInfo<'info>,
97    pub rent_sponsor: AccountInfo<'info>,
98    pub system_program: AccountInfo<'info>,
99    pub pre_pay_num_epochs: u8,
100    pub lamports_per_write: Option<u32>,
101    pub compress_to_account_pubkey: Option<CompressToPubkey>,
102    pub token_account_version: TokenDataVersion,
103    pub compression_only: bool,
104}
105
106impl<'info> CompressibleParamsCpi<'info> {
107    pub fn new(
108        compressible_config: AccountInfo<'info>,
109        rent_sponsor: AccountInfo<'info>,
110        system_program: AccountInfo<'info>,
111    ) -> Self {
112        let defaults = CompressibleParams::default();
113        Self {
114            compressible_config,
115            rent_sponsor,
116            system_program,
117            pre_pay_num_epochs: defaults.pre_pay_num_epochs,
118            lamports_per_write: defaults.lamports_per_write,
119            compress_to_account_pubkey: None,
120            token_account_version: defaults.token_account_version,
121            compression_only: defaults.compression_only,
122        }
123    }
124
125    pub fn new_ata(
126        compressible_config: AccountInfo<'info>,
127        rent_sponsor: AccountInfo<'info>,
128        system_program: AccountInfo<'info>,
129    ) -> Self {
130        let defaults = CompressibleParams::default_ata();
131        Self {
132            compressible_config,
133            rent_sponsor,
134            system_program,
135            pre_pay_num_epochs: defaults.pre_pay_num_epochs,
136            lamports_per_write: defaults.lamports_per_write,
137            compress_to_account_pubkey: None,
138            token_account_version: defaults.token_account_version,
139            compression_only: defaults.compression_only,
140        }
141    }
142
143    pub fn with_compress_to_pubkey(mut self, compress_to: CompressToPubkey) -> Self {
144        self.compress_to_account_pubkey = Some(compress_to);
145        self
146    }
147}