iota_move_natives_latest/
lib.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use 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    // Address natives
96    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    // Config
101    pub config_read_setting_impl_cost_params: ConfigReadSettingImplCostParams,
102
103    // Dynamic field natives
104    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    // Event natives
113    pub event_emit_cost_params: EventEmitCostParams,
114
115    // Object
116    pub borrow_uid_cost_params: BorrowUidCostParams,
117    pub delete_impl_cost_params: DeleteImplCostParams,
118    pub record_new_id_cost_params: RecordNewIdCostParams,
119
120    // Transfer
121    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    // TxContext
126    pub tx_context_derive_id_cost_params: TxContextDeriveIdCostParams,
127
128    // Type
129    pub type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams,
130
131    // Validator
132    pub validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams,
133
134    // Crypto natives
135    pub crypto_invalid_arguments_cost: InternalGas,
136    // bls12381
137    pub bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams,
138    pub bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams,
139
140    // ecdsak1
141    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    // ecdsar1
146    pub ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams,
147    pub ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams,
148
149    // ecvrf
150    pub ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams,
151
152    // ed25519
153    pub ed25519_verify_cost_params: Ed25519VerifyCostParams,
154
155    // groth16
156    pub groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams,
157    pub groth16_verify_groth16_proof_internal_cost_params:
158        Groth16VerifyGroth16ProofInternalCostParams,
159
160    // hash
161    pub hash_blake2b256_cost_params: HashBlake2b256CostParams,
162    pub hash_keccak256_cost_params: HashKeccak256CostParams,
163
164    // poseidon
165    pub poseidon_bn254_cost_params: PoseidonBN254CostParams,
166
167    // hmac
168    pub hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams,
169
170    // group ops
171    pub group_ops_cost_params: GroupOpsCostParams,
172
173    // vdf
174    pub vdf_cost_params: VDFCostParams,
175
176    // zklogin
177    pub check_zklogin_id_cost_params: CheckZkloginIdCostParams,
178    pub check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams,
179
180    // Receive object
181    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
302            crypto_invalid_arguments_cost: protocol_config.crypto_invalid_arguments_cost().into(),
303            // ed25519
304            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
316            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
1113// ID { bytes: address }
1114// Extract the first field of the struct to get the address bytes.
1115pub fn get_receiver_object_id(object: Value) -> Result<Value, PartialVMError> {
1116    get_nested_struct_field(object, &[0])
1117}
1118
1119// Object { id: UID { id: ID { bytes: address } } .. }
1120// Extract the first field of the struct 3 times to get the id bytes.
1121pub fn get_object_id(object: Value) -> Result<Value, PartialVMError> {
1122    get_nested_struct_field(object, &[0, 0, 0])
1123}
1124
1125// Extract a field value that's nested inside value `v`. The offset of each
1126// nesting is determined by `offsets`.
1127pub 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
1139/// Returns the struct tag, non-annotated type layout, and fully annotated type
1140/// layout of `ty`.
1141pub(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}