diff --git a/src/types.rs b/src/types.rs index 2e07ded2..ea7ccbdd 100644 --- a/src/types.rs +++ b/src/types.rs @@ -226,82 +226,220 @@ impl GasCosts { abi_costs, }) } + + #[cfg(any(test, feature = "gas_calibration", feature = "testing"))] + pub fn get_abi_costs(&self) -> &HashMap<String, u64> { + &self.abi_costs + } + + #[cfg(any(test, feature = "gas_calibration", feature = "testing"))] + /// Insert into hashmap - return None if already there + fn try_insert(h: &mut HashMap<String, u64>, k: String, v: u64) { + // Note: use try_insert when not an experimental feature anymore + // https://doc.rust-lang.org/std/collections/struct.HashMap.html#method.try_insert + if let Some(_) = h.insert(k.clone(), v) { + // Insert return old value if the key was already there + panic!("Key {} already in hashmap", k); + } + } } #[cfg(any(test, feature = "gas_calibration", feature = "testing"))] impl Default for GasCosts { fn default() -> Self { - let mut abi_costs = HashMap::new(); - abi_costs.insert(String::from("assembly_script_address_from_public_key"), 147); - abi_costs.insert(String::from("assembly_script_validate_address"), 4); - abi_costs.insert(String::from("assembly_script_append_data"), 162); - abi_costs.insert(String::from("assembly_script_append_data_for"), 200); - abi_costs.insert(String::from("assembly_script_call"), 30466); - abi_costs.insert(String::from("assembly_script_create_sc"), 160); - abi_costs.insert(String::from("assembly_script_delete_data"), 78); - abi_costs.insert(String::from("assembly_script_delete_data_for"), 120); - abi_costs.insert(String::from("assembly_script_generate_event"), 36); - abi_costs.insert(String::from("assembly_script_get_balance"), 4); - abi_costs.insert(String::from("assembly_script_get_balance_for"), 41); - abi_costs.insert(String::from("assembly_script_get_call_coins"), 9); - abi_costs.insert(String::from("assembly_script_get_call_stack"), 56); - abi_costs.insert(String::from("assembly_script_get_current_slot"), 9); - abi_costs.insert(String::from("assembly_script_get_data"), 85); - abi_costs.insert(String::from("assembly_script_get_data_for"), 139); - abi_costs.insert(String::from("assembly_script_get_keys"), 26); - abi_costs.insert(String::from("assembly_script_get_keys_for"), 48); - abi_costs.insert(String::from("assembly_script_get_op_data"), 71); - abi_costs.insert(String::from("assembly_script_get_op_keys"), 138); - abi_costs.insert(String::from("assembly_script_get_op_keys_prefix"), 138); - abi_costs.insert(String::from("assembly_script_get_owned_addresses"), 52); - abi_costs.insert(String::from("assembly_script_get_remaining_gas"), 7); - abi_costs.insert(String::from("assembly_script_get_time"), 4); - abi_costs.insert(String::from("assembly_script_has_data"), 69); - abi_costs.insert(String::from("assembly_script_has_data_for"), 115); - abi_costs.insert(String::from("assembly_script_has_op_key"), 78); - abi_costs.insert(String::from("assembly_script_hash"), 83); - abi_costs.insert(String::from("assembly_script_hash_sha256"), 83); - abi_costs.insert(String::from("assembly_script_keccak256_hash"), 83); - abi_costs.insert(String::from("assembly_script_print"), 35); - abi_costs.insert(String::from("assembly_script_send_message"), 316); - abi_costs.insert(String::from("assembly_script_get_origin_operation_id"), 200); - abi_costs.insert(String::from("assembly_script_set_bytecode"), 74); - abi_costs.insert(String::from("assembly_script_set_bytecode_for"), 129); - abi_costs.insert(String::from("assembly_script_set_data"), 158); - abi_costs.insert(String::from("assembly_script_set_data_for"), 165); - abi_costs.insert(String::from("assembly_script_signature_verify"), 98); - abi_costs.insert(String::from("assembly_script_evm_signature_verify"), 264); - abi_costs.insert( + let mut h = HashMap::new(); + // Note: use try_insert to notify devs for duplicated abi/gas_costs + // this will panic in unit tests + GasCosts::try_insert( + &mut h, + String::from("assembly_script_address_from_public_key"), + 147, + ); + GasCosts::try_insert(&mut h, String::from("assembly_script_validate_address"), 4); + GasCosts::try_insert(&mut h, String::from("assembly_script_append_data"), 162); + GasCosts::try_insert(&mut h, String::from("assembly_script_append_data_for"), 200); + GasCosts::try_insert(&mut h, String::from("assembly_script_create_sc"), 160); + GasCosts::try_insert(&mut h, String::from("assembly_script_delete_data"), 78); + GasCosts::try_insert(&mut h, String::from("assembly_script_delete_data_for"), 120); + GasCosts::try_insert(&mut h, String::from("assembly_script_generate_event"), 36); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_balance"), 4); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_balance_for"), 41); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_call_coins"), 9); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_call_stack"), 56); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_data"), 85); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_data_for"), 139); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_keys"), 26); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_keys_for"), 48); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_op_data"), 71); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_op_keys"), 138); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_get_op_keys_prefix"), + 138, + ); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_get_owned_addresses"), + 52, + ); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_remaining_gas"), 7); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_time"), 4); + GasCosts::try_insert(&mut h, String::from("assembly_script_has_data"), 69); + GasCosts::try_insert(&mut h, String::from("assembly_script_has_data_for"), 115); + GasCosts::try_insert(&mut h, String::from("assembly_script_has_op_key"), 78); + GasCosts::try_insert(&mut h, String::from("assembly_script_hash"), 83); + GasCosts::try_insert(&mut h, String::from("assembly_script_hash_sha256"), 83); + GasCosts::try_insert(&mut h, String::from("assembly_script_keccak256_hash"), 83); + GasCosts::try_insert(&mut h, String::from("assembly_script_print"), 35); + GasCosts::try_insert(&mut h, String::from("assembly_script_send_message"), 316); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_get_origin_operation_id"), + 200, + ); + GasCosts::try_insert(&mut h, String::from("assembly_script_set_bytecode"), 74); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_set_bytecode_for"), + 129, + ); + GasCosts::try_insert(&mut h, String::from("assembly_script_set_data"), 158); + GasCosts::try_insert(&mut h, String::from("assembly_script_set_data_for"), 165); + GasCosts::try_insert(&mut h, String::from("assembly_script_signature_verify"), 98); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_evm_signature_verify"), + 264, + ); + GasCosts::try_insert( + &mut h, String::from("assembly_script_evm_get_address_from_pubkey"), 11, ); - abi_costs.insert( + GasCosts::try_insert( + &mut h, String::from("assembly_script_evm_get_pubkey_from_signature"), 11, ); - abi_costs.insert(String::from("assembly_script_is_address_eoa"), 11); - abi_costs.insert(String::from("assembly_script_transfer_coins"), 62); - abi_costs.insert(String::from("assembly_script_transfer_coins_for"), 102); - abi_costs.insert(String::from("assembly_script_unsafe_random"), 11); - abi_costs.insert(String::from("assembly_script_call"), 11); - abi_costs.insert(String::from("assembly_script_local_call"), 11); - abi_costs.insert(String::from("assembly_script_local_execution"), 11); - abi_costs.insert(String::from("assembly_script_get_bytecode"), 11); - abi_costs.insert(String::from("assembly_script_get_bytecode_for"), 11); - abi_costs.insert(String::from("assembly_script_caller_has_write_access"), 11); - abi_costs.insert(String::from("assembly_script_function_exists"), 11); - abi_costs.insert(String::from("assembly_script_seed"), 11); - abi_costs.insert(String::from("assembly_script_abort"), 11); - abi_costs.insert(String::from("assembly_script_date_now"), 11); - abi_costs.insert(String::from("assembly_script_console_log"), 36); // same cost as for generate_event - abi_costs.insert(String::from("assembly_script_console_info"), 36); - abi_costs.insert(String::from("assembly_script_console_debug"), 36); - abi_costs.insert(String::from("assembly_script_console_warn"), 36); - abi_costs.insert(String::from("assembly_script_console_error"), 36); - abi_costs.insert(String::from("assembly_script_trace"), 36); - abi_costs.insert(String::from("assembly_script_chain_id"), 9); + GasCosts::try_insert(&mut h, String::from("assembly_script_is_address_eoa"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_transfer_coins"), 62); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_transfer_coins_for"), + 102, + ); + GasCosts::try_insert(&mut h, String::from("assembly_script_unsafe_random"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_call"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_local_call"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_local_execution"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_bytecode"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_get_bytecode_for"), 11); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_caller_has_write_access"), + 11, + ); + GasCosts::try_insert(&mut h, String::from("assembly_script_function_exists"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_seed"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_abort"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_date_now"), 11); + GasCosts::try_insert(&mut h, String::from("assembly_script_console_log"), 36); // same cost as for generate_event + GasCosts::try_insert(&mut h, String::from("assembly_script_console_info"), 36); + GasCosts::try_insert(&mut h, String::from("assembly_script_console_debug"), 36); + GasCosts::try_insert(&mut h, String::from("assembly_script_console_warn"), 36); + GasCosts::try_insert(&mut h, String::from("assembly_script_console_error"), 36); + GasCosts::try_insert(&mut h, String::from("assembly_script_trace"), 36); + GasCosts::try_insert(&mut h, String::from("assembly_script_chain_id"), 9); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_get_current_period"), + 157, + ); + GasCosts::try_insert( + &mut h, + String::from("assembly_script_get_current_thread"), + 154, + ); + + // abi v1 + GasCosts::try_insert(&mut h, String::from("abi_get_address_version"), 30); + GasCosts::try_insert(&mut h, String::from("abi_call"), 30); + GasCosts::try_insert( + &mut h, + String::from("abi_checked_scalar_div_native_time"), + 30, + ); + GasCosts::try_insert(&mut h, String::from("abi_check_signature"), 30); + GasCosts::try_insert(&mut h, String::from("abi_local_call"), 30); + GasCosts::try_insert(&mut h, String::from("abi_compare_address"), 30); + GasCosts::try_insert(&mut h, String::from("sp_compilation"), 30); + GasCosts::try_insert(&mut h, String::from("abi_append_ds_value"), 30); + GasCosts::try_insert(&mut h, String::from("abi_delete_ds_entry"), 30); + GasCosts::try_insert(&mut h, String::from("abi_address_from_public_key"), 30); + GasCosts::try_insert(&mut h, String::from("abi_bytes_to_base58_check"), 30); + GasCosts::try_insert(&mut h, String::from("abi_hash_blake3"), 30); + GasCosts::try_insert( + &mut h, + String::from("abi_evm_get_pubkey_from_signature"), + 30, + ); + GasCosts::try_insert(&mut h, String::from("abi_get_remaining_gas"), 30); + GasCosts::try_insert(&mut h, String::from("abi_add_native_amount"), 30); + GasCosts::try_insert(&mut h, String::from("abi_base58_check_to_bytes"), 30); + GasCosts::try_insert(&mut h, String::from("abi_set_bytecode"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_call_coins"), 30); + GasCosts::try_insert(&mut h, String::from("abi_chain_id"), 30); + GasCosts::try_insert(&mut h, String::from("abi_abort"), 30); + GasCosts::try_insert(&mut h, String::from("abi_checked_div_native_time"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_address_category"), 30); + GasCosts::try_insert(&mut h, String::from("abi_send_async_message"), 30); + GasCosts::try_insert(&mut h, String::from("abi_check_address"), 30); + GasCosts::try_insert(&mut h, String::from("abi_sub_native_amount"), 30); + GasCosts::try_insert(&mut h, String::from("abi_scalar_mul_native_amount"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_bytecode"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_op_keys"), 30); + GasCosts::try_insert(&mut h, String::from("abi_native_amount_to_string"), 30); + GasCosts::try_insert(&mut h, String::from("abi_hash_sha256"), 30); + GasCosts::try_insert(&mut h, String::from("abi_native_amount_from_string"), 30); + GasCosts::try_insert(&mut h, String::from("abi_create_sc"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_origin_operation_id"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_pubkey_version"), 30); + GasCosts::try_insert(&mut h, String::from("abi_is_address_eoa"), 30); + GasCosts::try_insert(&mut h, String::from("abi_evm_get_address_from_pubkey"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_ds_value"), 30); + GasCosts::try_insert(&mut h, String::from("abi_scalar_div_rem_native_amount"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_signature_version"), 30); + GasCosts::try_insert(&mut h, String::from("abi_unsafe_random"), 30); + GasCosts::try_insert(&mut h, String::from("abi_compare_pub_key"), 30); + GasCosts::try_insert(&mut h, String::from("abi_generate_event"), 30); + GasCosts::try_insert(&mut h, String::from("abi_verify_signature"), 30); + GasCosts::try_insert(&mut h, String::from("abi_checked_sub_native_time"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_native_time"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_owned_addresses"), 30); + GasCosts::try_insert(&mut h, String::from("abi_check_pubkey"), 30); + GasCosts::try_insert(&mut h, String::from("abi_compare_native_amount"), 30); + GasCosts::try_insert(&mut h, String::from("abi_compare_native_time"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_balance"), 30); + GasCosts::try_insert(&mut h, String::from("abi_set_ds_value"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_ds_keys"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_op_data"), 30); + GasCosts::try_insert(&mut h, String::from("abi_ds_entry_exists"), 30); + GasCosts::try_insert(&mut h, String::from("abi_div_rem_native_amount"), 30); + GasCosts::try_insert(&mut h, String::from("abi_evm_verify_signature"), 30); + GasCosts::try_insert(&mut h, String::from("abi_check_native_amount"), 30); + GasCosts::try_insert(&mut h, String::from("abi_transfer_coins"), 30); + GasCosts::try_insert(&mut h, String::from("abi_hash_keccak256"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_current_slot"), 30); + GasCosts::try_insert(&mut h, String::from("abi_checked_add_native_time"), 30); + GasCosts::try_insert(&mut h, String::from("abi_op_entry_exists"), 30); + GasCosts::try_insert(&mut h, String::from("abi_function_exists"), 30); + GasCosts::try_insert(&mut h, String::from("abi_get_call_stack"), 30); + GasCosts::try_insert(&mut h, String::from("abi_caller_has_write_access"), 30); + GasCosts::try_insert(&mut h, String::from("abi_local_execution"), 30); + GasCosts::try_insert(&mut h, String::from("abi_checked_mul_native_time"), 30); + Self { - abi_costs, + abi_costs: h, operator_cost: 1, launch_cost: 10_000, sp_compilation_cost: 314_000_000,