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