Skip to main content

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};