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