sui_move_natives_v2/
lib.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4use self::{
5    address::{AddressFromBytesCostParams, AddressFromU256CostParams, AddressToU256CostParams},
6    crypto::{bls12381, ecdsa_k1, ecdsa_r1, ecvrf, ed25519, groth16, hash, hmac},
7    crypto::{
8        bls12381::{Bls12381Bls12381MinPkVerifyCostParams, Bls12381Bls12381MinSigVerifyCostParams},
9        ecdsa_k1::{
10            EcdsaK1DecompressPubkeyCostParams, EcdsaK1EcrecoverCostParams,
11            EcdsaK1Secp256k1VerifyCostParams,
12        },
13        ecdsa_r1::{EcdsaR1EcrecoverCostParams, EcdsaR1Secp256R1VerifyCostParams},
14        ecvrf::EcvrfEcvrfVerifyCostParams,
15        ed25519::Ed25519VerifyCostParams,
16        groth16::{
17            Groth16PrepareVerifyingKeyCostParams, Groth16VerifyGroth16ProofInternalCostParams,
18        },
19        hash::{HashBlake2b256CostParams, HashKeccak256CostParams},
20        hmac::HmacHmacSha3256CostParams,
21        poseidon,
22    },
23    dynamic_field::{
24        DynamicFieldAddChildObjectCostParams, DynamicFieldBorrowChildObjectCostParams,
25        DynamicFieldHasChildObjectCostParams, DynamicFieldHasChildObjectWithTyCostParams,
26        DynamicFieldHashTypeAndKeyCostParams, DynamicFieldRemoveChildObjectCostParams,
27    },
28    event::EventEmitCostParams,
29    object::{BorrowUidCostParams, DeleteImplCostParams, RecordNewIdCostParams},
30    transfer::{
31        TransferFreezeObjectCostParams, TransferInternalCostParams, TransferShareObjectCostParams,
32    },
33    tx_context::TxContextDeriveIdCostParams,
34    types::TypesIsOneTimeWitnessCostParams,
35    validator::ValidatorValidateMetadataBcsCostParams,
36};
37use crate::crypto::group_ops;
38use crate::crypto::group_ops::GroupOpsCostParams;
39use crate::crypto::poseidon::PoseidonBN254CostParams;
40use crate::crypto::zklogin;
41use crate::crypto::zklogin::{CheckZkloginIdCostParams, CheckZkloginIssuerCostParams};
42use better_any::{Tid, TidAble};
43use move_binary_format::errors::{PartialVMError, PartialVMResult};
44use move_core_types::{
45    annotated_value as A,
46    gas_algebra::InternalGas,
47    identifier::Identifier,
48    language_storage::{StructTag, TypeTag},
49    runtime_value as R,
50    vm_status::StatusCode,
51};
52use move_stdlib_natives::{GasParameters, NurseryGasParameters};
53use move_vm_runtime::native_functions::{NativeContext, NativeFunction, NativeFunctionTable};
54use move_vm_types::{
55    loaded_data::runtime_types::Type,
56    natives::function::NativeResult,
57    values::{Struct, Value},
58};
59use std::sync::Arc;
60use sui_protocol_config::ProtocolConfig;
61use sui_types::{MOVE_STDLIB_ADDRESS, SUI_FRAMEWORK_ADDRESS, SUI_SYSTEM_ADDRESS};
62use transfer::TransferReceiveObjectInternalCostParams;
63
64mod address;
65mod crypto;
66mod dynamic_field;
67mod event;
68mod object;
69pub mod object_runtime;
70mod test_scenario;
71mod test_utils;
72mod transfer;
73mod tx_context;
74mod types;
75mod validator;
76
77#[derive(Tid)]
78pub struct NativesCostTable {
79    // Address natives
80    pub address_from_bytes_cost_params: AddressFromBytesCostParams,
81    pub address_to_u256_cost_params: AddressToU256CostParams,
82    pub address_from_u256_cost_params: AddressFromU256CostParams,
83
84    // Dynamic field natives
85    pub dynamic_field_hash_type_and_key_cost_params: DynamicFieldHashTypeAndKeyCostParams,
86    pub dynamic_field_add_child_object_cost_params: DynamicFieldAddChildObjectCostParams,
87    pub dynamic_field_borrow_child_object_cost_params: DynamicFieldBorrowChildObjectCostParams,
88    pub dynamic_field_remove_child_object_cost_params: DynamicFieldRemoveChildObjectCostParams,
89    pub dynamic_field_has_child_object_cost_params: DynamicFieldHasChildObjectCostParams,
90    pub dynamic_field_has_child_object_with_ty_cost_params:
91        DynamicFieldHasChildObjectWithTyCostParams,
92
93    // Event natives
94    pub event_emit_cost_params: EventEmitCostParams,
95
96    // Object
97    pub borrow_uid_cost_params: BorrowUidCostParams,
98    pub delete_impl_cost_params: DeleteImplCostParams,
99    pub record_new_id_cost_params: RecordNewIdCostParams,
100
101    // Transfer
102    pub transfer_transfer_internal_cost_params: TransferInternalCostParams,
103    pub transfer_freeze_object_cost_params: TransferFreezeObjectCostParams,
104    pub transfer_share_object_cost_params: TransferShareObjectCostParams,
105
106    // TxContext
107    pub tx_context_derive_id_cost_params: TxContextDeriveIdCostParams,
108
109    // Type
110    pub type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams,
111
112    // Validator
113    pub validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams,
114
115    // Crypto natives
116    pub crypto_invalid_arguments_cost: InternalGas,
117    // bls12381
118    pub bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams,
119    pub bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams,
120
121    // ecdsak1
122    pub ecdsa_k1_ecrecover_cost_params: EcdsaK1EcrecoverCostParams,
123    pub ecdsa_k1_decompress_pubkey_cost_params: EcdsaK1DecompressPubkeyCostParams,
124    pub ecdsa_k1_secp256k1_verify_cost_params: EcdsaK1Secp256k1VerifyCostParams,
125
126    // ecdsar1
127    pub ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams,
128    pub ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams,
129
130    // ecvrf
131    pub ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams,
132
133    // ed25519
134    pub ed25519_verify_cost_params: Ed25519VerifyCostParams,
135
136    // groth16
137    pub groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams,
138    pub groth16_verify_groth16_proof_internal_cost_params:
139        Groth16VerifyGroth16ProofInternalCostParams,
140
141    // hash
142    pub hash_blake2b256_cost_params: HashBlake2b256CostParams,
143    pub hash_keccak256_cost_params: HashKeccak256CostParams,
144
145    // poseidon
146    pub poseidon_bn254_cost_params: PoseidonBN254CostParams,
147
148    // hmac
149    pub hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams,
150
151    // group ops
152    pub group_ops_cost_params: GroupOpsCostParams,
153
154    // zklogin
155    pub check_zklogin_id_cost_params: CheckZkloginIdCostParams,
156    pub check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams,
157
158    // Receive object
159    pub transfer_receive_object_internal_cost_params: TransferReceiveObjectInternalCostParams,
160}
161
162impl NativesCostTable {
163    pub fn from_protocol_config(protocol_config: &ProtocolConfig) -> NativesCostTable {
164        Self {
165            address_from_bytes_cost_params: AddressFromBytesCostParams {
166                address_from_bytes_cost_base: protocol_config.address_from_bytes_cost_base().into(),
167            },
168            address_to_u256_cost_params: AddressToU256CostParams {
169                address_to_u256_cost_base: protocol_config.address_to_u256_cost_base().into(),
170            },
171            address_from_u256_cost_params: AddressFromU256CostParams {
172                address_from_u256_cost_base: protocol_config.address_from_u256_cost_base().into(),
173            },
174
175            dynamic_field_hash_type_and_key_cost_params: DynamicFieldHashTypeAndKeyCostParams {
176                dynamic_field_hash_type_and_key_cost_base: protocol_config
177                    .dynamic_field_hash_type_and_key_cost_base()
178                    .into(),
179                dynamic_field_hash_type_and_key_type_cost_per_byte: protocol_config
180                    .dynamic_field_hash_type_and_key_type_cost_per_byte()
181                    .into(),
182                dynamic_field_hash_type_and_key_value_cost_per_byte: protocol_config
183                    .dynamic_field_hash_type_and_key_value_cost_per_byte()
184                    .into(),
185                dynamic_field_hash_type_and_key_type_tag_cost_per_byte: protocol_config
186                    .dynamic_field_hash_type_and_key_type_tag_cost_per_byte()
187                    .into(),
188            },
189            dynamic_field_add_child_object_cost_params: DynamicFieldAddChildObjectCostParams {
190                dynamic_field_add_child_object_cost_base: protocol_config
191                    .dynamic_field_add_child_object_cost_base()
192                    .into(),
193                dynamic_field_add_child_object_type_cost_per_byte: protocol_config
194                    .dynamic_field_add_child_object_type_cost_per_byte()
195                    .into(),
196                dynamic_field_add_child_object_value_cost_per_byte: protocol_config
197                    .dynamic_field_add_child_object_value_cost_per_byte()
198                    .into(),
199                dynamic_field_add_child_object_struct_tag_cost_per_byte: protocol_config
200                    .dynamic_field_add_child_object_struct_tag_cost_per_byte()
201                    .into(),
202            },
203            dynamic_field_borrow_child_object_cost_params:
204                DynamicFieldBorrowChildObjectCostParams {
205                    dynamic_field_borrow_child_object_cost_base: protocol_config
206                        .dynamic_field_borrow_child_object_cost_base()
207                        .into(),
208                    dynamic_field_borrow_child_object_child_ref_cost_per_byte: protocol_config
209                        .dynamic_field_borrow_child_object_child_ref_cost_per_byte()
210                        .into(),
211                    dynamic_field_borrow_child_object_type_cost_per_byte: protocol_config
212                        .dynamic_field_borrow_child_object_type_cost_per_byte()
213                        .into(),
214                },
215            dynamic_field_remove_child_object_cost_params:
216                DynamicFieldRemoveChildObjectCostParams {
217                    dynamic_field_remove_child_object_cost_base: protocol_config
218                        .dynamic_field_remove_child_object_cost_base()
219                        .into(),
220                    dynamic_field_remove_child_object_child_cost_per_byte: protocol_config
221                        .dynamic_field_remove_child_object_child_cost_per_byte()
222                        .into(),
223                    dynamic_field_remove_child_object_type_cost_per_byte: protocol_config
224                        .dynamic_field_remove_child_object_type_cost_per_byte()
225                        .into(),
226                },
227            dynamic_field_has_child_object_cost_params: DynamicFieldHasChildObjectCostParams {
228                dynamic_field_has_child_object_cost_base: protocol_config
229                    .dynamic_field_has_child_object_cost_base()
230                    .into(),
231            },
232            dynamic_field_has_child_object_with_ty_cost_params:
233                DynamicFieldHasChildObjectWithTyCostParams {
234                    dynamic_field_has_child_object_with_ty_cost_base: protocol_config
235                        .dynamic_field_has_child_object_with_ty_cost_base()
236                        .into(),
237                    dynamic_field_has_child_object_with_ty_type_cost_per_byte: protocol_config
238                        .dynamic_field_has_child_object_with_ty_type_cost_per_byte()
239                        .into(),
240                    dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte: protocol_config
241                        .dynamic_field_has_child_object_with_ty_type_tag_cost_per_byte()
242                        .into(),
243                },
244
245            event_emit_cost_params: EventEmitCostParams {
246                event_emit_value_size_derivation_cost_per_byte: protocol_config
247                    .event_emit_value_size_derivation_cost_per_byte()
248                    .into(),
249                event_emit_tag_size_derivation_cost_per_byte: protocol_config
250                    .event_emit_tag_size_derivation_cost_per_byte()
251                    .into(),
252                event_emit_output_cost_per_byte: protocol_config
253                    .event_emit_output_cost_per_byte()
254                    .into(),
255                event_emit_cost_base: protocol_config.event_emit_cost_base().into(),
256            },
257
258            borrow_uid_cost_params: BorrowUidCostParams {
259                object_borrow_uid_cost_base: protocol_config.object_borrow_uid_cost_base().into(),
260            },
261            delete_impl_cost_params: DeleteImplCostParams {
262                object_delete_impl_cost_base: protocol_config.object_delete_impl_cost_base().into(),
263            },
264            record_new_id_cost_params: RecordNewIdCostParams {
265                object_record_new_uid_cost_base: protocol_config
266                    .object_record_new_uid_cost_base()
267                    .into(),
268            },
269
270            // Crypto
271            crypto_invalid_arguments_cost: protocol_config.crypto_invalid_arguments_cost().into(),
272            // ed25519
273            ed25519_verify_cost_params: Ed25519VerifyCostParams {
274                ed25519_ed25519_verify_cost_base: protocol_config
275                    .ed25519_ed25519_verify_cost_base()
276                    .into(),
277                ed25519_ed25519_verify_msg_cost_per_byte: protocol_config
278                    .ed25519_ed25519_verify_msg_cost_per_byte()
279                    .into(),
280                ed25519_ed25519_verify_msg_cost_per_block: protocol_config
281                    .ed25519_ed25519_verify_msg_cost_per_block()
282                    .into(),
283            },
284            // hash
285            hash_blake2b256_cost_params: HashBlake2b256CostParams {
286                hash_blake2b256_cost_base: protocol_config.hash_blake2b256_cost_base().into(),
287                hash_blake2b256_data_cost_per_byte: protocol_config
288                    .hash_blake2b256_data_cost_per_byte()
289                    .into(),
290                hash_blake2b256_data_cost_per_block: protocol_config
291                    .hash_blake2b256_data_cost_per_block()
292                    .into(),
293            },
294            hash_keccak256_cost_params: HashKeccak256CostParams {
295                hash_keccak256_cost_base: protocol_config.hash_keccak256_cost_base().into(),
296                hash_keccak256_data_cost_per_byte: protocol_config
297                    .hash_keccak256_data_cost_per_byte()
298                    .into(),
299                hash_keccak256_data_cost_per_block: protocol_config
300                    .hash_keccak256_data_cost_per_block()
301                    .into(),
302            },
303            transfer_transfer_internal_cost_params: TransferInternalCostParams {
304                transfer_transfer_internal_cost_base: protocol_config
305                    .transfer_transfer_internal_cost_base()
306                    .into(),
307            },
308            transfer_freeze_object_cost_params: TransferFreezeObjectCostParams {
309                transfer_freeze_object_cost_base: protocol_config
310                    .transfer_freeze_object_cost_base()
311                    .into(),
312            },
313            transfer_share_object_cost_params: TransferShareObjectCostParams {
314                transfer_share_object_cost_base: protocol_config
315                    .transfer_share_object_cost_base()
316                    .into(),
317            },
318            tx_context_derive_id_cost_params: TxContextDeriveIdCostParams {
319                tx_context_derive_id_cost_base: protocol_config
320                    .tx_context_derive_id_cost_base()
321                    .into(),
322            },
323            type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams {
324                types_is_one_time_witness_cost_base: protocol_config
325                    .types_is_one_time_witness_cost_base()
326                    .into(),
327                types_is_one_time_witness_type_tag_cost_per_byte: protocol_config
328                    .types_is_one_time_witness_type_tag_cost_per_byte()
329                    .into(),
330                types_is_one_time_witness_type_cost_per_byte: protocol_config
331                    .types_is_one_time_witness_type_cost_per_byte()
332                    .into(),
333            },
334            validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams {
335                validator_validate_metadata_cost_base: protocol_config
336                    .validator_validate_metadata_cost_base()
337                    .into(),
338                validator_validate_metadata_data_cost_per_byte: protocol_config
339                    .validator_validate_metadata_data_cost_per_byte()
340                    .into(),
341            },
342            bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams {
343                bls12381_bls12381_min_sig_verify_cost_base: protocol_config
344                    .bls12381_bls12381_min_sig_verify_cost_base()
345                    .into(),
346                bls12381_bls12381_min_sig_verify_msg_cost_per_byte: protocol_config
347                    .bls12381_bls12381_min_sig_verify_msg_cost_per_byte()
348                    .into(),
349                bls12381_bls12381_min_sig_verify_msg_cost_per_block: protocol_config
350                    .bls12381_bls12381_min_sig_verify_msg_cost_per_block()
351                    .into(),
352            },
353            bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams {
354                bls12381_bls12381_min_pk_verify_cost_base: protocol_config
355                    .bls12381_bls12381_min_pk_verify_cost_base()
356                    .into(),
357                bls12381_bls12381_min_pk_verify_msg_cost_per_byte: protocol_config
358                    .bls12381_bls12381_min_pk_verify_msg_cost_per_byte()
359                    .into(),
360                bls12381_bls12381_min_pk_verify_msg_cost_per_block: protocol_config
361                    .bls12381_bls12381_min_pk_verify_msg_cost_per_block()
362                    .into(),
363            },
364            ecdsa_k1_ecrecover_cost_params: EcdsaK1EcrecoverCostParams {
365                ecdsa_k1_ecrecover_keccak256_cost_base: protocol_config
366                    .ecdsa_k1_ecrecover_keccak256_cost_base()
367                    .into(),
368                ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte: protocol_config
369                    .ecdsa_k1_ecrecover_keccak256_msg_cost_per_byte()
370                    .into(),
371                ecdsa_k1_ecrecover_keccak256_msg_cost_per_block: protocol_config
372                    .ecdsa_k1_ecrecover_keccak256_msg_cost_per_block()
373                    .into(),
374                ecdsa_k1_ecrecover_sha256_cost_base: protocol_config
375                    .ecdsa_k1_ecrecover_sha256_cost_base()
376                    .into(),
377                ecdsa_k1_ecrecover_sha256_msg_cost_per_byte: protocol_config
378                    .ecdsa_k1_ecrecover_sha256_msg_cost_per_byte()
379                    .into(),
380                ecdsa_k1_ecrecover_sha256_msg_cost_per_block: protocol_config
381                    .ecdsa_k1_ecrecover_sha256_msg_cost_per_block()
382                    .into(),
383            },
384            ecdsa_k1_decompress_pubkey_cost_params: EcdsaK1DecompressPubkeyCostParams {
385                ecdsa_k1_decompress_pubkey_cost_base: protocol_config
386                    .ecdsa_k1_decompress_pubkey_cost_base()
387                    .into(),
388            },
389            ecdsa_k1_secp256k1_verify_cost_params: EcdsaK1Secp256k1VerifyCostParams {
390                ecdsa_k1_secp256k1_verify_keccak256_cost_base: protocol_config
391                    .ecdsa_k1_secp256k1_verify_keccak256_cost_base()
392                    .into(),
393                ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte: protocol_config
394                    .ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_byte()
395                    .into(),
396                ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block: protocol_config
397                    .ecdsa_k1_secp256k1_verify_keccak256_msg_cost_per_block()
398                    .into(),
399                ecdsa_k1_secp256k1_verify_sha256_cost_base: protocol_config
400                    .ecdsa_k1_secp256k1_verify_sha256_cost_base()
401                    .into(),
402                ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte: protocol_config
403                    .ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_byte()
404                    .into(),
405                ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block: protocol_config
406                    .ecdsa_k1_secp256k1_verify_sha256_msg_cost_per_block()
407                    .into(),
408            },
409            ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams {
410                ecdsa_r1_ecrecover_keccak256_cost_base: protocol_config
411                    .ecdsa_r1_ecrecover_keccak256_cost_base()
412                    .into(),
413                ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte: protocol_config
414                    .ecdsa_r1_ecrecover_keccak256_msg_cost_per_byte()
415                    .into(),
416                ecdsa_r1_ecrecover_keccak256_msg_cost_per_block: protocol_config
417                    .ecdsa_r1_ecrecover_keccak256_msg_cost_per_block()
418                    .into(),
419                ecdsa_r1_ecrecover_sha256_cost_base: protocol_config
420                    .ecdsa_r1_ecrecover_sha256_cost_base()
421                    .into(),
422                ecdsa_r1_ecrecover_sha256_msg_cost_per_byte: protocol_config
423                    .ecdsa_r1_ecrecover_sha256_msg_cost_per_byte()
424                    .into(),
425                ecdsa_r1_ecrecover_sha256_msg_cost_per_block: protocol_config
426                    .ecdsa_r1_ecrecover_sha256_msg_cost_per_block()
427                    .into(),
428            },
429            ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams {
430                ecdsa_r1_secp256r1_verify_keccak256_cost_base: protocol_config
431                    .ecdsa_r1_secp256r1_verify_keccak256_cost_base()
432                    .into(),
433                ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte: protocol_config
434                    .ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_byte()
435                    .into(),
436                ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block: protocol_config
437                    .ecdsa_r1_secp256r1_verify_keccak256_msg_cost_per_block()
438                    .into(),
439                ecdsa_r1_secp256r1_verify_sha256_cost_base: protocol_config
440                    .ecdsa_r1_secp256r1_verify_sha256_cost_base()
441                    .into(),
442                ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte: protocol_config
443                    .ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_byte()
444                    .into(),
445                ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block: protocol_config
446                    .ecdsa_r1_secp256r1_verify_sha256_msg_cost_per_block()
447                    .into(),
448            },
449            ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams {
450                ecvrf_ecvrf_verify_cost_base: protocol_config.ecvrf_ecvrf_verify_cost_base().into(),
451                ecvrf_ecvrf_verify_alpha_string_cost_per_byte: protocol_config
452                    .ecvrf_ecvrf_verify_alpha_string_cost_per_byte()
453                    .into(),
454                ecvrf_ecvrf_verify_alpha_string_cost_per_block: protocol_config
455                    .ecvrf_ecvrf_verify_alpha_string_cost_per_block()
456                    .into(),
457            },
458            groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams {
459                groth16_prepare_verifying_key_bls12381_cost_base: protocol_config
460                    .groth16_prepare_verifying_key_bls12381_cost_base()
461                    .into(),
462                groth16_prepare_verifying_key_bn254_cost_base: protocol_config
463                    .groth16_prepare_verifying_key_bn254_cost_base()
464                    .into(),
465            },
466            groth16_verify_groth16_proof_internal_cost_params:
467                Groth16VerifyGroth16ProofInternalCostParams {
468                    groth16_verify_groth16_proof_internal_bls12381_cost_base: protocol_config
469                        .groth16_verify_groth16_proof_internal_bls12381_cost_base()
470                        .into(),
471                    groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input:
472                        protocol_config
473                            .groth16_verify_groth16_proof_internal_bls12381_cost_per_public_input()
474                            .into(),
475                    groth16_verify_groth16_proof_internal_bn254_cost_base: protocol_config
476                        .groth16_verify_groth16_proof_internal_bn254_cost_base()
477                        .into(),
478                    groth16_verify_groth16_proof_internal_bn254_cost_per_public_input:
479                        protocol_config
480                            .groth16_verify_groth16_proof_internal_bn254_cost_per_public_input()
481                            .into(),
482                    groth16_verify_groth16_proof_internal_public_input_cost_per_byte:
483                        protocol_config
484                            .groth16_verify_groth16_proof_internal_public_input_cost_per_byte()
485                            .into(),
486                },
487            hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams {
488                hmac_hmac_sha3_256_cost_base: protocol_config.hmac_hmac_sha3_256_cost_base().into(),
489                hmac_hmac_sha3_256_input_cost_per_byte: protocol_config
490                    .hmac_hmac_sha3_256_input_cost_per_byte()
491                    .into(),
492                hmac_hmac_sha3_256_input_cost_per_block: protocol_config
493                    .hmac_hmac_sha3_256_input_cost_per_block()
494                    .into(),
495            },
496            transfer_receive_object_internal_cost_params: TransferReceiveObjectInternalCostParams {
497                transfer_receive_object_internal_cost_base: protocol_config
498                    .transfer_receive_object_cost_base_as_option()
499                    .unwrap_or(0)
500                    .into(),
501            },
502            check_zklogin_id_cost_params: CheckZkloginIdCostParams {
503                check_zklogin_id_cost_base: protocol_config
504                    .check_zklogin_id_cost_base_as_option()
505                    .map(Into::into),
506            },
507            check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams {
508                check_zklogin_issuer_cost_base: protocol_config
509                    .check_zklogin_issuer_cost_base_as_option()
510                    .map(Into::into),
511            },
512            poseidon_bn254_cost_params: PoseidonBN254CostParams {
513                poseidon_bn254_cost_base: protocol_config
514                    .poseidon_bn254_cost_base_as_option()
515                    .map(Into::into),
516                poseidon_bn254_data_cost_per_block: protocol_config
517                    .poseidon_bn254_cost_per_block_as_option()
518                    .map(Into::into),
519            },
520            group_ops_cost_params: GroupOpsCostParams {
521                bls12381_decode_scalar_cost: protocol_config
522                    .group_ops_bls12381_decode_scalar_cost_as_option()
523                    .map(Into::into),
524                bls12381_decode_g1_cost: protocol_config
525                    .group_ops_bls12381_decode_g1_cost_as_option()
526                    .map(Into::into),
527                bls12381_decode_g2_cost: protocol_config
528                    .group_ops_bls12381_decode_g2_cost_as_option()
529                    .map(Into::into),
530                bls12381_decode_gt_cost: protocol_config
531                    .group_ops_bls12381_decode_gt_cost_as_option()
532                    .map(Into::into),
533                bls12381_scalar_add_cost: protocol_config
534                    .group_ops_bls12381_scalar_add_cost_as_option()
535                    .map(Into::into),
536                bls12381_g1_add_cost: protocol_config
537                    .group_ops_bls12381_g1_add_cost_as_option()
538                    .map(Into::into),
539                bls12381_g2_add_cost: protocol_config
540                    .group_ops_bls12381_g2_add_cost_as_option()
541                    .map(Into::into),
542                bls12381_gt_add_cost: protocol_config
543                    .group_ops_bls12381_gt_add_cost_as_option()
544                    .map(Into::into),
545                bls12381_scalar_sub_cost: protocol_config
546                    .group_ops_bls12381_scalar_sub_cost_as_option()
547                    .map(Into::into),
548                bls12381_g1_sub_cost: protocol_config
549                    .group_ops_bls12381_g1_sub_cost_as_option()
550                    .map(Into::into),
551                bls12381_g2_sub_cost: protocol_config
552                    .group_ops_bls12381_g2_sub_cost_as_option()
553                    .map(Into::into),
554                bls12381_gt_sub_cost: protocol_config
555                    .group_ops_bls12381_gt_sub_cost_as_option()
556                    .map(Into::into),
557                bls12381_scalar_mul_cost: protocol_config
558                    .group_ops_bls12381_scalar_mul_cost_as_option()
559                    .map(Into::into),
560                bls12381_g1_mul_cost: protocol_config
561                    .group_ops_bls12381_g1_mul_cost_as_option()
562                    .map(Into::into),
563                bls12381_g2_mul_cost: protocol_config
564                    .group_ops_bls12381_g2_mul_cost_as_option()
565                    .map(Into::into),
566                bls12381_gt_mul_cost: protocol_config
567                    .group_ops_bls12381_gt_mul_cost_as_option()
568                    .map(Into::into),
569                bls12381_scalar_div_cost: protocol_config
570                    .group_ops_bls12381_scalar_div_cost_as_option()
571                    .map(Into::into),
572                bls12381_g1_div_cost: protocol_config
573                    .group_ops_bls12381_g1_div_cost_as_option()
574                    .map(Into::into),
575                bls12381_g2_div_cost: protocol_config
576                    .group_ops_bls12381_g2_div_cost_as_option()
577                    .map(Into::into),
578                bls12381_gt_div_cost: protocol_config
579                    .group_ops_bls12381_gt_div_cost_as_option()
580                    .map(Into::into),
581                bls12381_g1_hash_to_base_cost: protocol_config
582                    .group_ops_bls12381_g1_hash_to_base_cost_as_option()
583                    .map(Into::into),
584                bls12381_g2_hash_to_base_cost: protocol_config
585                    .group_ops_bls12381_g2_hash_to_base_cost_as_option()
586                    .map(Into::into),
587                bls12381_g1_hash_to_cost_per_byte: protocol_config
588                    .group_ops_bls12381_g1_hash_to_cost_per_byte_as_option()
589                    .map(Into::into),
590                bls12381_g2_hash_to_cost_per_byte: protocol_config
591                    .group_ops_bls12381_g2_hash_to_cost_per_byte_as_option()
592                    .map(Into::into),
593                bls12381_g1_msm_base_cost: protocol_config
594                    .group_ops_bls12381_g1_msm_base_cost_as_option()
595                    .map(Into::into),
596                bls12381_g2_msm_base_cost: protocol_config
597                    .group_ops_bls12381_g2_msm_base_cost_as_option()
598                    .map(Into::into),
599                bls12381_g1_msm_base_cost_per_input: protocol_config
600                    .group_ops_bls12381_g1_msm_base_cost_per_input_as_option()
601                    .map(Into::into),
602                bls12381_g2_msm_base_cost_per_input: protocol_config
603                    .group_ops_bls12381_g2_msm_base_cost_per_input_as_option()
604                    .map(Into::into),
605                bls12381_msm_max_len: protocol_config.group_ops_bls12381_msm_max_len_as_option(),
606                bls12381_pairing_cost: protocol_config
607                    .group_ops_bls12381_pairing_cost_as_option()
608                    .map(Into::into),
609            },
610        }
611    }
612}
613
614pub fn all_natives(silent: bool) -> NativeFunctionTable {
615    let sui_framework_natives: &[(&str, &str, NativeFunction)] = &[
616        ("address", "from_bytes", make_native!(address::from_bytes)),
617        ("address", "to_u256", make_native!(address::to_u256)),
618        ("address", "from_u256", make_native!(address::from_u256)),
619        ("hash", "blake2b256", make_native!(hash::blake2b256)),
620        (
621            "bls12381",
622            "bls12381_min_sig_verify",
623            make_native!(bls12381::bls12381_min_sig_verify),
624        ),
625        (
626            "bls12381",
627            "bls12381_min_pk_verify",
628            make_native!(bls12381::bls12381_min_pk_verify),
629        ),
630        (
631            "dynamic_field",
632            "hash_type_and_key",
633            make_native!(dynamic_field::hash_type_and_key),
634        ),
635        (
636            "dynamic_field",
637            "add_child_object",
638            make_native!(dynamic_field::add_child_object),
639        ),
640        (
641            "dynamic_field",
642            "borrow_child_object",
643            make_native!(dynamic_field::borrow_child_object),
644        ),
645        (
646            "dynamic_field",
647            "borrow_child_object_mut",
648            make_native!(dynamic_field::borrow_child_object),
649        ),
650        (
651            "dynamic_field",
652            "remove_child_object",
653            make_native!(dynamic_field::remove_child_object),
654        ),
655        (
656            "dynamic_field",
657            "has_child_object",
658            make_native!(dynamic_field::has_child_object),
659        ),
660        (
661            "dynamic_field",
662            "has_child_object_with_ty",
663            make_native!(dynamic_field::has_child_object_with_ty),
664        ),
665        (
666            "ecdsa_k1",
667            "secp256k1_ecrecover",
668            make_native!(ecdsa_k1::ecrecover),
669        ),
670        (
671            "ecdsa_k1",
672            "decompress_pubkey",
673            make_native!(ecdsa_k1::decompress_pubkey),
674        ),
675        (
676            "ecdsa_k1",
677            "secp256k1_verify",
678            make_native!(ecdsa_k1::secp256k1_verify),
679        ),
680        ("ecvrf", "ecvrf_verify", make_native!(ecvrf::ecvrf_verify)),
681        (
682            "ecdsa_r1",
683            "secp256r1_ecrecover",
684            make_native!(ecdsa_r1::ecrecover),
685        ),
686        (
687            "ecdsa_r1",
688            "secp256r1_verify",
689            make_native!(ecdsa_r1::secp256r1_verify),
690        ),
691        (
692            "ed25519",
693            "ed25519_verify",
694            make_native!(ed25519::ed25519_verify),
695        ),
696        ("event", "emit", make_native!(event::emit)),
697        (
698            "groth16",
699            "verify_groth16_proof_internal",
700            make_native!(groth16::verify_groth16_proof_internal),
701        ),
702        (
703            "groth16",
704            "prepare_verifying_key_internal",
705            make_native!(groth16::prepare_verifying_key_internal),
706        ),
707        ("hmac", "hmac_sha3_256", make_native!(hmac::hmac_sha3_256)),
708        ("hash", "keccak256", make_native!(hash::keccak256)),
709        (
710            "group_ops",
711            "internal_validate",
712            make_native!(group_ops::internal_validate),
713        ),
714        (
715            "group_ops",
716            "internal_add",
717            make_native!(group_ops::internal_add),
718        ),
719        (
720            "group_ops",
721            "internal_sub",
722            make_native!(group_ops::internal_sub),
723        ),
724        (
725            "group_ops",
726            "internal_mul",
727            make_native!(group_ops::internal_mul),
728        ),
729        (
730            "group_ops",
731            "internal_div",
732            make_native!(group_ops::internal_div),
733        ),
734        (
735            "group_ops",
736            "internal_hash_to",
737            make_native!(group_ops::internal_hash_to),
738        ),
739        (
740            "group_ops",
741            "internal_multi_scalar_mul",
742            make_native!(group_ops::internal_multi_scalar_mul),
743        ),
744        (
745            "group_ops",
746            "internal_pairing",
747            make_native!(group_ops::internal_pairing),
748        ),
749        ("object", "delete_impl", make_native!(object::delete_impl)),
750        ("object", "borrow_uid", make_native!(object::borrow_uid)),
751        (
752            "object",
753            "record_new_uid",
754            make_native!(object::record_new_uid),
755        ),
756        (
757            "test_scenario",
758            "take_from_address_by_id",
759            make_native!(test_scenario::take_from_address_by_id),
760        ),
761        (
762            "test_scenario",
763            "most_recent_id_for_address",
764            make_native!(test_scenario::most_recent_id_for_address),
765        ),
766        (
767            "test_scenario",
768            "was_taken_from_address",
769            make_native!(test_scenario::was_taken_from_address),
770        ),
771        (
772            "test_scenario",
773            "take_immutable_by_id",
774            make_native!(test_scenario::take_immutable_by_id),
775        ),
776        (
777            "test_scenario",
778            "most_recent_immutable_id",
779            make_native!(test_scenario::most_recent_immutable_id),
780        ),
781        (
782            "test_scenario",
783            "was_taken_immutable",
784            make_native!(test_scenario::was_taken_immutable),
785        ),
786        (
787            "test_scenario",
788            "take_shared_by_id",
789            make_native!(test_scenario::take_shared_by_id),
790        ),
791        (
792            "test_scenario",
793            "most_recent_id_shared",
794            make_native!(test_scenario::most_recent_id_shared),
795        ),
796        (
797            "test_scenario",
798            "was_taken_shared",
799            make_native!(test_scenario::was_taken_shared),
800        ),
801        (
802            "test_scenario",
803            "end_transaction",
804            make_native!(test_scenario::end_transaction),
805        ),
806        (
807            "test_scenario",
808            "ids_for_address",
809            make_native!(test_scenario::ids_for_address),
810        ),
811        (
812            "transfer",
813            "transfer_impl",
814            make_native!(transfer::transfer_internal),
815        ),
816        (
817            "transfer",
818            "freeze_object_impl",
819            make_native!(transfer::freeze_object),
820        ),
821        (
822            "transfer",
823            "share_object_impl",
824            make_native!(transfer::share_object),
825        ),
826        (
827            "transfer",
828            "receive_impl",
829            make_native!(transfer::receive_object_internal),
830        ),
831        (
832            "tx_context",
833            "derive_id",
834            make_native!(tx_context::derive_id),
835        ),
836        (
837            "types",
838            "is_one_time_witness",
839            make_native!(types::is_one_time_witness),
840        ),
841        (
842            "test_utils",
843            "create_one_time_witness",
844            make_native!(test_utils::create_one_time_witness),
845        ),
846        (
847            "zklogin_verified_id",
848            "check_zklogin_id_internal",
849            make_native!(zklogin::check_zklogin_id_internal),
850        ),
851        (
852            "zklogin_verified_issuer",
853            "check_zklogin_issuer_internal",
854            make_native!(zklogin::check_zklogin_issuer_internal),
855        ),
856        (
857            "poseidon",
858            "poseidon_bn254_internal",
859            make_native!(poseidon::poseidon_bn254_internal),
860        ),
861    ];
862    let sui_framework_natives_iter =
863        sui_framework_natives
864            .iter()
865            .cloned()
866            .map(|(module_name, func_name, func)| {
867                (
868                    SUI_FRAMEWORK_ADDRESS,
869                    Identifier::new(module_name).unwrap(),
870                    Identifier::new(func_name).unwrap(),
871                    func,
872                )
873            });
874    let sui_system_natives: &[(&str, &str, NativeFunction)] = &[(
875        "validator",
876        "validate_metadata_bcs",
877        make_native!(validator::validate_metadata_bcs),
878    )];
879    sui_system_natives
880        .iter()
881        .cloned()
882        .map(|(module_name, func_name, func)| {
883            (
884                SUI_SYSTEM_ADDRESS,
885                Identifier::new(module_name).unwrap(),
886                Identifier::new(func_name).unwrap(),
887                func,
888            )
889        })
890        .chain(sui_framework_natives_iter)
891        .chain(move_stdlib_natives::all_natives(
892            MOVE_STDLIB_ADDRESS,
893            // TODO: tune gas params
894            GasParameters::zeros(),
895        ))
896        .chain(move_stdlib_natives::nursery_natives(
897            silent,
898            MOVE_STDLIB_ADDRESS,
899            // TODO: tune gas params
900            NurseryGasParameters::zeros(),
901        ))
902        .collect()
903}
904
905// ID { bytes: address }
906// Extract the first field of the struct to get the address bytes.
907pub fn get_receiver_object_id(object: Value) -> Result<Value, PartialVMError> {
908    get_nested_struct_field(object, &[0])
909}
910
911// Object { id: UID { id: ID { bytes: address } } .. }
912// Extract the first field of the struct 3 times to get the id bytes.
913pub fn get_object_id(object: Value) -> Result<Value, PartialVMError> {
914    get_nested_struct_field(object, &[0, 0, 0])
915}
916
917// Extract a field value that's nested inside value `v`. The offset of each nesting
918// is determined by `offsets`.
919pub fn get_nested_struct_field(mut v: Value, offsets: &[usize]) -> Result<Value, PartialVMError> {
920    for offset in offsets {
921        v = get_nth_struct_field(v, *offset)?;
922    }
923    Ok(v)
924}
925
926pub fn get_nth_struct_field(v: Value, n: usize) -> Result<Value, PartialVMError> {
927    let mut itr = v.value_as::<Struct>()?.unpack()?;
928    Ok(itr.nth(n).unwrap())
929}
930
931/// Returns the struct tag, non-annotated type layout, and fully annotated type layout of `ty`.
932pub(crate) fn get_tag_and_layouts(
933    context: &NativeContext,
934    ty: &Type,
935) -> PartialVMResult<Option<(StructTag, R::MoveTypeLayout, A::MoveTypeLayout)>> {
936    let tag = match context.type_to_type_tag(ty)? {
937        TypeTag::Struct(s) => s,
938        _ => {
939            return Err(
940                PartialVMError::new(StatusCode::UNKNOWN_INVARIANT_VIOLATION_ERROR)
941                    .with_message("Sui verifier guarantees this is a struct".to_string()),
942            )
943        }
944    };
945    let Some(layout) = context.type_to_type_layout(ty)? else {
946        return Ok(None);
947    };
948    let Some(annotated_layout) = context.type_to_fully_annotated_layout(ty)? else {
949        return Ok(None);
950    };
951    Ok(Some((*tag, layout, annotated_layout)))
952}
953
954#[macro_export]
955macro_rules! make_native {
956    ($native: expr) => {
957        Arc::new(
958            move |context, ty_args, args| -> PartialVMResult<NativeResult> {
959                $native(context, ty_args, args)
960            },
961        )
962    };
963}
964
965pub(crate) fn legacy_test_cost() -> InternalGas {
966    InternalGas::new(0)
967}