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::{
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    // Address natives
101    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    // Config
106    pub config_read_setting_impl_cost_params: ConfigReadSettingImplCostParams,
107
108    // Dynamic field natives
109    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    // Event natives
118    pub event_emit_cost_params: EventEmitCostParams,
119
120    // Object
121    pub borrow_uid_cost_params: BorrowUidCostParams,
122    pub delete_impl_cost_params: DeleteImplCostParams,
123    pub record_new_id_cost_params: RecordNewIdCostParams,
124
125    // Transfer
126    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    // TxContext
131    pub tx_context_derive_id_cost_params: TxContextDeriveIdCostParams,
132
133    // Type
134    pub type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams,
135
136    // Validator
137    pub validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams,
138
139    // Crypto natives
140    pub crypto_invalid_arguments_cost: InternalGas,
141    // bls12381
142    pub bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams,
143    pub bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams,
144
145    // ecdsak1
146    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    // ecdsar1
151    pub ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams,
152    pub ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams,
153
154    // ecvrf
155    pub ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams,
156
157    // ed25519
158    pub ed25519_verify_cost_params: Ed25519VerifyCostParams,
159
160    // groth16
161    pub groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams,
162    pub groth16_verify_groth16_proof_internal_cost_params:
163        Groth16VerifyGroth16ProofInternalCostParams,
164
165    // hash
166    pub hash_blake2b256_cost_params: HashBlake2b256CostParams,
167    pub hash_keccak256_cost_params: HashKeccak256CostParams,
168
169    // poseidon
170    pub poseidon_bn254_cost_params: PoseidonBN254CostParams,
171
172    // hmac
173    pub hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams,
174
175    // group ops
176    pub group_ops_cost_params: GroupOpsCostParams,
177
178    // vdf
179    pub vdf_cost_params: VDFCostParams,
180
181    // zklogin
182    pub check_zklogin_id_cost_params: CheckZkloginIdCostParams,
183    pub check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams,
184
185    // Receive object
186    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
307            crypto_invalid_arguments_cost: protocol_config.crypto_invalid_arguments_cost().into(),
308            // ed25519
309            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
321            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
1118// ID { bytes: address }
1119// Extract the first field of the struct to get the address bytes.
1120pub fn get_receiver_object_id(object: Value) -> Result<Value, PartialVMError> {
1121    get_nested_struct_field(object, &[0])
1122}
1123
1124// Object { id: UID { id: ID { bytes: address } } .. }
1125// Extract the first field of the struct 3 times to get the id bytes.
1126pub fn get_object_id(object: Value) -> Result<Value, PartialVMError> {
1127    get_nested_struct_field(object, &[0, 0, 0])
1128}
1129
1130// Extract a field value that's nested inside value `v`. The offset of each
1131// nesting is determined by `offsets`.
1132pub 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
1144/// Returns the struct tag, non-annotated type layout, and fully annotated type
1145/// layout of `ty`.
1146pub(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}