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