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
94mod approve;
95mod burn;
96mod burn_checked;
97mod close;
98mod compressible;
99mod create;
100mod create_ata;
101mod create_mint;
102mod create_mints;
103// Decompress instruction builder is client-side only (uses PackedAccounts)
104#[cfg(not(target_os = "solana"))]
105mod decompress;
106mod decompress_mint;
107mod freeze;
108mod mint_to;
109mod mint_to_checked;
110mod revoke;
111mod thaw;
112mod transfer;
113mod transfer_checked;
114mod transfer_from_spl;
115mod transfer_interface;
116mod transfer_to_spl;
117
118pub use approve::*;
119pub use burn::*;
120pub use burn_checked::*;
121pub use close::{CloseAccount, CloseAccountCpi};
122pub use compressible::{CompressibleParams, CompressibleParamsCpi};
123pub use create::*;
124pub use create_ata::{
125 derive_associated_token_account, derive_associated_token_account as derive_token_ata,
126 CreateAssociatedTokenAccount, CreateTokenAtaCpi as CreateAssociatedAccountCpi,
127 CreateTokenAtaCpi,
128};
129pub use create_mint::*;
130pub use create_mints::*;
131#[cfg(not(target_os = "solana"))]
132pub use decompress::Decompress;
133pub use decompress_mint::*;
134pub use freeze::*;
135pub use light_token_interface::{
136 instructions::{
137 extensions::{CompressToPubkey, ExtensionInstructionData, TokenMetadataInstructionData},
138 mint_action::MintWithContext,
139 },
140 state::{AdditionalMetadata, Token, TokenDataVersion},
141};
142pub use mint_to::{MintTo, MintToCpi};
143pub use mint_to_checked::*;
144pub use revoke::{Revoke, RevokeCpi};
145use solana_account_info::AccountInfo;
146use solana_pubkey::Pubkey;
147pub use thaw::{Thaw, ThawCpi};
148pub use transfer::*;
149pub use transfer_checked::*;
150pub use transfer_from_spl::{TransferFromSpl, TransferFromSplCpi};
151pub use transfer_interface::{
152 SplInterface, SplInterfaceCpi, TransferInterface, TransferInterfaceCpi,
153};
154pub use transfer_to_spl::{TransferToSpl, TransferToSplCpi};
155
156/// System accounts required for CPI operations to Light Protocol.
157///
158/// Pass these accounts when invoking Light Token operations from your program.
159///
160/// # Fields
161///
162/// - `light_system_program` - Light System Program
163/// - `cpi_authority_pda` - CPI authority (signs for your program)
164/// - `registered_program_pda` - Your program's registration
165/// - `account_compression_authority` - Compression authority
166/// - `account_compression_program` - Account Compression Program
167/// - `system_program` - Solana System Program
168#[derive(Clone)]
169pub struct SystemAccountInfos<'info> {
170 pub light_system_program: AccountInfo<'info>,
171 pub cpi_authority_pda: AccountInfo<'info>,
172 pub registered_program_pda: AccountInfo<'info>,
173 pub account_compression_authority: AccountInfo<'info>,
174 pub account_compression_program: AccountInfo<'info>,
175 pub system_program: AccountInfo<'info>,
176}
177
178/// System accounts with Pubkey references for instruction building.
179///
180/// ```rust
181/// # use light_token::instruction::SystemAccounts;
182/// # use solana_instruction::AccountMeta;
183/// let system_accounts = SystemAccounts::default();
184/// let accounts = vec![
185/// AccountMeta::new_readonly(system_accounts.light_system_program, false),
186/// AccountMeta::new_readonly(system_accounts.cpi_authority_pda, false),
187/// // ...
188/// ];
189/// ```
190#[derive(Debug, Clone, Copy)]
191pub struct SystemAccounts {
192 pub light_system_program: Pubkey,
193 pub cpi_authority_pda: Pubkey,
194 pub registered_program_pda: Pubkey,
195 pub account_compression_authority: Pubkey,
196 pub account_compression_program: Pubkey,
197 pub system_program: Pubkey,
198}
199
200impl Default for SystemAccounts {
201 fn default() -> Self {
202 use light_compressed_token_sdk::utils::TokenDefaultAccounts;
203 let defaults = TokenDefaultAccounts::default();
204 Self {
205 light_system_program: defaults.light_system_program,
206 cpi_authority_pda: defaults.cpi_authority_pda,
207 registered_program_pda: defaults.registered_program_pda,
208 account_compression_authority: defaults.account_compression_authority,
209 account_compression_program: defaults.account_compression_program,
210 system_program: defaults.system_program,
211 }
212 }
213}
214
215// Re-export constants for backwards compatibility
216pub use crate::{
217 constants::{
218 compression_authority_pda, config_pda, rent_sponsor_pda, LIGHT_TOKEN_CONFIG,
219 LIGHT_TOKEN_CPI_AUTHORITY, LIGHT_TOKEN_PROGRAM_ID,
220 RENT_SPONSOR_V1 as LIGHT_TOKEN_RENT_SPONSOR,
221 },
222 cpi_authority, id,
223 spl_interface::get_spl_interface_pda_and_bump,
224 utils::{get_associated_token_address, get_associated_token_address_and_bump},
225};