1use 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 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 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 pub event_emit_cost_params: EventEmitCostParams,
91
92 pub borrow_uid_cost_params: BorrowUidCostParams,
94 pub delete_impl_cost_params: DeleteImplCostParams,
95 pub record_new_id_cost_params: RecordNewIdCostParams,
96
97 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 pub tx_context_derive_id_cost_params: TxContextDeriveIdCostParams,
104
105 pub type_is_one_time_witness_cost_params: TypesIsOneTimeWitnessCostParams,
107
108 pub validator_validate_metadata_bcs_cost_params: ValidatorValidateMetadataBcsCostParams,
110
111 pub crypto_invalid_arguments_cost: InternalGas,
113 pub bls12381_bls12381_min_sig_verify_cost_params: Bls12381Bls12381MinSigVerifyCostParams,
115 pub bls12381_bls12381_min_pk_verify_cost_params: Bls12381Bls12381MinPkVerifyCostParams,
116
117 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 pub ecdsa_r1_ecrecover_cost_params: EcdsaR1EcrecoverCostParams,
124 pub ecdsa_r1_secp256_r1_verify_cost_params: EcdsaR1Secp256R1VerifyCostParams,
125
126 pub ecvrf_ecvrf_verify_cost_params: EcvrfEcvrfVerifyCostParams,
128
129 pub ed25519_verify_cost_params: Ed25519VerifyCostParams,
131
132 pub groth16_prepare_verifying_key_cost_params: Groth16PrepareVerifyingKeyCostParams,
134 pub groth16_verify_groth16_proof_internal_cost_params:
135 Groth16VerifyGroth16ProofInternalCostParams,
136
137 pub hash_blake2b256_cost_params: HashBlake2b256CostParams,
139 pub hash_keccak256_cost_params: HashKeccak256CostParams,
140
141 pub hmac_hmac_sha3_256_cost_params: HmacHmacSha3256CostParams,
143
144 pub check_zklogin_id_cost_params: CheckZkloginIdCostParams,
146 pub check_zklogin_issuer_cost_params: CheckZkloginIssuerCostParams,
147
148 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_invalid_arguments_cost: protocol_config.crypto_invalid_arguments_cost().into(),
262 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_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 GasParameters::zeros(),
742 ))
743 .chain(move_stdlib_natives::nursery_natives(
744 silent,
745 MOVE_STDLIB_ADDRESS,
746 NurseryGasParameters::zeros(),
748 ))
749 .collect()
750}
751
752pub fn get_receiver_object_id(object: Value) -> Result<Value, PartialVMError> {
755 get_nested_struct_field(object, &[0])
756}
757
758pub fn get_object_id(object: Value) -> Result<Value, PartialVMError> {
761 get_nested_struct_field(object, &[0, 0, 0])
762}
763
764pub 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
778pub(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}