@@ -67,6 +67,8 @@ fn test() {
6767
6868Mollusk 的 token program 助手显著简化了涉及 SPL 代币的测试场景。` mollusk-svm-programs-token ` crate 提供了对 ` Token ` 、` Token2022 ` 和 ` Associated Token ` 程序的预配置支持。
6969
70+ ### 程序账户
71+
7072在包含 token helper crate 后,添加您的测试所需的特定 token 程序:
7173
7274``` rust
@@ -103,108 +105,73 @@ let (associated_token_program, associated_token_program_account) =
103105 mollusk_svm_programs_token :: associated_token :: keyed_account ();
104106```
105107
106- 这些助手确保与代币相关的测试能够访问正确的程序账户并具有适当的配置 ,从而无需手动设置程序即可全面测试代币操作。
108+ 这些助手确保代币相关测试能够访问正确的程序账户并进行适当配置 ,从而无需手动设置程序即可全面测试代币操作。
107109
108- 如果我们想从 token program 中创建已初始化的 State 账户,我们需要使用 Account 方法创建它们,并将其加载到 Mollusk 实例的账户结构中。
110+ ### 状态账户
109111
110- 手动创建已初始化的 token account 涉及大量的样板代码,用于序列化账户数据和计算 rent 免除。以下是简化此过程的辅助函数:
112+ 在测试过程中,我们可能需要一个已经初始化的 ` Mint ` 、 ` Token ` 或 ` Associated Token ` 账户。幸运的是,Mollusk 为我们提供了一些方便的助手。
111113
112- ``` rust
113- use spl_token :: {state :: {Mint , Account as TokenAccount , AccountState }, ID as token};
114- use spl_associated_token_account :: get_associated_token_address_with_program_id;
115-
116- // Create a Keyed Account for a Mint with default data
117- #[allow(dead_code)]
118- pub fn keyed_account_for_mint_default (
119- mollusk : & Mollusk ,
120- authority : & Pubkey ,
121- decimals : u8 ,
122- pubkey : Option <Pubkey >,
123- token_program : Option <Pubkey >,
124- ) -> (Pubkey , Account ) {
125- let mint_data = Mint {
126- mint_authority : Some (* authority ). into (),
127- supply : 0 ,
128- decimals ,
129- is_initialized : true ,
130- freeze_authority : None . into (),
131- };
114+ 要创建一个` Mint ` 账户,我们可以像这样使用` create_account_for_mint() ` 函数:
132115
133- let mut data = vec! [0u8 ; Mint :: LEN ];
134- Mint :: pack (mint_data , & mut data ). unwrap ();
116+ ``` rust
117+ use spl_token :: state :: Mint ;
118+ use mollusk_svm_programs_token :: token :: create_account_for_mint;
119+
120+ let mint_data = Mint {
121+ mint_authority : Pubkey :: new_unique (),
122+ supply : 10_000_000_000 ,
123+ decimals : 6 ,
124+ is_initialized : true ,
125+ freeze_authority : None ,
126+ };
135127
136- let account = Account {
137- lamports : mollusk . sysvars. rent. minimum_balance (Mint :: LEN ),
138- data ,
139- owner : token_program . unwrap_or (token :: ID ),
140- executable : false ,
141- rent_epoch : 0 ,
142- };
128+ let mint_account = create_account_for_mint (mint_data )
129+ ```
143130
144- (pubkey . unwrap_or (Pubkey :: new_unique ()), account )
145- }
131+ 要创建一个` Token ` 账户,我们可以像这样使用` create_account_for_token_account() ` 函数:
146132
147- // Create a Keyed Account for a Token Account with default data
148- #[allow(dead_code)]
149- pub fn keyed_account_for_token_account_default (
150- mollusk : & Mollusk ,
151- mint : & Pubkey ,
152- owner : & Pubkey ,
153- amount : u64 ,
154- pubkey : Option <Pubkey >,
155- token_program : Option <Pubkey >,
156- ) -> (Pubkey , Account ) {
157- let account_data = TokenAccount {
158- mint : * mint ,
159- owner : * owner ,
160- amount ,
161- delegate : None . into (),
162- state : AccountState :: Initialized ,
163- is_native : None . into (),
164- delegated_amount : 0 ,
165- close_authority : None . into (),
166- };
133+ ``` rust
134+ use spl_token :: state :: {TokenAccount , AccountState };
135+ use mollusk_svm_programs_token :: token :: create_account_for_token_account;
136+
137+ let token_data = TokenAccount {
138+ mint : Pubkey :: new_unique (),
139+ owner : Pubkey :: new_unique (),
140+ amount : 1_000_000 ,
141+ delegate : None ,
142+ state : AccountState :: Initialized ,
143+ is_native : None ,
144+ delegated_amount : 0 ,
145+ close_authority : None ,
146+ };
167147
168- let mut data = vec! [ 0 u8 ; TokenAccount :: LEN ];
169- TokenAccount :: pack ( account_data , & mut data ) . unwrap ();
148+ let token_account = create_account_for_token_account ( token_data )
149+ ```
170150
171- let account = Account {
172- lamports : mollusk . sysvars. rent. minimum_balance (TokenAccount :: LEN ),
173- data ,
174- owner : token_program . unwrap_or (token :: ID ),
175- executable : false ,
176- rent_epoch : 0 ,
177- };
151+ > 注意:这些示例适用于SPL-Token程序。如果您想创建由Token2022程序拥有的` Mint ` 和` Token ` 账户,只需使用` mollusk_svm_programs_token::token2022::... ` 。
178152
179- (pubkey . unwrap_or (Pubkey :: new_unique ()), account )
180- }
153+ 要创建一个` Associated Token ` 账户,我们可以像这样使用` create_account_for_associated_token_account() ` 函数:
181154
182- // Create a Keyed Account for an Associated Token Account with default data
183- #[allow(dead_code)]
184- pub fn keyed_account_for_associated_token_account_default (
185- mollusk : & Mollusk ,
186- mint : & Pubkey ,
187- owner : & Pubkey ,
188- amount : u64 ,
189- token_program : Option < Pubkey > ,
190- ) -> ( Pubkey , Account ) {
191- let associated_token_address = get_associated_token_address_with_program_id (
192- owner ,
193- mint ,
194- & token_program . unwrap_or ( token :: ID ) ,
195- ) ;
155+ ``` rust
156+ use spl_token :: state :: { TokenAccount , AccountState };
157+ use mollusk_svm_programs_token :: associated_token :: pub fn create_account_for_associated_token_account;
158+
159+ let token_data = TokenAccount {
160+ mint : Pubkey :: new_unique () ,
161+ owner : Pubkey :: new_unique () ,
162+ amount : 1_000_000 ,
163+ delegate : None ,
164+ state : AccountState :: Initialized ,
165+ is_native : None ,
166+ delegated_amount : 0 ,
167+ close_authority : None ,
168+ } ;
196169
197- keyed_account_for_token_account_default (
198- mollusk ,
199- mint ,
200- owner ,
201- amount ,
202- Some (associated_token_address ),
203- Some (token_program . unwrap_or (token :: ID )),
204- )
205- }
170+ let associated_token_account = create_account_for_associated_token_account (token_data )
206171```
207172
173+ > 注意:此示例适用于SPL-Token程序。如果您想创建由Token2022程序拥有的` Associated Token ` 账户,只需使用` create_account_for_associated_token_2022_account ` 函数。
174+
208175<ArticleSection name = " 基准测试计算单元" id = " benchmarking-compute-units" level = " h2" />
209176
210177Mollusk 包含一个专用的计算单元基准测试系统,可以精确测量和跟踪程序的计算效率。` MolluskComputeUnitBencher ` 提供了一个简化的 API,用于创建全面的基准测试,监控不同指令场景下的计算单元消耗。
@@ -458,7 +425,7 @@ use solana_sdk::feature_set::FeatureSet;
458425// Enable all features (latest functionality)
459426mollusk . set_feature_set (FeatureSet :: all_enabled ());
460427
461- // Use default feature set (production-like environment)
428+ // All features disabled
462429mollusk . set_feature_set (FeatureSet :: default ());
463430```
464431
0 commit comments