1use std::sync::Arc;
6
7use better_any::{Tid, TidAble};
8use crypto::vdf::{self, VDFCostParams};
9use iota_protocol_config::ProtocolConfig;
10use iota_types::{IOTA_FRAMEWORK_ADDRESS, IOTA_SYSTEM_ADDRESS, MOVE_STDLIB_ADDRESS};
11use move_binary_format::errors::{PartialVMError, PartialVMResult};
12use move_core_types::{
13 annotated_value as A,
14 gas_algebra::InternalGas,
15 identifier::Identifier,
16 language_storage::{StructTag, TypeTag},
17 runtime_value as R,
18 vm_status::StatusCode,
19};
20use move_stdlib_natives::{self as MSN, GasParameters};
21use move_vm_runtime::native_functions::{NativeContext, NativeFunction, NativeFunctionTable};
22use move_vm_types::{
23 loaded_data::runtime_types::Type,
24 natives::function::NativeResult,
25 values::{Struct, Value},
26};
27use transfer::TransferReceiveObjectInternalCostParams;
28
29use self::{
30 address::{AddressFromBytesCostParams, AddressFromU256CostParams, AddressToU256CostParams},
31 config::ConfigReadSettingImplCostParams,
32 crypto::{
33 bls12381,
34 bls12381::{Bls12381Bls12381MinPkVerifyCostParams, Bls12381Bls12381MinSigVerifyCostParams},
35 ecdsa_k1,
36 ecdsa_k1::{
37 EcdsaK1DecompressPubkeyCostParams, EcdsaK1EcrecoverCostParams,
38 EcdsaK1Secp256k1VerifyCostParams,
39 },
40 ecdsa_r1,
41 ecdsa_r1::{EcdsaR1EcrecoverCostParams, EcdsaR1Secp256R1VerifyCostParams},
42 ecvrf,
43 ecvrf::EcvrfEcvrfVerifyCostParams,
44 ed25519,
45 ed25519::Ed25519VerifyCostParams,
46 groth16,
47 groth16::{
48 Groth16PrepareVerifyingKeyCostParams, Groth16VerifyGroth16ProofInternalCostParams,
49 },
50 hash,
51 hash::{HashBlake2b256CostParams, HashKeccak256CostParams},
52 hmac,
53 hmac::HmacHmacSha3256CostParams,
54 poseidon,
55 },
56 dynamic_field::{
57 DynamicFieldAddChildObjectCostParams, DynamicFieldBorrowChildObjectCostParams,
58 DynamicFieldHasChildObjectCostParams, DynamicFieldHasChildObjectWithTyCostParams,
59 DynamicFieldHashTypeAndKeyCostParams, DynamicFieldRemoveChildObjectCostParams,
60 },
61 event::EventEmitCostParams,
62 object::{BorrowUidCostParams, DeleteImplCostParams, RecordNewIdCostParams},
63 transfer::{
64 TransferFreezeObjectCostParams, TransferInternalCostParams, TransferShareObjectCostParams,
65 },
66 tx_context::TxContextDeriveIdCostParams,
67 types::TypesIsOneTimeWitnessCostParams,
68 validator::ValidatorValidateMetadataBcsCostParams,
69};
70use crate::crypto::{
71 group_ops,
72 group_ops::GroupOpsCostParams,
73 poseidon::PoseidonBN254CostParams,
74 zklogin,
75 zklogin::{CheckZkloginIdCostParams, CheckZkloginIssuerCostParams},
76};
77
78mod address;
79mod config;
80mod crypto;
81mod dynamic_field;
82mod event;
83mod object;
84pub mod object_runtime;
85mod random;
86pub mod test_scenario;
87mod test_utils;
88mod transfer;
89mod tx_context;
90mod types;
91mod validator;
92
93#[derive(Tid)]
94pub struct NativesCostTable {
95 pub address_from_bytes_cost_params: AddressFromBytesCostParams,
97 pub address_to_u256_cost_params: AddressToU256CostParams,
98 pub address_from_u256_cost_params: AddressFromU256CostParams,
99
100 pub config_read_setting_impl_cost_params: ConfigReadSettingImplCostParams,
102
103 pub dynamic_field_hash_type_and_key_cost_params: DynamicFieldHashTypeAndKeyCostParams,
105 pub dynamic_field_add_child_object_cost_params: DynamicFieldAddChildObjectCostParams,
106 pub dynamic_field_borrow_child_object_cost_params: DynamicFieldBorrowChildObjectCostParams,
107 pub dynamic_field_remove_child_object_cost_params: DynamicFieldRemoveChildObjectCostParams,
108 pub dynamic_field_has_child_object_cost_params: DynamicFieldHasChildObjectCostParams,
109 pub dynamic_field_has_child_object_with_ty_cost_params:
110 DynamicFieldHasChildObjectWithTyCostParams,
111
112 pub event_emit_cost_params: EventEmitCostParams,
114
115 pub borrow_uid_cost_params: BorrowUidCostParams,
117 pub delete_impl_cost_params: DeleteImplCostParams,
118 pub record_new_id_cost_params: RecordNewIdCostParams,
119
120 pub transfer_transfer_internal_cost_params: TransferInternalCostParams,
122 pub transfer_freeze_object_cost_params: TransferFreezeObjectCostParams,
123 pub transfer_share_object_cost_params: TransferShareObjectCostParams,
124
125 pub tx_context_derive_id_cost_params: TxContextDeriveIdCostParams,
127
128 pub type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams,
130
131 pub validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams,
133
134 pub crypto_invalid_arguments_cost: InternalGas,
136 pub bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams,
138 pub bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams,
139
140 pub ecdsa_k1_ecrecover_cost_params: EcdsaK1EcrecoverCostParams,
142 pub ecdsa_k1_decompress_pubkey_cost_params: EcdsaK1DecompressPubkeyCostParams,
143 pub ecdsa_k1_secp256k1_verify_cost_params: EcdsaK1Secp256k1VerifyCostParams,
144
145 pub ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams,
147 pub ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams,
148
149 pub ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams,
151
152 pub ed25519_verify_cost_params: Ed25519VerifyCostParams,
154
155 pub groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams,
157 pub groth16_verify_groth16_proof_internal_cost_params:
158 Groth16VerifyGroth16ProofInternalCostParams,
159
160 pub hash_blake2b256_cost_params: HashBlake2b256CostParams,
162 pub hash_keccak256_cost_params: HashKeccak256CostParams,
163
164 pub poseidon_bn254_cost_params: PoseidonBN254CostParams,
166
167 pub hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams,
169
170 pub group_ops_cost_params: GroupOpsCostParams,
172
173 pub vdf_cost_params: VDFCostParams,
175
176 pub check_zklogin_id_cost_params: CheckZkloginIdCostParams,
178 pub check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams,
179
180 pub transfer_receive_object_internal_cost_params: TransferReceiveObjectInternalCostParams,
182}
183
184impl NativesCostTable {
185 pub fn from_protocol_config(protocol_config: &ProtocolConfig) -> NativesCostTable {
186 Self {
187 address_from_bytes_cost_params: AddressFromBytesCostParams {
188 address_from_bytes_cost_base: protocol_config.address_from_bytes_cost_base().into(),
189 },
190 address_to_u256_cost_params: AddressToU256CostParams {
191 address_to_u256_cost_base: protocol_config.address_to_u256_cost_base().into(),
192 },
193 address_from_u256_cost_params: AddressFromU256CostParams {
194 address_from_u256_cost_base: protocol_config.address_from_u256_cost_base().into(),
195 },
196
197 config_read_setting_impl_cost_params: ConfigReadSettingImplCostParams {
198 config_read_setting_impl_cost_base: protocol_config
199 .config_read_setting_impl_cost_base_as_option()
200 .map(Into::into),
201 config_read_setting_impl_cost_per_byte: protocol_config
202 .config_read_setting_impl_cost_per_byte_as_option()
203 .map(Into::into),
204 },
205
206 dynamic_field_hash_type_and_key_cost_params: DynamicFieldHashTypeAndKeyCostParams {
207 dynamic_field_hash_type_and_key_cost_base: protocol_config
208 .dynamic_field_hash_type_and_key_cost_base()
209 .into(),
210 dynamic_field_hash_type_and_key_type_cost_per_byte: protocol_config
211 .dynamic_field_hash_type_and_key_type_cost_per_byte()
212 .into(),
213 dynamic_field_hash_type_and_key_value_cost_per_byte: protocol_config
214 .dynamic_field_hash_type_and_key_value_cost_per_byte()
215 .into(),
216 dynamic_field_hash_type_and_key_type_tag_cost_per_byte: protocol_config
217 .dynamic_field_hash_type_and_key_type_tag_cost_per_byte()
218 .into(),
219 },
220 dynamic_field_add_child_object_cost_params: DynamicFieldAddChildObjectCostParams {
221 dynamic_field_add_child_object_cost_base: protocol_config
222 .dynamic_field_add_child_object_cost_base()
223 .into(),
224 dynamic_field_add_child_object_type_cost_per_byte: protocol_config
225 .dynamic_field_add_child_object_type_cost_per_byte()
226 .into(),
227 dynamic_field_add_child_object_value_cost_per_byte: protocol_config
228 .dynamic_field_add_child_object_value_cost_per_byte()
229 .into(),
230 dynamic_field_add_child_object_struct_tag_cost_per_byte: protocol_config
231 .dynamic_field_add_child_object_struct_tag_cost_per_byte()
232 .into(),
233 },
234 dynamic_field_borrow_child_object_cost_params:
235 DynamicFieldBorrowChildObjectCostParams {
236 dynamic_field_borrow_child_object_cost_base: protocol_config
237 .dynamic_field_borrow_child_object_cost_base()
238 .into(),
239 dynamic_field_borrow_child_object_child_ref_cost_per_byte: protocol_config
240 .dynamic_field_borrow_child_object_child_ref_cost_per_byte()
241 .into(),
242 dynamic_field_borrow_child_object_type_cost_per_byte: protocol_config
243 .dynamic_field_borrow_child_object_type_cost_per_byte()
244 .into(),
245 },
246 dynamic_field_remove_child_object_cost_params:
247 DynamicFieldRemoveChildObjectCostParams {
248 dynamic_field_remove_child_object_cost_base: protocol_config
249 .dynamic_field_remove_child_object_cost_base()
250 .into(),
251 dynamic_field_remove_child_object_child_cost_per_byte: protocol_config
252 .dynamic_field_remove_child_object_child_cost_per_byte()
253 .into(),
254 dynamic_field_remove_child_object_type_cost_per_byte: protocol_config
255 .dynamic_field_remove_child_object_type_cost_per_byte()
256 .into(),
257 },
258 dynamic_field_has_child_object_cost_params: DynamicFieldHasChildObjectCostParams {
259 dynamic_field_has_child_object_cost_base: protocol_config
260 .dynamic_field_has_child_object_cost_base()
261 .into(),
262 },
263 dynamic_field_has_child_object_with_ty_cost_params:
264 DynamicFieldHasChildObjectWithTyCostParams {
265 dynamic_field_has_child_object_with_ty_cost_base: protocol_config
266 .dynamic_field_has_child_object_with_ty_cost_base()
267 .into(),
268 dynamic_field_has_child_object_with_ty_type_cost_per_byte: protocol_config
269 .dynamic_field_has_child_object_with_ty_type_cost_per_byte()
270 .into(),
271 dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: protocol_config
272 .dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte()
273 .into(),
274 },
275
276 event_emit_cost_params: EventEmitCostParams {
277 event_emit_value_size_derivation_cost_per_byte: protocol_config
278 .event_emit_value_size_derivation_cost_per_byte()
279 .into(),
280 event_emit_tag_size_derivation_cost_per_byte: protocol_config
281 .event_emit_tag_size_derivation_cost_per_byte()
282 .into(),
283 event_emit_output_cost_per_byte: protocol_config
284 .event_emit_output_cost_per_byte()
285 .into(),
286 event_emit_cost_base: protocol_config.event_emit_cost_base().into(),
287 },
288
289 borrow_uid_cost_params: BorrowUidCostParams {
290 object_borrow_uid_cost_base: protocol_config.object_borrow_uid_cost_base().into(),
291 },
292 delete_impl_cost_params: DeleteImplCostParams {
293 object_delete_impl_cost_base: protocol_config.object_delete_impl_cost_base().into(),
294 },
295 record_new_id_cost_params: RecordNewIdCostParams {
296 object_record_new_uid_cost_base: protocol_config
297 .object_record_new_uid_cost_base()
298 .into(),
299 },
300
301 crypto_invalid_arguments_cost: protocol_config.crypto_invalid_arguments_cost().into(),
303 ed25519_verify_cost_params: Ed25519VerifyCostParams {
305 ed25519_ed25519_verify_cost_base: protocol_config
306 .ed25519_ed25519_verify_cost_base()
307 .into(),
308 ed25519_ed25519_verify_msg_cost_per_byte: protocol_config
309 .ed25519_ed25519_verify_msg_cost_per_byte()
310 .into(),
311 ed25519_ed25519_verify_msg_cost_per_block: protocol_config
312 .ed25519_ed25519_verify_msg_cost_per_block()
313 .into(),
314 },
315 hash_blake2b256_cost_params: HashBlake2b256CostParams {
317 hash_blake2b256_cost_base: protocol_config.hash_blake2b256_cost_base().into(),
318 hash_blake2b256_data_cost_per_byte: protocol_config
319 .hash_blake2b256_data_cost_per_byte()
320 .into(),
321 hash_blake2b256_data_cost_per_block: protocol_config
322 .hash_blake2b256_data_cost_per_block()
323 .into(),
324 },
325 hash_keccak256_cost_params: HashKeccak256CostParams {
326 hash_keccak256_cost_base: protocol_config.hash_keccak256_cost_base().into(),
327 hash_keccak256_data_cost_per_byte: protocol_config
328 .hash_keccak256_data_cost_per_byte()
329 .into(),
330 hash_keccak256_data_cost_per_block: protocol_config
331 .hash_keccak256_data_cost_per_block()
332 .into(),
333 },
334 transfer_transfer_internal_cost_params: TransferInternalCostParams {
335 transfer_transfer_internal_cost_base: protocol_config
336 .transfer_transfer_internal_cost_base()
337 .into(),
338 },
339 transfer_freeze_object_cost_params: TransferFreezeObjectCostParams {
340 transfer_freeze_object_cost_base: protocol_config
341 .transfer_freeze_object_cost_base()
342 .into(),
343 },
344 transfer_share_object_cost_params: TransferShareObjectCostParams {
345 transfer_share_object_cost_base: protocol_config
346 .transfer_share_object_cost_base()
347 .into(),
348 },
349 tx_context_derive_id_cost_params: TxContextDeriveIdCostParams {
350 tx_context_derive_id_cost_base: protocol_config
351 .tx_context_derive_id_cost_base()
352 .into(),
353 },
354 type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams {
355 types_is_one_time_witness_cost_base: protocol_config
356 .types_is_one_time_witness_cost_base()
357 .into(),
358 types_is_one_time_witness_type_tag_cost_per_byte: protocol_config
359 .types_is_one_time_witness_type_tag_cost_per_byte()
360 .into(),
361 types_is_one_time_witness_type_cost_per_byte: protocol_config
362 .types_is_one_time_witness_type_cost_per_byte()
363 .into(),
364 },
365 validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams {
366 validator_validate_metadata_cost_base: protocol_config
367 .validator_validate_metadata_cost_base()
368 .into(),
369 validator_validate_metadata_data_cost_per_byte: protocol_config
370 .validator_validate_metadata_data_cost_per_byte()
371 .into(),
372 },
373 bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams {
374 bls12381_bls12381_min_sig_verify_cost_base: protocol_config
375 .bls12381_bls12381_min_sig_verify_cost_base()
376 .into(),
377 bls12381_bls12381_min_sig_verify_msg_cost_per_byte: protocol_config
378 .bls12381_bls12381_min_sig_verify_msg_cost_per_byte()
379 .into(),
380 bls12381_bls12381_min_sig_verify_msg_cost_per_block: protocol_config
381 .bls12381_bls12381_min_sig_verify_msg_cost_per_block()
382 .into(),
383 },
384 bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams {
385 bls12381_bls12381_min_pk_verify_cost_base: protocol_config
386 .bls12381_bls12381_min_pk_verify_cost_base()
387 .into(),
388 bls12381_bls12381_min_pk_verify_msg_cost_per_byte: protocol_config
389 .bls12381_bls12381_min_pk_verify_msg_cost_per_byte()
390 .into(),
391 bls12381_bls12381_min_pk_verify_msg_cost_per_block: protocol_config
392 .bls12381_bls12381_min_pk_verify_msg_cost_per_block()
393 .into(),
394 },
395 ecdsa_k1_ecrecover_cost_params: EcdsaK1EcrecoverCostParams {
396 ecdsa_k1_ecrecover_keccak256_cost_base: protocol_config
397 .ecdsa_k1_ecrecover_keccak256_cost_base()
398 .into(),
399 ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: protocol_config
400 .ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte()
401 .into(),
402 ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: protocol_config
403 .ecdsa_k1_ecrecover_keccak256_msg_cost_per_block()
404 .into(),
405 ecdsa_k1_ecrecover_sha256_cost_base: protocol_config
406 .ecdsa_k1_ecrecover_sha256_cost_base()
407 .into(),
408 ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: protocol_config
409 .ecdsa_k1_ecrecover_sha256_msg_cost_per_byte()
410 .into(),
411 ecdsa_k1_ecrecover_sha256_msg_cost_per_block: protocol_config
412 .ecdsa_k1_ecrecover_sha256_msg_cost_per_block()
413 .into(),
414 },
415 ecdsa_k1_decompress_pubkey_cost_params: EcdsaK1DecompressPubkeyCostParams {
416 ecdsa_k1_decompress_pubkey_cost_base: protocol_config
417 .ecdsa_k1_decompress_pubkey_cost_base()
418 .into(),
419 },
420 ecdsa_k1_secp256k1_verify_cost_params: EcdsaK1Secp256k1VerifyCostParams {
421 ecdsa_k1_secp256k1_verify_keccak256_cost_base: protocol_config
422 .ecdsa_k1_secp256k1_verify_keccak256_cost_base()
423 .into(),
424 ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: protocol_config
425 .ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte()
426 .into(),
427 ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: protocol_config
428 .ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block()
429 .into(),
430 ecdsa_k1_secp256k1_verify_sha256_cost_base: protocol_config
431 .ecdsa_k1_secp256k1_verify_sha256_cost_base()
432 .into(),
433 ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: protocol_config
434 .ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte()
435 .into(),
436 ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: protocol_config
437 .ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block()
438 .into(),
439 },
440 ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams {
441 ecdsa_r1_ecrecover_keccak256_cost_base: protocol_config
442 .ecdsa_r1_ecrecover_keccak256_cost_base()
443 .into(),
444 ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: protocol_config
445 .ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte()
446 .into(),
447 ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: protocol_config
448 .ecdsa_r1_ecrecover_keccak256_msg_cost_per_block()
449 .into(),
450 ecdsa_r1_ecrecover_sha256_cost_base: protocol_config
451 .ecdsa_r1_ecrecover_sha256_cost_base()
452 .into(),
453 ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: protocol_config
454 .ecdsa_r1_ecrecover_sha256_msg_cost_per_byte()
455 .into(),
456 ecdsa_r1_ecrecover_sha256_msg_cost_per_block: protocol_config
457 .ecdsa_r1_ecrecover_sha256_msg_cost_per_block()
458 .into(),
459 },
460 ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams {
461 ecdsa_r1_secp256r1_verify_keccak256_cost_base: protocol_config
462 .ecdsa_r1_secp256r1_verify_keccak256_cost_base()
463 .into(),
464 ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: protocol_config
465 .ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte()
466 .into(),
467 ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: protocol_config
468 .ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block()
469 .into(),
470 ecdsa_r1_secp256r1_verify_sha256_cost_base: protocol_config
471 .ecdsa_r1_secp256r1_verify_sha256_cost_base()
472 .into(),
473 ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: protocol_config
474 .ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte()
475 .into(),
476 ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: protocol_config
477 .ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block()
478 .into(),
479 },
480 ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams {
481 ecvrf_ecvrf_verify_cost_base: protocol_config.ecvrf_ecvrf_verify_cost_base().into(),
482 ecvrf_ecvrf_verify_alpha_string_cost_per_byte: protocol_config
483 .ecvrf_ecvrf_verify_alpha_string_cost_per_byte()
484 .into(),
485 ecvrf_ecvrf_verify_alpha_string_cost_per_block: protocol_config
486 .ecvrf_ecvrf_verify_alpha_string_cost_per_block()
487 .into(),
488 },
489 groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams {
490 groth16_prepare_verifying_key_bls12381_cost_base: protocol_config
491 .groth16_prepare_verifying_key_bls12381_cost_base()
492 .into(),
493 groth16_prepare_verifying_key_bn254_cost_base: protocol_config
494 .groth16_prepare_verifying_key_bn254_cost_base()
495 .into(),
496 },
497 groth16_verify_groth16_proof_internal_cost_params:
498 Groth16VerifyGroth16ProofInternalCostParams {
499 groth16_verify_groth16_proof_internal_bls12381_cost_base: protocol_config
500 .groth16_verify_groth16_proof_internal_bls12381_cost_base()
501 .into(),
502 groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input:
503 protocol_config
504 .groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input()
505 .into(),
506 groth16_verify_groth16_proof_internal_bn254_cost_base: protocol_config
507 .groth16_verify_groth16_proof_internal_bn254_cost_base()
508 .into(),
509 groth16_verify_groth16_proof_internal_bn254_cost_per_public_input:
510 protocol_config
511 .groth16_verify_groth16_proof_internal_bn254_cost_per_public_input()
512 .into(),
513 groth16_verify_groth16_proof_internal_public_input_cost_per_byte:
514 protocol_config
515 .groth16_verify_groth16_proof_internal_public_input_cost_per_byte()
516 .into(),
517 },
518 hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams {
519 hmac_hmac_sha3_256_cost_base: protocol_config.hmac_hmac_sha3_256_cost_base().into(),
520 hmac_hmac_sha3_256_input_cost_per_byte: protocol_config
521 .hmac_hmac_sha3_256_input_cost_per_byte()
522 .into(),
523 hmac_hmac_sha3_256_input_cost_per_block: protocol_config
524 .hmac_hmac_sha3_256_input_cost_per_block()
525 .into(),
526 },
527 transfer_receive_object_internal_cost_params: TransferReceiveObjectInternalCostParams {
528 transfer_receive_object_internal_cost_base: protocol_config
529 .transfer_receive_object_cost_base_as_option()
530 .unwrap_or(0)
531 .into(),
532 },
533 check_zklogin_id_cost_params: CheckZkloginIdCostParams {
534 check_zklogin_id_cost_base: protocol_config
535 .check_zklogin_id_cost_base_as_option()
536 .map(Into::into),
537 },
538 check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams {
539 check_zklogin_issuer_cost_base: protocol_config
540 .check_zklogin_issuer_cost_base_as_option()
541 .map(Into::into),
542 },
543 poseidon_bn254_cost_params: PoseidonBN254CostParams {
544 poseidon_bn254_cost_base: protocol_config
545 .poseidon_bn254_cost_base_as_option()
546 .map(Into::into),
547 poseidon_bn254_data_cost_per_block: protocol_config
548 .poseidon_bn254_cost_per_block_as_option()
549 .map(Into::into),
550 },
551 group_ops_cost_params: GroupOpsCostParams {
552 bls12381_decode_scalar_cost: protocol_config
553 .group_ops_bls12381_decode_scalar_cost_as_option()
554 .map(Into::into),
555 bls12381_decode_g1_cost: protocol_config
556 .group_ops_bls12381_decode_g1_cost_as_option()
557 .map(Into::into),
558 bls12381_decode_g2_cost: protocol_config
559 .group_ops_bls12381_decode_g2_cost_as_option()
560 .map(Into::into),
561 bls12381_decode_gt_cost: protocol_config
562 .group_ops_bls12381_decode_gt_cost_as_option()
563 .map(Into::into),
564 bls12381_scalar_add_cost: protocol_config
565 .group_ops_bls12381_scalar_add_cost_as_option()
566 .map(Into::into),
567 bls12381_g1_add_cost: protocol_config
568 .group_ops_bls12381_g1_add_cost_as_option()
569 .map(Into::into),
570 bls12381_g2_add_cost: protocol_config
571 .group_ops_bls12381_g2_add_cost_as_option()
572 .map(Into::into),
573 bls12381_gt_add_cost: protocol_config
574 .group_ops_bls12381_gt_add_cost_as_option()
575 .map(Into::into),
576 bls12381_scalar_sub_cost: protocol_config
577 .group_ops_bls12381_scalar_sub_cost_as_option()
578 .map(Into::into),
579 bls12381_g1_sub_cost: protocol_config
580 .group_ops_bls12381_g1_sub_cost_as_option()
581 .map(Into::into),
582 bls12381_g2_sub_cost: protocol_config
583 .group_ops_bls12381_g2_sub_cost_as_option()
584 .map(Into::into),
585 bls12381_gt_sub_cost: protocol_config
586 .group_ops_bls12381_gt_sub_cost_as_option()
587 .map(Into::into),
588 bls12381_scalar_mul_cost: protocol_config
589 .group_ops_bls12381_scalar_mul_cost_as_option()
590 .map(Into::into),
591 bls12381_g1_mul_cost: protocol_config
592 .group_ops_bls12381_g1_mul_cost_as_option()
593 .map(Into::into),
594 bls12381_g2_mul_cost: protocol_config
595 .group_ops_bls12381_g2_mul_cost_as_option()
596 .map(Into::into),
597 bls12381_gt_mul_cost: protocol_config
598 .group_ops_bls12381_gt_mul_cost_as_option()
599 .map(Into::into),
600 bls12381_scalar_div_cost: protocol_config
601 .group_ops_bls12381_scalar_div_cost_as_option()
602 .map(Into::into),
603 bls12381_g1_div_cost: protocol_config
604 .group_ops_bls12381_g1_div_cost_as_option()
605 .map(Into::into),
606 bls12381_g2_div_cost: protocol_config
607 .group_ops_bls12381_g2_div_cost_as_option()
608 .map(Into::into),
609 bls12381_gt_div_cost: protocol_config
610 .group_ops_bls12381_gt_div_cost_as_option()
611 .map(Into::into),
612 bls12381_g1_hash_to_base_cost: protocol_config
613 .group_ops_bls12381_g1_hash_to_base_cost_as_option()
614 .map(Into::into),
615 bls12381_g2_hash_to_base_cost: protocol_config
616 .group_ops_bls12381_g2_hash_to_base_cost_as_option()
617 .map(Into::into),
618 bls12381_g1_hash_to_cost_per_byte: protocol_config
619 .group_ops_bls12381_g1_hash_to_cost_per_byte_as_option()
620 .map(Into::into),
621 bls12381_g2_hash_to_cost_per_byte: protocol_config
622 .group_ops_bls12381_g2_hash_to_cost_per_byte_as_option()
623 .map(Into::into),
624 bls12381_g1_msm_base_cost: protocol_config
625 .group_ops_bls12381_g1_msm_base_cost_as_option()
626 .map(Into::into),
627 bls12381_g2_msm_base_cost: protocol_config
628 .group_ops_bls12381_g2_msm_base_cost_as_option()
629 .map(Into::into),
630 bls12381_g1_msm_base_cost_per_input: protocol_config
631 .group_ops_bls12381_g1_msm_base_cost_per_input_as_option()
632 .map(Into::into),
633 bls12381_g2_msm_base_cost_per_input: protocol_config
634 .group_ops_bls12381_g2_msm_base_cost_per_input_as_option()
635 .map(Into::into),
636 bls12381_msm_max_len: protocol_config.group_ops_bls12381_msm_max_len_as_option(),
637 bls12381_pairing_cost: protocol_config
638 .group_ops_bls12381_pairing_cost_as_option()
639 .map(Into::into),
640 bls12381_g1_to_uncompressed_g1_cost: protocol_config
641 .group_ops_bls12381_g1_to_uncompressed_g1_cost_as_option()
642 .map(Into::into),
643 bls12381_uncompressed_g1_to_g1_cost: protocol_config
644 .group_ops_bls12381_uncompressed_g1_to_g1_cost_as_option()
645 .map(Into::into),
646 bls12381_uncompressed_g1_sum_base_cost: protocol_config
647 .group_ops_bls12381_uncompressed_g1_sum_base_cost_as_option()
648 .map(Into::into),
649 bls12381_uncompressed_g1_sum_cost_per_term: protocol_config
650 .group_ops_bls12381_uncompressed_g1_sum_cost_per_term_as_option()
651 .map(Into::into),
652 bls12381_uncompressed_g1_sum_max_terms: protocol_config
653 .group_ops_bls12381_uncompressed_g1_sum_max_terms_as_option(),
654 },
655 vdf_cost_params: VDFCostParams {
656 vdf_verify_cost: protocol_config
657 .vdf_verify_vdf_cost_as_option()
658 .map(Into::into),
659 hash_to_input_cost: protocol_config
660 .vdf_hash_to_input_cost_as_option()
661 .map(Into::into),
662 },
663 }
664 }
665}
666
667pub fn make_stdlib_gas_params_for_protocol_config(
668 protocol_config: &ProtocolConfig,
669) -> GasParameters {
670 macro_rules! get_gas_cost_or_default {
671 ($name: ident) => {{
672 debug_assert!(
673 protocol_config.version.as_u64() < 53 || protocol_config.$name().is_some()
674 );
675 protocol_config.$name().map(Into::into).unwrap_or(0.into())
676 }};
677 }
678 GasParameters::new(
679 MSN::bcs::GasParameters {
680 to_bytes: MSN::bcs::ToBytesGasParameters {
681 per_byte_serialized: get_gas_cost_or_default!(
682 bcs_per_byte_serialized_cost_as_option
683 ),
684 legacy_min_output_size: get_gas_cost_or_default!(
685 bcs_legacy_min_output_size_cost_as_option
686 ),
687 failure: get_gas_cost_or_default!(bcs_failure_cost_as_option),
688 },
689 },
690 MSN::debug::GasParameters {
691 print: MSN::debug::PrintGasParameters {
692 base_cost: get_gas_cost_or_default!(debug_print_base_cost_as_option),
693 },
694 print_stack_trace: MSN::debug::PrintStackTraceGasParameters {
695 base_cost: get_gas_cost_or_default!(debug_print_stack_trace_base_cost_as_option),
696 },
697 },
698 MSN::hash::GasParameters {
699 sha2_256: MSN::hash::Sha2_256GasParameters {
700 base: get_gas_cost_or_default!(hash_sha2_256_base_cost_as_option),
701 per_byte: get_gas_cost_or_default!(hash_sha2_256_per_byte_cost_as_option),
702 legacy_min_input_len: get_gas_cost_or_default!(
703 hash_sha2_256_legacy_min_input_len_cost_as_option
704 ),
705 },
706 sha3_256: MSN::hash::Sha3_256GasParameters {
707 base: get_gas_cost_or_default!(hash_sha3_256_base_cost_as_option),
708 per_byte: get_gas_cost_or_default!(hash_sha3_256_per_byte_cost_as_option),
709 legacy_min_input_len: get_gas_cost_or_default!(
710 hash_sha3_256_legacy_min_input_len_cost_as_option
711 ),
712 },
713 },
714 MSN::string::GasParameters {
715 check_utf8: MSN::string::CheckUtf8GasParameters {
716 base: get_gas_cost_or_default!(string_check_utf8_base_cost_as_option),
717 per_byte: get_gas_cost_or_default!(string_check_utf8_per_byte_cost_as_option),
718 },
719 is_char_boundary: MSN::string::IsCharBoundaryGasParameters {
720 base: get_gas_cost_or_default!(string_is_char_boundary_base_cost_as_option),
721 },
722 sub_string: MSN::string::SubStringGasParameters {
723 base: get_gas_cost_or_default!(string_sub_string_base_cost_as_option),
724 per_byte: get_gas_cost_or_default!(string_sub_string_per_byte_cost_as_option),
725 },
726 index_of: MSN::string::IndexOfGasParameters {
727 base: get_gas_cost_or_default!(string_index_of_base_cost_as_option),
728 per_byte_pattern: get_gas_cost_or_default!(
729 string_index_of_per_byte_pattern_cost_as_option
730 ),
731 per_byte_searched: get_gas_cost_or_default!(
732 string_index_of_per_byte_searched_cost_as_option
733 ),
734 },
735 },
736 MSN::type_name::GasParameters {
737 get: MSN::type_name::GetGasParameters {
738 base: get_gas_cost_or_default!(type_name_get_base_cost_as_option),
739 per_byte: get_gas_cost_or_default!(type_name_get_per_byte_cost_as_option),
740 },
741 },
742 MSN::vector::GasParameters {
743 empty: MSN::vector::EmptyGasParameters {
744 base: get_gas_cost_or_default!(vector_empty_base_cost_as_option),
745 },
746 length: MSN::vector::LengthGasParameters {
747 base: get_gas_cost_or_default!(vector_length_base_cost_as_option),
748 },
749 push_back: MSN::vector::PushBackGasParameters {
750 base: get_gas_cost_or_default!(vector_push_back_base_cost_as_option),
751 legacy_per_abstract_memory_unit: get_gas_cost_or_default!(
752 vector_push_back_legacy_per_abstract_memory_unit_cost_as_option
753 ),
754 },
755 borrow: MSN::vector::BorrowGasParameters {
756 base: get_gas_cost_or_default!(vector_borrow_base_cost_as_option),
757 },
758 pop_back: MSN::vector::PopBackGasParameters {
759 base: get_gas_cost_or_default!(vector_pop_back_base_cost_as_option),
760 },
761 destroy_empty: MSN::vector::DestroyEmptyGasParameters {
762 base: get_gas_cost_or_default!(vector_destroy_empty_base_cost_as_option),
763 },
764 swap: MSN::vector::SwapGasParameters {
765 base: get_gas_cost_or_default!(vector_swap_base_cost_as_option),
766 },
767 },
768 )
769}
770
771pub fn all_natives(silent: bool, protocol_config: &ProtocolConfig) -> NativeFunctionTable {
772 let iota_framework_natives: &[(&str, &str, NativeFunction)] = &[
773 ("address", "from_bytes", make_native!(address::from_bytes)),
774 ("address", "to_u256", make_native!(address::to_u256)),
775 ("address", "from_u256", make_native!(address::from_u256)),
776 ("hash", "blake2b256", make_native!(hash::blake2b256)),
777 (
778 "bls12381",
779 "bls12381_min_sig_verify",
780 make_native!(bls12381::bls12381_min_sig_verify),
781 ),
782 (
783 "bls12381",
784 "bls12381_min_pk_verify",
785 make_native!(bls12381::bls12381_min_pk_verify),
786 ),
787 (
788 "dynamic_field",
789 "hash_type_and_key",
790 make_native!(dynamic_field::hash_type_and_key),
791 ),
792 (
793 "config",
794 "read_setting_impl",
795 make_native!(config::read_setting_impl),
796 ),
797 (
798 "dynamic_field",
799 "add_child_object",
800 make_native!(dynamic_field::add_child_object),
801 ),
802 (
803 "dynamic_field",
804 "borrow_child_object",
805 make_native!(dynamic_field::borrow_child_object),
806 ),
807 (
808 "dynamic_field",
809 "borrow_child_object_mut",
810 make_native!(dynamic_field::borrow_child_object),
811 ),
812 (
813 "dynamic_field",
814 "remove_child_object",
815 make_native!(dynamic_field::remove_child_object),
816 ),
817 (
818 "dynamic_field",
819 "has_child_object",
820 make_native!(dynamic_field::has_child_object),
821 ),
822 (
823 "dynamic_field",
824 "has_child_object_with_ty",
825 make_native!(dynamic_field::has_child_object_with_ty),
826 ),
827 (
828 "ecdsa_k1",
829 "secp256k1_ecrecover",
830 make_native!(ecdsa_k1::ecrecover),
831 ),
832 (
833 "ecdsa_k1",
834 "decompress_pubkey",
835 make_native!(ecdsa_k1::decompress_pubkey),
836 ),
837 (
838 "ecdsa_k1",
839 "secp256k1_verify",
840 make_native!(ecdsa_k1::secp256k1_verify),
841 ),
842 ("ecvrf", "ecvrf_verify", make_native!(ecvrf::ecvrf_verify)),
843 (
844 "ecdsa_r1",
845 "secp256r1_ecrecover",
846 make_native!(ecdsa_r1::ecrecover),
847 ),
848 (
849 "ecdsa_r1",
850 "secp256r1_verify",
851 make_native!(ecdsa_r1::secp256r1_verify),
852 ),
853 (
854 "ed25519",
855 "ed25519_verify",
856 make_native!(ed25519::ed25519_verify),
857 ),
858 ("event", "emit", make_native!(event::emit)),
859 (
860 "event",
861 "events_by_type",
862 make_native!(event::get_events_by_type),
863 ),
864 ("event", "num_events", make_native!(event::num_events)),
865 (
866 "groth16",
867 "verify_groth16_proof_internal",
868 make_native!(groth16::verify_groth16_proof_internal),
869 ),
870 (
871 "groth16",
872 "prepare_verifying_key_internal",
873 make_native!(groth16::prepare_verifying_key_internal),
874 ),
875 ("hmac", "hmac_sha3_256", make_native!(hmac::hmac_sha3_256)),
876 ("hash", "keccak256", make_native!(hash::keccak256)),
877 (
878 "group_ops",
879 "internal_validate",
880 make_native!(group_ops::internal_validate),
881 ),
882 (
883 "group_ops",
884 "internal_add",
885 make_native!(group_ops::internal_add),
886 ),
887 (
888 "group_ops",
889 "internal_sub",
890 make_native!(group_ops::internal_sub),
891 ),
892 (
893 "group_ops",
894 "internal_mul",
895 make_native!(group_ops::internal_mul),
896 ),
897 (
898 "group_ops",
899 "internal_div",
900 make_native!(group_ops::internal_div),
901 ),
902 (
903 "group_ops",
904 "internal_hash_to",
905 make_native!(group_ops::internal_hash_to),
906 ),
907 (
908 "group_ops",
909 "internal_multi_scalar_mul",
910 make_native!(group_ops::internal_multi_scalar_mul),
911 ),
912 (
913 "group_ops",
914 "internal_pairing",
915 make_native!(group_ops::internal_pairing),
916 ),
917 (
918 "group_ops",
919 "internal_convert",
920 make_native!(group_ops::internal_convert),
921 ),
922 (
923 "group_ops",
924 "internal_sum",
925 make_native!(group_ops::internal_sum),
926 ),
927 ("object", "delete_impl", make_native!(object::delete_impl)),
928 ("object", "borrow_uid", make_native!(object::borrow_uid)),
929 (
930 "object",
931 "record_new_uid",
932 make_native!(object::record_new_uid),
933 ),
934 (
935 "test_scenario",
936 "take_from_address_by_id",
937 make_native!(test_scenario::take_from_address_by_id),
938 ),
939 (
940 "test_scenario",
941 "most_recent_id_for_address",
942 make_native!(test_scenario::most_recent_id_for_address),
943 ),
944 (
945 "test_scenario",
946 "was_taken_from_address",
947 make_native!(test_scenario::was_taken_from_address),
948 ),
949 (
950 "test_scenario",
951 "take_immutable_by_id",
952 make_native!(test_scenario::take_immutable_by_id),
953 ),
954 (
955 "test_scenario",
956 "most_recent_immutable_id",
957 make_native!(test_scenario::most_recent_immutable_id),
958 ),
959 (
960 "test_scenario",
961 "was_taken_immutable",
962 make_native!(test_scenario::was_taken_immutable),
963 ),
964 (
965 "test_scenario",
966 "take_shared_by_id",
967 make_native!(test_scenario::take_shared_by_id),
968 ),
969 (
970 "test_scenario",
971 "most_recent_id_shared",
972 make_native!(test_scenario::most_recent_id_shared),
973 ),
974 (
975 "test_scenario",
976 "was_taken_shared",
977 make_native!(test_scenario::was_taken_shared),
978 ),
979 (
980 "test_scenario",
981 "end_transaction",
982 make_native!(test_scenario::end_transaction),
983 ),
984 (
985 "test_scenario",
986 "ids_for_address",
987 make_native!(test_scenario::ids_for_address),
988 ),
989 (
990 "test_scenario",
991 "allocate_receiving_ticket_for_object",
992 make_native!(test_scenario::allocate_receiving_ticket_for_object),
993 ),
994 (
995 "test_scenario",
996 "deallocate_receiving_ticket_for_object",
997 make_native!(test_scenario::deallocate_receiving_ticket_for_object),
998 ),
999 (
1000 "transfer",
1001 "transfer_impl",
1002 make_native!(transfer::transfer_internal),
1003 ),
1004 (
1005 "transfer",
1006 "freeze_object_impl",
1007 make_native!(transfer::freeze_object),
1008 ),
1009 (
1010 "transfer",
1011 "share_object_impl",
1012 make_native!(transfer::share_object),
1013 ),
1014 (
1015 "transfer",
1016 "receive_impl",
1017 make_native!(transfer::receive_object_internal),
1018 ),
1019 (
1020 "tx_context",
1021 "derive_id",
1022 make_native!(tx_context::derive_id),
1023 ),
1024 (
1025 "types",
1026 "is_one_time_witness",
1027 make_native!(types::is_one_time_witness),
1028 ),
1029 ("test_utils", "destroy", make_native!(test_utils::destroy)),
1030 (
1031 "test_utils",
1032 "create_one_time_witness",
1033 make_native!(test_utils::create_one_time_witness),
1034 ),
1035 (
1036 "random",
1037 "generate_rand_seed_for_testing",
1038 make_native!(random::generate_rand_seed_for_testing),
1039 ),
1040 (
1041 "zklogin_verified_id",
1042 "check_zklogin_id_internal",
1043 make_native!(zklogin::check_zklogin_id_internal),
1044 ),
1045 (
1046 "zklogin_verified_issuer",
1047 "check_zklogin_issuer_internal",
1048 make_native!(zklogin::check_zklogin_issuer_internal),
1049 ),
1050 (
1051 "poseidon",
1052 "poseidon_bn254_internal",
1053 make_native!(poseidon::poseidon_bn254_internal),
1054 ),
1055 (
1056 "vdf",
1057 "vdf_verify_internal",
1058 make_native!(vdf::vdf_verify_internal),
1059 ),
1060 (
1061 "vdf",
1062 "hash_to_input_internal",
1063 make_native!(vdf::hash_to_input_internal),
1064 ),
1065 (
1066 "ecdsa_k1",
1067 "secp256k1_sign",
1068 make_native!(ecdsa_k1::secp256k1_sign),
1069 ),
1070 (
1071 "ecdsa_k1",
1072 "secp256k1_keypair_from_seed",
1073 make_native!(ecdsa_k1::secp256k1_keypair_from_seed),
1074 ),
1075 ];
1076 let iota_framework_natives_iter =
1077 iota_framework_natives
1078 .iter()
1079 .cloned()
1080 .map(|(module_name, func_name, func)| {
1081 (
1082 IOTA_FRAMEWORK_ADDRESS,
1083 Identifier::new(module_name).unwrap(),
1084 Identifier::new(func_name).unwrap(),
1085 func,
1086 )
1087 });
1088 let iota_system_natives: &[(&str, &str, NativeFunction)] = &[(
1089 "validator",
1090 "validate_metadata_bcs",
1091 make_native!(validator::validate_metadata_bcs),
1092 )];
1093 iota_system_natives
1094 .iter()
1095 .cloned()
1096 .map(|(module_name, func_name, func)| {
1097 (
1098 IOTA_SYSTEM_ADDRESS,
1099 Identifier::new(module_name).unwrap(),
1100 Identifier::new(func_name).unwrap(),
1101 func,
1102 )
1103 })
1104 .chain(iota_framework_natives_iter)
1105 .chain(move_stdlib_natives::all_natives(
1106 MOVE_STDLIB_ADDRESS,
1107 make_stdlib_gas_params_for_protocol_config(protocol_config),
1108 silent,
1109 ))
1110 .collect()
1111}
1112
1113pub fn get_receiver_object_id(object: Value) -> Result<Value, PartialVMError> {
1116 get_nested_struct_field(object, &[0])
1117}
1118
1119pub fn get_object_id(object: Value) -> Result<Value, PartialVMError> {
1122 get_nested_struct_field(object, &[0, 0, 0])
1123}
1124
1125pub fn get_nested_struct_field(mut v: Value, offsets: &[usize]) -> Result<Value, PartialVMError> {
1128 for offset in offsets {
1129 v = get_nth_struct_field(v, *offset)?;
1130 }
1131 Ok(v)
1132}
1133
1134pub fn get_nth_struct_field(v: Value, n: usize) -> Result<Value, PartialVMError> {
1135 let mut itr = v.value_as::<Struct>()?.unpack()?;
1136 Ok(itr.nth(n).unwrap())
1137}
1138
1139pub(crate) fn get_tag_and_layouts(
1142 context: &NativeContext,
1143 ty: &Type,
1144) -> PartialVMResult<Option<(StructTag, R::MoveTypeLayout, A::MoveTypeLayout)>> {
1145 let tag = match context.type_to_type_tag(ty)? {
1146 TypeTag::Struct(s) => s,
1147 _ => {
1148 return Err(
1149 PartialVMError::new(StatusCode::UNKNOWN_INVARIANT_VIOLATION_ERROR)
1150 .with_message("IOTA verifier guarantees this is a struct".to_string()),
1151 );
1152 }
1153 };
1154 let Some(layout) = context.type_to_type_layout(ty)? else {
1155 return Ok(None);
1156 };
1157 let Some(annotated_layout) = context.type_to_fully_annotated_layout(ty)? else {
1158 return Ok(None);
1159 };
1160 Ok(Some((*tag, layout, annotated_layout)))
1161}
1162
1163#[macro_export]
1164macro_rules! make_native {
1165 ($native: expr) => {
1166 Arc::new(
1167 move |context, ty_args, args| -> PartialVMResult<NativeResult> {
1168 $native(context, ty_args, args)
1169 },
1170 )
1171 };
1172}
1173
1174pub(crate) fn legacy_test_cost() -> InternalGas {
1175 InternalGas::new(0)
1176}