light_instruction_decoder/programs/
token_2022.rs

1//! Token 2022 (Token Extensions) program instruction decoder.
2//!
3//! This module provides a macro-derived decoder for the Token 2022 program,
4//! which uses single-byte discriminators based on variant indices.
5
6// Allow the macro-generated code to reference types from this crate
7extern crate self as light_instruction_decoder;
8
9use light_instruction_decoder_derive::InstructionDecoder;
10
11/// Token 2022 program instructions.
12///
13/// The Token 2022 program uses a 1-byte discriminator (variant index).
14/// Each variant's discriminator is its position in this enum (0, 1, 2, ...).
15///
16/// Token 2022 is a superset of SPL Token (indices 0-24 are compatible).
17/// Indices 25+ are Token Extensions specific instructions.
18///
19/// Note: Complex types (Pubkey, COption<Pubkey>, Vec<ExtensionType>) are not
20/// fully parsed; only primitive fields are extracted.
21#[derive(InstructionDecoder)]
22#[instruction_decoder(
23    program_id = "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
24    program_name = "Token 2022",
25    discriminator_size = 1
26)]
27pub enum Token2022Instruction {
28    // ===== SPL Token compatible instructions (0-24) =====
29    /// Initialize a new mint (index 0)
30    #[instruction_decoder(account_names = ["mint", "rent"])]
31    InitializeMint { decimals: u8 },
32
33    /// Initialize a new token account (index 1)
34    #[instruction_decoder(account_names = ["account", "mint", "owner", "rent"])]
35    InitializeAccount,
36
37    /// Initialize a multisig account (index 2)
38    #[instruction_decoder(account_names = ["multisig", "rent"])]
39    InitializeMultisig { m: u8 },
40
41    /// Transfer tokens - DEPRECATED, use TransferChecked (index 3)
42    #[instruction_decoder(account_names = ["source", "destination", "authority"])]
43    Transfer { amount: u64 },
44
45    /// Approve a delegate (index 4)
46    #[instruction_decoder(account_names = ["source", "delegate", "owner"])]
47    Approve { amount: u64 },
48
49    /// Revoke delegate authority (index 5)
50    #[instruction_decoder(account_names = ["source", "owner"])]
51    Revoke,
52
53    /// Set a new authority (index 6)
54    #[instruction_decoder(account_names = ["account_or_mint", "current_authority"])]
55    SetAuthority { authority_type: u8 },
56
57    /// Mint new tokens (index 7)
58    #[instruction_decoder(account_names = ["mint", "destination", "authority"])]
59    MintTo { amount: u64 },
60
61    /// Burn tokens (index 8)
62    #[instruction_decoder(account_names = ["source", "mint", "authority"])]
63    Burn { amount: u64 },
64
65    /// Close a token account (index 9)
66    #[instruction_decoder(account_names = ["account", "destination", "authority"])]
67    CloseAccount,
68
69    /// Freeze a token account (index 10)
70    #[instruction_decoder(account_names = ["account", "mint", "authority"])]
71    FreezeAccount,
72
73    /// Thaw a frozen token account (index 11)
74    #[instruction_decoder(account_names = ["account", "mint", "authority"])]
75    ThawAccount,
76
77    /// Transfer tokens with decimals check (index 12)
78    #[instruction_decoder(account_names = ["source", "mint", "destination", "authority"])]
79    TransferChecked { amount: u64, decimals: u8 },
80
81    /// Approve delegate with decimals check (index 13)
82    #[instruction_decoder(account_names = ["source", "mint", "delegate", "owner"])]
83    ApproveChecked { amount: u64, decimals: u8 },
84
85    /// Mint tokens with decimals check (index 14)
86    #[instruction_decoder(account_names = ["mint", "destination", "authority"])]
87    MintToChecked { amount: u64, decimals: u8 },
88
89    /// Burn tokens with decimals check (index 15)
90    #[instruction_decoder(account_names = ["source", "mint", "authority"])]
91    BurnChecked { amount: u64, decimals: u8 },
92
93    /// Initialize account with owner in data (index 16)
94    #[instruction_decoder(account_names = ["account", "mint", "rent"])]
95    InitializeAccount2,
96
97    /// Sync native SOL balance (index 17)
98    #[instruction_decoder(account_names = ["account"])]
99    SyncNative,
100
101    /// Initialize account without rent sysvar (index 18)
102    #[instruction_decoder(account_names = ["account", "mint"])]
103    InitializeAccount3,
104
105    /// Initialize multisig without rent sysvar (index 19)
106    #[instruction_decoder(account_names = ["multisig"])]
107    InitializeMultisig2 { m: u8 },
108
109    /// Initialize mint without rent sysvar (index 20)
110    #[instruction_decoder(account_names = ["mint"])]
111    InitializeMint2 { decimals: u8 },
112
113    /// Get required account size (index 21)
114    #[instruction_decoder(account_names = ["mint"])]
115    GetAccountDataSize,
116
117    /// Initialize immutable owner extension (index 22)
118    #[instruction_decoder(account_names = ["account"])]
119    InitializeImmutableOwner,
120
121    /// Convert amount to UI amount string (index 23)
122    #[instruction_decoder(account_names = ["mint"])]
123    AmountToUiAmount { amount: u64 },
124
125    /// Convert UI amount string to amount (index 24)
126    #[instruction_decoder(account_names = ["mint"])]
127    UiAmountToAmount,
128
129    // ===== Token Extensions specific instructions (25+) =====
130    /// Initialize mint close authority extension (index 25)
131    #[instruction_decoder(account_names = ["mint"])]
132    InitializeMintCloseAuthority,
133
134    /// Transfer fee extension instruction prefix (index 26)
135    #[instruction_decoder(account_names = ["mint"])]
136    TransferFeeExtension,
137
138    /// Confidential transfer extension instruction prefix (index 27)
139    #[instruction_decoder(account_names = ["account"])]
140    ConfidentialTransferExtension,
141
142    /// Default account state extension instruction prefix (index 28)
143    #[instruction_decoder(account_names = ["mint"])]
144    DefaultAccountStateExtension,
145
146    /// Reallocate account for extensions (index 29)
147    #[instruction_decoder(account_names = ["account", "payer", "system_program"])]
148    Reallocate,
149
150    /// Memo transfer extension instruction prefix (index 30)
151    #[instruction_decoder(account_names = ["account", "owner"])]
152    MemoTransferExtension,
153
154    /// Create the native mint (index 31)
155    #[instruction_decoder(account_names = ["mint", "funding_account", "system_program"])]
156    CreateNativeMint,
157
158    /// Initialize non-transferable mint extension (index 32)
159    #[instruction_decoder(account_names = ["mint"])]
160    InitializeNonTransferableMint,
161
162    /// Interest bearing mint extension instruction prefix (index 33)
163    #[instruction_decoder(account_names = ["mint"])]
164    InterestBearingMintExtension,
165
166    /// CPI guard extension instruction prefix (index 34)
167    #[instruction_decoder(account_names = ["account", "owner"])]
168    CpiGuardExtension,
169
170    /// Initialize permanent delegate extension (index 35)
171    #[instruction_decoder(account_names = ["mint"])]
172    InitializePermanentDelegate,
173
174    /// Transfer hook extension instruction prefix (index 36)
175    #[instruction_decoder(account_names = ["mint"])]
176    TransferHookExtension,
177
178    /// Confidential transfer fee extension instruction prefix (index 37)
179    #[instruction_decoder(account_names = ["mint"])]
180    ConfidentialTransferFeeExtension,
181
182    /// Withdraw excess lamports from token account (index 38)
183    #[instruction_decoder(account_names = ["source", "destination", "authority"])]
184    WithdrawExcessLamports,
185
186    /// Metadata pointer extension instruction prefix (index 39)
187    #[instruction_decoder(account_names = ["mint"])]
188    MetadataPointerExtension,
189
190    /// Group pointer extension instruction prefix (index 40)
191    #[instruction_decoder(account_names = ["mint"])]
192    GroupPointerExtension,
193
194    /// Group member pointer extension instruction prefix (index 41)
195    #[instruction_decoder(account_names = ["mint"])]
196    GroupMemberPointerExtension,
197
198    /// Confidential mint/burn extension instruction prefix (index 42)
199    #[instruction_decoder(account_names = ["mint"])]
200    ConfidentialMintBurnExtension,
201
202    /// Scaled UI amount extension instruction prefix (index 43)
203    #[instruction_decoder(account_names = ["mint"])]
204    ScaledUiAmountExtension,
205
206    /// Pausable extension instruction prefix (index 44)
207    #[instruction_decoder(account_names = ["mint"])]
208    PausableExtension,
209}