light_token/instruction/mod.rs
1//! High-level builders for Light Token operations.
2//!
3//!
4//! ## Account Creation
5//!
6//! - [`CreateAssociatedTokenAccount`] - Create associated Light Token account (ATA) instruction
7//! - [`CreateTokenAtaCpi`] - Create associated Light Token account (ATA) via CPI
8//! - [`CreateTokenAccount`] - Create Light Token account instruction
9//! - [`CreateTokenAccountCpi`] - Create Light Token account via CPI
10//!
11//! ## Transfers
12//!
13//! - [`TransferInterfaceCpi`] - Transfer via CPI, auto-detect source/destination account types
14//!
15//! ## Decompress
16//!
17//! - [`Decompress`] - Decompress compressed tokens to a Light Token account
18//!
19//! ## Close
20//!
21//! - [`CloseAccount`] - Create close Light Token account instruction
22//! - [`CloseAccountCpi`] - Close Light Token account via CPI
23//!
24//!
25//! ## Mint
26//!
27//! - [`CreateMint`] - Create Light Mint
28//! - [`create_mints`] - Create multiple Light Mints in a batch
29//! - [`MintTo`] - Mint tokens to Light Token accounts
30//!
31//! ## Revoke and Thaw
32//!
33//! - [`Revoke`] - Revoke delegation for a Light Token account
34//! - [`RevokeCpi`] - Revoke delegation via CPI
35//! - [`Thaw`] - Thaw a frozen Light Token account
36//! - [`ThawCpi`] - Thaw a frozen Light Token account via CPI
37//!
38//! # Example: Create Light Token Account Instruction
39//!
40//! ```rust
41//! # use solana_pubkey::Pubkey;
42//! use light_token::instruction::CreateAssociatedTokenAccount;
43//! # let payer = Pubkey::new_unique();
44//! # let owner = Pubkey::new_unique();
45//! # let mint = Pubkey::new_unique();
46//!
47//! let instruction = CreateAssociatedTokenAccount::new(payer, owner, mint)
48//! .idempotent()
49//! .instruction()?;
50//! # Ok::<(), solana_program_error::ProgramError>(())
51//! ```
52//!
53//! # Example: Create rent-free ATA via CPI
54//!
55//! ```rust,ignore
56//! use light_token::instruction::CreateTokenAtaCpi;
57//!
58//! CreateTokenAtaCpi {
59//! payer: ctx.accounts.payer.to_account_info(),
60//! owner: ctx.accounts.owner.to_account_info(),
61//! mint: ctx.accounts.mint.to_account_info(),
62//! ata: ctx.accounts.user_ata.to_account_info(),
63//! }
64//! .idempotent()
65//! .rent_free(
66//! ctx.accounts.light_token_config.to_account_info(),
67//! ctx.accounts.rent_sponsor.to_account_info(),
68//! ctx.accounts.system_program.to_account_info(),
69//! )
70//! .invoke()?;
71//! ```
72//!
73//! # Example: Create rent-free vault via CPI (with PDA signing)
74//!
75//! ```rust,ignore
76//! use light_token::instruction::CreateTokenAccountCpi;
77//!
78//! CreateTokenAccountCpi {
79//! payer: ctx.accounts.payer.to_account_info(),
80//! account: ctx.accounts.vault.to_account_info(),
81//! mint: ctx.accounts.mint.to_account_info(),
82//! owner: ctx.accounts.vault_authority.key(),
83//! }
84//! .rent_free(
85//! ctx.accounts.light_token_config.to_account_info(),
86//! ctx.accounts.rent_sponsor.to_account_info(),
87//! ctx.accounts.system_program.to_account_info(),
88//! &crate::ID,
89//! )
90//! .invoke_signed(&[b"vault", mint.key().as_ref(), &[bump]])?;
91//! ```
92//!
93
94#[macro_use]
95mod macros;
96
97mod approve;
98mod burn;
99mod burn_checked;
100mod close;
101mod compressible;
102mod create;
103mod create_ata;
104mod create_mint;
105mod create_mints;
106// Decompress instruction builder is client-side only (uses PackedAccounts)
107#[cfg(not(target_os = "solana"))]
108mod decompress;
109mod decompress_mint;
110mod freeze;
111mod mint_to;
112mod mint_to_checked;
113mod revoke;
114mod thaw;
115mod transfer;
116mod transfer_checked;
117mod transfer_from_spl;
118mod transfer_interface;
119mod transfer_to_spl;
120
121pub use approve::*;
122pub use burn::*;
123pub use burn_checked::*;
124pub use close::{CloseAccount, CloseAccountCpi};
125pub use compressible::{CompressibleParams, CompressibleParamsCpi};
126pub use create::*;
127pub use create_ata::{
128 derive_associated_token_account, derive_associated_token_account as derive_token_ata,
129 CreateAssociatedTokenAccount, CreateTokenAtaCpi as CreateAssociatedAccountCpi,
130 CreateTokenAtaCpi,
131};
132pub use create_mint::*;
133pub use create_mints::*;
134#[cfg(not(target_os = "solana"))]
135pub use decompress::Decompress;
136pub use decompress_mint::*;
137pub use freeze::*;
138pub use light_token_interface::{
139 instructions::{
140 extensions::{CompressToPubkey, ExtensionInstructionData, TokenMetadataInstructionData},
141 mint_action::MintWithContext,
142 },
143 state::{AdditionalMetadata, Token, TokenDataVersion},
144};
145pub use mint_to::{MintTo, MintToCpi};
146pub use mint_to_checked::*;
147pub use revoke::{Revoke, RevokeCpi};
148use solana_account_info::AccountInfo;
149use solana_pubkey::Pubkey;
150pub use thaw::{Thaw, ThawCpi};
151pub use transfer::*;
152pub use transfer_checked::*;
153pub use transfer_from_spl::{TransferFromSpl, TransferFromSplCpi};
154pub use transfer_interface::{
155 SplInterface, SplInterfaceCpi, TransferInterface, TransferInterfaceCpi,
156};
157pub use transfer_to_spl::{TransferToSpl, TransferToSplCpi};
158
159/// System accounts required for CPI operations to Light Protocol.
160///
161/// Pass these accounts when invoking Light Token operations from your program.
162///
163/// # Fields
164///
165/// - `light_system_program` - Light System Program
166/// - `cpi_authority_pda` - CPI authority (signs for your program)
167/// - `registered_program_pda` - Your program's registration
168/// - `account_compression_authority` - Compression authority
169/// - `account_compression_program` - Account Compression Program
170/// - `system_program` - Solana System Program
171#[derive(Clone)]
172pub struct SystemAccountInfos<'info> {
173 pub light_system_program: AccountInfo<'info>,
174 pub cpi_authority_pda: AccountInfo<'info>,
175 pub registered_program_pda: AccountInfo<'info>,
176 pub account_compression_authority: AccountInfo<'info>,
177 pub account_compression_program: AccountInfo<'info>,
178 pub system_program: AccountInfo<'info>,
179}
180
181/// System accounts with Pubkey references for instruction building.
182///
183/// ```rust
184/// # use light_token::instruction::SystemAccounts;
185/// # use solana_instruction::AccountMeta;
186/// let system_accounts = SystemAccounts::default();
187/// let accounts = vec![
188/// AccountMeta::new_readonly(system_accounts.light_system_program, false),
189/// AccountMeta::new_readonly(system_accounts.cpi_authority_pda, false),
190/// // ...
191/// ];
192/// ```
193#[derive(Debug, Clone, Copy)]
194pub struct SystemAccounts {
195 pub light_system_program: Pubkey,
196 pub cpi_authority_pda: Pubkey,
197 pub registered_program_pda: Pubkey,
198 pub account_compression_authority: Pubkey,
199 pub account_compression_program: Pubkey,
200 pub system_program: Pubkey,
201}
202
203impl Default for SystemAccounts {
204 fn default() -> Self {
205 use light_compressed_token_sdk::utils::TokenDefaultAccounts;
206 let defaults = TokenDefaultAccounts::default();
207 Self {
208 light_system_program: defaults.light_system_program,
209 cpi_authority_pda: defaults.cpi_authority_pda,
210 registered_program_pda: defaults.registered_program_pda,
211 account_compression_authority: defaults.account_compression_authority,
212 account_compression_program: defaults.account_compression_program,
213 system_program: defaults.system_program,
214 }
215 }
216}
217
218// Re-export constants for backwards compatibility
219pub use crate::{
220 constants::{
221 compression_authority_pda, config_pda, rent_sponsor_pda, LIGHT_TOKEN_CONFIG,
222 LIGHT_TOKEN_CPI_AUTHORITY, LIGHT_TOKEN_PROGRAM_ID,
223 RENT_SPONSOR_V1 as LIGHT_TOKEN_RENT_SPONSOR,
224 },
225 cpi_authority, id,
226 spl_interface::get_spl_interface_pda_and_bump,
227 utils::{get_associated_token_address, get_associated_token_address_and_bump},
228};