From d0b2590feac096d052d5fe7408ed2691f71bbb98 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 19 Jan 2024 15:19:44 -0300 Subject: [PATCH 01/50] Add GasPricess & FeeTokenAddresses structs --- src/state/mod.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/state/mod.rs b/src/state/mod.rs index 306d93f94..b37234c00 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -27,12 +27,24 @@ pub struct BlockInfo { pub block_number: u64, /// Timestamp of the beginning of the last block creation attempt. pub block_timestamp: u64, - /// L1 gas price (in Wei) measured at the beginning of the last block creation attempt. + /// L1 gas price measured at the beginning of the last block creation attempt. pub gas_price: u128, /// The sequencer address of this block. pub sequencer_address: Address, } +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct GasPrices { + pub eth_l1_gas_price: u128, // (Wei) + pub strk_l1_gas_price: u128, // (STRK) +} + +#[derive(Clone, Debug)] +pub struct FeeTokenAddresses { + pub strk_fee_token_address: Address, + pub eth_fee_token_address: Address, +} + impl BlockInfo { /// Creates an empty BlockInfo with given sequencer address. pub const fn empty(sequencer_address: Address) -> Self { From 6327d7aa0a003d6a223bb1a10714b2cf93ff76ff Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 19 Jan 2024 16:09:06 -0300 Subject: [PATCH 02/50] Update code --- src/bin/invoke_with_cachedstate.rs | 4 +- src/definitions/block_context.rs | 60 ++++++++++++++++++++++++++++-- src/definitions/constants.rs | 13 +++++-- src/lib.rs | 14 ++++--- src/state/mod.rs | 22 ++++------- src/state/state_api.rs | 5 ++- src/transaction/declare.rs | 21 +++++++---- src/transaction/declare_v2.rs | 16 ++++++-- src/transaction/deploy_account.rs | 21 ++++++++--- src/transaction/fee.rs | 15 +++++--- src/transaction/invoke_function.rs | 33 +++++++++++----- src/transaction/l1_handler.rs | 15 ++++++-- src/utils.rs | 14 +++++-- 13 files changed, 183 insertions(+), 70 deletions(-) diff --git a/src/bin/invoke_with_cachedstate.rs b/src/bin/invoke_with_cachedstate.rs index 093366d73..fbb3f7a5a 100644 --- a/src/bin/invoke_with_cachedstate.rs +++ b/src/bin/invoke_with_cachedstate.rs @@ -132,8 +132,8 @@ pub fn new_starknet_block_context_for_testing() -> BlockContext { BlockContext::new( StarknetOsConfig::new( StarknetChainId::TestNet.to_felt(), - Address(Felt252::ZERO), - 0, + Default::default(), + Default::default(), ), 0, 0, diff --git a/src/definitions/block_context.rs b/src/definitions/block_context.rs index e9bce24f6..80242d250 100644 --- a/src/definitions/block_context.rs +++ b/src/definitions/block_context.rs @@ -71,10 +71,60 @@ pub struct StarknetOsConfig { pub(crate) chain_id: Felt252, /// Address of the token used when paying fees #[get = "pub"] - pub(crate) fee_token_address: Address, + pub(crate) fee_token_address: FeeTokenAddresses, /// Price of gas #[get = "pub"] - pub(crate) gas_price: u128, + pub(crate) gas_price: GasPrices, +} + +#[derive(Clone, Debug, PartialEq, Eq, Default)] +pub struct GasPrices { + pub eth_l1_gas_price: u128, // (Wei) + pub strk_l1_gas_price: u128, // (STRK) +} + +impl GasPrices { + pub fn new(eth_l1_gas_price: u128, strk_l1_gas_price: u128) -> Self { + Self { + eth_l1_gas_price, + strk_l1_gas_price, + } + } + + pub fn get_by_fee_type(&self, fee_type: &FeeType) -> u128 { + match fee_type { + FeeType::Strk => self.strk_l1_gas_price, + FeeType::Eth => self.eth_l1_gas_price, + } + } +} + +#[derive(Clone, Debug, PartialEq, Eq, Default)] +pub struct FeeTokenAddresses { + pub eth_fee_token_address: Address, + pub strk_fee_token_address: Address, +} + +impl FeeTokenAddresses { + pub fn new(eth_fee_token_address: Address, strk_fee_token_address: Address) -> Self { + Self { + eth_fee_token_address, + strk_fee_token_address, + } + } + + pub fn get_by_fee_type(&self, fee_type: &FeeType) -> Address { + match fee_type { + FeeType::Strk => self.strk_fee_token_address, + FeeType::Eth => self.eth_fee_token_address, + } + } +} + +#[derive(Clone, Copy, Hash, Eq, PartialEq)] +pub enum FeeType { + Strk, + Eth, } impl StarknetOsConfig { @@ -85,7 +135,11 @@ impl StarknetOsConfig { /// * `chain_id` - [`Felt252`] of the configured chain. /// * `fee_token_address` - Address of the token used when paying fees. /// * `gas_price` - Price of gas. - pub const fn new(chain_id: Felt252, fee_token_address: Address, gas_price: u128) -> Self { + pub const fn new( + chain_id: Felt252, + fee_token_address: FeeTokenAddresses, + gas_price: GasPrices, + ) -> Self { StarknetOsConfig { chain_id, fee_token_address, diff --git a/src/definitions/constants.rs b/src/definitions/constants.rs index c866e9209..c12856208 100644 --- a/src/definitions/constants.rs +++ b/src/definitions/constants.rs @@ -45,12 +45,17 @@ lazy_static! { pub static ref DEFAULT_SEQUENCER_ADDRESS: Address = Address(Felt252::from_hex( "0x3711666a3506c99c9d78c4d4013409a87a962b7a0880a1c24af9fe193dafc01" ).unwrap()); + pub static ref DEFAULT_STARKNET_OS_CONFIG: StarknetOsConfig = StarknetOsConfig { chain_id: StarknetChainId::TestNet.to_felt(), - fee_token_address: Address(Felt252::from_hex( - "0x4c07059285c2607d528a4c5220ef1f64d8f01273c23cfd9dec68759f61b544" - ).unwrap()), - gas_price: 0, + fee_token_address: crate::definitions::block_context::FeeTokenAddresses { + // TODO: Replace with strk token contract address one deployed + strk_fee_token_address: Address(Felt252::ZERO), + eth_fee_token_address: Address(Felt252::from_hex( + "0x4c07059285c2607d528a4c5220ef1f64d8f01273c23cfd9dec68759f61b544" + ).unwrap()), + }, + gas_price: crate::definitions::block_context::GasPrices::default(), }; pub static ref DECLARE_VERSION: Felt252 = 2.into(); diff --git a/src/lib.rs b/src/lib.rs index a33dc1c4d..e0d33f28a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -18,6 +18,7 @@ use crate::{ utils::Address, }; pub use cairo_vm::Felt252; +use definitions::block_context::FeeType; use std::sync::Arc; #[cfg(test)] @@ -217,7 +218,10 @@ where )?; let tx_fee = calculate_tx_fee( &transaction_result.actual_resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, )?; if let Some(gas_usage) = transaction_result.actual_resources.get("l1_gas_usage") { @@ -251,7 +255,7 @@ mod test { call_contract, core::contract_address::{compute_deprecated_class_hash, compute_sierra_class_hash}, definitions::{ - block_context::{BlockContext, StarknetChainId}, + block_context::{BlockContext, GasPrices, StarknetChainId}, constants::{ EXECUTE_ENTRY_POINT_SELECTOR, INITIAL_GAS_COST, VALIDATE_DECLARE_ENTRY_POINT_SELECTOR, VALIDATE_ENTRY_POINT_SELECTOR, @@ -439,7 +443,7 @@ mod test { ); let mut block_context = BlockContext::default(); - block_context.starknet_os_config.gas_price = 1; + block_context.starknet_os_config.gas_price = GasPrices::new(1, 0); let estimated_fee = estimate_message_fee( &l1_handler, @@ -1061,7 +1065,7 @@ mod test { .unwrap(); let mut block_context = BlockContext::default(); - block_context.starknet_os_config.gas_price = 1; + block_context.starknet_os_config.gas_price = GasPrices::new(1, 0); simulate_transaction( &[&l1_handler_tx], @@ -1261,7 +1265,7 @@ mod test { declare.hash_value = Felt252::from_dec_str("2718").unwrap(); let mut block_context = BlockContext::default(); - block_context.starknet_os_config_mut().gas_price = 12; + block_context.starknet_os_config_mut().gas_price = GasPrices::new(12, 0); let declare_tx = Transaction::Declare(declare); diff --git a/src/state/mod.rs b/src/state/mod.rs index b37234c00..f53f98750 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -4,6 +4,7 @@ use self::{ }; use crate::{ core::errors::state_errors::StateError, + definitions::block_context::GasPrices, transaction::error::TransactionError, utils::{ get_keys, to_cache_state_storage_mapping, to_state_diff_storage_mapping, Address, @@ -28,30 +29,21 @@ pub struct BlockInfo { /// Timestamp of the beginning of the last block creation attempt. pub block_timestamp: u64, /// L1 gas price measured at the beginning of the last block creation attempt. - pub gas_price: u128, + pub gas_price: GasPrices, /// The sequencer address of this block. pub sequencer_address: Address, } -#[derive(Clone, Debug, PartialEq, Eq)] -pub struct GasPrices { - pub eth_l1_gas_price: u128, // (Wei) - pub strk_l1_gas_price: u128, // (STRK) -} - -#[derive(Clone, Debug)] -pub struct FeeTokenAddresses { - pub strk_fee_token_address: Address, - pub eth_fee_token_address: Address, -} - impl BlockInfo { /// Creates an empty BlockInfo with given sequencer address. pub const fn empty(sequencer_address: Address) -> Self { BlockInfo { block_number: 0, // To do: In cairo-lang, this value is set to -1 block_timestamp: 0, - gas_price: 0, + gas_price: GasPrices { + strk_l1_gas_price: 0, + eth_l1_gas_price: 0, + }, sequencer_address, } } @@ -79,7 +71,7 @@ impl Default for BlockInfo { Self { block_number: 0, block_timestamp: 0, - gas_price: 0, + gas_price: Default::default(), sequencer_address: Address(0.into()), } } diff --git a/src/state/state_api.rs b/src/state/state_api.rs index 20e1cbbda..cf92c1667 100644 --- a/src/state/state_api.rs +++ b/src/state/state_api.rs @@ -1,7 +1,7 @@ use super::state_cache::StorageEntry; use crate::{ core::errors::state_errors::StateError, - definitions::block_context::BlockContext, + definitions::block_context::{BlockContext, FeeType}, services::api::contract_classes::compiled_class::CompiledClass, state::StateDiff, utils::{get_erc20_balance_var_addresses, Address, ClassHash, CompiledClassHash}, @@ -103,12 +103,14 @@ pub trait State { &mut self, block_context: &BlockContext, contract_address: &Address, + fee_type: &FeeType, ) -> Result<(Felt252, Felt252), StateError> { let (low_key, high_key) = get_erc20_balance_var_addresses(contract_address)?; let low = self.get_storage_at(&( block_context .starknet_os_config() .fee_token_address() + .get_by_fee_type(fee_type) .clone(), low_key, ))?; @@ -116,6 +118,7 @@ pub trait State { block_context .starknet_os_config() .fee_token_address() + .get_by_fee_type(fee_type) .clone(), high_key, ))?; diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index 13a4cc00b..3916058fa 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -1,6 +1,6 @@ use crate::core::contract_address::compute_deprecated_class_hash; use crate::core::transaction_hash::calculate_declare_transaction_hash; -use crate::definitions::block_context::BlockContext; +use crate::definitions::block_context::{BlockContext, FeeType}; use crate::definitions::constants::VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; use crate::definitions::transaction_type::TransactionType; use crate::execution::gas_usage::get_onchain_data_segment_length; @@ -209,7 +209,10 @@ impl Declare { )? }; let changes = state.count_actual_state_changes(Some(( - &block_context.starknet_os_config.fee_token_address, + &block_context + .starknet_os_config + .fee_token_address + .get_by_fee_type(&FeeType::Eth), &self.sender_address, )))?; let actual_resources = calculate_tx_resources( @@ -318,6 +321,7 @@ impl Declare { &self, state: &mut S, block_context: &BlockContext, + fee_type: &FeeType, ) -> Result<(), TransactionError> { if self.max_fee.is_zero() { return Ok(()); @@ -329,7 +333,7 @@ impl Declare { } // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = - state.get_fee_token_balance(block_context, &self.sender_address)?; + state.get_fee_token_balance(block_context, &self.sender_address, fee_type)?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(self.max_fee) { return Err(TransactionError::MaxFeeExceedsBalance( @@ -358,7 +362,10 @@ impl Declare { ]); calculate_tx_fee( &resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, ) } @@ -389,7 +396,7 @@ impl Declare { )); } if !self.skip_fee_transfer { - self.check_fee_balance(state, block_context)?; + self.check_fee_balance(state, block_context, &FeeType::Eth)?; } self.handle_nonce(state)?; @@ -460,7 +467,7 @@ mod tests { use super::*; use crate::{ definitions::{ - block_context::{BlockContext, StarknetChainId}, + block_context::{BlockContext, GasPrices, StarknetChainId}, constants::VALIDATE_DECLARE_ENTRY_POINT_SELECTOR, transaction_type::TransactionType, }, @@ -968,7 +975,7 @@ mod tests { // --------------------- let mut state_copy = state.clone_for_testing(); let mut bock_context = BlockContext::default(); - bock_context.starknet_os_config.gas_price = 12; + bock_context.starknet_os_config.gas_price = GasPrices::new(12, 0); assert!( declare .execute( diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 15ae287f3..983992fcb 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -1,6 +1,7 @@ use super::fee::{calculate_tx_fee, charge_fee}; use super::{get_tx_version, Transaction}; use crate::core::contract_address::{compute_casm_class_hash, compute_sierra_class_hash}; +use crate::definitions::block_context::FeeType; use crate::definitions::constants::VALIDATE_RETDATA; use crate::execution::execution_entry_point::ExecutionResult; use crate::execution::gas_usage::get_onchain_data_segment_length; @@ -300,6 +301,7 @@ impl DeclareV2 { &self, state: &mut S, block_context: &BlockContext, + fee_type: &FeeType, ) -> Result<(), TransactionError> { if self.max_fee.is_zero() { return Ok(()); @@ -311,7 +313,7 @@ impl DeclareV2 { } // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = - state.get_fee_token_balance(block_context, &self.sender_address)?; + state.get_fee_token_balance(block_context, &self.sender_address, fee_type)?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(self.max_fee) { return Err(TransactionError::MaxFeeExceedsBalance( @@ -340,7 +342,10 @@ impl DeclareV2 { ]); calculate_tx_fee( &resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, ) } @@ -375,7 +380,7 @@ impl DeclareV2 { } if !self.skip_fee_transfer { - self.check_fee_balance(state, block_context)?; + self.check_fee_balance(state, block_context, &FeeType::Eth)?; } self.handle_nonce(state)?; @@ -399,7 +404,10 @@ impl DeclareV2 { self.compile_and_store_casm_class(state)?; let storage_changes = state.count_actual_state_changes(Some(( - &block_context.starknet_os_config.fee_token_address, + &block_context + .starknet_os_config + .fee_token_address + .get_by_fee_type(&FeeType::Eth), &self.sender_address, )))?; diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 89c079e96..0eae7a402 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -1,6 +1,7 @@ use super::fee::{calculate_tx_fee, charge_fee}; use super::get_tx_version; use super::{invoke_function::verify_no_calls_to_other_contracts, Transaction}; +use crate::definitions::block_context::FeeType; use crate::definitions::constants::VALIDATE_RETDATA; use crate::execution::execution_entry_point::ExecutionResult; use crate::execution::gas_usage::get_onchain_data_segment_length; @@ -203,7 +204,7 @@ impl DeployAccount { } if !self.skip_fee_transfer { - self.check_fee_balance(state, block_context)?; + self.check_fee_balance(state, block_context, &FeeType::Eth)?; } self.handle_nonce(state)?; @@ -237,7 +238,10 @@ impl DeployAccount { let actual_fee = calculate_tx_fee( &tx_exec_info.actual_resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, )?; @@ -332,7 +336,10 @@ impl DeployAccount { &[Some(constructor_call_info.clone()), validate_info.clone()], TransactionType::DeployAccount, state.count_actual_state_changes(Some(( - &block_context.starknet_os_config.fee_token_address, + &block_context + .starknet_os_config + .fee_token_address + .get_by_fee_type(&FeeType::Eth), &self.contract_address, )))?, None, @@ -403,6 +410,7 @@ impl DeployAccount { &self, state: &mut S, block_context: &BlockContext, + fee_type: &FeeType, ) -> Result<(), TransactionError> { if self.max_fee.is_zero() { return Ok(()); @@ -414,7 +422,7 @@ impl DeployAccount { } // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = - state.get_fee_token_balance(block_context, self.contract_address())?; + state.get_fee_token_balance(block_context, self.contract_address(), fee_type)?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(self.max_fee) { return Err(TransactionError::MaxFeeExceedsBalance( @@ -443,7 +451,10 @@ impl DeployAccount { ]); calculate_tx_fee( &resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, ) } diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 5eb3c99f8..a4f7e783e 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -1,7 +1,7 @@ use super::error::TransactionError; use crate::{ definitions::{ - block_context::BlockContext, + block_context::{BlockContext, FeeType}, constants::{FEE_FACTOR, INITIAL_GAS_COST, TRANSFER_ENTRY_POINT_SELECTOR}, }, execution::{ @@ -56,7 +56,7 @@ pub(crate) fn execute_fee_transfer( .to_vec(); let fee_transfer_call = ExecutionEntryPoint::new( - fee_token_address, + fee_token_address.get_by_fee_type(&FeeType::Eth), calldata, *TRANSFER_ENTRY_POINT_SELECTOR, tx_execution_context.account_contract_address.clone(), @@ -165,7 +165,10 @@ pub fn charge_fee( let actual_fee = calculate_tx_fee( resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, )?; @@ -201,7 +204,7 @@ pub fn charge_fee( #[cfg(test)] mod tests { use crate::{ - definitions::block_context::BlockContext, + definitions::block_context::{BlockContext, GasPrices}, execution::TransactionExecutionContext, state::{ cached_state::CachedState, contract_class_cache::PermanentContractClassCache, @@ -221,7 +224,7 @@ mod tests { ); let mut tx_execution_context = TransactionExecutionContext::default(); let mut block_context = BlockContext::default(); - block_context.starknet_os_config.gas_price = 1; + block_context.starknet_os_config.gas_price = GasPrices::new(1, 0); let resources = HashMap::from([ ("l1_gas_usage".to_string(), 200_usize), ("pedersen_builtin".to_string(), 10000_usize), @@ -257,7 +260,7 @@ mod tests { ..Default::default() }; let mut block_context = BlockContext::default(); - block_context.starknet_os_config.gas_price = 1; + block_context.starknet_os_config.gas_price = GasPrices::new(1, 0); let resources = HashMap::from([ ("l1_gas_usage".to_string(), 200_usize), ("pedersen_builtin".to_string(), 10000_usize), diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index a3b100884..9201c173a 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -5,7 +5,7 @@ use super::{ use crate::{ core::transaction_hash::{calculate_transaction_hash_common, TransactionHashPrefix}, definitions::{ - block_context::BlockContext, + block_context::{BlockContext, FeeType}, constants::{ EXECUTE_ENTRY_POINT_SELECTOR, VALIDATE_ENTRY_POINT_SELECTOR, VALIDATE_RETDATA, }, @@ -318,7 +318,10 @@ impl InvokeFunction { )? }; let changes = state.count_actual_state_changes(Some(( - &block_context.starknet_os_config.fee_token_address, + &block_context + .starknet_os_config + .fee_token_address + .get_by_fee_type(&FeeType::Eth), &self.contract_address, )))?; let actual_resources = calculate_tx_resources( @@ -371,7 +374,7 @@ impl InvokeFunction { } if !self.skip_fee_transfer { - self.check_fee_balance(state, block_context)?; + self.check_fee_balance(state, block_context, &FeeType::Eth)?; } self.handle_nonce(state)?; @@ -407,7 +410,10 @@ impl InvokeFunction { let actual_fee = calculate_tx_fee( &tx_exec_info.actual_resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, )?; @@ -426,8 +432,11 @@ impl InvokeFunction { } else { // Check if as a result of tx execution the sender's fee token balance is not enough to pay the actual_fee. // If so, revert the transaction. - let (balance_low, balance_high) = transactional_state - .get_fee_token_balance(block_context, self.contract_address())?; + let (balance_low, balance_high) = transactional_state.get_fee_token_balance( + block_context, + self.contract_address(), + &FeeType::Eth, + )?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(actual_fee) @@ -489,6 +498,7 @@ impl InvokeFunction { &self, state: &mut S, block_context: &BlockContext, + fee_type: &FeeType, ) -> Result<(), TransactionError> { if self.max_fee.is_zero() { return Ok(()); @@ -500,7 +510,7 @@ impl InvokeFunction { } // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = - state.get_fee_token_balance(block_context, self.contract_address())?; + state.get_fee_token_balance(block_context, self.contract_address(), fee_type)?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(self.max_fee) { return Err(TransactionError::MaxFeeExceedsBalance( @@ -529,7 +539,10 @@ impl InvokeFunction { ]); calculate_tx_fee( &resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, ) } @@ -690,7 +703,7 @@ fn convert_invoke_v1( mod tests { use super::*; use crate::{ - definitions::constants::QUERY_VERSION_1, + definitions::{block_context::GasPrices, constants::QUERY_VERSION_1}, services::api::contract_classes::{ compiled_class::CompiledClass, deprecated_contract_class::ContractClass, }, @@ -1263,7 +1276,7 @@ mod tests { .unwrap(); let mut block_context = BlockContext::default(); - block_context.starknet_os_config.gas_price = 1; + block_context.starknet_os_config.gas_price = GasPrices::new(1, 0); let tx_info = internal_invoke_function .execute( diff --git a/src/transaction/l1_handler.rs b/src/transaction/l1_handler.rs index 351a34a04..6af282ee6 100644 --- a/src/transaction/l1_handler.rs +++ b/src/transaction/l1_handler.rs @@ -2,7 +2,8 @@ use super::Transaction; use crate::{ core::transaction_hash::{calculate_transaction_hash_common, TransactionHashPrefix}, definitions::{ - block_context::BlockContext, constants::L1_HANDLER_VERSION, + block_context::{BlockContext, FeeType}, + constants::L1_HANDLER_VERSION, transaction_type::TransactionType, }, execution::{ @@ -168,7 +169,10 @@ impl L1Handler { if let Some(paid_fee) = self.paid_fee_on_l1 { let required_fee = calculate_tx_fee( &actual_resources, - block_context.starknet_os_config.gas_price, + block_context + .starknet_os_config + .gas_price + .get_by_fee_type(&FeeType::Eth), block_context, )?; // For now, assert only that any amount of fee was paid. @@ -250,7 +254,10 @@ impl L1Handler { #[cfg(test)] mod test { use crate::{ - definitions::{block_context::BlockContext, transaction_type::TransactionType}, + definitions::{ + block_context::{BlockContext, GasPrices}, + transaction_type::TransactionType, + }, execution::{CallInfo, TransactionExecutionInfo}, services::api::contract_classes::{ compiled_class::CompiledClass, @@ -317,7 +324,7 @@ mod test { .unwrap(); let mut block_context = BlockContext::default(); - block_context.starknet_os_config.gas_price = 1; + block_context.starknet_os_config.gas_price = GasPrices::new(1, 0); let tx_exec = l1_handler .execute( diff --git a/src/utils.rs b/src/utils.rs index 08126349f..afac88920 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -111,7 +111,7 @@ pub fn get_native_context() -> &'static cairo_native::context::NativeContext { //* Address //* ------------------- -#[derive(Clone, PartialEq, Hash, Eq, Default, Serialize, Deserialize)] +#[derive(Clone, Copy, PartialEq, Hash, Eq, Default, Serialize, Deserialize)] pub struct Address(pub Felt252); impl fmt::Display for Address { @@ -512,7 +512,9 @@ pub mod test_utils { use crate::{ definitions::{ - block_context::{BlockContext, StarknetChainId, StarknetOsConfig}, + block_context::{ + BlockContext, FeeTokenAddresses, GasPrices, StarknetChainId, StarknetOsConfig, + }, constants::DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS, }, services::api::contract_classes::{ @@ -728,6 +730,9 @@ pub mod test_utils { Address(Felt252::from_dec_str("4096").unwrap()); pub(crate) static ref TEST_ERC20_CONTRACT_ADDRESS: Address = Address(Felt252::from_dec_str("4097").unwrap()); + pub(crate) static ref TEST_STRK_CONTRACT_ADDRESS: Address = + Address(Felt252::from_dec_str("4097").unwrap()); + pub(crate) static ref TEST_FEE_TOKEN_ADDRESSES : FeeTokenAddresses = FeeTokenAddresses::new(TEST_ERC20_CONTRACT_ADDRESS.clone(), TEST_STRK_CONTRACT_ADDRESS.clone()); // Class hashes. @@ -759,8 +764,8 @@ pub mod test_utils { BlockContext::new( StarknetOsConfig::new( StarknetChainId::TestNet.to_felt(), - TEST_ERC20_CONTRACT_ADDRESS.clone(), - 1, + TEST_FEE_TOKEN_ADDRESSES.clone(), + GasPrices::new(1, 1), ), 0, 0, @@ -806,6 +811,7 @@ pub mod test_utils { let test_erc20_address = block_context .starknet_os_config() .fee_token_address() + .eth_fee_token_address .clone(); let address_to_class_hash = HashMap::from([ (test_contract_address, test_contract_class_hash), From e24dacda2f78c0453e14f367791a27455a2ed52a Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 19 Jan 2024 16:40:32 -0300 Subject: [PATCH 03/50] RpcStateReader::get_gas_price fetch both --- rpc_state_reader/src/rpc_state.rs | 40 +++++++++++++++++++++---------- src/definitions/block_context.rs | 2 +- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/rpc_state_reader/src/rpc_state.rs b/rpc_state_reader/src/rpc_state.rs index 7bf7f84d7..30896cbb4 100644 --- a/rpc_state_reader/src/rpc_state.rs +++ b/rpc_state_reader/src/rpc_state.rs @@ -18,7 +18,7 @@ use starknet_api::{ state::StorageKey, transaction::{Transaction as SNTransaction, TransactionHash}, }; -use starknet_in_rust::definitions::block_context::StarknetChainId; +use starknet_in_rust::definitions::block_context::{GasPrices, StarknetChainId}; use std::{collections::HashMap, env, fmt::Display}; use crate::{rpc_state_errors::RpcStateError, utils}; @@ -429,7 +429,7 @@ impl RpcState { } /// Gets the gas price of a given block. - pub fn get_gas_price(&self, block_number: u64) -> Result { + pub fn get_gas_price(&self, block_number: u64) -> Result { let res = self .rpc_call::( "starknet_getBlockWithTxHashes", @@ -438,16 +438,32 @@ impl RpcState { .get("result") .ok_or(RpcStateError::MissingRpcResponseField("result".into()))? .clone(); - let gas_price_hex = res - .get("l1_gas_price") - .and_then(|gp| gp.get("price_in_wei")) - .and_then(|gp| gp.as_str()) - .ok_or(RpcStateError::MissingRpcResponseField( - "gas_price".to_string(), - ))?; - let gas_price = u128::from_str_radix(gas_price_hex.trim_start_matches("0x"), 16) - .map_err(|_| RpcStateError::RpcResponseWrongType("gas_price".to_string()))?; - Ok(gas_price) + + let gas_price_eth = u128::from_str_radix( + res.get("l1_gas_price") + .and_then(|gp| gp.get("price_in_wei")) + .and_then(|gp| gp.as_str()) + .ok_or(RpcStateError::MissingRpcResponseField( + "gas_price.price_in_wei".to_string(), + ))? + .trim_start_matches("0x"), + 16, + ) + .map_err(|_| RpcStateError::RpcResponseWrongType("gas_price".to_string()))?; + + let gas_price_strk = u128::from_str_radix( + res.get("l1_gas_price") + .and_then(|gp| gp.get("price_in_fri")) + .and_then(|gp| gp.as_str()) + .ok_or(RpcStateError::MissingRpcResponseField( + "gas_price.price_in_fri".to_string(), + ))? + .trim_start_matches("0x"), + 16, + ) + .map_err(|_| RpcStateError::RpcResponseWrongType("gas_price".to_string()))?; + + Ok(GasPrices::new(gas_price_eth, gas_price_strk)) } pub fn get_chain_name(&self) -> ChainId { diff --git a/src/definitions/block_context.rs b/src/definitions/block_context.rs index 80242d250..9c89b0567 100644 --- a/src/definitions/block_context.rs +++ b/src/definitions/block_context.rs @@ -80,7 +80,7 @@ pub struct StarknetOsConfig { #[derive(Clone, Debug, PartialEq, Eq, Default)] pub struct GasPrices { pub eth_l1_gas_price: u128, // (Wei) - pub strk_l1_gas_price: u128, // (STRK) + pub strk_l1_gas_price: u128, // (Fri) } impl GasPrices { From 5a4d9840a5c8a7d10239d0db8e01eae476e0ed08 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 19 Jan 2024 17:11:07 -0300 Subject: [PATCH 04/50] Update code --- rpc_state_reader/src/sir_state_reader.rs | 18 ++++++++++++------ rpc_state_reader/tests/blockifier_tests.rs | 6 +++--- rpc_state_reader/tests/sir_tests.rs | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/rpc_state_reader/src/sir_state_reader.rs b/rpc_state_reader/src/sir_state_reader.rs index 1c6adb7d5..415e5b1c5 100644 --- a/rpc_state_reader/src/sir_state_reader.rs +++ b/rpc_state_reader/src/sir_state_reader.rs @@ -11,7 +11,7 @@ use starknet_api::{ use starknet_in_rust::{ core::{contract_address::compute_casm_class_hash, errors::state_errors::StateError}, definitions::{ - block_context::{BlockContext, StarknetChainId, StarknetOsConfig}, + block_context::{BlockContext, FeeTokenAddresses, StarknetChainId, StarknetOsConfig}, constants::{ DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS, DEFAULT_CONTRACT_STORAGE_COMMITMENT_TREE_HEIGHT, DEFAULT_GLOBAL_STATE_COMMITMENT_TREE_HEIGHT, DEFAULT_INVOKE_TX_MAX_N_STEPS, @@ -166,9 +166,12 @@ pub fn execute_tx_configurable_with_state( skip_nonce_check: bool, state: &mut CachedState, ) -> Result { - let fee_token_address = Address( - Felt252::from_hex("049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7") - .unwrap(), + let fee_token_address = FeeTokenAddresses::new( + Address( + Felt252::from_hex("049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7") + .unwrap(), + ), + Address::default(), ); // Get values for block context before giving ownership of the reader @@ -177,8 +180,11 @@ pub fn execute_tx_configurable_with_state( RpcChain::TestNet => StarknetChainId::TestNet, RpcChain::TestNet2 => StarknetChainId::TestNet2, }; - let starknet_os_config = - StarknetOsConfig::new(chain_id.to_felt(), fee_token_address, block_info.gas_price); + let starknet_os_config = StarknetOsConfig::new( + chain_id.to_felt(), + fee_token_address, + block_info.gas_price.clone(), + ); // Get transaction before giving ownership of the reader let tx = match tx { diff --git a/rpc_state_reader/tests/blockifier_tests.rs b/rpc_state_reader/tests/blockifier_tests.rs index db2da1c22..a7c8d4744 100644 --- a/rpc_state_reader/tests/blockifier_tests.rs +++ b/rpc_state_reader/tests/blockifier_tests.rs @@ -177,8 +177,8 @@ pub fn execute_tx( vm_resource_fee_cost, // TODO: Add strk l1 gas price when updated gas_prices: GasPrices { - eth_l1_gas_price: gas_price, - strk_l1_gas_price: gas_price, + eth_l1_gas_price: gas_price.eth_l1_gas_price, + strk_l1_gas_price: gas_price.strk_l1_gas_price, }, invoke_tx_max_n_steps: 1_000_000, validate_max_n_steps: 1_000_000, @@ -254,7 +254,7 @@ fn test_get_gas_price() { let rpc_state = RpcState::new_rpc(RpcChain::MainNet, block).unwrap(); let price = rpc_state.get_gas_price(169928).unwrap(); - assert_eq!(price, 22804578690); + assert_eq!(price.eth_l1_gas_price, 22804578690); } #[test] diff --git a/rpc_state_reader/tests/sir_tests.rs b/rpc_state_reader/tests/sir_tests.rs index 856d215b8..6f7b6e37b 100644 --- a/rpc_state_reader/tests/sir_tests.rs +++ b/rpc_state_reader/tests/sir_tests.rs @@ -43,7 +43,7 @@ fn test_get_gas_price() { let rpc_state = RpcState::new_rpc(RpcChain::MainNet, block).unwrap(); let price = rpc_state.get_gas_price(169928).unwrap(); - assert_eq!(price, 22804578690); + assert_eq!(price.eth_l1_gas_price, 22804578690); } #[test_case( From c1d4bd0b7c93b04a7c7c10d34dddd53479aa9553 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 19 Jan 2024 17:38:46 -0300 Subject: [PATCH 05/50] Clippy --- replay/src/main.rs | 11 ++++++----- src/definitions/block_context.rs | 6 +++--- src/transaction/declare.rs | 4 ++-- src/transaction/declare_v2.rs | 4 ++-- src/transaction/deploy_account.rs | 4 ++-- src/transaction/fee.rs | 2 +- src/transaction/invoke_function.rs | 4 ++-- src/utils.rs | 2 +- 8 files changed, 19 insertions(+), 18 deletions(-) diff --git a/replay/src/main.rs b/replay/src/main.rs index e8e465bcc..bb0550c5e 100644 --- a/replay/src/main.rs +++ b/replay/src/main.rs @@ -19,6 +19,7 @@ use starknet_api::{ use starknet_in_rust::execution::TransactionExecutionInfo; #[cfg(feature = "benchmark")] use starknet_in_rust::{ + definitions::block_context::GasPrices, state::{ cached_state::CachedState, contract_class_cache::PermanentContractClassCache, BlockInfo, }, @@ -137,7 +138,7 @@ fn main() { >::new(); let mut block_timestamps = HashMap::::new(); let mut sequencer_addresses = HashMap::::new(); - let mut gas_prices = HashMap::::new(); + let mut gas_prices = HashMap::::new(); for block_number in block_start..=block_end { // For each block: let block_number = BlockNumber(block_number); @@ -158,7 +159,7 @@ fn main() { sequencer_addresses.insert(block_number, sequencer_address.clone()); // Fetch gas price let gas_price = state.state_reader.0.get_gas_price(block_number.0).unwrap(); - gas_prices.insert(block_number, gas_price); + gas_prices.insert(block_number, gas_price.clone()); // Fetch txs for the block let transaction_hashes = get_transaction_hashes(block_number, network) @@ -177,7 +178,7 @@ fn main() { BlockInfo { block_number: block_number.0, block_timestamp: block_timestamp.0, - gas_price, + gas_price: gas_price.clone(), sequencer_address: sequencer_address.clone(), }, false, @@ -213,7 +214,7 @@ fn main() { // Fetch sequencer address let sequencer_address = sequencer_addresses.get(&block_number).unwrap(); // Fetch gas price - let gas_price = *gas_prices.get(&block_number).unwrap(); + let gas_price = gas_prices.get(&block_number).unwrap(); // Run txs for (tx_hash, tx) in block_txs { let _ = execute_tx_configurable_with_state( @@ -223,7 +224,7 @@ fn main() { BlockInfo { block_number: block_number.0, block_timestamp, - gas_price, + gas_price: gas_price.clone(), sequencer_address: sequencer_address.clone(), }, false, diff --git a/src/definitions/block_context.rs b/src/definitions/block_context.rs index 9c89b0567..2f6af2fdd 100644 --- a/src/definitions/block_context.rs +++ b/src/definitions/block_context.rs @@ -113,10 +113,10 @@ impl FeeTokenAddresses { } } - pub fn get_by_fee_type(&self, fee_type: &FeeType) -> Address { + pub fn get_by_fee_type(&self, fee_type: &FeeType) -> &Address { match fee_type { - FeeType::Strk => self.strk_fee_token_address, - FeeType::Eth => self.eth_fee_token_address, + FeeType::Strk => &self.strk_fee_token_address, + FeeType::Eth => &self.eth_fee_token_address, } } } diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index e23a50883..722f2f758 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -209,10 +209,10 @@ impl Declare { )? }; let changes = state.count_actual_state_changes(Some(( - &block_context + (block_context .starknet_os_config .fee_token_address - .get_by_fee_type(&FeeType::Eth), + .get_by_fee_type(&FeeType::Eth)), &self.sender_address, )))?; let actual_resources = calculate_tx_resources( diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 38e65fb54..e4967964c 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -395,10 +395,10 @@ impl DeclareV2 { self.compile_and_store_casm_class(state)?; let storage_changes = state.count_actual_state_changes(Some(( - &block_context + (block_context .starknet_os_config .fee_token_address - .get_by_fee_type(&FeeType::Eth), + .get_by_fee_type(&FeeType::Eth)), &self.sender_address, )))?; diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index b539cdf16..534f1a86f 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -331,10 +331,10 @@ impl DeployAccount { &[Some(constructor_call_info.clone()), validate_info.clone()], TransactionType::DeployAccount, state.count_actual_state_changes(Some(( - &block_context + (block_context .starknet_os_config .fee_token_address - .get_by_fee_type(&FeeType::Eth), + .get_by_fee_type(&FeeType::Eth)), &self.contract_address, )))?, None, diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index d1d47ea35..3a15d662a 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -56,7 +56,7 @@ pub(crate) fn execute_fee_transfer( .to_vec(); let fee_transfer_call = ExecutionEntryPoint::new( - fee_token_address.get_by_fee_type(&FeeType::Eth), + fee_token_address.get_by_fee_type(&FeeType::Eth).clone(), calldata, *TRANSFER_ENTRY_POINT_SELECTOR, tx_execution_context.account_contract_address.clone(), diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 57f454b62..2df8c9d5f 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -327,10 +327,10 @@ impl InvokeFunction { )? }; let changes = state.count_actual_state_changes(Some(( - &block_context + (block_context .starknet_os_config .fee_token_address - .get_by_fee_type(&FeeType::Eth), + .get_by_fee_type(&FeeType::Eth)), &self.contract_address, )))?; let actual_resources = calculate_tx_resources( diff --git a/src/utils.rs b/src/utils.rs index 796ea6a18..2fc4f167c 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -111,7 +111,7 @@ pub fn get_native_context() -> &'static cairo_native::context::NativeContext { //* Address //* ------------------- -#[derive(Clone, Copy, PartialEq, Hash, Eq, Default, Serialize, Deserialize)] +#[derive(Clone, PartialEq, Hash, Eq, Default, Serialize, Deserialize)] pub struct Address(pub Felt252); impl fmt::Display for Address { From 81a61f2f4b0887f25bc289338cd188e20de38555 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 19 Jan 2024 17:41:40 -0300 Subject: [PATCH 06/50] Fix comment --- src/definitions/constants.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/definitions/constants.rs b/src/definitions/constants.rs index c12856208..1613f970f 100644 --- a/src/definitions/constants.rs +++ b/src/definitions/constants.rs @@ -49,7 +49,7 @@ lazy_static! { pub static ref DEFAULT_STARKNET_OS_CONFIG: StarknetOsConfig = StarknetOsConfig { chain_id: StarknetChainId::TestNet.to_felt(), fee_token_address: crate::definitions::block_context::FeeTokenAddresses { - // TODO: Replace with strk token contract address one deployed + // TODO: Replace with STRK token contract address when deployed strk_fee_token_address: Address(Felt252::ZERO), eth_fee_token_address: Address(Felt252::from_hex( "0x4c07059285c2607d528a4c5220ef1f64d8f01273c23cfd9dec68759f61b544" From 8d6168da42bdaf7242f788842e3cac8faf63b100 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 13:31:53 -0300 Subject: [PATCH 07/50] Add VersionSpecificAccountTxFields struct --- src/transaction/mod.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 9303d78fe..c78c47cc7 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -186,3 +186,22 @@ fn get_tx_version(version: Felt252) -> Felt252 { version => version, } } + +pub enum VersionSpecificAccountTxFields { + // Deprecated fields only consist of max_fee + Deprecated(u128) +} + +impl Default for VersionSpecificAccountTxFields { + fn default() -> Self { + Self::Deprecated(0) + } +} + +impl VersionSpecificAccountTxFields { + fn max_fee(&self) -> u128 { + match self { + Self::Deprecated(max_fee) => *max_fee + } + } +} From badc6a52bab1b837ff8cd1db1198e2f61264b81f Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 14:58:56 -0300 Subject: [PATCH 08/50] Integrate into TransactionExecutionContext --- src/execution/mod.rs | 17 ++++++----------- src/lib.rs | 3 ++- src/syscalls/business_logic_syscall_handler.rs | 2 +- src/syscalls/deprecated_syscall_handler.rs | 7 ++++--- src/transaction/fee.rs | 4 ++-- src/transaction/mod.rs | 10 +++++++--- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/execution/mod.rs b/src/execution/mod.rs index 33e386d69..3071edd4b 100644 --- a/src/execution/mod.rs +++ b/src/execution/mod.rs @@ -2,6 +2,7 @@ pub mod execution_entry_point; pub mod gas_usage; pub mod os_usage; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; +use crate::transaction::VersionSpecificAccountTxFields; use crate::utils::parse_felt_array; use crate::{ definitions::{constants::CONSTRUCTOR_ENTRY_POINT_SELECTOR, transaction_type::TransactionType}, @@ -361,7 +362,7 @@ pub struct TransactionExecutionContext { pub(crate) n_emitted_events: u64, pub(crate) version: Felt252, pub(crate) account_contract_address: Address, - pub(crate) max_fee: u128, + pub(crate) account_tx_fields: VersionSpecificAccountTxFields, pub(crate) transaction_hash: Felt252, pub(crate) signature: Vec, #[get = "pub"] @@ -376,7 +377,7 @@ impl TransactionExecutionContext { account_contract_address: Address, transaction_hash: Felt252, signature: Vec, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, nonce: Felt252, n_steps: u64, version: Felt252, @@ -390,7 +391,7 @@ impl TransactionExecutionContext { TransactionExecutionContext { n_emitted_events: 0, account_contract_address, - max_fee, + account_tx_fields, nonce, signature, transaction_hash, @@ -402,21 +403,15 @@ impl TransactionExecutionContext { pub fn create_for_testing( account_contract_address: Address, - _max_fee: u128, nonce: Felt252, n_steps: u64, version: Felt252, ) -> Self { TransactionExecutionContext { - n_emitted_events: 0, version, account_contract_address, - max_fee: 0, - transaction_hash: Felt252::ZERO, - signature: Vec::new(), nonce, - n_sent_messages: 0, - _n_steps: n_steps, + ..Default::default() } } } @@ -442,7 +437,7 @@ impl TxInfoStruct { TxInfoStruct { version: tx.version, account_contract_address: tx.account_contract_address, - max_fee: tx.max_fee, + max_fee: tx.account_tx_fields.max_fee(), signature_len: tx.signature.len(), signature, transaction_hash: tx.transaction_hash, diff --git a/src/lib.rs b/src/lib.rs index a47aa3814..b1f23abaa 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,6 +20,7 @@ use crate::{ pub use cairo_vm::Felt252; use definitions::block_context::FeeType; use std::sync::Arc; +use transaction::VersionSpecificAccountTxFields; #[cfg(test)] #[macro_use] @@ -171,7 +172,7 @@ pub fn call_contract( contract_address, transaction_hash, signature, - max_fee, + VersionSpecificAccountTxFields::new_deprecated(max_fee), nonce, block_context.invoke_tx_max_n_steps(), version.into(), diff --git a/src/syscalls/business_logic_syscall_handler.rs b/src/syscalls/business_logic_syscall_handler.rs index 3680d8126..c81e3e47b 100644 --- a/src/syscalls/business_logic_syscall_handler.rs +++ b/src/syscalls/business_logic_syscall_handler.rs @@ -752,7 +752,7 @@ impl<'a, S: StateReader, C: ContractClassCache> BusinessLogicSyscallHandler<'a, let tx_info_data = vec![ MaybeRelocatable::from(&tx_info.version), MaybeRelocatable::from(&tx_info.account_contract_address.0), - MaybeRelocatable::from(Felt252::from(tx_info.max_fee)), + MaybeRelocatable::from(Felt252::from(tx_info.account_tx_fields.max_fee())), signature_start_ptr.into(), signature_end_ptr.into(), MaybeRelocatable::from(&tx_info.transaction_hash), diff --git a/src/syscalls/deprecated_syscall_handler.rs b/src/syscalls/deprecated_syscall_handler.rs index 85cb7c688..5f6612568 100644 --- a/src/syscalls/deprecated_syscall_handler.rs +++ b/src/syscalls/deprecated_syscall_handler.rs @@ -272,6 +272,7 @@ mod tests { use crate::services::api::contract_classes::compiled_class::CompiledClass; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use crate::state::StateDiff; + use crate::transaction::VersionSpecificAccountTxFields; use crate::utils::ClassHash; use crate::{ add_segments, allocate_selector, any_box, @@ -546,7 +547,7 @@ mod tests { n_emitted_events: 50, version: 51.into(), account_contract_address: Address(260.into()), - max_fee: 261, + account_tx_fields: VersionSpecificAccountTxFields::new_deprecated(261), transaction_hash: 262.into(), signature: vec![300.into(), 301.into()], nonce: 263.into(), @@ -589,7 +590,7 @@ mod tests { ); assert_matches!( get_integer(&vm, relocatable!(4, 2)), - Ok(field) if field == tx_execution_context.max_fee as usize + Ok(field) if field == tx_execution_context.account_tx_fields.max_fee() as usize ); assert_matches!( get_integer(&vm, relocatable!(4, 3)), @@ -879,7 +880,7 @@ mod tests { n_emitted_events: 50, version: 51.into(), account_contract_address: Address(260.into()), - max_fee: 261, + account_tx_fields: VersionSpecificAccountTxFields::new_deprecated(261), transaction_hash: 262.into(), signature: vec![300.into(), 301.into()], nonce: 263.into(), diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 3a15d662a..30dac5642 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -39,10 +39,10 @@ pub(crate) fn execute_fee_transfer( Rc>>, >, ) -> Result { - if actual_fee > tx_execution_context.max_fee { + if actual_fee > tx_execution_context.account_tx_fields.max_fee() { return Err(TransactionError::ActualFeeExceedsMaxFee( actual_fee, - tx_execution_context.max_fee, + tx_execution_context.account_tx_fields.max_fee(), )); } diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index c78c47cc7..77f083cf1 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -187,9 +187,10 @@ fn get_tx_version(version: Felt252) -> Felt252 { } } +#[derive(Clone, Debug)] pub enum VersionSpecificAccountTxFields { // Deprecated fields only consist of max_fee - Deprecated(u128) + Deprecated(u128), } impl Default for VersionSpecificAccountTxFields { @@ -199,9 +200,12 @@ impl Default for VersionSpecificAccountTxFields { } impl VersionSpecificAccountTxFields { - fn max_fee(&self) -> u128 { + pub fn new_deprecated(max_fee: u128) -> Self { + Self::Deprecated(max_fee) + } + pub fn max_fee(&self) -> u128 { match self { - Self::Deprecated(max_fee) => *max_fee + Self::Deprecated(max_fee) => *max_fee, } } } From 2bb0091e553d1fd97cb6f3e931f0d4ff2e66f5ef Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 15:30:00 -0300 Subject: [PATCH 09/50] Replace max_fee field with account_tx_fields for InvokeFunction tx --- src/lib.rs | 17 +++--- src/syscalls/deprecated_syscall_handler.rs | 2 +- src/transaction/invoke_function.rs | 71 ++++++++++++---------- src/transaction/mod.rs | 3 +- 4 files changed, 51 insertions(+), 42 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b1f23abaa..ffa48390a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -274,6 +274,7 @@ mod test { }, transaction::{ Declare, DeclareV2, Deploy, DeployAccount, InvokeFunction, L1Handler, Transaction, + VersionSpecificAccountTxFields, }, utils::{ felt_to_hash, @@ -323,7 +324,7 @@ mod test { let invoke_function = InvokeFunction::new( TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), *VALIDATE_ENTRY_POINT_SELECTOR, - 0, // should be ignored. + VersionSpecificAccountTxFields::new_deprecated(0), // should be ignored. 1.into(), calldata, vec![], @@ -492,7 +493,7 @@ mod test { let invoke = InvokeFunction::new( address, entrypoint_selector, - 1000000, + VersionSpecificAccountTxFields::new_deprecated(1000000), Felt252::ZERO, calldata, vec![], @@ -592,7 +593,7 @@ mod test { InvokeFunction::new( address.clone(), entrypoint_selector, - 1000000, + VersionSpecificAccountTxFields::new_deprecated(1000000), Felt252::ONE, calldata.clone(), vec![], @@ -606,7 +607,7 @@ mod test { InvokeFunction::new( address.clone(), entrypoint_selector, - 1000000, + VersionSpecificAccountTxFields::new_deprecated(1000000), Felt252::ONE, calldata.clone(), vec![], @@ -620,7 +621,7 @@ mod test { InvokeFunction::new( address, entrypoint_selector, - 1000000, + VersionSpecificAccountTxFields::new_deprecated(1000000), Felt252::ONE, calldata, vec![], @@ -728,7 +729,7 @@ mod test { InvokeFunction::new( address, entrypoint_selector, - 1000000, + VersionSpecificAccountTxFields::new_deprecated(1000000), Felt252::ONE, calldata, vec![], @@ -900,7 +901,7 @@ mod test { InvokeFunction::new( CONTRACT_ADDRESS.clone(), selector, - 0, + VersionSpecificAccountTxFields::new_deprecated(0), *TRANSACTION_VERSION, calldata, SIGNATURE.clone(), @@ -1126,7 +1127,7 @@ mod test { InvokeFunction::new( CONTRACT_ADDRESS.clone(), selector, - 0, + VersionSpecificAccountTxFields::new_deprecated(0), *TRANSACTION_VERSION, calldata, SIGNATURE.clone(), diff --git a/src/syscalls/deprecated_syscall_handler.rs b/src/syscalls/deprecated_syscall_handler.rs index 5f6612568..cc172df4c 100644 --- a/src/syscalls/deprecated_syscall_handler.rs +++ b/src/syscalls/deprecated_syscall_handler.rs @@ -1234,7 +1234,7 @@ mod tests { Address(deployed_address), Felt252::from_hex("0x283e8c15029ea364bfb37203d91b698bc75838eaddc4f375f1ff83c2d67395c") .unwrap(), - 0, + VersionSpecificAccountTxFields::new_deprecated(0), Felt252::ZERO, vec![10.into()], Vec::new(), diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 2df8c9d5f..50fbbeae5 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -1,6 +1,6 @@ use super::{ fee::{calculate_tx_fee, charge_fee}, - get_tx_version, Transaction, + get_tx_version, Transaction, VersionSpecificAccountTxFields, }; use crate::{ core::transaction_hash::{calculate_transaction_hash_common, TransactionHashPrefix}, @@ -60,7 +60,7 @@ pub struct InvokeFunction { hash_value: Felt252, #[getset(get = "pub")] signature: Vec, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, nonce: Option, skip_validation: bool, skip_execute: bool, @@ -73,7 +73,7 @@ impl InvokeFunction { pub fn new( contract_address: Address, entry_point_selector: Felt252, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, version: Felt252, calldata: Vec, signature: Vec, @@ -88,7 +88,7 @@ impl InvokeFunction { &contract_address, entry_point_selector_field, &calldata, - max_fee, + account_tx_fields.max_fee(), chain_id, &additional_data, )?; @@ -96,7 +96,7 @@ impl InvokeFunction { InvokeFunction::new_with_tx_hash( contract_address, entry_point_selector, - max_fee, + account_tx_fields, version, calldata, signature, @@ -109,7 +109,7 @@ impl InvokeFunction { pub fn new_with_tx_hash( contract_address: Address, entry_point_selector: Felt252, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, version: Felt252, calldata: Vec, signature: Vec, @@ -127,7 +127,7 @@ impl InvokeFunction { calldata, tx_type: TransactionType::InvokeFunction, version, - max_fee, + account_tx_fields, signature, validate_entry_point_selector, nonce, @@ -161,7 +161,7 @@ impl InvokeFunction { self.contract_address.clone(), self.hash_value, self.signature.clone(), - self.max_fee, + self.account_tx_fields, if self.version.is_zero() { Felt252::ZERO } else { @@ -423,12 +423,13 @@ impl InvokeFunction { if let Some(revert_error) = tx_exec_info.revert_error.clone() { // execution error tx_exec_info = tx_exec_info.to_revert_error(&revert_error); - } else if actual_fee > self.max_fee { + } else if actual_fee > self.account_tx_fields.max_fee() { // max_fee exceeded tx_exec_info = tx_exec_info.to_revert_error( format!( "Calculated fee ({}) exceeds max fee ({})", - actual_fee, self.max_fee + actual_fee, + self.account_tx_fields.max_fee() ) .as_str(), ); @@ -459,7 +460,7 @@ impl InvokeFunction { state, &tx_exec_info.actual_resources, block_context, - self.max_fee, + self.account_tx_fields.max_fee(), &mut tx_execution_context, self.skip_fee_transfer, #[cfg(feature = "cairo-native")] @@ -503,21 +504,24 @@ impl InvokeFunction { block_context: &BlockContext, fee_type: &FeeType, ) -> Result<(), TransactionError> { - if self.max_fee.is_zero() { + if self.account_tx_fields.max_fee().is_zero() { return Ok(()); } let minimal_fee = self.estimate_minimal_fee(block_context)?; // Check max fee is at least the estimated constant overhead. - if self.max_fee < minimal_fee { - return Err(TransactionError::MaxFeeTooLow(self.max_fee, minimal_fee)); + if self.account_tx_fields.max_fee() < minimal_fee { + return Err(TransactionError::MaxFeeTooLow( + self.account_tx_fields.max_fee(), + minimal_fee, + )); } // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = state.get_fee_token_balance(block_context, self.contract_address(), fee_type)?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). - if balance_high.is_zero() && balance_low < Felt252::from(self.max_fee) { + if balance_high.is_zero() && balance_low < Felt252::from(self.account_tx_fields.max_fee()) { return Err(TransactionError::MaxFeeExceedsBalance( - self.max_fee, + self.account_tx_fields.max_fee(), balance_low, balance_high, )); @@ -558,10 +562,12 @@ impl InvokeFunction { skip_execute, skip_fee_transfer, skip_nonce_check, - max_fee: if ignore_max_fee { - u128::MAX + // TODO[0.13]: Handle ignore_max_fee for V3 txs + account_tx_fields: if ignore_max_fee { + // max_fee = 0 + Default::default() } else { - self.max_fee + self.account_tx_fields }, ..self.clone() }; @@ -649,7 +655,7 @@ fn convert_invoke_v0( InvokeFunction::new_with_tx_hash( contract_address, entry_point_selector, - max_fee, + VersionSpecificAccountTxFields::Deprecated(max_fee), Felt252::from(0), calldata, signature, @@ -686,7 +692,8 @@ fn convert_invoke_v1( InvokeFunction::new_with_tx_hash( contract_address, entry_point_selector, - max_fee, + // TODO[0.13] Properly convert between V3 tx fields + VersionSpecificAccountTxFields::Deprecated(max_fee), Felt252::ONE, calldata, signature, @@ -798,7 +805,7 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 0, + account_tx_fields: Default::default(), nonce: Some(0.into()), skip_validation: false, skip_execute: false, @@ -880,7 +887,7 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 0, + account_tx_fields: Default::default(), nonce: Some(0.into()), skip_validation: false, skip_execute: false, @@ -954,7 +961,7 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 0, + account_tx_fields: Default::default(), nonce: Some(0.into()), skip_validation: false, skip_execute: false, @@ -1021,7 +1028,7 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 0, + account_tx_fields: Default::default(), nonce: None, skip_validation: false, skip_execute: false, @@ -1100,7 +1107,7 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 0, + account_tx_fields: Default::default(), nonce: None, skip_validation: false, skip_execute: false, @@ -1184,7 +1191,7 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 1000, + account_tx_fields: VersionSpecificAccountTxFields::new_deprecated(1000), nonce: Some(0.into()), skip_validation: false, skip_execute: false, @@ -1233,7 +1240,7 @@ mod tests { validate_entry_point_selector: *VALIDATE_ENTRY_POINT_SELECTOR, hash_value: 0.into(), signature: Vec::new(), - max_fee, + account_tx_fields: VersionSpecificAccountTxFields::new_deprecated(max_fee), nonce: Some(0.into()), skip_validation: false, skip_execute: false, @@ -1306,7 +1313,7 @@ mod tests { validate_entry_point_selector: *VALIDATE_ENTRY_POINT_SELECTOR, hash_value: 0.into(), signature: Vec::new(), - max_fee: 0, + account_tx_fields: Default::default(), nonce: Some(0.into()), skip_validation: false, skip_execute: false, @@ -1383,7 +1390,7 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 0, + account_tx_fields: Default::default(), nonce: None, skip_validation: false, skip_execute: false, @@ -1520,7 +1527,7 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 0, + account_tx_fields: Default::default(), nonce: Some(0.into()), skip_validation: true, skip_execute: false, @@ -1606,7 +1613,7 @@ mod tests { let internal_declare = InvokeFunction::new( Address(Felt252::ONE), Felt252::ONE, - 9000, + VersionSpecificAccountTxFields::new_deprecated(9000), 2.into(), vec![], vec![], diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 77f083cf1..50b251449 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -203,7 +203,8 @@ impl VersionSpecificAccountTxFields { pub fn new_deprecated(max_fee: u128) -> Self { Self::Deprecated(max_fee) } - pub fn max_fee(&self) -> u128 { + // TODO[0.13]: This method should be removed after completing V3 Tx related changes + pub(crate) fn max_fee(&self) -> u128 { match self { Self::Deprecated(max_fee) => *max_fee, } From 93d0d610ad7af6965272fb7d00e9a9532af91ca3 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 15:47:31 -0300 Subject: [PATCH 10/50] Check tx account fields version when creating Invoke tx --- src/transaction/error.rs | 4 ++++ src/transaction/invoke_function.rs | 2 ++ src/transaction/mod.rs | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/src/transaction/error.rs b/src/transaction/error.rs index 89cd303b7..b277783a3 100644 --- a/src/transaction/error.rs +++ b/src/transaction/error.rs @@ -160,4 +160,8 @@ pub enum TransactionError { MaxFeeExceedsBalance(u128, Felt252, Felt252), #[error("V3 Transactions not Supported Yet")] UnsuportedV3Transaction, + #[error("V3 Transactions can't be created with deprecated account tx fields")] + DeprecatedAccountTxFieldsVInV3TX, + #[error("Non V3 Transactions can't be created with non deprecated account tx fields")] + CurrentAccountTxFieldsInNonV3TX, } diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 50fbbeae5..537da05b2 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -1,4 +1,5 @@ use super::{ + check_account_tx_fields_version, fee::{calculate_tx_fee, charge_fee}, get_tx_version, Transaction, VersionSpecificAccountTxFields, }; @@ -117,6 +118,7 @@ impl InvokeFunction { hash_value: Felt252, ) -> Result { let version = get_tx_version(version); + check_account_tx_fields_version(account_tx_fields, version)?; let validate_entry_point_selector = *VALIDATE_ENTRY_POINT_SELECTOR; diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 50b251449..9ea8bdf28 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -187,10 +187,27 @@ fn get_tx_version(version: Felt252) -> Felt252 { } } +// Check that account_tx_fields is compatible with the tx's version +fn check_account_tx_fields_version( + account_tx_fields: VersionSpecificAccountTxFields, + version: Felt252, +) -> Result<(), TransactionError> { + match (account_tx_fields, version) { + (VersionSpecificAccountTxFields::Deprecated(_), v) if v == Felt252::THREE => { + Err(TransactionError::DeprecatedAccountTxFieldsVInV3TX) + } + (VersionSpecificAccountTxFields::Current(_), v) if v < Felt252::THREE => { + Err(TransactionError::CurrentAccountTxFieldsInNonV3TX) + } + _ => Ok(()), + } +} + #[derive(Clone, Debug)] pub enum VersionSpecificAccountTxFields { // Deprecated fields only consist of max_fee Deprecated(u128), + Current(bool), } impl Default for VersionSpecificAccountTxFields { @@ -207,6 +224,7 @@ impl VersionSpecificAccountTxFields { pub(crate) fn max_fee(&self) -> u128 { match self { Self::Deprecated(max_fee) => *max_fee, + Self::Current(_) => 10, } } } From bcaab1915e0d223049bb1d0c87d26b71fb5d8ffd Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 15:56:39 -0300 Subject: [PATCH 11/50] Replace max_fee field with account_tx_fields for DeclareV3 tx --- src/core/transaction_hash/mod.rs | 3 ++ src/transaction/declare_v2.rs | 63 ++++++++++++++++++-------------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/src/core/transaction_hash/mod.rs b/src/core/transaction_hash/mod.rs index d7b762f96..ed50b1fcf 100644 --- a/src/core/transaction_hash/mod.rs +++ b/src/core/transaction_hash/mod.rs @@ -34,6 +34,7 @@ impl TransactionHashPrefix { } } +// TODO[0.13] Investigate how transaction hashes are calculated for V3 Txs (aka without max_fee) /// Calculates the transaction hash in the StarkNet network - a unique identifier of the /// transaction. /// The transaction hash is a hash chain of the following information: @@ -96,6 +97,7 @@ pub fn calculate_deploy_transaction_hash( ) } +// TODO[0.13] Investigate how transaction hashes are calculated for V3 Txs (aka without max_fee) /// Calculate the hash for deploying an account transaction. #[allow(clippy::too_many_arguments)] pub fn calculate_deploy_account_transaction_hash( @@ -157,6 +159,7 @@ pub fn calculate_declare_transaction_hash( // V2 Hash Functions // ---------------------------- +// TODO[0.13] Investigate how transaction hashes are calculated for V3 Txs (aka without max_fee) pub fn calculate_declare_v2_transaction_hash( sierra_class_hash: Felt252, compiled_class_hash: Felt252, diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index e4967964c..c051bfe8a 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -1,5 +1,7 @@ use super::fee::{calculate_tx_fee, charge_fee}; -use super::{get_tx_version, Transaction}; +use super::{ + check_account_tx_fields_version, get_tx_version, Transaction, VersionSpecificAccountTxFields, +}; use crate::core::contract_address::{compute_casm_class_hash, compute_sierra_class_hash}; use crate::definitions::block_context::FeeType; use crate::definitions::constants::VALIDATE_RETDATA; @@ -52,7 +54,7 @@ pub struct DeclareV2 { pub sender_address: Address, pub validate_entry_point_selector: Felt252, pub version: Felt252, - pub max_fee: u128, + pub account_tx_fields: VersionSpecificAccountTxFields, pub signature: Vec, pub nonce: Felt252, // maybe change this for ClassHash @@ -87,7 +89,7 @@ impl DeclareV2 { compiled_class_hash: Felt252, chain_id: Felt252, sender_address: Address, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, version: Felt252, signature: Vec, nonce: Felt252, @@ -99,7 +101,7 @@ impl DeclareV2 { compiled_class_hash, chain_id, &sender_address, - max_fee, + account_tx_fields.max_fee(), version, nonce, )?; @@ -110,7 +112,7 @@ impl DeclareV2 { casm_contract_class, compiled_class_hash, sender_address, - max_fee, + account_tx_fields, version, signature, nonce, @@ -139,13 +141,14 @@ impl DeclareV2 { casm_contract_class: Option, compiled_class_hash: Felt252, sender_address: Address, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, version: Felt252, signature: Vec, nonce: Felt252, hash_value: Felt252, ) -> Result { let version = get_tx_version(version); + check_account_tx_fields_version(account_tx_fields, version)?; let validate_entry_point_selector = *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; let internal_declare = DeclareV2 { @@ -154,7 +157,7 @@ impl DeclareV2 { sender_address, validate_entry_point_selector, version, - max_fee, + account_tx_fields, signature, nonce, compiled_class_hash, @@ -186,7 +189,7 @@ impl DeclareV2 { casm_contract_class: Option, compiled_class_hash: Felt252, sender_address: Address, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, version: Felt252, signature: Vec, nonce: Felt252, @@ -200,7 +203,7 @@ impl DeclareV2 { casm_contract_class, compiled_class_hash, sender_address, - max_fee, + account_tx_fields, version, signature, nonce, @@ -228,7 +231,7 @@ impl DeclareV2 { compiled_class_hash: Felt252, chain_id: Felt252, sender_address: Address, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, version: Felt252, signature: Vec, nonce: Felt252, @@ -238,7 +241,7 @@ impl DeclareV2 { compiled_class_hash, chain_id, &sender_address, - max_fee, + account_tx_fields.max_fee(), version, nonce, )?; @@ -249,7 +252,7 @@ impl DeclareV2 { casm_contract_class, compiled_class_hash, sender_address, - max_fee, + account_tx_fields, version, signature, nonce, @@ -269,7 +272,7 @@ impl DeclareV2 { self.sender_address.clone(), self.hash_value, self.signature.clone(), - self.max_fee, + self.account_tx_fields, self.nonce, n_steps, self.version, @@ -303,21 +306,24 @@ impl DeclareV2 { block_context: &BlockContext, fee_type: &FeeType, ) -> Result<(), TransactionError> { - if self.max_fee.is_zero() { + if self.account_tx_fields.max_fee().is_zero() { return Ok(()); } let minimal_fee = self.estimate_minimal_fee(block_context)?; // Check max fee is at least the estimated constant overhead. - if self.max_fee < minimal_fee { - return Err(TransactionError::MaxFeeTooLow(self.max_fee, minimal_fee)); + if self.account_tx_fields.max_fee() < minimal_fee { + return Err(TransactionError::MaxFeeTooLow( + self.account_tx_fields.max_fee(), + minimal_fee, + )); } // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = state.get_fee_token_balance(block_context, &self.sender_address, fee_type)?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). - if balance_high.is_zero() && balance_low < Felt252::from(self.max_fee) { + if balance_high.is_zero() && balance_low < Felt252::from(self.account_tx_fields.max_fee()) { return Err(TransactionError::MaxFeeExceedsBalance( - self.max_fee, + self.account_tx_fields.max_fee(), balance_low, balance_high, )); @@ -417,7 +423,7 @@ impl DeclareV2 { state, &actual_resources, block_context, - self.max_fee, + self.account_tx_fields.max_fee(), &mut tx_execution_context, self.skip_fee_transfer, #[cfg(feature = "cairo-native")] @@ -574,10 +580,11 @@ impl DeclareV2 { skip_validate, skip_execute, skip_fee_transfer, - max_fee: if ignore_max_fee { - u128::MAX + // TODO[0.13]: Handle ignore_max_fee for V3 txs + account_tx_fields: if ignore_max_fee { + Default::default() } else { - self.max_fee + self.account_tx_fields }, skip_nonce_check, ..self.clone() @@ -642,7 +649,7 @@ mod tests { None, casm_class_hash, sender_address, - 0, + Default::default(), version, [1.into()].to_vec(), Felt252::ZERO, @@ -712,7 +719,7 @@ mod tests { Some(casm_class), casm_class_hash, sender_address, - 0, + Default::default(), version, [1.into()].to_vec(), Felt252::ZERO, @@ -784,7 +791,7 @@ mod tests { Some(casm_class), casm_class_hash, sender_address, - 0, + Default::default(), version, vec![], Felt252::ZERO, @@ -854,7 +861,7 @@ mod tests { None, casm_class_hash, sender_address, - 0, + Default::default(), version, [1.into()].to_vec(), Felt252::ZERO, @@ -925,7 +932,7 @@ mod tests { None, sended_class_hash, sender_address, - 0, + Default::default(), version, [1.into()].to_vec(), Felt252::ZERO, @@ -978,7 +985,7 @@ mod tests { Felt252::ONE, chain_id, Address(Felt252::ONE), - 0, + Default::default(), 1.into(), Vec::new(), Felt252::ZERO, From 7f44d13c6868218790e3ce6c37d028aeeef29909 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 16:06:20 -0300 Subject: [PATCH 12/50] Replace max_fee field with account_tx_fields for DeployAccount tx --- src/transaction/deploy_account.rs | 121 +++++++++-------------------- src/transaction/invoke_function.rs | 2 +- src/transaction/mod.rs | 2 +- 3 files changed, 40 insertions(+), 85 deletions(-) diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 534f1a86f..ea2dde92c 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -1,5 +1,5 @@ use super::fee::{calculate_tx_fee, charge_fee}; -use super::get_tx_version; +use super::{check_account_tx_fields_version, get_tx_version, VersionSpecificAccountTxFields}; use super::{invoke_function::verify_no_calls_to_other_contracts, Transaction}; use crate::definitions::block_context::FeeType; use crate::definitions::constants::VALIDATE_RETDATA; @@ -37,14 +37,12 @@ use crate::{ state_api::{State, StateReader}, ExecutionResourcesManager, }, - syscalls::syscall_handler_errors::SyscallHandlerError, transaction::error::TransactionError, utils::{calculate_tx_resources, Address, ClassHash}, }; use cairo_vm::Felt252; use getset::Getters; use num_traits::Zero; -use starknet_api::transaction::Fee; use std::collections::HashMap; use std::fmt::Debug; @@ -74,7 +72,7 @@ pub struct DeployAccount { constructor_calldata: Vec, version: Felt252, nonce: Felt252, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, #[getset(get = "pub")] hash_value: Felt252, #[getset(get = "pub")] @@ -90,15 +88,16 @@ impl DeployAccount { /// Constructor create a new DeployAccount. pub fn new( class_hash: ClassHash, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, version: Felt252, nonce: Felt252, constructor_calldata: Vec, signature: Vec, contract_address_salt: Felt252, chain_id: Felt252, - ) -> Result { + ) -> Result { let version = get_tx_version(version); + check_account_tx_fields_version(&account_tx_fields, version)?; let contract_address = Address(calculate_contract_address( &contract_address_salt, &Felt252::from_bytes_be(&class_hash.0), @@ -111,7 +110,7 @@ impl DeployAccount { &contract_address, Felt252::from_bytes_be(&class_hash.0), &constructor_calldata, - max_fee, + account_tx_fields.max_fee(), nonce, contract_address_salt, chain_id, @@ -124,7 +123,7 @@ impl DeployAccount { constructor_calldata, version, nonce, - max_fee, + account_tx_fields, hash_value, signature, skip_execute: false, @@ -138,15 +137,16 @@ impl DeployAccount { /// Creates a new L1Handler instance with a specified transaction hash. pub fn new_with_tx_hash( class_hash: ClassHash, - max_fee: u128, + account_tx_fields: VersionSpecificAccountTxFields, version: Felt252, nonce: Felt252, constructor_calldata: Vec, signature: Vec, contract_address_salt: Felt252, hash_value: Felt252, - ) -> Result { + ) -> Result { let version = get_tx_version(version); + check_account_tx_fields_version(&account_tx_fields, version)?; let contract_address = Address(calculate_contract_address( &contract_address_salt, &Felt252::from_bytes_be(&class_hash.0), @@ -161,7 +161,7 @@ impl DeployAccount { constructor_calldata, version, nonce, - max_fee, + account_tx_fields, hash_value, signature, skip_execute: false, @@ -242,12 +242,13 @@ impl DeployAccount { if let Some(revert_error) = tx_exec_info.revert_error.clone() { // execution error tx_exec_info = tx_exec_info.to_revert_error(&revert_error); - } else if actual_fee > self.max_fee { + } else if actual_fee > self.account_tx_fields.max_fee() { // max_fee exceeded tx_exec_info = tx_exec_info.to_revert_error( format!( "Calculated fee ({}) exceeds max fee ({})", - actual_fee, self.max_fee + actual_fee, + self.account_tx_fields.max_fee() ) .as_str(), ); @@ -262,7 +263,7 @@ impl DeployAccount { state, &tx_exec_info.actual_resources, block_context, - self.max_fee, + self.account_tx_fields.max_fee(), &mut tx_execution_context, self.skip_fee_transfer, #[cfg(feature = "cairo-native")] @@ -407,21 +408,24 @@ impl DeployAccount { block_context: &BlockContext, fee_type: &FeeType, ) -> Result<(), TransactionError> { - if self.max_fee.is_zero() { + if self.account_tx_fields.max_fee().is_zero() { return Ok(()); } let minimal_fee = self.estimate_minimal_fee(block_context)?; // Check max fee is at least the estimated constant overhead. - if self.max_fee < minimal_fee { - return Err(TransactionError::MaxFeeTooLow(self.max_fee, minimal_fee)); + if self.account_tx_fields.max_fee() < minimal_fee { + return Err(TransactionError::MaxFeeTooLow( + self.account_tx_fields.max_fee(), + minimal_fee, + )); } // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = state.get_fee_token_balance(block_context, self.contract_address(), fee_type)?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). - if balance_high.is_zero() && balance_low < Felt252::from(self.max_fee) { + if balance_high.is_zero() && balance_low < Felt252::from(self.account_tx_fields.max_fee()) { return Err(TransactionError::MaxFeeExceedsBalance( - self.max_fee, + self.account_tx_fields.max_fee(), balance_low, balance_high, )); @@ -492,7 +496,7 @@ impl DeployAccount { self.contract_address.clone(), self.hash_value, self.signature.clone(), - self.max_fee, + self.account_tx_fields, self.nonce, n_steps, self.version, @@ -581,10 +585,12 @@ impl DeployAccount { skip_validate, skip_execute, skip_fee_transfer, - max_fee: if ignore_max_fee { - u128::MAX + // TODO[0.13]: Handle ignore_max_fee for V3 txs + account_tx_fields: if ignore_max_fee { + // max_fee = 0 + Default::default() } else { - self.max_fee + self.account_tx_fields }, skip_nonce_check, ..self.clone() @@ -596,13 +602,11 @@ impl DeployAccount { pub fn from_sn_api_transaction( value: starknet_api::transaction::DeployAccountTransaction, tx_hash: Felt252, - ) -> Result { + ) -> Result { let max_fee = match value { starknet_api::transaction::DeployAccountTransaction::V1(ref tx) => tx.max_fee, starknet_api::transaction::DeployAccountTransaction::V3(_) => { - return Err(SyscallHandlerError::CustomError( - "V3 Transactions Not Supported Yet".to_string(), - )) + return Err(TransactionError::UnsuportedV3Transaction) } }; let version = Felt252::from_bytes_be_slice(value.version().0.bytes()); @@ -627,7 +631,8 @@ impl DeployAccount { DeployAccount::new_with_tx_hash( class_hash, - max_fee.0, + // TODO[0.13] Properly convert between V3 tx fields + VersionSpecificAccountTxFields::Deprecated(max_fee.0), version, nonce, constructor_calldata, @@ -638,56 +643,6 @@ impl DeployAccount { } } -// ---------------------------------- -// Try from starknet api -// ---------------------------------- - -impl TryFrom for DeployAccount { - type Error = SyscallHandlerError; - - fn try_from( - value: starknet_api::transaction::DeployAccountTransaction, - ) -> Result { - let max_fee = match value { - starknet_api::transaction::DeployAccountTransaction::V1(ref tx) => tx.max_fee, - // TODO: check this - starknet_api::transaction::DeployAccountTransaction::V3(_) => Fee(0), - }; - let version = Felt252::from_bytes_be_slice(value.version().0.bytes()); - let nonce = Felt252::from_bytes_be_slice(value.nonce().0.bytes()); - let class_hash: ClassHash = ClassHash(value.class_hash().0.bytes().try_into().unwrap()); - let contract_address_salt = - Felt252::from_bytes_be_slice(value.contract_address_salt().0.bytes()); - - let signature = value - .signature() - .0 - .iter() - .map(|f| Felt252::from_bytes_be_slice(f.bytes())) - .collect(); - let constructor_calldata = value - .constructor_calldata() - .0 - .as_ref() - .iter() - .map(|f| Felt252::from_bytes_be_slice(f.bytes())) - .collect(); - - let chain_id = Felt252::ZERO; - - DeployAccount::new( - class_hash, - max_fee.0, - version, - nonce, - constructor_calldata, - signature, - contract_address_salt, - chain_id, - ) - } -} - #[cfg(test)] mod tests { use super::*; @@ -717,7 +672,7 @@ mod tests { let internal_deploy = DeployAccount::new( class_hash, - 0, + Default::default(), 0.into(), 0.into(), vec![10.into()], @@ -752,7 +707,7 @@ mod tests { let internal_deploy = DeployAccount::new( class_hash, - 0, + Default::default(), 1.into(), 0.into(), vec![], @@ -764,7 +719,7 @@ mod tests { let internal_deploy_error = DeployAccount::new( class_hash, - 0, + Default::default(), 1.into(), 1.into(), vec![], @@ -817,7 +772,7 @@ mod tests { let internal_deploy = DeployAccount::new( class_hash, - 0, + Default::default(), 0.into(), 0.into(), Vec::new(), @@ -848,7 +803,7 @@ mod tests { // declare tx let internal_declare = DeployAccount::new( ClassHash([2; 32]), - 9000, + VersionSpecificAccountTxFields::new_deprecated(9000), 2.into(), Felt252::ZERO, vec![], diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 537da05b2..fdf2d916d 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -118,7 +118,7 @@ impl InvokeFunction { hash_value: Felt252, ) -> Result { let version = get_tx_version(version); - check_account_tx_fields_version(account_tx_fields, version)?; + check_account_tx_fields_version(&account_tx_fields, version)?; let validate_entry_point_selector = *VALIDATE_ENTRY_POINT_SELECTOR; diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 9ea8bdf28..59b7fd290 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -189,7 +189,7 @@ fn get_tx_version(version: Felt252) -> Felt252 { // Check that account_tx_fields is compatible with the tx's version fn check_account_tx_fields_version( - account_tx_fields: VersionSpecificAccountTxFields, + account_tx_fields: &VersionSpecificAccountTxFields, version: Felt252, ) -> Result<(), TransactionError> { match (account_tx_fields, version) { From e7de24dbd04ee1554e0671f154c64cebe182464e Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 16:09:03 -0300 Subject: [PATCH 13/50] Update get_transaction_context for Txs not affected by this change --- src/transaction/declare.rs | 2 +- src/transaction/declare_v2.rs | 6 +++--- src/transaction/deploy.rs | 4 ++-- src/transaction/l1_handler.rs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index 722f2f758..613a20f96 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -244,7 +244,7 @@ impl Declare { self.sender_address.clone(), self.hash_value, self.signature.clone(), - self.max_fee, + super::VersionSpecificAccountTxFields::new_deprecated(self.max_fee), self.nonce, n_steps, self.version, diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index c051bfe8a..7f339da91 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -148,7 +148,7 @@ impl DeclareV2 { hash_value: Felt252, ) -> Result { let version = get_tx_version(version); - check_account_tx_fields_version(account_tx_fields, version)?; + check_account_tx_fields_version(&account_tx_fields, version)?; let validate_entry_point_selector = *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; let internal_declare = DeclareV2 { @@ -272,7 +272,7 @@ impl DeclareV2 { self.sender_address.clone(), self.hash_value, self.signature.clone(), - self.account_tx_fields, + self.account_tx_fields.clone(), self.nonce, n_steps, self.version, @@ -584,7 +584,7 @@ impl DeclareV2 { account_tx_fields: if ignore_max_fee { Default::default() } else { - self.account_tx_fields + self.account_tx_fields.clone() }, skip_nonce_check, ..self.clone() diff --git a/src/transaction/deploy.rs b/src/transaction/deploy.rs index 7848d2940..37ef553aa 100644 --- a/src/transaction/deploy.rs +++ b/src/transaction/deploy.rs @@ -1,4 +1,4 @@ -use super::Transaction; +use super::{Transaction, VersionSpecificAccountTxFields}; use crate::{ core::{ contract_address::compute_deprecated_class_hash, errors::hash_errors::HashError, @@ -245,7 +245,7 @@ impl Deploy { Address(Felt252::ZERO), self.hash_value, Vec::new(), - 0, + VersionSpecificAccountTxFields::new_deprecated(0), Felt252::ZERO, block_context.invoke_tx_max_n_steps, self.version, diff --git a/src/transaction/l1_handler.rs b/src/transaction/l1_handler.rs index fd91cbdfa..232ac7ba9 100644 --- a/src/transaction/l1_handler.rs +++ b/src/transaction/l1_handler.rs @@ -203,7 +203,7 @@ impl L1Handler { self.contract_address.clone(), self.hash_value, [].to_vec(), - 0, + super::VersionSpecificAccountTxFields::new_deprecated(0), self.nonce.ok_or(TransactionError::MissingNonce)?, n_steps, L1_HANDLER_VERSION.into(), From 444e28850e462d6ca7844ebd1e05b062231e3c9c Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 16:27:53 -0300 Subject: [PATCH 14/50] Fixes --- rpc_state_reader/src/sir_state_reader.rs | 6 ++++-- src/bin/fibonacci.rs | 2 +- src/execution/mod.rs | 7 ++++--- src/lib.rs | 4 ++-- src/syscalls/native_syscall_handler.rs | 2 +- src/transaction/deploy_account.rs | 4 ++-- src/transaction/invoke_function.rs | 4 ++-- src/transaction/mod.rs | 2 +- 8 files changed, 17 insertions(+), 14 deletions(-) diff --git a/rpc_state_reader/src/sir_state_reader.rs b/rpc_state_reader/src/sir_state_reader.rs index 415e5b1c5..67f1f9715 100644 --- a/rpc_state_reader/src/sir_state_reader.rs +++ b/rpc_state_reader/src/sir_state_reader.rs @@ -29,6 +29,7 @@ use starknet_in_rust::{ }, transaction::{ error::TransactionError, Declare, DeclareV2, DeployAccount, InvokeFunction, L1Handler, + VersionSpecificAccountTxFields, }, utils::{Address, ClassHash}, }; @@ -270,14 +271,15 @@ pub fn execute_tx_configurable_with_state( Address(Felt252::from_bytes_be_slice( tx.sender_address().0.key().bytes(), )), - match tx { + // TODO[0.13] Properly convert between V3 tx fields + VersionSpecificAccountTxFields::new_deprecated(match tx { starknet_api::transaction::DeclareTransaction::V0(ref tx) => tx.max_fee.0, starknet_api::transaction::DeclareTransaction::V1(ref tx) => tx.max_fee.0, starknet_api::transaction::DeclareTransaction::V2(ref tx) => tx.max_fee.0, starknet_api::transaction::DeclareTransaction::V3(_) => { return Err(TransactionError::UnsuportedV3Transaction) } - }, + }), Felt252::from_bytes_be_slice(tx.version().0.bytes()), tx.signature() .0 diff --git a/src/bin/fibonacci.rs b/src/bin/fibonacci.rs index 22d7b10d9..9b10d6cd6 100644 --- a/src/bin/fibonacci.rs +++ b/src/bin/fibonacci.rs @@ -115,7 +115,7 @@ fn main() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), nonce.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/src/execution/mod.rs b/src/execution/mod.rs index 3071edd4b..2ca2e648c 100644 --- a/src/execution/mod.rs +++ b/src/execution/mod.rs @@ -379,7 +379,7 @@ impl TransactionExecutionContext { signature: Vec, account_tx_fields: VersionSpecificAccountTxFields, nonce: Felt252, - n_steps: u64, + _n_steps: u64, version: Felt252, ) -> Self { let nonce = if version == 0.into() { @@ -397,20 +397,21 @@ impl TransactionExecutionContext { transaction_hash, version, n_sent_messages: 0, - _n_steps: n_steps, + _n_steps, } } pub fn create_for_testing( account_contract_address: Address, nonce: Felt252, - n_steps: u64, + _n_steps: u64, version: Felt252, ) -> Self { TransactionExecutionContext { version, account_contract_address, nonce, + _n_steps, ..Default::default() } } diff --git a/src/lib.rs b/src/lib.rs index ffa48390a..eb95726d2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -949,7 +949,7 @@ mod test { let deploy_account_tx = Transaction::DeployAccount( DeployAccount::new( CLASS_HASH.to_owned(), - 0, + Default::default(), 1.into(), Felt252::ZERO, vec![], @@ -988,7 +988,7 @@ mod test { sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), validate_entry_point_selector: *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR, version: 2.into(), - max_fee: 2900, + account_tx_fields: VersionSpecificAccountTxFields::Deprecated(2900), signature: vec![], nonce: 0.into(), hash_value: 0.into(), diff --git a/src/syscalls/native_syscall_handler.rs b/src/syscalls/native_syscall_handler.rs index d7c825d1b..b7b64d30e 100644 --- a/src/syscalls/native_syscall_handler.rs +++ b/src/syscalls/native_syscall_handler.rs @@ -121,7 +121,7 @@ impl<'a, 'cache, S: StateReader, C: ContractClassCache> StarkNetSyscallHandler tx_info: TxInfo { version: self.tx_execution_context.version, account_contract_address: self.tx_execution_context.account_contract_address.0, - max_fee: self.tx_execution_context.max_fee, + max_fee: self.tx_execution_context.account_tx_fields.max_fee(), signature: self.tx_execution_context.signature.clone(), transaction_hash: self.tx_execution_context.transaction_hash, chain_id: self.block_context.starknet_os_config.chain_id, diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index ea2dde92c..e9b701d24 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -496,7 +496,7 @@ impl DeployAccount { self.contract_address.clone(), self.hash_value, self.signature.clone(), - self.account_tx_fields, + self.account_tx_fields.clone(), self.nonce, n_steps, self.version, @@ -590,7 +590,7 @@ impl DeployAccount { // max_fee = 0 Default::default() } else { - self.account_tx_fields + self.account_tx_fields.clone() }, skip_nonce_check, ..self.clone() diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index fdf2d916d..3c8cac2e9 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -163,7 +163,7 @@ impl InvokeFunction { self.contract_address.clone(), self.hash_value, self.signature.clone(), - self.account_tx_fields, + self.account_tx_fields.clone(), if self.version.is_zero() { Felt252::ZERO } else { @@ -569,7 +569,7 @@ impl InvokeFunction { // max_fee = 0 Default::default() } else { - self.account_tx_fields + self.account_tx_fields.clone() }, ..self.clone() }; diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 59b7fd290..a5789156e 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -224,7 +224,7 @@ impl VersionSpecificAccountTxFields { pub(crate) fn max_fee(&self) -> u128 { match self { Self::Deprecated(max_fee) => *max_fee, - Self::Current(_) => 10, + Self::Current(_) => 0, } } } From a832b6232e990973961e66cf60899e0c07f2f0fb Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 16:50:02 -0300 Subject: [PATCH 15/50] Fixes --- bench/internals.rs | 4 ++-- cli/src/main.rs | 2 +- examples/contract_execution/src/main.rs | 8 ++++---- examples/lru_cache/main.rs | 2 +- fuzzer/src/main.rs | 2 +- src/bin/deploy_invoke.rs | 4 ++-- src/bin/invoke.rs | 4 ++-- src/bin/invoke_with_cachedstate.rs | 6 +++--- src/syscalls/native_syscall_handler.rs | 9 ++++++++- tests/account_panic.rs | 2 +- tests/complex_contracts/erc20.rs | 6 +++--- tests/complex_contracts/utils.rs | 2 +- tests/delegate_call.rs | 2 +- tests/delegate_l1_handler.rs | 2 +- tests/deploy_account.rs | 4 ++-- tests/fibonacci.rs | 4 ++-- tests/increase_balance.rs | 2 +- tests/internal_calls.rs | 1 - tests/internals.rs | 23 ++++++++++++----------- tests/multi_syscall_test.rs | 2 +- tests/storage.rs | 2 +- tests/syscalls.rs | 14 +++++++------- tests/syscalls_errors.rs | 1 - 23 files changed, 57 insertions(+), 51 deletions(-) diff --git a/bench/internals.rs b/bench/internals.rs index 440c986d8..7d139fd91 100644 --- a/bench/internals.rs +++ b/bench/internals.rs @@ -102,7 +102,7 @@ pub fn deploy_account( // new consumes more execution time than raw struct instantiation let internal_deploy_account = DeployAccount::new( class_hash, - 0, + Default::default(), 1.into(), Felt252::ZERO, vec![], @@ -268,7 +268,7 @@ pub fn invoke( let internal_invoke = InvokeFunction::new( address, selector, - 0, + Default::default(), *TRANSACTION_VERSION, calldata, signature, diff --git a/cli/src/main.rs b/cli/src/main.rs index cc35950f4..f37aca481 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -193,7 +193,7 @@ fn invoke_parser( let internal_invoke = InvokeFunction::new_with_tx_hash( contract_address.clone(), *entrypoint_selector, - 0, + Default::default(), *TRANSACTION_VERSION, calldata.clone(), vec![], diff --git a/examples/contract_execution/src/main.rs b/examples/contract_execution/src/main.rs index c118376b9..ee7c2b1f1 100644 --- a/examples/contract_execution/src/main.rs +++ b/examples/contract_execution/src/main.rs @@ -115,7 +115,7 @@ fn test_contract( let internal_deploy = DeployAccount::new_with_tx_hash( account_contract_class_hash, - 0, + Default::default(), 1.into(), 0.into(), // Values hardcoded to pass signature validation @@ -164,7 +164,7 @@ fn test_contract( Some(casm_class), compiled_class_hash, account_contract_address.clone(), - 0, // max fee + Default::default(), // max fee 2.into(), signature.clone(), 1.into(), // nonce @@ -189,7 +189,7 @@ fn test_contract( let deploy = InvokeFunction::new( deployer_contract_address, Felt252::from_bytes_be(&calculate_sn_keccak("deploy_contract".as_bytes())), - 0, + Default::default(), 0.into(), vec![compiled_class_hash, 3.into(), 0.into()], // call data signature.clone(), @@ -237,7 +237,7 @@ fn test_contract( let invoke_tx = InvokeFunction::new_with_tx_hash( account_contract_address, Felt252::from_bytes_be(&calculate_sn_keccak("__execute__".as_bytes())), - 0, + Default::default(), 1.into(), account_execute_calldata, signature, diff --git a/examples/lru_cache/main.rs b/examples/lru_cache/main.rs index 7d3810fe4..5e0912285 100644 --- a/examples/lru_cache/main.rs +++ b/examples/lru_cache/main.rs @@ -97,7 +97,7 @@ fn run_contract( let invoke_tx = InvokeFunction::new( deploy_tx.contract_address.clone(), entry_point_selector, - 0, + Default::default(), *TRANSACTION_VERSION, calldata.into(), signature, diff --git a/fuzzer/src/main.rs b/fuzzer/src/main.rs index d2985ab0f..1b81ec7a0 100644 --- a/fuzzer/src/main.rs +++ b/fuzzer/src/main.rs @@ -155,7 +155,7 @@ fn main() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/src/bin/deploy_invoke.rs b/src/bin/deploy_invoke.rs index ba6a2b4a1..ffe5eb683 100644 --- a/src/bin/deploy_invoke.rs +++ b/src/bin/deploy_invoke.rs @@ -96,7 +96,7 @@ fn main() { let invoke_first = InvokeFunction::new( contract_address.clone(), *INCREASE_BALANCE_SELECTOR, - 0, + Default::default(), *TRANSACTION_VERSION, vec![1000.into()], signature.clone(), @@ -118,7 +118,7 @@ fn main() { let invoke_second = InvokeFunction::new( contract_address.clone(), *GET_BALANCE_SELECTOR, - 0, + Default::default(), *TRANSACTION_VERSION, vec![], signature.clone(), diff --git a/src/bin/invoke.rs b/src/bin/invoke.rs index 20d8222f7..209ae532e 100644 --- a/src/bin/invoke.rs +++ b/src/bin/invoke.rs @@ -78,7 +78,7 @@ fn main() { let invoke_first = InvokeFunction::new( CONTRACT_ADDRESS.clone(), *INCREASE_BALANCE_SELECTOR, - 0, + Default::default(), *TRANSACTION_VERSION, vec![1000.into()], signature.clone(), @@ -100,7 +100,7 @@ fn main() { let invoke_second = InvokeFunction::new( CONTRACT_ADDRESS.clone(), *GET_BALANCE_SELECTOR, - 0, + Default::default(), *TRANSACTION_VERSION, vec![], signature.clone(), diff --git a/src/bin/invoke_with_cachedstate.rs b/src/bin/invoke_with_cachedstate.rs index fbb3f7a5a..da04c900f 100644 --- a/src/bin/invoke_with_cachedstate.rs +++ b/src/bin/invoke_with_cachedstate.rs @@ -13,7 +13,7 @@ use starknet_in_rust::{ state::{ cached_state::CachedState, contract_class_cache::PermanentContractClassCache, BlockInfo, }, - transaction::InvokeFunction, + transaction::{InvokeFunction, VersionSpecificAccountTxFields}, utils::{Address, ClassHash}, }; use std::{collections::HashMap, path::PathBuf, sync::Arc}; @@ -57,7 +57,7 @@ fn main() { InvokeFunction::new( CONTRACT_ADDRESS.clone(), *INCREASE_BALANCE_SELECTOR, - 2, + VersionSpecificAccountTxFields::new_deprecated(2), *TRANSACTION_VERSION, vec![1000.into()], vec![], @@ -77,7 +77,7 @@ fn main() { let tx_exec_info = InvokeFunction::new( CONTRACT_ADDRESS.clone(), *GET_BALANCE_SELECTOR, - 2, + VersionSpecificAccountTxFields::new_deprecated(2), *TRANSACTION_VERSION, vec![], vec![], diff --git a/src/syscalls/native_syscall_handler.rs b/src/syscalls/native_syscall_handler.rs index b7b64d30e..0db0fb5e7 100644 --- a/src/syscalls/native_syscall_handler.rs +++ b/src/syscalls/native_syscall_handler.rs @@ -1,3 +1,4 @@ +use crate::VersionSpecificAccountTxFields; use crate::{ core::errors::state_errors::StateError, definitions::{block_context::BlockContext, constants::CONSTRUCTOR_ENTRY_POINT_SELECTOR}, @@ -577,7 +578,13 @@ impl<'a, 'cache, S: StateReader, C: ContractClassCache> StarkNetSyscallHandler } fn set_max_fee(&mut self, max_fee: u128) { - self.tx_execution_context.max_fee = max_fee; + if matches!( + self.tx_execution_context.account_tx_fields, + VersionSpecificAccountTxFields::Deprecated(_) + ) { + self.tx_execution_context.account_tx_fields = + VersionSpecificAccountTxFields::new_deprecated(max_fee) + }; } fn set_nonce(&mut self, nonce: Felt252) { diff --git a/tests/account_panic.rs b/tests/account_panic.rs index 506bf179e..0c19adbbb 100644 --- a/tests/account_panic.rs +++ b/tests/account_panic.rs @@ -102,7 +102,7 @@ fn account_panic() { let invoke = InvokeFunction::new( account_address, selector, - 0, + Default::default(), *TRANSACTION_VERSION, calldata, vec![], diff --git a/tests/complex_contracts/erc20.rs b/tests/complex_contracts/erc20.rs index b9e0a4e8e..4177dd238 100644 --- a/tests/complex_contracts/erc20.rs +++ b/tests/complex_contracts/erc20.rs @@ -105,7 +105,7 @@ fn test_erc20_cairo2() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), 1.into(), @@ -155,7 +155,7 @@ fn test_erc20_cairo2() { let internal_deploy_account = DeployAccount::new( ClassHash::from(Felt252::from_dec_str("1").unwrap()), - 0, + Default::default(), 1.into(), Felt252::ZERO, vec![2.into()], @@ -212,7 +212,7 @@ fn test_erc20_cairo2() { let internal_deploy_account = DeployAccount::new( ClassHash::from(Felt252::from_dec_str("1").unwrap()), - 0, + Default::default(), 1.into(), Felt252::ZERO, vec![2.into()], diff --git a/tests/complex_contracts/utils.rs b/tests/complex_contracts/utils.rs index 6c185f8da..84f2369cd 100644 --- a/tests/complex_contracts/utils.rs +++ b/tests/complex_contracts/utils.rs @@ -122,7 +122,7 @@ pub fn execute_entry_point( Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), call_config.block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/delegate_call.rs b/tests/delegate_call.rs index a43e170bc..578c835b6 100644 --- a/tests/delegate_call.rs +++ b/tests/delegate_call.rs @@ -112,7 +112,7 @@ fn delegate_call() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/delegate_l1_handler.rs b/tests/delegate_l1_handler.rs index a82fe8ef1..80156bb4b 100644 --- a/tests/delegate_l1_handler.rs +++ b/tests/delegate_l1_handler.rs @@ -108,7 +108,7 @@ fn delegate_l1_handler() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/deploy_account.rs b/tests/deploy_account.rs index 25d2988e3..90e870a54 100644 --- a/tests/deploy_account.rs +++ b/tests/deploy_account.rs @@ -56,7 +56,7 @@ fn internal_deploy_account() { let internal_deploy_account = DeployAccount::new( class_hash, - 0, + Default::default(), 1.into(), Felt252::ZERO, vec![], @@ -171,7 +171,7 @@ fn internal_deploy_account_cairo1() { let internal_deploy_account = DeployAccount::new( ClassHash(TEST_ACCOUNT_COMPILED_CONTRACT_CLASS_HASH.to_bytes_be()), - 0, + Default::default(), 1.into(), Felt252::ZERO, vec![2.into()], diff --git a/tests/fibonacci.rs b/tests/fibonacci.rs index f890363a6..aa7eb506b 100644 --- a/tests/fibonacci.rs +++ b/tests/fibonacci.rs @@ -101,7 +101,7 @@ fn integration_test() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -202,7 +202,7 @@ fn integration_test_cairo1() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/increase_balance.rs b/tests/increase_balance.rs index 2268e6bf7..a3a3cae8b 100644 --- a/tests/increase_balance.rs +++ b/tests/increase_balance.rs @@ -101,7 +101,7 @@ fn hello_starknet_increase_balance() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/internal_calls.rs b/tests/internal_calls.rs index cd82e4650..846058cf3 100644 --- a/tests/internal_calls.rs +++ b/tests/internal_calls.rs @@ -29,7 +29,6 @@ fn test_internal_calls() { let block_context = BlockContext::default(); let mut tx_execution_context = TransactionExecutionContext::create_for_testing( Address(0.into()), - 10, 0.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/internals.rs b/tests/internals.rs index 43681221d..0375dac72 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -17,9 +17,6 @@ use lazy_static::lazy_static; use num_bigint::BigUint; use num_traits::Zero; use pretty_assertions_sorted::{assert_eq, assert_eq_sorted}; -use starknet_in_rust::definitions::constants::{ - DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS, VALIDATE_ENTRY_POINT_SELECTOR, -}; use starknet_in_rust::execution::execution_entry_point::ExecutionEntryPoint; use starknet_in_rust::execution::TransactionExecutionContext; use starknet_in_rust::services::api::contract_classes::compiled_class::CompiledClass; @@ -42,6 +39,10 @@ use starknet_in_rust::{ core::errors::state_errors::StateError, definitions::block_context::{FeeTokenAddresses, FeeType, GasPrices}, }; +use starknet_in_rust::{ + definitions::constants::{DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS, VALIDATE_ENTRY_POINT_SELECTOR}, + transaction::VersionSpecificAccountTxFields, +}; use starknet_in_rust::{ definitions::{ block_context::{BlockContext, StarknetChainId, StarknetOsConfig}, @@ -700,7 +701,7 @@ fn invoke_tx(calldata: Vec, max_fee: u128) -> InvokeFunction { InvokeFunction::new( TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), *EXECUTE_ENTRY_POINT_SELECTOR, - max_fee, + VersionSpecificAccountTxFields::new_deprecated(max_fee), *TRANSACTION_VERSION, calldata, vec![], @@ -714,7 +715,7 @@ fn invoke_tx_with_nonce(calldata: Vec, max_fee: u128, nonce: Felt252) - InvokeFunction::new( TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), *EXECUTE_ENTRY_POINT_SELECTOR, - max_fee, + VersionSpecificAccountTxFields::new_deprecated(max_fee), *TRANSACTION_VERSION, calldata, vec![], @@ -885,7 +886,7 @@ fn declarev2_tx() -> DeclareV2 { sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), validate_entry_point_selector: *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR, version: 2.into(), - max_fee: 50000000, + account_tx_fields: VersionSpecificAccountTxFields::new_deprecated(50000000), signature: vec![], nonce: 0.into(), hash_value: 0.into(), @@ -1689,7 +1690,7 @@ fn test_deploy_account() { let deploy_account_tx = DeployAccount::new( *TEST_ACCOUNT_CONTRACT_CLASS_HASH, - expected_fee, + VersionSpecificAccountTxFields::new_deprecated(expected_fee), *TRANSACTION_VERSION, Default::default(), Default::default(), @@ -1815,7 +1816,7 @@ fn test_deploy_account_revert() { let deploy_account_tx = DeployAccount::new( *TEST_ACCOUNT_CONTRACT_CLASS_HASH, - max_fee, + VersionSpecificAccountTxFields::new_deprecated(max_fee), *TRANSACTION_VERSION, Default::default(), Default::default(), @@ -2370,7 +2371,7 @@ fn test_invoke_tx_wrong_entrypoint() { TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), // Entrypoiont that doesnt exits in the contract Felt252::from_bytes_be(&calculate_sn_keccak(b"none_function")), - 2483, + VersionSpecificAccountTxFields::new_deprecated(2483), *TRANSACTION_VERSION, vec![ test_contract_address, // CONTRACT_ADDRESS @@ -2405,7 +2406,7 @@ fn test_deploy_undeclared_account() { // Deploy transaction with a not_deployed_class_hash class_hash let deploy_account_tx = DeployAccount::new( not_deployed_class_hash, - 0, + Default::default(), *TRANSACTION_VERSION, Default::default(), Default::default(), @@ -2539,7 +2540,7 @@ fn test_library_call_with_declare_v2() { Address(0.into()), Felt252::ZERO, Vec::new(), - 100000000, + VersionSpecificAccountTxFields::new_deprecated(100000000), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/multi_syscall_test.rs b/tests/multi_syscall_test.rs index 996baff13..18574b267 100644 --- a/tests/multi_syscall_test.rs +++ b/tests/multi_syscall_test.rs @@ -244,7 +244,7 @@ fn test_syscall( Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/storage.rs b/tests/storage.rs index c0e972876..656e281eb 100644 --- a/tests/storage.rs +++ b/tests/storage.rs @@ -99,7 +99,7 @@ fn integration_storage_test() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/syscalls.rs b/tests/syscalls.rs index c5bdd49da..7b537b0e8 100644 --- a/tests/syscalls.rs +++ b/tests/syscalls.rs @@ -30,6 +30,7 @@ use starknet_in_rust::{ state_api::State, ExecutionResourcesManager, }, + transaction::VersionSpecificAccountTxFields, utils::{calculate_sn_keccak, felt_to_hash, Address, ClassHash}, EntryPointType, }; @@ -72,7 +73,6 @@ fn test_contract<'a>( let mut tx_execution_context = tx_execution_context_option.unwrap_or_else(|| { TransactionExecutionContext::create_for_testing( Address(0.into()), - 10, 0.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -515,7 +515,7 @@ fn get_tx_info_syscall() { account_contract_address.clone(), transaction_hash, signature.clone(), - max_fee, + VersionSpecificAccountTxFields::new_deprecated(max_fee), 3.into(), n_steps, version, @@ -647,7 +647,7 @@ fn get_tx_signature_syscall() { Address::default(), 0.into(), signature.clone(), - 12, + VersionSpecificAccountTxFields::new_deprecated(12), 3.into(), n_steps, 0.into(), @@ -1196,7 +1196,7 @@ fn deploy_cairo1_from_cairo0_with_constructor() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1306,7 +1306,7 @@ fn deploy_cairo1_from_cairo0_without_constructor() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1418,7 +1418,7 @@ fn deploy_cairo1_and_invoke() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1562,7 +1562,7 @@ fn send_messages_to_l1_different_contract_calls() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/syscalls_errors.rs b/tests/syscalls_errors.rs index bb07667b5..ba91ccb14 100644 --- a/tests/syscalls_errors.rs +++ b/tests/syscalls_errors.rs @@ -48,7 +48,6 @@ fn test_contract<'a>( let mut tx_execution_context = tx_execution_context_option.unwrap_or_else(|| { TransactionExecutionContext::create_for_testing( Address(0.into()), - 10, 0.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, From d08c64a84e0d4a3ded0abd54ea15a53f4270f0f4 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 17:01:14 -0300 Subject: [PATCH 16/50] Fixes --- src/bin/native_bench.rs | 10 +++---- tests/cairo_1_syscalls.rs | 60 +++++++++++++++++++-------------------- tests/cairo_native.rs | 4 +-- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/bin/native_bench.rs b/src/bin/native_bench.rs index 82d9dcac8..23917dd2d 100644 --- a/src/bin/native_bench.rs +++ b/src/bin/native_bench.rs @@ -363,7 +363,7 @@ fn bench_erc20(executions: usize, bench_type: BenchType) { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), 1.into(), @@ -444,7 +444,7 @@ fn bench_erc20(executions: usize, bench_type: BenchType) { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), 1.into(), @@ -505,7 +505,7 @@ fn bench_erc20(executions: usize, bench_type: BenchType) { // create a transaction for deploying the first account let account1_deploy_tx = DeployAccount::new( *ACCOUNT1_CLASS_HASH, // class hash - 0, // max fee + Default::default(), // max fee 1.into(), // tx version Felt252::ZERO, // nonce vec![2.into()], // constructor calldata @@ -537,7 +537,7 @@ fn bench_erc20(executions: usize, bench_type: BenchType) { // now we need to deploy account2 let account2_deploy_tx = DeployAccount::new( *ACCOUNT1_CLASS_HASH, // class hash - 0, // max fee + Default::default(), // max fee 1.into(), // tx version Felt252::ZERO, // nonce vec![3.into()], // constructor calldata @@ -615,7 +615,7 @@ fn execute( Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/cairo_1_syscalls.rs b/tests/cairo_1_syscalls.rs index e1c97a9ee..34f05ee67 100644 --- a/tests/cairo_1_syscalls.rs +++ b/tests/cairo_1_syscalls.rs @@ -95,7 +95,7 @@ fn storage_write_read() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -292,7 +292,7 @@ fn library_call() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -455,7 +455,7 @@ fn call_contract_storage_write_read() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -642,7 +642,7 @@ fn emit_event() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -771,7 +771,7 @@ fn deploy_cairo1_from_cairo1() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -882,7 +882,7 @@ fn deploy_cairo0_from_cairo1_without_constructor() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -992,7 +992,7 @@ fn deploy_cairo0_from_cairo1_with_constructor() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1104,7 +1104,7 @@ fn deploy_cairo0_and_invoke() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1230,7 +1230,7 @@ fn test_send_message_to_l1_syscall() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1330,7 +1330,7 @@ fn test_get_execution_info() { Address(0.into()), Felt252::ZERO, vec![22.into(), 33.into()], - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1478,7 +1478,7 @@ fn replace_class_internal() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1606,7 +1606,7 @@ fn replace_class_contract_call() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1797,7 +1797,7 @@ fn replace_class_contract_call_same_transaction() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1928,7 +1928,7 @@ fn call_contract_upgrade_cairo_0_to_cairo_1_same_transaction() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2057,7 +2057,7 @@ fn call_contract_downgrade_cairo_1_to_cairo_0_same_transaction() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2179,7 +2179,7 @@ fn call_contract_replace_class_cairo_0() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2280,7 +2280,7 @@ fn test_out_of_gas_failure() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2364,7 +2364,7 @@ fn deploy_syscall_failure_uninitialized_class_hash() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2463,7 +2463,7 @@ fn deploy_syscall_failure_in_constructor() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2532,7 +2532,7 @@ fn storage_read_no_value() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2611,7 +2611,7 @@ fn storage_read_unavailable_address_domain() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2693,7 +2693,7 @@ fn storage_write_unavailable_address_domain() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2816,7 +2816,7 @@ fn library_call_failure() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -2939,7 +2939,7 @@ fn send_messages_to_l1_different_contract_calls() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -3067,7 +3067,7 @@ fn send_messages_to_l1_different_contract_calls_cairo1_to_cairo0() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -3193,7 +3193,7 @@ fn send_messages_to_l1_different_contract_calls_cairo0_to_cairo1() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -3278,7 +3278,7 @@ fn keccak_syscall() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -3408,7 +3408,7 @@ fn library_call_recursive_50_calls() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -3545,7 +3545,7 @@ fn call_contract_storage_write_read_recursive_50_calls() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -3760,7 +3760,7 @@ fn call_contract_storage_write_read_recursive_100_calls() { Address(0.into()), Felt252::ZERO, Vec::new(), - 0, + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, diff --git a/tests/cairo_native.rs b/tests/cairo_native.rs index 8de0f49bb..8a53e204b 100644 --- a/tests/cairo_native.rs +++ b/tests/cairo_native.rs @@ -970,7 +970,7 @@ impl TestState { Address(Felt252::default()), Felt252::default(), Vec::default(), - u128::default(), + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, @@ -1006,7 +1006,7 @@ impl TestState { Address(Felt252::default()), Felt252::default(), Vec::default(), - u128::default(), + Default::default(), 10.into(), block_context.invoke_tx_max_n_steps(), *TRANSACTION_VERSION, From 9815fa101b1add93be4bf27215b58404fb082fc1 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 17:34:21 -0300 Subject: [PATCH 17/50] Fix handling of ignore_max_fee --- src/transaction/declare_v2.rs | 2 +- src/transaction/deploy_account.rs | 2 +- src/transaction/invoke_function.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 7f339da91..c3c9b8ea8 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -582,7 +582,7 @@ impl DeclareV2 { skip_fee_transfer, // TODO[0.13]: Handle ignore_max_fee for V3 txs account_tx_fields: if ignore_max_fee { - Default::default() + VersionSpecificAccountTxFields::new_deprecated(u128::MAX) } else { self.account_tx_fields.clone() }, diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index e9b701d24..8c17d45c5 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -588,7 +588,7 @@ impl DeployAccount { // TODO[0.13]: Handle ignore_max_fee for V3 txs account_tx_fields: if ignore_max_fee { // max_fee = 0 - Default::default() + VersionSpecificAccountTxFields::new_deprecated(u128::MAX) } else { self.account_tx_fields.clone() }, diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 3c8cac2e9..181d89c3c 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -567,7 +567,7 @@ impl InvokeFunction { // TODO[0.13]: Handle ignore_max_fee for V3 txs account_tx_fields: if ignore_max_fee { // max_fee = 0 - Default::default() + VersionSpecificAccountTxFields::new_deprecated(u128::MAX) } else { self.account_tx_fields.clone() }, From 5bb3c5f2d0d52a537c5b20c051e048a3d01a355b Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 18:07:23 -0300 Subject: [PATCH 18/50] Improve placeholder method --- src/transaction/mod.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index a5789156e..dcd95633f 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -203,11 +203,34 @@ fn check_account_tx_fields_version( } } +#[derive(Clone, Debug)] +pub enum DataAvailabilityMode { + L1, + L2, +} + +#[derive(Clone, Debug)] +pub struct ResourceBounds { + pub max_amount: u64, + pub max_price_per_unit: u128, +} + +#[derive(Clone, Debug)] +pub struct CurrentAccountTxFields { + pub l1_resource_bounds: Option, + pub l2_resource_bounds: Option, + pub tip: u64, + pub nonce_data_availability_mode: DataAvailabilityMode, + pub fee_data_availability_mode: DataAvailabilityMode, + pub paymaster_data: Vec, + pub account_deployment_data: Vec, +} + #[derive(Clone, Debug)] pub enum VersionSpecificAccountTxFields { // Deprecated fields only consist of max_fee Deprecated(u128), - Current(bool), + Current(CurrentAccountTxFields), } impl Default for VersionSpecificAccountTxFields { @@ -224,7 +247,11 @@ impl VersionSpecificAccountTxFields { pub(crate) fn max_fee(&self) -> u128 { match self { Self::Deprecated(max_fee) => *max_fee, - Self::Current(_) => 0, + Self::Current(current) => current + .l1_resource_bounds + .as_ref() + .map(|rb| rb.max_amount as u128 * rb.max_price_per_unit) + .unwrap_or_default(), } } } From 127da88b3042a789fb7a72d56863f8b3ca36a718 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 22 Jan 2024 18:12:58 -0300 Subject: [PATCH 19/50] Handle TODOs --- src/transaction/declare_v2.rs | 15 ++++++++++++--- src/transaction/deploy_account.rs | 17 +++++++++++++---- src/transaction/invoke_function.rs | 15 +++++++++++---- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index c3c9b8ea8..c79edfb6b 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -1,6 +1,7 @@ use super::fee::{calculate_tx_fee, charge_fee}; use super::{ - check_account_tx_fields_version, get_tx_version, Transaction, VersionSpecificAccountTxFields, + check_account_tx_fields_version, get_tx_version, ResourceBounds, Transaction, + VersionSpecificAccountTxFields, }; use crate::core::contract_address::{compute_casm_class_hash, compute_sierra_class_hash}; use crate::definitions::block_context::FeeType; @@ -580,9 +581,17 @@ impl DeclareV2 { skip_validate, skip_execute, skip_fee_transfer, - // TODO[0.13]: Handle ignore_max_fee for V3 txs account_tx_fields: if ignore_max_fee { - VersionSpecificAccountTxFields::new_deprecated(u128::MAX) + if let VersionSpecificAccountTxFields::Current(current) = &self.account_tx_fields { + let mut current_fields = current.clone(); + current_fields.l1_resource_bounds = Some(ResourceBounds { + max_amount: u64::MAX, + max_price_per_unit: u128::MAX, + }); + VersionSpecificAccountTxFields::Current(current_fields) + } else { + VersionSpecificAccountTxFields::new_deprecated(u128::MAX) + } } else { self.account_tx_fields.clone() }, diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 8c17d45c5..fbbd25a13 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -1,5 +1,7 @@ use super::fee::{calculate_tx_fee, charge_fee}; -use super::{check_account_tx_fields_version, get_tx_version, VersionSpecificAccountTxFields}; +use super::{ + check_account_tx_fields_version, get_tx_version, ResourceBounds, VersionSpecificAccountTxFields, +}; use super::{invoke_function::verify_no_calls_to_other_contracts, Transaction}; use crate::definitions::block_context::FeeType; use crate::definitions::constants::VALIDATE_RETDATA; @@ -585,10 +587,17 @@ impl DeployAccount { skip_validate, skip_execute, skip_fee_transfer, - // TODO[0.13]: Handle ignore_max_fee for V3 txs account_tx_fields: if ignore_max_fee { - // max_fee = 0 - VersionSpecificAccountTxFields::new_deprecated(u128::MAX) + if let VersionSpecificAccountTxFields::Current(current) = &self.account_tx_fields { + let mut current_fields = current.clone(); + current_fields.l1_resource_bounds = Some(ResourceBounds { + max_amount: u64::MAX, + max_price_per_unit: u128::MAX, + }); + VersionSpecificAccountTxFields::Current(current_fields) + } else { + VersionSpecificAccountTxFields::new_deprecated(u128::MAX) + } } else { self.account_tx_fields.clone() }, diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 181d89c3c..fc7118708 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -1,7 +1,7 @@ use super::{ check_account_tx_fields_version, fee::{calculate_tx_fee, charge_fee}, - get_tx_version, Transaction, VersionSpecificAccountTxFields, + get_tx_version, ResourceBounds, Transaction, VersionSpecificAccountTxFields, }; use crate::{ core::transaction_hash::{calculate_transaction_hash_common, TransactionHashPrefix}, @@ -564,10 +564,17 @@ impl InvokeFunction { skip_execute, skip_fee_transfer, skip_nonce_check, - // TODO[0.13]: Handle ignore_max_fee for V3 txs account_tx_fields: if ignore_max_fee { - // max_fee = 0 - VersionSpecificAccountTxFields::new_deprecated(u128::MAX) + if let VersionSpecificAccountTxFields::Current(current) = &self.account_tx_fields { + let mut current_fields = current.clone(); + current_fields.l1_resource_bounds = Some(ResourceBounds { + max_amount: u64::MAX, + max_price_per_unit: u128::MAX, + }); + VersionSpecificAccountTxFields::Current(current_fields) + } else { + VersionSpecificAccountTxFields::new_deprecated(u128::MAX) + } } else { self.account_tx_fields.clone() }, From 0099b22e6d584f1450f69ceca1fbf9b1c79a0460 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 11:27:51 -0300 Subject: [PATCH 20/50] Implement get_onchain_data_cost --- src/execution/gas_usage.rs | 9 +++++++ .../eth_definitions/eth_gas_constants.rs | 24 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index 85e26a90a..b001d85f1 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -107,6 +107,15 @@ pub const fn get_onchain_data_segment_length(state_changes: &StateChangesCount) + state_changes.n_compiled_class_hash_updates * 2 } +pub fn get_onchain_data_cost(state_changes: &StateChangesCount) -> usize { + let onchain_data_segment_length = get_onchain_data_segment_length(state_changes); + let naive_cost = onchain_data_segment_length * SHARP_GAS_PER_DA_WORD; + + let mut discount = state_changes.n_modified_contracts * MODIFIED_CONTRACT_DISCOUNT; + discount += GAS_PER_MEMORY_WORD - FEE_BALANCE_VALUE_COST; + naive_cost.saturating_sub(discount) +} + /// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given /// payload size. /// diff --git a/src/services/eth_definitions/eth_gas_constants.rs b/src/services/eth_definitions/eth_gas_constants.rs index 54e9b21e8..d98f5ef92 100644 --- a/src/services/eth_definitions/eth_gas_constants.rs +++ b/src/services/eth_definitions/eth_gas_constants.rs @@ -1,13 +1,16 @@ // Ethereum gas usage constants; for more details, see // page 27 in https://ethereum.github.io/yellowpaper/paper.pdf. -pub(crate) const WORD_WIDTH: usize = 32; +// Calldata. +pub(crate) const GAS_PER_MEMORY_ZERO_BYTE: usize = 4; pub(crate) const GAS_PER_MEMORY_BYTE: usize = 16; +pub(crate) const WORD_WIDTH: usize = 32; +pub(crate) const GAS_PER_MEMORY_WORD: usize = GAS_PER_MEMORY_BYTE * WORD_WIDTH; + pub(crate) const GAS_PER_LOG_DATA_BYTE: usize = 8; pub(crate) const GAS_PER_LOG_TOPIC: usize = 375; pub(crate) const GAS_PER_LOG: usize = 375; pub(crate) const GAS_PER_LOG_DATA_WORD: usize = GAS_PER_LOG_DATA_BYTE * WORD_WIDTH; -pub(crate) const GAS_PER_MEMORY_WORD: usize = GAS_PER_MEMORY_BYTE * WORD_WIDTH; pub(crate) const GAS_PER_ZERO_TO_NONZERO_STORAGE_SET: usize = 20000; pub(crate) const GAS_PER_COLD_STORAGE_ACCESS: usize = 2100; pub(crate) const GAS_PER_NONZERO_TO_INT_STORAGE_SET: usize = 2900; @@ -16,3 +19,20 @@ pub(crate) const GAS_PER_COUNTER_DECREASE: usize = pub(crate) const SHARP_ADDITIONAL_GAS_PER_MEMORY_WORD: usize = 100; //This value is not accurate. pub(crate) const SHARP_GAS_PER_MEMORY_WORD: usize = GAS_PER_MEMORY_WORD + SHARP_ADDITIONAL_GAS_PER_MEMORY_WORD; + +// Constants used to calculate discounts in onchain data cost calculation + +// 10% discount for data availability. +pub(crate) const DISCOUNT_PER_DA_WORD: usize = (SHARP_GAS_PER_MEMORY_WORD * 10) / 100; +pub(crate) const SHARP_GAS_PER_DA_WORD: usize = SHARP_GAS_PER_MEMORY_WORD - DISCOUNT_PER_DA_WORD; + +// For each modified contract, the expected non-zeros bytes in the second word are: +// 1 bytes for class hash flag; 2 for number of storage updates (up to 64K); +// 3 for nonce update (up to 16M). +const MODIFIED_CONTRACT_COST: usize = + 6 * GAS_PER_MEMORY_BYTE + (WORD_WIDTH - 6) * GAS_PER_MEMORY_ZERO_BYTE; +pub(crate) const MODIFIED_CONTRACT_DISCOUNT: usize = GAS_PER_MEMORY_WORD - MODIFIED_CONTRACT_COST; + +// Up to balance of 8*(10**10) ETH. +pub(crate) const FEE_BALANCE_VALUE_COST: usize = + 12 * GAS_PER_MEMORY_BYTE + (WORD_WIDTH - 12) * GAS_PER_MEMORY_ZERO_BYTE; From a6940c461fcfedb7e34dc6483ae1bcb45fa3aad2 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 13:59:28 -0300 Subject: [PATCH 21/50] Refactor --- src/transaction/fee.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 30dac5642..c71112fe1 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -83,13 +83,26 @@ pub(crate) fn execute_fee_transfer( call_info.ok_or(TransactionError::CallInfoIsNone) } -/// Calculates the fee of a transaction given its execution resources. -/// We add the l1_gas_usage (which may include, for example, the direct cost of L2-to-L1 -/// messages) to the gas consumed by Cairo resource and multiply by the L1 gas price. +/// Calculates the fee that should be charged, given execution resources. pub fn calculate_tx_fee( resources: &HashMap, block_context: &BlockContext, fee_type: &FeeType, +) -> Result { + let l1_gas_usage = calculate_tx_l1_gas_usage(resources, block_context)?; + Ok(l1_gas_usage + * block_context + .starknet_os_config() + .gas_price() + .get_by_fee_type(fee_type)) +} + +/// Computes and returns the total L1 gas consumption. +/// We add the l1_gas_usage (which may include, for example, the direct cost of L2-to-L1 messages) +/// to the gas consumed by Cairo VM resource. +pub fn calculate_tx_l1_gas_usage( + resources: &HashMap, + block_context: &BlockContext, ) -> Result { let gas_usage = resources .get(&"l1_gas_usage".to_string()) @@ -99,11 +112,7 @@ pub fn calculate_tx_fee( let l1_gas_by_cairo_usage = calculate_l1_gas_by_cairo_usage(block_context, resources)?; let total_l1_gas_usage = gas_usage.to_f64().unwrap() + l1_gas_by_cairo_usage; - Ok(total_l1_gas_usage.ceil() as u128 - * block_context - .starknet_os_config() - .gas_price() - .get_by_fee_type(fee_type)) + Ok(total_l1_gas_usage.ceil() as u128) } /// Calculates the L1 gas consumed when submitting the underlying Cairo program to SHARP. From 8ae7451e075ee267646e6a9ea3b8de4e9bb4300a Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 14:10:05 -0300 Subject: [PATCH 22/50] Generalize fn --- src/transaction/fee.rs | 55 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index c71112fe1..7608c6a5c 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -6,12 +6,19 @@ use crate::{ }, execution::{ execution_entry_point::{ExecutionEntryPoint, ExecutionResult}, + gas_usage::get_onchain_data_segment_length, + os_usage::{ + ESTIMATED_DECLARE_STEPS, ESTIMATED_DEPLOY_ACCOUNT_STEPS, + ESTIMATED_INVOKE_FUNCTION_STEPS, + }, CallInfo, CallType, TransactionExecutionContext, }, services::api::contract_classes::deprecated_contract_class::EntryPointType, state::{ - cached_state::CachedState, contract_class_cache::ContractClassCache, - state_api::StateReader, ExecutionResourcesManager, + cached_state::CachedState, + contract_class_cache::ContractClassCache, + state_api::{StateChangesCount, StateReader}, + ExecutionResourcesManager, }, }; use cairo_vm::Felt252; @@ -206,6 +213,50 @@ pub fn charge_fee( Ok((fee_transfer_info, actual_fee)) } +// Minimal Fee estimation + +pub(crate) enum AccountTxType { + Declare, + Invoke, + DeployAccount, +} + +pub(crate) fn estimate_minimal_l1_gas( + block_context: &BlockContext, + tx_type: AccountTxType, +) -> Result { + let n_estimated_steps = match tx_type { + AccountTxType::Declare => ESTIMATED_DECLARE_STEPS, + AccountTxType::Invoke => ESTIMATED_INVOKE_FUNCTION_STEPS, + AccountTxType::DeployAccount => ESTIMATED_DEPLOY_ACCOUNT_STEPS, + }; + let state_changes = match tx_type { + AccountTxType::Declare => StateChangesCount { + n_storage_updates: 1, + n_class_hash_updates: 0, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 1, + }, + AccountTxType::Invoke => StateChangesCount { + n_storage_updates: 1, + n_class_hash_updates: 0, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 1, + }, + AccountTxType::DeployAccount => StateChangesCount { + n_storage_updates: 1, + n_class_hash_updates: 1, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 1, + }, + }; + let gas_cost = get_onchain_data_segment_length(&state_changes); + let resources = HashMap::from([ + ("l1_gas_usage".to_string(), gas_cost), + ("n_steps".to_string(), n_estimated_steps), + ]); + calculate_tx_l1_gas_usage(&resources, block_context) +} #[cfg(test)] mod tests { From 791d45e6b7f87321ff5d9ceb35969297d91f3339 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 14:22:21 -0300 Subject: [PATCH 23/50] Start implementing check_fee_bounds --- src/transaction/fee.rs | 25 ++++++++++++++++++++++++- src/transaction/mod.rs | 7 ++++--- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 7608c6a5c..5ad5d583e 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -1,4 +1,4 @@ -use super::error::TransactionError; +use super::{error::TransactionError, VersionSpecificAccountTxFields}; use crate::{ definitions::{ block_context::{BlockContext, FeeType}, @@ -221,6 +221,29 @@ pub(crate) enum AccountTxType { DeployAccount, } +pub(crate) fn check_fee_bounds( + account_tx_fields: &VersionSpecificAccountTxFields, + block_context: &BlockContext, + tx_type: AccountTxType, +) -> Result<(), TransactionError> { + let minimal_l1_gas_amount = estimate_minimal_l1_gas(block_context, tx_type)?; + match account_tx_fields { + VersionSpecificAccountTxFields::Deprecated(max_fee) => { + let minimal_fee = minimal_l1_gas_amount + * block_context + .starknet_os_config() + .gas_price() + .get_by_fee_type(&FeeType::Eth); + // Check max fee is at least the estimated constant overhead. + if *max_fee < minimal_fee { + return Err(TransactionError::MaxFeeTooLow(*max_fee, minimal_fee)); + } + } + VersionSpecificAccountTxFields::Current(_) => todo!(), + } + Ok(()) +} + pub(crate) fn estimate_minimal_l1_gas( block_context: &BlockContext, tx_type: AccountTxType, diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index dcd95633f..332e27092 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -203,19 +203,20 @@ fn check_account_tx_fields_version( } } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Default)] pub enum DataAvailabilityMode { + #[default] L1, L2, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Default)] pub struct ResourceBounds { pub max_amount: u64, pub max_price_per_unit: u128, } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Default)] pub struct CurrentAccountTxFields { pub l1_resource_bounds: Option, pub l2_resource_bounds: Option, From d2aa1301729dda9c4a40ffd4e11725b1453a66be Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 14:44:33 -0300 Subject: [PATCH 24/50] Finish implementing check_fee_bounds --- src/definitions/block_context.rs | 4 ++++ src/transaction/error.rs | 4 ++++ src/transaction/fee.rs | 25 +++++++++++++++++++------ src/transaction/mod.rs | 2 +- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/definitions/block_context.rs b/src/definitions/block_context.rs index 2f6af2fdd..e9080bca8 100644 --- a/src/definitions/block_context.rs +++ b/src/definitions/block_context.rs @@ -216,6 +216,10 @@ impl BlockContext { enforce_l1_handler_fee, } } + + pub fn get_gas_price_by_fee_type(&self, fee_type: &FeeType) -> u128 { + self.starknet_os_config.gas_price.get_by_fee_type(fee_type) + } } impl Default for BlockContext { diff --git a/src/transaction/error.rs b/src/transaction/error.rs index b277783a3..0e66b3edc 100644 --- a/src/transaction/error.rs +++ b/src/transaction/error.rs @@ -156,6 +156,10 @@ pub enum TransactionError { WrongValidateRetdata, #[error("Max fee ({0}) is too low. Minimum fee: {1}.")] MaxFeeTooLow(u128, u128), + #[error("Max l1 gas amount ({0}) is too low. Minimum l1 gas amount: {1}.")] + MaxL1GasAmountTooLow(u64, u128), + #[error("Max l1 gas price ({0}) is too low. Actual l1 gas price: {1}.")] + MaxL1GasPriceTooLow(u128, u128), #[error("Max fee ({0}) exceeds balance (Uint256({1}, {2})).")] MaxFeeExceedsBalance(u128, Felt252, Felt252), #[error("V3 Transactions not Supported Yet")] diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 5ad5d583e..a880cdf71 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -229,17 +229,30 @@ pub(crate) fn check_fee_bounds( let minimal_l1_gas_amount = estimate_minimal_l1_gas(block_context, tx_type)?; match account_tx_fields { VersionSpecificAccountTxFields::Deprecated(max_fee) => { - let minimal_fee = minimal_l1_gas_amount - * block_context - .starknet_os_config() - .gas_price() - .get_by_fee_type(&FeeType::Eth); + let minimal_fee = + minimal_l1_gas_amount * block_context.get_gas_price_by_fee_type(&FeeType::Eth); // Check max fee is at least the estimated constant overhead. if *max_fee < minimal_fee { return Err(TransactionError::MaxFeeTooLow(*max_fee, minimal_fee)); } } - VersionSpecificAccountTxFields::Current(_) => todo!(), + VersionSpecificAccountTxFields::Current(fields) => { + // Check l1_gas amount + if (fields.l1_resource_bounds.max_amount as u128) < minimal_l1_gas_amount { + return Err(TransactionError::MaxL1GasAmountTooLow( + fields.l1_resource_bounds.max_amount, + minimal_l1_gas_amount, + ))?; + } + // Check l1_gas price + let actual_gas_price = block_context.get_gas_price_by_fee_type(&FeeType::Strk); + if (fields.l1_resource_bounds.max_price_per_unit as u128) < actual_gas_price { + return Err(TransactionError::MaxL1GasPriceTooLow( + fields.l1_resource_bounds.max_price_per_unit, + actual_gas_price, + ))?; + } + } } Ok(()) } diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 332e27092..6181a6d34 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -218,7 +218,7 @@ pub struct ResourceBounds { #[derive(Clone, Debug, Default)] pub struct CurrentAccountTxFields { - pub l1_resource_bounds: Option, + pub l1_resource_bounds: ResourceBounds, pub l2_resource_bounds: Option, pub tip: u64, pub nonce_data_availability_mode: DataAvailabilityMode, From f217d86941a72ce0bc2b8dabe0d19854f968e5b3 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 14:51:33 -0300 Subject: [PATCH 25/50] Replace old code --- src/transaction/invoke_function.rs | 49 ++++++++---------------------- src/transaction/mod.rs | 11 +++---- 2 files changed, 17 insertions(+), 43 deletions(-) diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index fc7118708..722b59867 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -1,6 +1,6 @@ use super::{ check_account_tx_fields_version, - fee::{calculate_tx_fee, charge_fee}, + fee::{calculate_tx_fee, charge_fee, check_fee_bounds}, get_tx_version, ResourceBounds, Transaction, VersionSpecificAccountTxFields, }; use crate::{ @@ -14,20 +14,15 @@ use crate::{ }, execution::{ execution_entry_point::{ExecutionEntryPoint, ExecutionResult}, - gas_usage::get_onchain_data_segment_length, - os_usage::ESTIMATED_INVOKE_FUNCTION_STEPS, CallInfo, TransactionExecutionContext, TransactionExecutionInfo, }, - services::{ - api::contract_classes::{ - compiled_class::CompiledClass, deprecated_contract_class::EntryPointType, - }, - eth_definitions::eth_gas_constants::SHARP_GAS_PER_MEMORY_WORD, + services::api::contract_classes::{ + compiled_class::CompiledClass, deprecated_contract_class::EntryPointType, }, state::{ cached_state::CachedState, contract_class_cache::ContractClassCache, - state_api::{State, StateChangesCount, StateReader}, + state_api::{State, StateReader}, ExecutionResourcesManager, StateDiff, }, transaction::error::TransactionError, @@ -36,7 +31,7 @@ use crate::{ use cairo_vm::Felt252; use getset::Getters; use num_traits::Zero; -use std::{collections::HashMap, fmt::Debug}; +use std::fmt::Debug; #[cfg(feature = "cairo-native")] use { @@ -509,14 +504,12 @@ impl InvokeFunction { if self.account_tx_fields.max_fee().is_zero() { return Ok(()); } - let minimal_fee = self.estimate_minimal_fee(block_context)?; // Check max fee is at least the estimated constant overhead. - if self.account_tx_fields.max_fee() < minimal_fee { - return Err(TransactionError::MaxFeeTooLow( - self.account_tx_fields.max_fee(), - minimal_fee, - )); - } + check_fee_bounds( + &self.account_tx_fields, + block_context, + super::fee::AccountTxType::Invoke, + )?; // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = state.get_fee_token_balance(block_context, self.contract_address(), fee_type)?; @@ -531,24 +524,6 @@ impl InvokeFunction { Ok(()) } - fn estimate_minimal_fee(&self, block_context: &BlockContext) -> Result { - let n_estimated_steps = ESTIMATED_INVOKE_FUNCTION_STEPS; - let onchain_data_length = get_onchain_data_segment_length(&StateChangesCount { - n_storage_updates: 1, - n_class_hash_updates: 0, - n_compiled_class_hash_updates: 0, - n_modified_contracts: 1, - }); - let resources = HashMap::from([ - ( - "l1_gas_usage".to_string(), - onchain_data_length * SHARP_GAS_PER_MEMORY_WORD, - ), - ("n_steps".to_string(), n_estimated_steps), - ]); - calculate_tx_fee(&resources, block_context, &FeeType::Eth) - } - // Simulation function pub fn create_for_simulation( @@ -567,10 +542,10 @@ impl InvokeFunction { account_tx_fields: if ignore_max_fee { if let VersionSpecificAccountTxFields::Current(current) = &self.account_tx_fields { let mut current_fields = current.clone(); - current_fields.l1_resource_bounds = Some(ResourceBounds { + current_fields.l1_resource_bounds = ResourceBounds { max_amount: u64::MAX, max_price_per_unit: u128::MAX, - }); + }; VersionSpecificAccountTxFields::Current(current_fields) } else { VersionSpecificAccountTxFields::new_deprecated(u128::MAX) diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 6181a6d34..03d2d0392 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -244,15 +244,14 @@ impl VersionSpecificAccountTxFields { pub fn new_deprecated(max_fee: u128) -> Self { Self::Deprecated(max_fee) } - // TODO[0.13]: This method should be removed after completing V3 Tx related changes + pub(crate) fn max_fee(&self) -> u128 { match self { Self::Deprecated(max_fee) => *max_fee, - Self::Current(current) => current - .l1_resource_bounds - .as_ref() - .map(|rb| rb.max_amount as u128 * rb.max_price_per_unit) - .unwrap_or_default(), + Self::Current(current) => { + current.l1_resource_bounds.max_amount as u128 + * current.l1_resource_bounds.max_price_per_unit + } } } } From c16c449b6b8c75ff563722aa6790b720e008fe7b Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 14:52:31 -0300 Subject: [PATCH 26/50] Fixes --- src/transaction/declare_v2.rs | 4 ++-- src/transaction/deploy_account.rs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index c79edfb6b..4f374f747 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -584,10 +584,10 @@ impl DeclareV2 { account_tx_fields: if ignore_max_fee { if let VersionSpecificAccountTxFields::Current(current) = &self.account_tx_fields { let mut current_fields = current.clone(); - current_fields.l1_resource_bounds = Some(ResourceBounds { + current_fields.l1_resource_bounds = ResourceBounds { max_amount: u64::MAX, max_price_per_unit: u128::MAX, - }); + }; VersionSpecificAccountTxFields::Current(current_fields) } else { VersionSpecificAccountTxFields::new_deprecated(u128::MAX) diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index fbbd25a13..4e7f9a751 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -590,10 +590,10 @@ impl DeployAccount { account_tx_fields: if ignore_max_fee { if let VersionSpecificAccountTxFields::Current(current) = &self.account_tx_fields { let mut current_fields = current.clone(); - current_fields.l1_resource_bounds = Some(ResourceBounds { + current_fields.l1_resource_bounds = ResourceBounds { max_amount: u64::MAX, max_price_per_unit: u128::MAX, - }); + }; VersionSpecificAccountTxFields::Current(current_fields) } else { VersionSpecificAccountTxFields::new_deprecated(u128::MAX) From 49c083051a0e20876e6f28e7dae81c53700898d2 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 15:02:19 -0300 Subject: [PATCH 27/50] Implement FeeType for VersionSpecificAccountTxFields --- src/transaction/fee.rs | 7 ++++--- src/transaction/invoke_function.rs | 10 ++++++---- src/transaction/mod.rs | 14 ++++++++++++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index a880cdf71..a65dfebb2 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -229,8 +229,8 @@ pub(crate) fn check_fee_bounds( let minimal_l1_gas_amount = estimate_minimal_l1_gas(block_context, tx_type)?; match account_tx_fields { VersionSpecificAccountTxFields::Deprecated(max_fee) => { - let minimal_fee = - minimal_l1_gas_amount * block_context.get_gas_price_by_fee_type(&FeeType::Eth); + let minimal_fee = minimal_l1_gas_amount + * block_context.get_gas_price_by_fee_type(&account_tx_fields.fee_type()); // Check max fee is at least the estimated constant overhead. if *max_fee < minimal_fee { return Err(TransactionError::MaxFeeTooLow(*max_fee, minimal_fee)); @@ -245,7 +245,8 @@ pub(crate) fn check_fee_bounds( ))?; } // Check l1_gas price - let actual_gas_price = block_context.get_gas_price_by_fee_type(&FeeType::Strk); + let actual_gas_price = + block_context.get_gas_price_by_fee_type(&account_tx_fields.fee_type()); if (fields.l1_resource_bounds.max_price_per_unit as u128) < actual_gas_price { return Err(TransactionError::MaxL1GasPriceTooLow( fields.l1_resource_bounds.max_price_per_unit, diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 722b59867..13966d418 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -380,7 +380,7 @@ impl InvokeFunction { } if !self.skip_fee_transfer { - self.check_fee_balance(state, block_context, &FeeType::Eth)?; + self.check_fee_balance(state, block_context)?; } self.handle_nonce(state)?; @@ -499,7 +499,6 @@ impl InvokeFunction { &self, state: &mut S, block_context: &BlockContext, - fee_type: &FeeType, ) -> Result<(), TransactionError> { if self.account_tx_fields.max_fee().is_zero() { return Ok(()); @@ -511,8 +510,11 @@ impl InvokeFunction { super::fee::AccountTxType::Invoke, )?; // Check that the current balance is high enough to cover the max_fee - let (balance_low, balance_high) = - state.get_fee_token_balance(block_context, self.contract_address(), fee_type)?; + let (balance_low, balance_high) = state.get_fee_token_balance( + block_context, + self.contract_address(), + &self.account_tx_fields.fee_type(), + )?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(self.account_tx_fields.max_fee()) { return Err(TransactionError::MaxFeeExceedsBalance( diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 03d2d0392..765ece771 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -1,6 +1,9 @@ use crate::{ definitions::block_context::BlockContext, - definitions::constants::{QUERY_VERSION_0, QUERY_VERSION_1, QUERY_VERSION_2}, + definitions::{ + block_context::FeeType, + constants::{QUERY_VERSION_0, QUERY_VERSION_1, QUERY_VERSION_2}, + }, execution::TransactionExecutionInfo, state::{ cached_state::CachedState, contract_class_cache::ContractClassCache, state_api::StateReader, @@ -245,7 +248,7 @@ impl VersionSpecificAccountTxFields { Self::Deprecated(max_fee) } - pub(crate) fn max_fee(&self) -> u128 { + pub fn max_fee(&self) -> u128 { match self { Self::Deprecated(max_fee) => *max_fee, Self::Current(current) => { @@ -254,4 +257,11 @@ impl VersionSpecificAccountTxFields { } } } + + pub fn fee_type(&self) -> FeeType { + match self { + Self::Deprecated(_) => FeeType::Eth, + Self::Current(_) => FeeType::Strk, + } + } } From f7b74003c2b50108764d7d37b220805550029a86 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 15:11:13 -0300 Subject: [PATCH 28/50] Update other txs --- src/transaction/declare.rs | 36 ++++++----------------- src/transaction/declare_v2.rs | 47 ++++++++----------------------- src/transaction/deploy_account.rs | 47 ++++++++----------------------- 3 files changed, 32 insertions(+), 98 deletions(-) diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index 613a20f96..3095d48d3 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -3,13 +3,10 @@ use crate::core::transaction_hash::calculate_declare_transaction_hash; use crate::definitions::block_context::{BlockContext, FeeType}; use crate::definitions::constants::VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; use crate::definitions::transaction_type::TransactionType; -use crate::execution::gas_usage::get_onchain_data_segment_length; -use crate::execution::os_usage::ESTIMATED_DECLARE_STEPS; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; -use crate::services::eth_definitions::eth_gas_constants::SHARP_GAS_PER_MEMORY_WORD; use crate::state::cached_state::CachedState; use crate::state::contract_class_cache::ContractClassCache; -use crate::state::state_api::{State, StateChangesCount, StateReader}; +use crate::state::state_api::{State, StateReader}; use crate::{ execution::{ execution_entry_point::{ExecutionEntryPoint, ExecutionResult}, @@ -28,9 +25,8 @@ use crate::{ use cairo_vm::Felt252; use num_traits::Zero; -use super::fee::{calculate_tx_fee, charge_fee}; +use super::fee::{charge_fee, estimate_minimal_l1_gas}; use super::{get_tx_version, Transaction}; -use std::collections::HashMap; use std::fmt::Debug; use std::sync::Arc; @@ -321,19 +317,21 @@ impl Declare { &self, state: &mut S, block_context: &BlockContext, - fee_type: &FeeType, ) -> Result<(), TransactionError> { if self.max_fee.is_zero() { return Ok(()); } - let minimal_fee = self.estimate_minimal_fee(block_context)?; + let minimal_l1_gas_amount = + estimate_minimal_l1_gas(block_context, super::fee::AccountTxType::Declare)?; + let minimal_fee = + minimal_l1_gas_amount * block_context.get_gas_price_by_fee_type(&FeeType::Eth); // Check max fee is at least the estimated constant overhead. if self.max_fee < minimal_fee { return Err(TransactionError::MaxFeeTooLow(self.max_fee, minimal_fee)); } // Check that the current balance is high enough to cover the max_fee let (balance_low, balance_high) = - state.get_fee_token_balance(block_context, &self.sender_address, fee_type)?; + state.get_fee_token_balance(block_context, &self.sender_address, &FeeType::Eth)?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(self.max_fee) { return Err(TransactionError::MaxFeeExceedsBalance( @@ -345,24 +343,6 @@ impl Declare { Ok(()) } - fn estimate_minimal_fee(&self, block_context: &BlockContext) -> Result { - let n_estimated_steps = ESTIMATED_DECLARE_STEPS; - let onchain_data_length = get_onchain_data_segment_length(&StateChangesCount { - n_storage_updates: 1, - n_class_hash_updates: 0, - n_compiled_class_hash_updates: 0, - n_modified_contracts: 1, - }); - let resources = HashMap::from([ - ( - "l1_gas_usage".to_string(), - onchain_data_length * SHARP_GAS_PER_MEMORY_WORD, - ), - ("n_steps".to_string(), n_estimated_steps), - ]); - calculate_tx_fee(&resources, block_context, &FeeType::Eth) - } - /// Calculates actual fee used by the transaction using the execution /// info returned by apply(), then updates the transaction execution info with the data of the fee. #[tracing::instrument(level = "debug", ret, err, skip(self, state, block_context, program_cache), fields( @@ -389,7 +369,7 @@ impl Declare { )); } if !self.skip_fee_transfer { - self.check_fee_balance(state, block_context, &FeeType::Eth)?; + self.check_fee_balance(state, block_context)?; } self.handle_nonce(state)?; diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 4f374f747..2487dd332 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -1,4 +1,4 @@ -use super::fee::{calculate_tx_fee, charge_fee}; +use super::fee::{charge_fee, check_fee_bounds}; use super::{ check_account_tx_fields_version, get_tx_version, ResourceBounds, Transaction, VersionSpecificAccountTxFields, @@ -7,15 +7,11 @@ use crate::core::contract_address::{compute_casm_class_hash, compute_sierra_clas use crate::definitions::block_context::FeeType; use crate::definitions::constants::VALIDATE_RETDATA; use crate::execution::execution_entry_point::ExecutionResult; -use crate::execution::gas_usage::get_onchain_data_segment_length; -use crate::execution::os_usage::ESTIMATED_DECLARE_STEPS; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use crate::services::api::contract_classes::compiled_class::CompiledClass; -use crate::services::eth_definitions::eth_gas_constants::SHARP_GAS_PER_MEMORY_WORD; use crate::state::cached_state::CachedState; use crate::state::contract_class_cache::ContractClassCache; -use crate::state::state_api::StateChangesCount; use crate::utils::ClassHash; use crate::{ core::transaction_hash::calculate_declare_v2_transaction_hash, @@ -37,7 +33,6 @@ use cairo_lang_starknet::casm_contract_class::CasmContractClass; use cairo_lang_starknet::contract_class::ContractClass as SierraContractClass; use cairo_vm::Felt252; use num_traits::Zero; -use std::collections::HashMap; use std::fmt::Debug; use std::sync::Arc; @@ -305,22 +300,22 @@ impl DeclareV2 { &self, state: &mut S, block_context: &BlockContext, - fee_type: &FeeType, ) -> Result<(), TransactionError> { if self.account_tx_fields.max_fee().is_zero() { return Ok(()); } - let minimal_fee = self.estimate_minimal_fee(block_context)?; // Check max fee is at least the estimated constant overhead. - if self.account_tx_fields.max_fee() < minimal_fee { - return Err(TransactionError::MaxFeeTooLow( - self.account_tx_fields.max_fee(), - minimal_fee, - )); - } + check_fee_bounds( + &self.account_tx_fields, + block_context, + super::fee::AccountTxType::Declare, + )?; // Check that the current balance is high enough to cover the max_fee - let (balance_low, balance_high) = - state.get_fee_token_balance(block_context, &self.sender_address, fee_type)?; + let (balance_low, balance_high) = state.get_fee_token_balance( + block_context, + &self.sender_address, + &self.account_tx_fields.fee_type(), + )?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(self.account_tx_fields.max_fee()) { return Err(TransactionError::MaxFeeExceedsBalance( @@ -332,24 +327,6 @@ impl DeclareV2 { Ok(()) } - fn estimate_minimal_fee(&self, block_context: &BlockContext) -> Result { - let n_estimated_steps = ESTIMATED_DECLARE_STEPS; - let onchain_data_length = get_onchain_data_segment_length(&StateChangesCount { - n_storage_updates: 1, - n_class_hash_updates: 0, - n_compiled_class_hash_updates: 0, - n_modified_contracts: 1, - }); - let resources = HashMap::from([ - ( - "l1_gas_usage".to_string(), - onchain_data_length * SHARP_GAS_PER_MEMORY_WORD, - ), - ("n_steps".to_string(), n_estimated_steps), - ]); - calculate_tx_fee(&resources, block_context, &FeeType::Eth) - } - /// Execute the validation of the contract in the cairo-vm. Returns a TransactionExecutionInfo if succesful. /// ## Parameter: /// - state: An state that implements the State and StateReader traits. @@ -380,7 +357,7 @@ impl DeclareV2 { } if !self.skip_fee_transfer { - self.check_fee_balance(state, block_context, &FeeType::Eth)?; + self.check_fee_balance(state, block_context)?; } self.handle_nonce(state)?; diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 4e7f9a751..626d05dc6 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -1,4 +1,4 @@ -use super::fee::{calculate_tx_fee, charge_fee}; +use super::fee::{calculate_tx_fee, charge_fee, check_fee_bounds}; use super::{ check_account_tx_fields_version, get_tx_version, ResourceBounds, VersionSpecificAccountTxFields, }; @@ -6,12 +6,8 @@ use super::{invoke_function::verify_no_calls_to_other_contracts, Transaction}; use crate::definitions::block_context::FeeType; use crate::definitions::constants::VALIDATE_RETDATA; use crate::execution::execution_entry_point::ExecutionResult; -use crate::execution::gas_usage::get_onchain_data_segment_length; -use crate::execution::os_usage::ESTIMATED_DEPLOY_ACCOUNT_STEPS; use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; -use crate::services::eth_definitions::eth_gas_constants::SHARP_GAS_PER_MEMORY_WORD; use crate::state::cached_state::CachedState; -use crate::state::state_api::StateChangesCount; use crate::state::StateDiff; use crate::{ core::{ @@ -45,7 +41,6 @@ use crate::{ use cairo_vm::Felt252; use getset::Getters; use num_traits::Zero; -use std::collections::HashMap; use std::fmt::Debug; #[cfg(feature = "cairo-native")] @@ -206,7 +201,7 @@ impl DeployAccount { } if !self.skip_fee_transfer { - self.check_fee_balance(state, block_context, &FeeType::Eth)?; + self.check_fee_balance(state, block_context)?; } self.handle_nonce(state)?; @@ -408,22 +403,22 @@ impl DeployAccount { &self, state: &mut S, block_context: &BlockContext, - fee_type: &FeeType, ) -> Result<(), TransactionError> { if self.account_tx_fields.max_fee().is_zero() { return Ok(()); } - let minimal_fee = self.estimate_minimal_fee(block_context)?; // Check max fee is at least the estimated constant overhead. - if self.account_tx_fields.max_fee() < minimal_fee { - return Err(TransactionError::MaxFeeTooLow( - self.account_tx_fields.max_fee(), - minimal_fee, - )); - } + check_fee_bounds( + &self.account_tx_fields, + block_context, + super::fee::AccountTxType::DeployAccount, + )?; // Check that the current balance is high enough to cover the max_fee - let (balance_low, balance_high) = - state.get_fee_token_balance(block_context, self.contract_address(), fee_type)?; + let (balance_low, balance_high) = state.get_fee_token_balance( + block_context, + self.contract_address(), + &self.account_tx_fields.fee_type(), + )?; // The fee is at most 128 bits, while balance is 256 bits (split into two 128 bit words). if balance_high.is_zero() && balance_low < Felt252::from(self.account_tx_fields.max_fee()) { return Err(TransactionError::MaxFeeExceedsBalance( @@ -435,24 +430,6 @@ impl DeployAccount { Ok(()) } - fn estimate_minimal_fee(&self, block_context: &BlockContext) -> Result { - let n_estimated_steps = ESTIMATED_DEPLOY_ACCOUNT_STEPS; - let onchain_data_length = get_onchain_data_segment_length(&StateChangesCount { - n_storage_updates: 1, - n_class_hash_updates: 1, - n_compiled_class_hash_updates: 0, - n_modified_contracts: 1, - }); - let resources = HashMap::from([ - ( - "l1_gas_usage".to_string(), - onchain_data_length * SHARP_GAS_PER_MEMORY_WORD, - ), - ("n_steps".to_string(), n_estimated_steps), - ]); - calculate_tx_fee(&resources, block_context, &FeeType::Eth) - } - pub fn run_constructor_entrypoint( &self, state: &mut CachedState, From 5c265b1eff923604560a314c11909b62826e569d Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 15:15:56 -0300 Subject: [PATCH 29/50] Clippy --- src/transaction/fee.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index a65dfebb2..ce8e65e2a 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -247,7 +247,7 @@ pub(crate) fn check_fee_bounds( // Check l1_gas price let actual_gas_price = block_context.get_gas_price_by_fee_type(&account_tx_fields.fee_type()); - if (fields.l1_resource_bounds.max_price_per_unit as u128) < actual_gas_price { + if fields.l1_resource_bounds.max_price_per_unit < actual_gas_price { return Err(TransactionError::MaxL1GasPriceTooLow( fields.l1_resource_bounds.max_price_per_unit, actual_gas_price, From ccdfac285d9e6a6b373c5fb55f8a122d8b0a7a06 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 15:24:19 -0300 Subject: [PATCH 30/50] Add test --- src/transaction/fee.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index ce8e65e2a..cba82e56f 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -299,10 +299,10 @@ pub(crate) fn estimate_minimal_l1_gas( mod tests { use crate::{ definitions::block_context::{BlockContext, GasPrices}, - execution::TransactionExecutionContext, + execution::{gas_usage::get_onchain_data_cost, TransactionExecutionContext}, state::{ cached_state::CachedState, contract_class_cache::PermanentContractClassCache, - in_memory_state_reader::InMemoryStateReader, + in_memory_state_reader::InMemoryStateReader, state_api::StateChangesCount, }, transaction::fee::charge_fee, }; @@ -376,4 +376,18 @@ mod tests { assert_eq!(result.1, max_fee); } + + #[test] + fn test_get_onchain_data_cost() { + // Input values and expected output taken from blockifier test `test_onchain_data_discount` + let state_changes = StateChangesCount { + n_storage_updates: 1, + n_class_hash_updates: 0, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 7, + }; + + let onchain_data_cost = get_onchain_data_cost(&state_changes); + assert_eq!(onchain_data_cost, 6392) + } } From 8070874a94f043e506f348ca09e9fa172a9e2fb7 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 16:13:04 -0300 Subject: [PATCH 31/50] Simplify --- src/transaction/fee.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index cba82e56f..39aba16e1 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -97,11 +97,7 @@ pub fn calculate_tx_fee( fee_type: &FeeType, ) -> Result { let l1_gas_usage = calculate_tx_l1_gas_usage(resources, block_context)?; - Ok(l1_gas_usage - * block_context - .starknet_os_config() - .gas_price() - .get_by_fee_type(fee_type)) + Ok(l1_gas_usage * block_context.get_gas_price_by_fee_type(fee_type)) } /// Computes and returns the total L1 gas consumption. From 03f94874b18131ff0ee14274ea93b26dff94af90 Mon Sep 17 00:00:00 2001 From: Federica Date: Tue, 23 Jan 2024 16:14:33 -0300 Subject: [PATCH 32/50] Move test --- src/execution/gas_usage.rs | 14 ++++++++++++++ src/transaction/fee.rs | 18 ++---------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index b001d85f1..62be7651a 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -277,4 +277,18 @@ mod test { 76439 ) } + + #[test] + fn test_get_onchain_data_cost() { + // Input values and expected output taken from blockifier test `test_onchain_data_discount` + let state_changes = StateChangesCount { + n_storage_updates: 1, + n_class_hash_updates: 0, + n_compiled_class_hash_updates: 0, + n_modified_contracts: 7, + }; + + let onchain_data_cost = get_onchain_data_cost(&state_changes); + assert_eq!(onchain_data_cost, 6392) + } } diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 39aba16e1..8c8ce6ba7 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -295,10 +295,10 @@ pub(crate) fn estimate_minimal_l1_gas( mod tests { use crate::{ definitions::block_context::{BlockContext, GasPrices}, - execution::{gas_usage::get_onchain_data_cost, TransactionExecutionContext}, + execution::TransactionExecutionContext, state::{ cached_state::CachedState, contract_class_cache::PermanentContractClassCache, - in_memory_state_reader::InMemoryStateReader, state_api::StateChangesCount, + in_memory_state_reader::InMemoryStateReader, }, transaction::fee::charge_fee, }; @@ -372,18 +372,4 @@ mod tests { assert_eq!(result.1, max_fee); } - - #[test] - fn test_get_onchain_data_cost() { - // Input values and expected output taken from blockifier test `test_onchain_data_discount` - let state_changes = StateChangesCount { - n_storage_updates: 1, - n_class_hash_updates: 0, - n_compiled_class_hash_updates: 0, - n_modified_contracts: 7, - }; - - let onchain_data_cost = get_onchain_data_cost(&state_changes); - assert_eq!(onchain_data_cost, 6392) - } } From 405579f4209fdfca60ef06e6eb218a13b0960560 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 26 Jan 2024 16:20:47 -0300 Subject: [PATCH 33/50] Return the appropiate error whe converting to deprecated declare --- rpc_state_reader/src/sir_state_reader.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rpc_state_reader/src/sir_state_reader.rs b/rpc_state_reader/src/sir_state_reader.rs index 67f1f9715..9abdb449f 100644 --- a/rpc_state_reader/src/sir_state_reader.rs +++ b/rpc_state_reader/src/sir_state_reader.rs @@ -240,7 +240,7 @@ pub fn execute_tx_configurable_with_state( starknet_api::transaction::DeclareTransaction::V1(ref tx) => tx.max_fee.0, starknet_api::transaction::DeclareTransaction::V2(ref tx) => tx.max_fee.0, starknet_api::transaction::DeclareTransaction::V3(_) => { - return Err(TransactionError::UnsuportedV3Transaction) + return Err(TransactionError::CurrentAccountTxFieldsInNonV3TX) } }, Felt252::from_bytes_be_slice(tx.version().0.bytes()), From 73a6cd1c2b81130a7a7410bb3d1a6d38ddf80bc6 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 26 Jan 2024 16:21:22 -0300 Subject: [PATCH 34/50] Fix conversion between sn api Invoke and sir InvokeFunction tx --- src/transaction/invoke_function.rs | 167 ++++++++++++++--------------- src/transaction/mod.rs | 27 +++++ 2 files changed, 108 insertions(+), 86 deletions(-) diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 5bdde7f2f..60db5fac4 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -1,7 +1,8 @@ use super::{ check_account_tx_fields_version, fee::{calculate_tx_fee, charge_fee, check_fee_bounds}, - get_tx_version, ResourceBounds, Transaction, VersionSpecificAccountTxFields, + get_tx_version, CurrentAccountTxFields, ResourceBounds, Transaction, + VersionSpecificAccountTxFields, }; use crate::{ core::transaction_hash::{calculate_transaction_hash_common, TransactionHashPrefix}, @@ -31,6 +32,7 @@ use crate::{ use cairo_vm::Felt252; use getset::Getters; use num_traits::Zero; +use starknet_api::transaction::Resource; use std::fmt::Debug; #[cfg(feature = "cairo-native")] @@ -141,13 +143,85 @@ impl InvokeFunction { tx: starknet_api::transaction::InvokeTransaction, tx_hash: Felt252, ) -> Result { - match tx { - starknet_api::transaction::InvokeTransaction::V0(v0) => convert_invoke_v0(v0, tx_hash), - starknet_api::transaction::InvokeTransaction::V1(v1) => convert_invoke_v1(v1, tx_hash), - starknet_api::transaction::InvokeTransaction::V3(_) => { - Err(TransactionError::UnsuportedV3Transaction) + let account_tx_fields = match &tx { + starknet_api::transaction::InvokeTransaction::V0(tx) => { + VersionSpecificAccountTxFields::Deprecated(tx.max_fee.0) } - } + starknet_api::transaction::InvokeTransaction::V1(tx) => { + VersionSpecificAccountTxFields::Deprecated(tx.max_fee.0) + } + starknet_api::transaction::InvokeTransaction::V3(tx) => { + VersionSpecificAccountTxFields::Current(CurrentAccountTxFields { + l1_resource_bounds: tx + .resource_bounds + .0 + .get(&Resource::L1Gas) + .map(|r| r.into()) + .unwrap_or_default(), + l2_resource_bounds: tx + .resource_bounds + .0 + .get(&Resource::L2Gas) + .map(|r| r.into()), + tip: tx.tip.0, + nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), + fee_data_availability_mode: tx.fee_data_availability_mode.into(), + paymaster_data: tx + .paymaster_data + .0 + .iter() + .map(|f| Felt252::from_bytes_be_slice(f.bytes())) + .collect(), + account_deployment_data: tx + .account_deployment_data + .0 + .iter() + .map(|f| Felt252::from_bytes_be_slice(f.bytes())) + .collect(), + }) + } + }; + let entry_point_selector = match &tx { + starknet_api::transaction::InvokeTransaction::V0(tx) => { + Felt252::from_bytes_be_slice(tx.entry_point_selector.0.bytes()) + } + starknet_api::transaction::InvokeTransaction::V1(_) + | starknet_api::transaction::InvokeTransaction::V3(_) => *EXECUTE_ENTRY_POINT_SELECTOR, + }; + let contract_address = Address(Felt252::from_bytes_be_slice( + tx.sender_address().0.key().bytes(), + )); + let version = Felt252::from_bytes_be_slice(tx.version().0.bytes()); + let nonce = if version.is_zero() { + None + } else { + Some(Felt252::from_bytes_be_slice(tx.nonce().0.bytes())) + }; + + let signature = tx + .signature() + .0 + .iter() + .map(|f| Felt252::from_bytes_be_slice(f.bytes())) + .collect(); + let calldata = tx + .calldata() + .0 + .as_ref() + .iter() + .map(|f| Felt252::from_bytes_be_slice(f.bytes())) + .collect(); + + InvokeFunction::new_with_tx_hash( + contract_address, + entry_point_selector, + account_tx_fields, + version, + calldata, + signature, + nonce, + tx_hash, + ) } fn get_execution_context( @@ -609,85 +683,6 @@ pub(crate) fn preprocess_invoke_function_fields( } } -// ---------------------------------- -// Try from starknet api -// ---------------------------------- - -fn convert_invoke_v0( - value: starknet_api::transaction::InvokeTransactionV0, - tx_hash: Felt252, -) -> Result { - let contract_address = Address(Felt252::from_bytes_be_slice( - value.contract_address.0.key().bytes(), - )); - let max_fee = value.max_fee.0; - let entry_point_selector = Felt252::from_bytes_be_slice(value.entry_point_selector.0.bytes()); - let nonce = None; - - let signature = value - .signature - .0 - .iter() - .map(|f| Felt252::from_bytes_be_slice(f.bytes())) - .collect(); - let calldata = value - .calldata - .0 - .as_ref() - .iter() - .map(|f| Felt252::from_bytes_be_slice(f.bytes())) - .collect(); - - InvokeFunction::new_with_tx_hash( - contract_address, - entry_point_selector, - VersionSpecificAccountTxFields::Deprecated(max_fee), - Felt252::from(0), - calldata, - signature, - nonce, - tx_hash, - ) -} - -fn convert_invoke_v1( - value: starknet_api::transaction::InvokeTransactionV1, - tx_hash: Felt252, -) -> Result { - let contract_address = Address(Felt252::from_bytes_be_slice( - value.sender_address.0.key().bytes(), - )); - let max_fee = value.max_fee.0; - let nonce = Felt252::from_bytes_be_slice(value.nonce.0.bytes()); - let entry_point_selector = *EXECUTE_ENTRY_POINT_SELECTOR; - - let signature = value - .signature - .0 - .iter() - .map(|f| Felt252::from_bytes_be_slice(f.bytes())) - .collect(); - let calldata = value - .calldata - .0 - .as_ref() - .iter() - .map(|f| Felt252::from_bytes_be_slice(f.bytes())) - .collect(); - - InvokeFunction::new_with_tx_hash( - contract_address, - entry_point_selector, - // TODO[0.13] Properly convert between V3 tx fields - VersionSpecificAccountTxFields::Deprecated(max_fee), - Felt252::ONE, - calldata, - signature, - Some(nonce), - tx_hash, - ) -} - #[cfg(test)] mod tests { use super::*; diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 765ece771..2025642ce 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -213,12 +213,39 @@ pub enum DataAvailabilityMode { L2, } +impl Into for DataAvailabilityMode { + fn into(self) -> starknet_api::data_availability::DataAvailabilityMode { + match self { + DataAvailabilityMode::L1 => starknet_api::data_availability::DataAvailabilityMode::L1, + DataAvailabilityMode::L2 => starknet_api::data_availability::DataAvailabilityMode::L2, + } + } +} + +impl From for DataAvailabilityMode { + fn from(value: starknet_api::data_availability::DataAvailabilityMode) -> Self { + match value { + starknet_api::data_availability::DataAvailabilityMode::L1 => Self::L1, + starknet_api::data_availability::DataAvailabilityMode::L2 => Self::L2, + } + } +} + #[derive(Clone, Debug, Default)] pub struct ResourceBounds { pub max_amount: u64, pub max_price_per_unit: u128, } +impl From<&starknet_api::transaction::ResourceBounds> for ResourceBounds { + fn from(value: &starknet_api::transaction::ResourceBounds) -> Self { + Self { + max_amount: value.max_amount, + max_price_per_unit: value.max_price_per_unit, + } + } +} + #[derive(Clone, Debug, Default)] pub struct CurrentAccountTxFields { pub l1_resource_bounds: ResourceBounds, From 3b28a1db9bb037cc16feb51d52b9c90bc233a858 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 29 Jan 2024 10:45:44 -0300 Subject: [PATCH 35/50] Fix conversion between sn api and sir DeployAccount tx --- src/transaction/deploy_account.rs | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 2c270ddbd..eec66545d 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -1,6 +1,6 @@ use super::fee::{calculate_tx_fee, charge_fee, check_fee_bounds}; use super::{ - check_account_tx_fields_version, get_tx_version, ResourceBounds, VersionSpecificAccountTxFields, + check_account_tx_fields_version, get_tx_version, CurrentAccountTxFields, ResourceBounds, VersionSpecificAccountTxFields }; use super::{invoke_function::verify_no_calls_to_other_contracts, Transaction}; use crate::definitions::block_context::FeeType; @@ -41,6 +41,7 @@ use crate::{ use cairo_vm::Felt252; use getset::Getters; use num_traits::Zero; +use starknet_api::transaction::Resource; use std::fmt::Debug; #[cfg(feature = "cairo-native")] @@ -589,12 +590,23 @@ impl DeployAccount { value: starknet_api::transaction::DeployAccountTransaction, tx_hash: Felt252, ) -> Result { - let max_fee = match value { - starknet_api::transaction::DeployAccountTransaction::V1(ref tx) => tx.max_fee, - starknet_api::transaction::DeployAccountTransaction::V3(_) => { - return Err(TransactionError::UnsuportedV3Transaction) - } + let account_tx_fields = match &value { + starknet_api::transaction::DeployAccountTransaction::V1(tx) => { + VersionSpecificAccountTxFields::Deprecated(tx.max_fee.0) + }, + starknet_api::transaction::DeployAccountTransaction::V3(tx) => { + VersionSpecificAccountTxFields::Current(CurrentAccountTxFields { + l1_resource_bounds: tx.resource_bounds.0.get(&Resource::L1Gas).map(|r| r.into()).unwrap_or_default(), + l2_resource_bounds: tx.resource_bounds.0.get(&Resource::L2Gas).map(|r| r.into()), + tip: tx.tip.0, + nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), + fee_data_availability_mode: tx.fee_data_availability_mode.into(), + paymaster_data: tx.paymaster_data.0.iter().map(|f| Felt252::from_bytes_be_slice(f.bytes())).collect(), + account_deployment_data: Default::default(), + }) + }, }; + let version = Felt252::from_bytes_be_slice(value.version().0.bytes()); let nonce = Felt252::from_bytes_be_slice(value.nonce().0.bytes()); let class_hash: ClassHash = ClassHash(value.class_hash().0.bytes().try_into().unwrap()); @@ -617,8 +629,7 @@ impl DeployAccount { DeployAccount::new_with_tx_hash( class_hash, - // TODO[0.13] Properly convert between V3 tx fields - VersionSpecificAccountTxFields::Deprecated(max_fee.0), + account_tx_fields, version, nonce, constructor_calldata, From 134e955b2d5eadd054477036c3dc726a0cac8834 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 29 Jan 2024 11:14:39 -0300 Subject: [PATCH 36/50] Implement declare_tx_from_sn_api_transaction --- rpc_state_reader/src/sir_state_reader.rs | 82 +++---------------- src/transaction/deploy_account.rs | 27 ++++-- src/transaction/mod.rs | 100 +++++++++++++++++++++++ 3 files changed, 131 insertions(+), 78 deletions(-) diff --git a/rpc_state_reader/src/sir_state_reader.rs b/rpc_state_reader/src/sir_state_reader.rs index 9abdb449f..4600bd90d 100644 --- a/rpc_state_reader/src/sir_state_reader.rs +++ b/rpc_state_reader/src/sir_state_reader.rs @@ -6,10 +6,10 @@ use starknet_api::{ core::{ClassHash as SNClassHash, ContractAddress, PatriciaKey}, hash::{StarkFelt, StarkHash}, state::StorageKey, - transaction::{Transaction as SNTransaction, TransactionHash, TransactionVersion}, + transaction::{Transaction as SNTransaction, TransactionHash}, }; use starknet_in_rust::{ - core::{contract_address::compute_casm_class_hash, errors::state_errors::StateError}, + core::errors::state_errors::StateError, definitions::{ block_context::{BlockContext, FeeTokenAddresses, StarknetChainId, StarknetOsConfig}, constants::{ @@ -28,8 +28,8 @@ use starknet_in_rust::{ BlockInfo, }, transaction::{ - error::TransactionError, Declare, DeclareV2, DeployAccount, InvokeFunction, L1Handler, - VersionSpecificAccountTxFields, + declare_tx_from_sn_api_transaction, error::TransactionError, DeployAccount, InvokeFunction, + L1Handler, }, utils::{Address, ClassHash}, }; @@ -224,74 +224,12 @@ pub fn execute_tx_configurable_with_state( contract_class }; - if tx.version() != TransactionVersion(2_u8.into()) { - let contract_class = match contract_class { - CompiledClass::Deprecated(cc) => cc.as_ref().clone(), - _ => unreachable!(), - }; - - let declare = Declare::new_with_tx_and_class_hash( - contract_class, - Address(Felt252::from_bytes_be_slice( - tx.sender_address().0.key().bytes(), - )), - match tx { - starknet_api::transaction::DeclareTransaction::V0(ref tx) => tx.max_fee.0, - starknet_api::transaction::DeclareTransaction::V1(ref tx) => tx.max_fee.0, - starknet_api::transaction::DeclareTransaction::V2(ref tx) => tx.max_fee.0, - starknet_api::transaction::DeclareTransaction::V3(_) => { - return Err(TransactionError::CurrentAccountTxFieldsInNonV3TX) - } - }, - Felt252::from_bytes_be_slice(tx.version().0.bytes()), - tx.signature() - .0 - .iter() - .map(|f| Felt252::from_bytes_be_slice(f.bytes())) - .collect(), - Felt252::from_bytes_be_slice(tx.nonce().0.bytes()), - Felt252::from_bytes_be_slice(tx_hash.0.bytes()), - class_hash, - ) - .unwrap(); - declare.create_for_simulation(skip_validate, false, false, false, skip_nonce_check) - } else { - let contract_class = match contract_class { - CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), - _ => unreachable!(), - }; - - let compiled_class_hash = compute_casm_class_hash(&contract_class).unwrap(); - - let declare = DeclareV2::new_with_sierra_class_hash_and_tx_hash( - None, - Felt252::from_bytes_be_slice(tx.class_hash().0.bytes()), - Some(contract_class), - compiled_class_hash, - Address(Felt252::from_bytes_be_slice( - tx.sender_address().0.key().bytes(), - )), - // TODO[0.13] Properly convert between V3 tx fields - VersionSpecificAccountTxFields::new_deprecated(match tx { - starknet_api::transaction::DeclareTransaction::V0(ref tx) => tx.max_fee.0, - starknet_api::transaction::DeclareTransaction::V1(ref tx) => tx.max_fee.0, - starknet_api::transaction::DeclareTransaction::V2(ref tx) => tx.max_fee.0, - starknet_api::transaction::DeclareTransaction::V3(_) => { - return Err(TransactionError::UnsuportedV3Transaction) - } - }), - Felt252::from_bytes_be_slice(tx.version().0.bytes()), - tx.signature() - .0 - .iter() - .map(|f| Felt252::from_bytes_be_slice(f.bytes())) - .collect(), - Felt252::from_bytes_be_slice(tx.nonce().0.bytes()), - Felt252::from_bytes_be_slice(tx_hash.0.bytes()), - ) - .unwrap(); - declare.create_for_simulation(skip_validate, false, false, false, skip_nonce_check) - } + let declare = declare_tx_from_sn_api_transaction( + tx, + Felt252::from_bytes_be_slice(tx_hash.0.bytes()), + contract_class, + )?; + declare.create_for_simulation(skip_validate, false, false, false, skip_nonce_check) } SNTransaction::L1Handler(tx) => L1Handler::from_sn_api_tx( tx, diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index eec66545d..a9a519498 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -1,6 +1,7 @@ use super::fee::{calculate_tx_fee, charge_fee, check_fee_bounds}; use super::{ - check_account_tx_fields_version, get_tx_version, CurrentAccountTxFields, ResourceBounds, VersionSpecificAccountTxFields + check_account_tx_fields_version, get_tx_version, CurrentAccountTxFields, ResourceBounds, + VersionSpecificAccountTxFields, }; use super::{invoke_function::verify_no_calls_to_other_contracts, Transaction}; use crate::definitions::block_context::FeeType; @@ -593,18 +594,32 @@ impl DeployAccount { let account_tx_fields = match &value { starknet_api::transaction::DeployAccountTransaction::V1(tx) => { VersionSpecificAccountTxFields::Deprecated(tx.max_fee.0) - }, + } starknet_api::transaction::DeployAccountTransaction::V3(tx) => { VersionSpecificAccountTxFields::Current(CurrentAccountTxFields { - l1_resource_bounds: tx.resource_bounds.0.get(&Resource::L1Gas).map(|r| r.into()).unwrap_or_default(), - l2_resource_bounds: tx.resource_bounds.0.get(&Resource::L2Gas).map(|r| r.into()), + l1_resource_bounds: tx + .resource_bounds + .0 + .get(&Resource::L1Gas) + .map(|r| r.into()) + .unwrap_or_default(), + l2_resource_bounds: tx + .resource_bounds + .0 + .get(&Resource::L2Gas) + .map(|r| r.into()), tip: tx.tip.0, nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), fee_data_availability_mode: tx.fee_data_availability_mode.into(), - paymaster_data: tx.paymaster_data.0.iter().map(|f| Felt252::from_bytes_be_slice(f.bytes())).collect(), + paymaster_data: tx + .paymaster_data + .0 + .iter() + .map(|f| Felt252::from_bytes_be_slice(f.bytes())) + .collect(), account_deployment_data: Default::default(), }) - }, + } }; let version = Felt252::from_bytes_be_slice(value.version().0.bytes()); diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 2025642ce..f8d0de9ac 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -1,10 +1,12 @@ use crate::{ + core::contract_address::compute_casm_class_hash, definitions::block_context::BlockContext, definitions::{ block_context::FeeType, constants::{QUERY_VERSION_0, QUERY_VERSION_1, QUERY_VERSION_2}, }, execution::TransactionExecutionInfo, + services::api::contract_classes::compiled_class::CompiledClass, state::{ cached_state::CachedState, contract_class_cache::ContractClassCache, state_api::StateReader, }, @@ -28,6 +30,7 @@ pub mod invoke_function; pub mod l1_handler; use cairo_vm::Felt252; +use starknet_api::transaction::Resource; #[cfg(feature = "cairo-native")] use { @@ -206,6 +209,103 @@ fn check_account_tx_fields_version( } } +/// Creates a `Declare or DeclareV2` from a starknet api `DeclareTransaction`. +pub fn declare_tx_from_sn_api_transaction( + tx: starknet_api::transaction::DeclareTransaction, + tx_hash: Felt252, + contract_class: CompiledClass, +) -> Result { + let account_tx_fields = match &tx { + starknet_api::transaction::DeclareTransaction::V0(tx) => { + VersionSpecificAccountTxFields::Deprecated(tx.max_fee.0) + } + starknet_api::transaction::DeclareTransaction::V1(tx) => { + VersionSpecificAccountTxFields::Deprecated(tx.max_fee.0) + } + starknet_api::transaction::DeclareTransaction::V2(tx) => { + VersionSpecificAccountTxFields::Deprecated(tx.max_fee.0) + } + starknet_api::transaction::DeclareTransaction::V3(tx) => { + VersionSpecificAccountTxFields::Current(CurrentAccountTxFields { + l1_resource_bounds: tx + .resource_bounds + .0 + .get(&Resource::L1Gas) + .map(|r| r.into()) + .unwrap_or_default(), + l2_resource_bounds: tx.resource_bounds.0.get(&Resource::L2Gas).map(|r| r.into()), + tip: tx.tip.0, + nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), + fee_data_availability_mode: tx.fee_data_availability_mode.into(), + paymaster_data: tx + .paymaster_data + .0 + .iter() + .map(|f| Felt252::from_bytes_be_slice(f.bytes())) + .collect(), + account_deployment_data: tx + .account_deployment_data + .0 + .iter() + .map(|f| Felt252::from_bytes_be_slice(f.bytes())) + .collect(), + }) + } + }; + let sender_address = Address(Felt252::from_bytes_be_slice( + tx.sender_address().0.key().bytes(), + )); + let version = Felt252::from_bytes_be_slice(tx.version().0.bytes()); + let nonce = Felt252::from_bytes_be_slice(tx.nonce().0.bytes()); + + let signature = tx + .signature() + .0 + .iter() + .map(|f| Felt252::from_bytes_be_slice(f.bytes())) + .collect(); + + if version < Felt252::TWO { + // Create Declare tx + let contract_class = match contract_class { + CompiledClass::Deprecated(cc) => cc.as_ref().clone(), + _ => return Err(TransactionError::DeclareV2NoSierraOrCasm), + }; + + Declare::new_with_tx_hash( + contract_class, + sender_address, + account_tx_fields.max_fee(), + version, + signature, + nonce, + tx_hash, + ) + .map(|d| Transaction::Declare(d)) + } else { + let contract_class = match contract_class { + CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), + _ => return Err(TransactionError::DeclareV2NoSierraOrCasm), + }; + + let compiled_class_hash = compute_casm_class_hash(&contract_class).unwrap(); + + DeclareV2::new_with_sierra_class_hash_and_tx_hash( + None, + Felt252::from_bytes_be_slice(tx.class_hash().0.bytes()), + Some(contract_class), + compiled_class_hash, + sender_address, + account_tx_fields, + version, + signature, + nonce, + tx_hash, + ) + .map(|d| Transaction::DeclareV2(Box::new(d))) + } +} + #[derive(Clone, Debug, Default)] pub enum DataAvailabilityMode { #[default] From 2ffd1eded4ae30b444c778fd6fe2faf90e2f8e1d Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 29 Jan 2024 11:33:14 -0300 Subject: [PATCH 37/50] Remove error --- src/transaction/error.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/transaction/error.rs b/src/transaction/error.rs index 0e66b3edc..5adf764e7 100644 --- a/src/transaction/error.rs +++ b/src/transaction/error.rs @@ -162,8 +162,6 @@ pub enum TransactionError { MaxL1GasPriceTooLow(u128, u128), #[error("Max fee ({0}) exceeds balance (Uint256({1}, {2})).")] MaxFeeExceedsBalance(u128, Felt252, Felt252), - #[error("V3 Transactions not Supported Yet")] - UnsuportedV3Transaction, #[error("V3 Transactions can't be created with deprecated account tx fields")] DeprecatedAccountTxFieldsVInV3TX, #[error("Non V3 Transactions can't be created with non deprecated account tx fields")] From 9097246258f63c768330741f00b22eef54c0c4cb Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 29 Jan 2024 13:14:01 -0300 Subject: [PATCH 38/50] Clippy --- src/transaction/mod.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index f8d0de9ac..b8005257a 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -281,7 +281,7 @@ pub fn declare_tx_from_sn_api_transaction( nonce, tx_hash, ) - .map(|d| Transaction::Declare(d)) + .map(Transaction::Declare) } else { let contract_class = match contract_class { CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), @@ -313,9 +313,9 @@ pub enum DataAvailabilityMode { L2, } -impl Into for DataAvailabilityMode { - fn into(self) -> starknet_api::data_availability::DataAvailabilityMode { - match self { +impl From for starknet_api::data_availability::DataAvailabilityMode { + fn from(val: DataAvailabilityMode) -> Self { + match val { DataAvailabilityMode::L1 => starknet_api::data_availability::DataAvailabilityMode::L1, DataAvailabilityMode::L2 => starknet_api::data_availability::DataAvailabilityMode::L2, } From d788483ee2fee62d7e65141290adc11b3da39bda Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 31 Jan 2024 15:16:44 -0300 Subject: [PATCH 39/50] Add V3 deser --- rpc_state_reader/src/utils.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/rpc_state_reader/src/utils.rs b/rpc_state_reader/src/utils.rs index ca7f3fadf..ced0663bb 100644 --- a/rpc_state_reader/src/utils.rs +++ b/rpc_state_reader/src/utils.rs @@ -78,13 +78,24 @@ pub fn deserialize_transaction_json( "0x1" => Ok(Transaction::Invoke(InvokeTransaction::V1( serde_json::from_value(transaction)?, ))), + "0x3" => Ok(Transaction::Invoke(InvokeTransaction::V3( + serde_json::from_value(transaction)?, + ))), x => Err(serde::de::Error::custom(format!( "unimplemented invoke version: {x}" ))), }, - "DEPLOY_ACCOUNT" => Ok(Transaction::DeployAccount(DeployAccountTransaction::V1( - serde_json::from_value(transaction)?, - ))), + "DEPLOY_ACCOUNT" => match tx_version.as_str() { + "0x1" => Ok(Transaction::DeployAccount(DeployAccountTransaction::V1( + serde_json::from_value(transaction)?, + ))), + "0x3" => Ok(Transaction::DeployAccount(DeployAccountTransaction::V3( + serde_json::from_value(transaction)?, + ))), + x => Err(serde::de::Error::custom(format!( + "unimplemented declare version: {x}" + ))), + }, "DECLARE" => match tx_version.as_str() { "0x0" => Ok(Transaction::Declare(DeclareTransaction::V0( serde_json::from_value(transaction)?, @@ -95,6 +106,9 @@ pub fn deserialize_transaction_json( "0x2" => Ok(Transaction::Declare(DeclareTransaction::V2( serde_json::from_value(transaction)?, ))), + "0x3" => Ok(Transaction::Declare(DeclareTransaction::V3( + serde_json::from_value(transaction)?, + ))), x => Err(serde::de::Error::custom(format!( "unimplemented declare version: {x}" ))), From 1060feaf63f3963580ce15e51d4173d0592cce60 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 2 Feb 2024 13:31:11 -0300 Subject: [PATCH 40/50] Rename Declare to DeclareDeprecated --- bench/internals.rs | 4 ++-- examples/lru_cache/main.rs | 4 ++-- src/lib.rs | 12 ++++++------ src/transaction/declare.rs | 30 +++++++++++++++--------------- src/transaction/mod.rs | 18 +++++++++--------- tests/internals.rs | 6 +++--- 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/bench/internals.rs b/bench/internals.rs index 7d139fd91..14617d393 100644 --- a/bench/internals.rs +++ b/bench/internals.rs @@ -19,7 +19,7 @@ use starknet_in_rust::{ contract_class_cache::PermanentContractClassCache, in_memory_state_reader::InMemoryStateReader, }, - transaction::{declare::Declare, Deploy, DeployAccount, InvokeFunction}, + transaction::{DeclareDeprecated, Deploy, DeployAccount, InvokeFunction}, utils::{Address, ClassHash}, }; use std::{hint::black_box, sync::Arc}; @@ -142,7 +142,7 @@ pub fn declare( let address = CONTRACT_ADDRESS.clone(); scope(|| { // new consumes more execution time than raw struct instantiation - let declare_tx = Declare::new( + let declare_tx = DeclareDeprecated::new( class, StarknetChainId::TestNet.to_felt(), address, diff --git a/examples/lru_cache/main.rs b/examples/lru_cache/main.rs index 5e0912285..b928aa750 100644 --- a/examples/lru_cache/main.rs +++ b/examples/lru_cache/main.rs @@ -12,7 +12,7 @@ use starknet_in_rust::{ contract_class_cache::{ContractClassCache, PermanentContractClassCache}, in_memory_state_reader::InMemoryStateReader, }, - transaction::{Declare, Deploy, InvokeFunction}, + transaction::{DeclareDeprecated, Deploy, InvokeFunction}, utils::{calculate_sn_keccak, Address, ClassHash}, }; use std::{ @@ -53,7 +53,7 @@ fn run_contract( let contract_class = ContractClass::from_path(contract_path.as_ref()).unwrap(); - let declare_tx = Declare::new( + let declare_tx = DeclareDeprecated::new( contract_class.clone(), chain_id, sender_address, diff --git a/src/lib.rs b/src/lib.rs index 34245d0c1..c67b53ce1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -273,8 +273,8 @@ mod test { ExecutionResourcesManager, }, transaction::{ - Declare, DeclareV2, Deploy, DeployAccount, InvokeFunction, L1Handler, Transaction, - VersionSpecificAccountTxFields, + DeclareDeprecated, DeclareV2, Deploy, DeployAccount, InvokeFunction, L1Handler, + Transaction, VersionSpecificAccountTxFields, }, utils::{ felt_to_hash, @@ -824,8 +824,8 @@ mod test { let class = CONTRACT_CLASS.clone(); let address = CONTRACT_ADDRESS.clone(); // new consumes more execution time than raw struct instantiation - let declare_tx = Transaction::Declare( - Declare::new( + let declare_tx = Transaction::DeclareDeprecated( + DeclareDeprecated::new( class, StarknetChainId::TestNet.to_felt(), address, @@ -1255,7 +1255,7 @@ mod test { // declare tx // Signature & tx hash values are hand-picked for account validations to pass let mut declare = - Declare::new( + DeclareDeprecated::new( fib_contract_class, chain_id, Address(Felt252::ONE), @@ -1277,7 +1277,7 @@ mod test { let mut block_context = BlockContext::default(); block_context.starknet_os_config_mut().gas_price = GasPrices::new(12, 0); - let declare_tx = Transaction::Declare(declare); + let declare_tx = Transaction::DeclareDeprecated(declare); let without_validate_fee = simulate_transaction( &[&declare_tx], diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index fe76a5c1c..eae74e8b5 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -42,7 +42,7 @@ use { /// Represents an internal transaction in the StarkNet network that is a declaration of a Cairo /// contract class. #[derive(Debug, Clone)] -pub struct Declare { +pub struct DeclareDeprecated { pub class_hash: ClassHash, pub sender_address: Address, pub validate_entry_point_selector: Felt252, @@ -61,7 +61,7 @@ pub struct Declare { // ------------------------------------------------------------ // Functions // ------------------------------------------------------------ -impl Declare { +impl DeclareDeprecated { #[allow(clippy::too_many_arguments)] /// Constructor creates a new Declare instance. pub fn new( @@ -88,7 +88,7 @@ impl Declare { let validate_entry_point_selector = *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; - let internal_declare = Declare { + let internal_declare = DeclareDeprecated { class_hash, sender_address, validate_entry_point_selector, @@ -125,7 +125,7 @@ impl Declare { let validate_entry_point_selector = *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; - let internal_declare = Declare { + let internal_declare = DeclareDeprecated { class_hash, sender_address, validate_entry_point_selector, @@ -158,7 +158,7 @@ impl Declare { let version = get_tx_version(version); let validate_entry_point_selector = *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; - let internal_declare = Declare { + let internal_declare = DeclareDeprecated { class_hash, sender_address, validate_entry_point_selector, @@ -429,7 +429,7 @@ impl Declare { ignore_max_fee: bool, skip_nonce_check: bool, ) -> Transaction { - let tx = Declare { + let tx = DeclareDeprecated { skip_validate, skip_execute, skip_fee_transfer, @@ -443,7 +443,7 @@ impl Declare { ..self.clone() }; - Transaction::Declare(tx) + Transaction::DeclareDeprecated(tx) } } @@ -517,7 +517,7 @@ mod tests { let chain_id = StarknetChainId::TestNet.to_felt(); // declare tx - let internal_declare = Declare::new( + let internal_declare = DeclareDeprecated::new( fib_contract_class, chain_id, Address(Felt252::ONE), @@ -637,7 +637,7 @@ mod tests { let chain_id = StarknetChainId::TestNet.to_felt(); // Declare same class twice - let internal_declare = Declare::new( + let internal_declare = DeclareDeprecated::new( fib_contract_class.clone(), chain_id, Address(Felt252::ONE), @@ -648,7 +648,7 @@ mod tests { ) .unwrap(); - let second_internal_declare = Declare::new( + let second_internal_declare = DeclareDeprecated::new( fib_contract_class, chain_id, Address(Felt252::ONE), @@ -727,7 +727,7 @@ mod tests { let chain_id = StarknetChainId::TestNet.to_felt(); // Declare same class twice - let internal_declare = Declare::new( + let internal_declare = DeclareDeprecated::new( fib_contract_class, chain_id, Address(Felt252::ONE), @@ -781,7 +781,7 @@ mod tests { let chain_id = StarknetChainId::TestNet.to_felt(); - let internal_declare = Declare::new( + let internal_declare = DeclareDeprecated::new( fib_contract_class, chain_id, Address(Felt252::ONE), @@ -851,7 +851,7 @@ mod tests { let chain_id = StarknetChainId::TestNet.to_felt(); // Use non-zero value so that the actual fee calculation is done - let internal_declare = Declare::new( + let internal_declare = DeclareDeprecated::new( fib_contract_class, chain_id, Address(Felt252::ONE), @@ -935,7 +935,7 @@ mod tests { // declare tx // Signature & tx hash values are hand-picked for account validations to pass let mut declare = - Declare::new( + DeclareDeprecated::new( fib_contract_class, chain_id, Address(Felt252::ONE), @@ -996,7 +996,7 @@ mod tests { let chain_id = StarknetChainId::TestNet.to_felt(); // declare tx - let internal_declare = Declare::new( + let internal_declare = DeclareDeprecated::new( fib_contract_class, chain_id, Address(Felt252::ONE), diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index e19e653dc..b2e5812cd 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -12,7 +12,7 @@ use crate::{ }, utils::Address, }; -pub use declare::Declare; +pub use declare::DeclareDeprecated; pub use declare_v2::DeclareV2; pub use deploy::Deploy; pub use deploy_account::DeployAccount; @@ -42,15 +42,15 @@ use { /// Represents a transaction inside the starknet network. /// The transaction are actions that may modified the state of the network. /// it can be one of: +/// - DeclareDeprecated /// - Declare -/// - DeclareV2 /// - Deploy /// - DeployAccount /// - InvokeFunction /// - L1Handler pub enum Transaction { - /// A declare transaction. - Declare(Declare), + /// A deprecated declare transaction. + DeclareDeprecated(DeclareDeprecated), /// A declare transaction. DeclareV2(Box), /// A deploy transaction. @@ -69,7 +69,7 @@ impl Transaction { match self { Transaction::Deploy(tx) => tx.contract_address.clone(), Transaction::InvokeFunction(tx) => tx.contract_address().clone(), - Transaction::Declare(tx) => tx.sender_address.clone(), + Transaction::DeclareDeprecated(tx) => tx.sender_address.clone(), Transaction::DeclareV2(tx) => tx.sender_address.clone(), Transaction::DeployAccount(tx) => tx.contract_address().clone(), Transaction::L1Handler(tx) => tx.contract_address().clone(), @@ -91,7 +91,7 @@ impl Transaction { >, ) -> Result { match self { - Transaction::Declare(tx) => tx.execute( + Transaction::DeclareDeprecated(tx) => tx.execute( state, block_context, #[cfg(feature = "cairo-native")] @@ -146,7 +146,7 @@ impl Transaction { skip_nonce_check: bool, ) -> Self { match self { - Transaction::Declare(tx) => tx.create_for_simulation( + Transaction::DeclareDeprecated(tx) => tx.create_for_simulation( skip_validate, skip_execute, skip_fee_transfer, @@ -273,7 +273,7 @@ pub fn declare_tx_from_sn_api_transaction( _ => return Err(TransactionError::DeclareV2NoSierraOrCasm), }; - Declare::new_with_tx_hash( + DeclareDeprecated::new_with_tx_hash( contract_class, sender_address, account_tx_fields.max_fee(), @@ -282,7 +282,7 @@ pub fn declare_tx_from_sn_api_transaction( nonce, tx_hash, ) - .map(Transaction::Declare) + .map(Transaction::DeclareDeprecated) } else { let contract_class = match contract_class { CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), diff --git a/tests/internals.rs b/tests/internals.rs index 3e79c9739..c3f9a92bb 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -58,7 +58,7 @@ use starknet_in_rust::{ BlockInfo, }, transaction::{ - error::TransactionError, invoke_function::InvokeFunction, Declare, DeployAccount, + error::TransactionError, invoke_function::InvokeFunction, DeclareDeprecated, DeployAccount, }, utils::{calculate_sn_keccak, felt_to_hash, Address, ClassHash}, }; @@ -762,8 +762,8 @@ fn expected_fib_fee_transfer_info(fee: u128) -> CallInfo { } } -fn declare_tx() -> Declare { - Declare { +fn declare_tx() -> DeclareDeprecated { + DeclareDeprecated { contract_class: ContractClass::from_path(TEST_EMPTY_CONTRACT_PATH).unwrap(), class_hash: *TEST_EMPTY_CONTRACT_CLASS_HASH, sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), From f89067ca989e01fda9c4cb5c66c8104956f471aa Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 2 Feb 2024 13:38:02 -0300 Subject: [PATCH 41/50] Rename module --- src/transaction/{declare.rs => declare_deprecated.rs} | 0 src/transaction/mod.rs | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/transaction/{declare.rs => declare_deprecated.rs} (100%) diff --git a/src/transaction/declare.rs b/src/transaction/declare_deprecated.rs similarity index 100% rename from src/transaction/declare.rs rename to src/transaction/declare_deprecated.rs diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index b2e5812cd..9adbdb3f5 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -12,7 +12,7 @@ use crate::{ }, utils::Address, }; -pub use declare::DeclareDeprecated; +pub use declare_deprecated::DeclareDeprecated; pub use declare_v2::DeclareV2; pub use deploy::Deploy; pub use deploy_account::DeployAccount; @@ -20,7 +20,7 @@ use error::TransactionError; pub use invoke_function::InvokeFunction; pub use l1_handler::L1Handler; -pub mod declare; +pub mod declare_deprecated; pub mod declare_v2; pub mod deploy; pub mod deploy_account; From 21ab314df39edde1707940622887f59db104e601 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 2 Feb 2024 13:40:00 -0300 Subject: [PATCH 42/50] Rename DeclareV2 to Declare --- src/lib.rs | 10 +++++----- src/transaction/declare_v2.rs | 36 +++++++++++++++++------------------ src/transaction/error.rs | 4 ++-- src/transaction/mod.rs | 20 +++++++++---------- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index c67b53ce1..e834a0661 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -273,7 +273,7 @@ mod test { ExecutionResourcesManager, }, transaction::{ - DeclareDeprecated, DeclareV2, Deploy, DeployAccount, InvokeFunction, L1Handler, + Declare, DeclareDeprecated, Deploy, DeployAccount, InvokeFunction, L1Handler, Transaction, VersionSpecificAccountTxFields, }, utils::{ @@ -977,14 +977,14 @@ mod test { .unwrap(); } - fn declarev2_tx() -> DeclareV2 { + fn declarev2_tx() -> Declare { let program_data = include_bytes!("../starknet_programs/cairo1/fibonacci.sierra"); let sierra_contract_class: SierraContractClass = serde_json::from_slice(program_data).unwrap(); let sierra_class_hash = compute_sierra_class_hash(&sierra_contract_class).unwrap(); - DeclareV2 { + Declare { sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), validate_entry_point_selector: *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR, version: 2.into(), @@ -1006,7 +1006,7 @@ mod test { #[test] fn test_simulate_declare_v2() { let (block_context, state) = create_account_tx_test_state().unwrap(); - let declare_tx = Transaction::DeclareV2(Box::new(declarev2_tx())); + let declare_tx = Transaction::Declare(Box::new(declarev2_tx())); simulate_transaction( &[&declare_tx], @@ -1173,7 +1173,7 @@ mod test { let real_casm_class_hash = declare_v2.compiled_class_hash; let wrong_casm_class_hash = Felt252::from(1); declare_v2.compiled_class_hash = wrong_casm_class_hash; - let declare_tx = Transaction::DeclareV2(Box::new(declare_v2)); + let declare_tx = Transaction::Declare(Box::new(declare_v2)); let err = declare_tx .execute( diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index f51db5ff1..a64388ba4 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -43,9 +43,9 @@ use { /// Represents a declare transaction in the starknet network. /// Declare creates a blueprint of a contract class that is used to deploy instances of the contract -/// DeclareV2 is meant to be used with the new cairo contract sintax, starting from Cairo1. +/// Declare is meant to be used with the new cairo contract sintax, starting from Cairo1. #[derive(Debug, Clone)] -pub struct DeclareV2 { +pub struct Declare { pub sender_address: Address, pub validate_entry_point_selector: Felt252, pub version: Felt252, @@ -64,8 +64,8 @@ pub struct DeclareV2 { pub skip_nonce_check: bool, } -impl DeclareV2 { - /// Creates a new instance of a [DeclareV2]. +impl Declare { + /// Creates a new instance of a [Declare]. /// It will calculate the sierra class hash and the transaction hash. /// ## Parameters: /// - sierra_contract_class: The sierra contract class of the contract to declare @@ -146,7 +146,7 @@ impl DeclareV2 { check_account_tx_fields_version(&account_tx_fields, version)?; let validate_entry_point_selector = *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; - let internal_declare = DeclareV2 { + let internal_declare = Declare { sierra_contract_class: sierra_contract_class.to_owned(), sierra_class_hash, sender_address, @@ -206,7 +206,7 @@ impl DeclareV2 { ) } - /// Creates a new instance of a [DeclareV2] but without the computation of the sierra class hash. + /// Creates a new instance of a [Declare] but without the computation of the sierra class hash. /// ## Parameters: /// - sierra_contract_class: The sierra contract class of the contract to declare /// - sierra_class_hash: The precomputed hash for the sierra contract @@ -349,7 +349,7 @@ impl DeclareV2 { ) -> Result { if !(self.version == Felt252::TWO || self.version == Felt252::THREE) { return Err(TransactionError::UnsupportedTxVersion( - "DeclareV2".to_string(), + "Declare".to_string(), self.version, vec![2, 3], )); @@ -440,7 +440,7 @@ impl DeclareV2 { None => CasmContractClass::from_contract_class( self.sierra_contract_class .clone() - .ok_or(TransactionError::DeclareV2NoSierraOrCasm)?, + .ok_or(TransactionError::DeclareNoSierraOrCasm)?, true, ) .map_err(|e| TransactionError::SierraCompileError(e.to_string()))?, @@ -566,7 +566,7 @@ impl DeclareV2 { ignore_max_fee: bool, skip_nonce_check: bool, ) -> Transaction { - let tx = DeclareV2 { + let tx = Declare { skip_validate, skip_execute, skip_fee_transfer, @@ -588,13 +588,13 @@ impl DeclareV2 { ..self.clone() }; - Transaction::DeclareV2(Box::new(tx)) + Transaction::Declare(Box::new(tx)) } } #[cfg(test)] mod tests { - use super::DeclareV2; + use super::Declare; use crate::core::contract_address::{compute_casm_class_hash, compute_sierra_class_hash}; use crate::definitions::block_context::{BlockContext, StarknetChainId}; use crate::definitions::constants::QUERY_VERSION_2; @@ -642,7 +642,7 @@ mod tests { // create internal declare v2 - let internal_declare = DeclareV2::new_with_tx_hash( + let internal_declare = Declare::new_with_tx_hash( &sierra_contract_class, None, casm_class_hash, @@ -712,7 +712,7 @@ mod tests { // create internal declare v2 - let internal_declare = DeclareV2::new_with_tx_hash( + let internal_declare = Declare::new_with_tx_hash( &sierra_contract_class, Some(casm_class), casm_class_hash, @@ -783,7 +783,7 @@ mod tests { // create internal declare v2 - let internal_declare = DeclareV2::new_with_sierra_class_hash_and_tx_hash( + let internal_declare = Declare::new_with_sierra_class_hash_and_tx_hash( Some(sierra_contract_class), sierra_class_hash, Some(casm_class), @@ -854,7 +854,7 @@ mod tests { // create internal declare v2 - let internal_declare = DeclareV2::new_with_tx_hash( + let internal_declare = Declare::new_with_tx_hash( &sierra_contract_class, None, casm_class_hash, @@ -925,7 +925,7 @@ mod tests { let sended_class_hash = Felt252::from(5); // create internal declare v2 - let internal_declare = DeclareV2::new_with_tx_hash( + let internal_declare = Declare::new_with_tx_hash( &sierra_contract_class, None, sended_class_hash, @@ -977,7 +977,7 @@ mod tests { let chain_id = StarknetChainId::TestNet.to_felt(); // declare tx - let internal_declare = DeclareV2::new( + let internal_declare = Declare::new( &sierra_contract_class, None, Felt252::ONE, @@ -999,6 +999,6 @@ mod tests { assert_matches!( result, Err(TransactionError::UnsupportedTxVersion(tx, ver, supp)) - if tx == "DeclareV2" && ver == 1.into() && supp == vec![2, 3]); + if tx == "Declare" && ver == 1.into() && supp == vec![2, 3]); } } diff --git a/src/transaction/error.rs b/src/transaction/error.rs index ca149ff45..95bea2adb 100644 --- a/src/transaction/error.rs +++ b/src/transaction/error.rs @@ -148,8 +148,8 @@ pub enum TransactionError { InvalidCompiledClassHash(String, String), #[error(transparent)] FromByteArrayError(#[from] FromByteArrayError), - #[error("DeclareV2 transaction has neither Sierra nor Casm contract class set")] - DeclareV2NoSierraOrCasm, + #[error("Declare transaction has neither Sierra nor Casm contract class set")] + DeclareNoSierraOrCasm, #[error("Unsupported {0} transaction version: {1}. Supported versions:{2:?}")] UnsupportedTxVersion(String, Felt252, Vec), #[error("The `validate` entry point should return `VALID`.")] diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 9adbdb3f5..1f48525b0 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -13,7 +13,7 @@ use crate::{ utils::Address, }; pub use declare_deprecated::DeclareDeprecated; -pub use declare_v2::DeclareV2; +pub use declare_v2::Declare; pub use deploy::Deploy; pub use deploy_account::DeployAccount; use error::TransactionError; @@ -52,7 +52,7 @@ pub enum Transaction { /// A deprecated declare transaction. DeclareDeprecated(DeclareDeprecated), /// A declare transaction. - DeclareV2(Box), + Declare(Box), /// A deploy transaction. Deploy(Deploy), /// A deploy account transaction. @@ -70,7 +70,7 @@ impl Transaction { Transaction::Deploy(tx) => tx.contract_address.clone(), Transaction::InvokeFunction(tx) => tx.contract_address().clone(), Transaction::DeclareDeprecated(tx) => tx.sender_address.clone(), - Transaction::DeclareV2(tx) => tx.sender_address.clone(), + Transaction::Declare(tx) => tx.sender_address.clone(), Transaction::DeployAccount(tx) => tx.contract_address().clone(), Transaction::L1Handler(tx) => tx.contract_address().clone(), } @@ -97,7 +97,7 @@ impl Transaction { #[cfg(feature = "cairo-native")] program_cache, ), - Transaction::DeclareV2(tx) => tx.execute( + Transaction::Declare(tx) => tx.execute( state, block_context, #[cfg(feature = "cairo-native")] @@ -153,7 +153,7 @@ impl Transaction { ignore_max_fee, skip_nonce_check, ), - Transaction::DeclareV2(tx) => tx.create_for_simulation( + Transaction::Declare(tx) => tx.create_for_simulation( skip_validate, skip_execute, skip_fee_transfer, @@ -210,7 +210,7 @@ fn check_account_tx_fields_version( } } -/// Creates a `Declare or DeclareV2` from a starknet api `DeclareTransaction`. +/// Creates a `Declare or Declare` from a starknet api `DeclareTransaction`. pub fn declare_tx_from_sn_api_transaction( tx: starknet_api::transaction::DeclareTransaction, tx_hash: Felt252, @@ -270,7 +270,7 @@ pub fn declare_tx_from_sn_api_transaction( // Create Declare tx let contract_class = match contract_class { CompiledClass::Deprecated(cc) => cc.as_ref().clone(), - _ => return Err(TransactionError::DeclareV2NoSierraOrCasm), + _ => return Err(TransactionError::DeclareNoSierraOrCasm), }; DeclareDeprecated::new_with_tx_hash( @@ -286,12 +286,12 @@ pub fn declare_tx_from_sn_api_transaction( } else { let contract_class = match contract_class { CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), - _ => return Err(TransactionError::DeclareV2NoSierraOrCasm), + _ => return Err(TransactionError::DeclareNoSierraOrCasm), }; let compiled_class_hash = compute_casm_class_hash(&contract_class).unwrap(); - DeclareV2::new_with_sierra_class_hash_and_tx_hash( + Declare::new_with_sierra_class_hash_and_tx_hash( None, Felt252::from_bytes_be_slice(tx.class_hash().0.bytes()), Some(contract_class), @@ -303,7 +303,7 @@ pub fn declare_tx_from_sn_api_transaction( nonce, tx_hash, ) - .map(|d| Transaction::DeclareV2(Box::new(d))) + .map(|d| Transaction::Declare(Box::new(d))) } } From 19a09504288dc70a82e5895d9397b0b4e2409150 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 2 Feb 2024 13:40:20 -0300 Subject: [PATCH 43/50] Rename module --- src/transaction/{declare_v2.rs => declare.rs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/transaction/{declare_v2.rs => declare.rs} (100%) diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare.rs similarity index 100% rename from src/transaction/declare_v2.rs rename to src/transaction/declare.rs From e1d7fe638cfb71b6a95df6f325371f2a58aada36 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 2 Feb 2024 13:45:23 -0300 Subject: [PATCH 44/50] Push --- bench/yas.rs | 10 +++++----- examples/contract_execution/src/main.rs | 4 ++-- src/transaction/mod.rs | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bench/yas.rs b/bench/yas.rs index c6676c016..f997de88e 100644 --- a/bench/yas.rs +++ b/bench/yas.rs @@ -23,7 +23,7 @@ use starknet_in_rust::{ state::{ cached_state::CachedState, contract_class_cache::ContractClassCache, state_api::StateReader, }, - transaction::{DeclareV2, InvokeFunction}, + transaction::{Declare, InvokeFunction}, utils::Address, }; use std::time::{Duration, Instant}; @@ -369,7 +369,7 @@ where let sender_address = Address(*ACCOUNT_ADDRESS); let nonce = state.get_nonce_at(&sender_address).unwrap(); - let tx_execution_info = DeclareV2::new( + let tx_execution_info = Declare::new( &sierra_contract_class, Some(casm_contract_class), casm_class_hash, @@ -410,7 +410,7 @@ where let sender_address = Address(*ACCOUNT_ADDRESS); let nonce = state.get_nonce_at(&sender_address).unwrap(); - let tx_execution_info = DeclareV2::new( + let tx_execution_info = Declare::new( &sierra_contract_class, Some(casm_contract_class), casm_class_hash, @@ -451,7 +451,7 @@ where let sender_address = Address(*ACCOUNT_ADDRESS); let nonce = state.get_nonce_at(&sender_address).unwrap(); - let tx_execution_info = DeclareV2::new( + let tx_execution_info = Declare::new( &sierra_contract_class, Some(casm_contract_class), casm_class_hash, @@ -492,7 +492,7 @@ where let sender_address = Address(*ACCOUNT_ADDRESS); let nonce = state.get_nonce_at(&sender_address).unwrap(); - let tx_execution_info = DeclareV2::new( + let tx_execution_info = Declare::new( &sierra_contract_class, Some(casm_contract_class), casm_class_hash, diff --git a/examples/contract_execution/src/main.rs b/examples/contract_execution/src/main.rs index ee7c2b1f1..48bde523a 100644 --- a/examples/contract_execution/src/main.rs +++ b/examples/contract_execution/src/main.rs @@ -20,7 +20,7 @@ use starknet_in_rust::{ cached_state::CachedState, contract_class_cache::PermanentContractClassCache, in_memory_state_reader::InMemoryStateReader, state_api::State, }, - transaction::{DeclareV2, DeployAccount, InvokeFunction}, + transaction::{Declare, DeployAccount, InvokeFunction}, utils::{calculate_sn_keccak, felt_to_hash, Address}, CasmContractClass, SierraContractClass, }; @@ -159,7 +159,7 @@ fn test_contract( //* -------------------------------------------- //* Declare new contract class //* -------------------------------------------- - let declare_tx = DeclareV2::new_with_tx_hash( + let declare_tx = Declare::new_with_tx_hash( &sierra_contract_class, Some(casm_class), compiled_class_hash, diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 1f48525b0..c5aa57c38 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -12,16 +12,16 @@ use crate::{ }, utils::Address, }; +pub use declare::Declare; pub use declare_deprecated::DeclareDeprecated; -pub use declare_v2::Declare; pub use deploy::Deploy; pub use deploy_account::DeployAccount; use error::TransactionError; pub use invoke_function::InvokeFunction; pub use l1_handler::L1Handler; +pub mod declare; pub mod declare_deprecated; -pub mod declare_v2; pub mod deploy; pub mod deploy_account; pub mod error; From 43b00b67bc7a8955a694a049f8b0111b65242737 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 2 Feb 2024 13:51:00 -0300 Subject: [PATCH 45/50] Rename tx hash calculation fns --- src/core/transaction_hash/current.rs | 2 +- src/core/transaction_hash/deprecated.rs | 13 +++++-------- src/core/transaction_hash/mod.rs | 6 +++--- src/transaction/declare.rs | 6 +++--- src/transaction/declare_deprecated.rs | 4 ++-- 5 files changed, 14 insertions(+), 17 deletions(-) diff --git a/src/core/transaction_hash/current.rs b/src/core/transaction_hash/current.rs index 839d96d32..89a6ae7d2 100644 --- a/src/core/transaction_hash/current.rs +++ b/src/core/transaction_hash/current.rs @@ -166,7 +166,7 @@ pub(super) fn calculate_deploy_account_transaction_hash( } #[allow(clippy::too_many_arguments)] -pub(super) fn calculate_declare_v2_transaction_hash( +pub(super) fn calculate_declare_transaction_hash( sierra_class_hash: Felt252, compiled_class_hash: Felt252, chain_id: Felt252, diff --git a/src/core/transaction_hash/deprecated.rs b/src/core/transaction_hash/deprecated.rs index 843e7fa05..f941be021 100644 --- a/src/core/transaction_hash/deprecated.rs +++ b/src/core/transaction_hash/deprecated.rs @@ -101,8 +101,8 @@ pub(super) fn deprecated_calculate_deploy_account_transaction_hash( ) } -/// Calculate the hash for a declared transaction. -pub fn deprecated_calculate_declare_transaction_hash( +/// Calculate the hash for a deprecated declare transaction. +pub fn calculate_declare_deprecated_transaction_hash( contract_class: &ContractClass, chain_id: Felt252, sender_address: &Address, @@ -185,11 +185,8 @@ fn preprocess_invoke_function_fields( } } -// ---------------------------- -// V2 Hash Functions -// ---------------------------- - -pub(super) fn deprecated_calculate_declare_v2_transaction_hash( +/// Calculate the hash for a declare transaction. +pub(super) fn deprecated_calculate_declare_transaction_hash( sierra_class_hash: Felt252, compiled_class_hash: Felt252, chain_id: Felt252, @@ -255,7 +252,7 @@ mod tests { } #[test] - fn calculate_declare_hash_test() { + fn calculate_declare_deprecated_hash_test() { let chain_id = StarknetChainId::MainNet; let sender_address = Address( Felt252::from_dec_str( diff --git a/src/core/transaction_hash/mod.rs b/src/core/transaction_hash/mod.rs index 0919f6b67..8a8e79bc2 100644 --- a/src/core/transaction_hash/mod.rs +++ b/src/core/transaction_hash/mod.rs @@ -92,7 +92,7 @@ pub fn calculate_deploy_account_transaction_hash( /// Calculate the hash for a Declare transaction of version 2+. /// Uses the older pedersen version for deprecated account tx fields and the newer poseidon version for current account tx fields -pub fn calculate_declare_v2_transaction_hash( +pub fn calculate_declare_transaction_hash( sierra_class_hash: Felt252, compiled_class_hash: Felt252, version: Felt252, @@ -103,7 +103,7 @@ pub fn calculate_declare_v2_transaction_hash( ) -> Result { match account_tx_fields { VersionSpecificAccountTxFields::Deprecated(max_fee) => { - deprecated::deprecated_calculate_declare_v2_transaction_hash( + deprecated::deprecated_calculate_declare_transaction_hash( sierra_class_hash, compiled_class_hash, chain_id, @@ -114,7 +114,7 @@ pub fn calculate_declare_v2_transaction_hash( ) } VersionSpecificAccountTxFields::Current(fields) => { - Ok(current::calculate_declare_v2_transaction_hash( + Ok(current::calculate_declare_transaction_hash( sierra_class_hash, compiled_class_hash, chain_id, diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index a64388ba4..73d28d947 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -13,7 +13,7 @@ use crate::state::cached_state::CachedState; use crate::state::contract_class_cache::ContractClassCache; use crate::utils::ClassHash; use crate::{ - core::transaction_hash::calculate_declare_v2_transaction_hash, + core::transaction_hash::calculate_declare_transaction_hash, definitions::{ block_context::BlockContext, constants::{INITIAL_GAS_COST, VALIDATE_DECLARE_ENTRY_POINT_SELECTOR}, @@ -91,7 +91,7 @@ impl Declare { ) -> Result { let sierra_class_hash = compute_sierra_class_hash(sierra_contract_class)?; - let hash_value = calculate_declare_v2_transaction_hash( + let hash_value = calculate_declare_transaction_hash( sierra_class_hash, compiled_class_hash, version, @@ -231,7 +231,7 @@ impl Declare { signature: Vec, nonce: Felt252, ) -> Result { - let hash_value = calculate_declare_v2_transaction_hash( + let hash_value = calculate_declare_transaction_hash( sierra_class_hash, compiled_class_hash, version, diff --git a/src/transaction/declare_deprecated.rs b/src/transaction/declare_deprecated.rs index eae74e8b5..99a583031 100644 --- a/src/transaction/declare_deprecated.rs +++ b/src/transaction/declare_deprecated.rs @@ -1,5 +1,5 @@ use crate::core::contract_address::compute_deprecated_class_hash; -use crate::core::transaction_hash::deprecated::deprecated_calculate_declare_transaction_hash; +use crate::core::transaction_hash::deprecated::calculate_declare_deprecated_transaction_hash; use crate::definitions::block_context::{BlockContext, FeeType}; use crate::definitions::constants::VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; use crate::definitions::transaction_type::TransactionType; @@ -77,7 +77,7 @@ impl DeclareDeprecated { let hash = compute_deprecated_class_hash(&contract_class)?; let class_hash = felt_to_hash(&hash); - let hash_value = deprecated_calculate_declare_transaction_hash( + let hash_value = calculate_declare_deprecated_transaction_hash( &contract_class, chain_id, &sender_address, From 2d7fa5ac53054ba877294b84b9aa93924760b483 Mon Sep 17 00:00:00 2001 From: Federica Date: Fri, 2 Feb 2024 13:55:47 -0300 Subject: [PATCH 46/50] Fixes --- cli/src/main.rs | 4 ++-- tests/internals.rs | 6 +++--- tests/yas_bench_test.rs | 10 +++++----- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cli/src/main.rs b/cli/src/main.rs index ba625c0f3..10d15e5b7 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -8,7 +8,7 @@ use starknet_in_rust::{ errors::{contract_address_errors::ContractAddressError, state_errors::StateError}, transaction_hash::{ deprecated::{ - deprecated_calculate_declare_transaction_hash, + calculate_declare_deprecated_transaction_hash, deprecated_calculate_deploy_transaction_hash, deprecated_calculate_transaction_hash_common, }, @@ -122,7 +122,7 @@ fn declare_parser( &CompiledClass::Deprecated(Arc::new(contract_class.clone())), )?; - let tx_hash = deprecated_calculate_declare_transaction_hash( + let tx_hash = calculate_declare_deprecated_transaction_hash( &contract_class, Felt252::ZERO, &Address(0.into()), diff --git a/tests/internals.rs b/tests/internals.rs index c3f9a92bb..781315565 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -23,7 +23,7 @@ use starknet_in_rust::services::api::contract_classes::compiled_class::CompiledC use starknet_in_rust::services::api::contract_classes::deprecated_contract_class::ContractClass; use starknet_in_rust::state::ExecutionResourcesManager; use starknet_in_rust::transaction::fee::calculate_tx_fee; -use starknet_in_rust::transaction::{DeclareV2, Deploy}; +use starknet_in_rust::transaction::{Declare, Deploy}; use starknet_in_rust::utils::CompiledClassHash; use starknet_in_rust::CasmContractClass; use starknet_in_rust::EntryPointType; @@ -780,7 +780,7 @@ fn declare_tx() -> DeclareDeprecated { } } -fn declarev2_tx() -> DeclareV2 { +fn declarev2_tx() -> Declare { #[cfg(not(feature = "cairo_1_tests"))] let program_data = include_bytes!("../starknet_programs/raw_contract_classes/fibonacci.sierra"); #[cfg(feature = "cairo_1_tests")] @@ -791,7 +791,7 @@ fn declarev2_tx() -> DeclareV2 { CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); - DeclareV2 { + Declare { sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), validate_entry_point_selector: *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR, version: 2.into(), diff --git a/tests/yas_bench_test.rs b/tests/yas_bench_test.rs index 1ebe97998..3d47ce8fb 100644 --- a/tests/yas_bench_test.rs +++ b/tests/yas_bench_test.rs @@ -17,7 +17,7 @@ use starknet_in_rust::{ state::{ cached_state::CachedState, contract_class_cache::ContractClassCache, state_api::StateReader, }, - transaction::{DeclareV2, InvokeFunction}, + transaction::{Declare, InvokeFunction}, utils::Address, }; use tracing::info; @@ -317,7 +317,7 @@ where let sender_address = Address(*ACCOUNT_ADDRESS); let nonce = state.get_nonce_at(&sender_address).unwrap(); - let tx_execution_info = DeclareV2::new( + let tx_execution_info = Declare::new( &sierra_contract_class, Some(casm_contract_class), casm_class_hash, @@ -353,7 +353,7 @@ where let sender_address = Address(*ACCOUNT_ADDRESS); let nonce = state.get_nonce_at(&sender_address).unwrap(); - let tx_execution_info = DeclareV2::new( + let tx_execution_info = Declare::new( &sierra_contract_class, Some(casm_contract_class), casm_class_hash, @@ -389,7 +389,7 @@ where let sender_address = Address(*ACCOUNT_ADDRESS); let nonce = state.get_nonce_at(&sender_address).unwrap(); - let tx_execution_info = DeclareV2::new( + let tx_execution_info = Declare::new( &sierra_contract_class, Some(casm_contract_class), casm_class_hash, @@ -425,7 +425,7 @@ where let sender_address = Address(*ACCOUNT_ADDRESS); let nonce = state.get_nonce_at(&sender_address).unwrap(); - let tx_execution_info = DeclareV2::new( + let tx_execution_info = Declare::new( &sierra_contract_class, Some(casm_contract_class), casm_class_hash, From 70fa0d8e7bbbebec2209809decedcd051e381632 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 5 Feb 2024 18:46:59 -0300 Subject: [PATCH 47/50] Fix merge --- cli/src/main.rs | 424 ------------------------------------------------ 1 file changed, 424 deletions(-) delete mode 100644 cli/src/main.rs diff --git a/cli/src/main.rs b/cli/src/main.rs deleted file mode 100644 index 10d15e5b7..000000000 --- a/cli/src/main.rs +++ /dev/null @@ -1,424 +0,0 @@ -use actix_web::{post, web, App, HttpResponse, HttpServer}; -use cairo_vm::{utils::felt_to_biguint, Felt252}; -use clap::{Args, Parser, Subcommand}; -use serde::{Deserialize, Serialize}; -use starknet_in_rust::{ - core::{ - contract_address::compute_deprecated_class_hash, - errors::{contract_address_errors::ContractAddressError, state_errors::StateError}, - transaction_hash::{ - deprecated::{ - calculate_declare_deprecated_transaction_hash, - deprecated_calculate_deploy_transaction_hash, - deprecated_calculate_transaction_hash_common, - }, - TransactionHashPrefix, - }, - }, - definitions::{ - block_context::BlockContext, - constants::{DECLARE_VERSION, TRANSACTION_VERSION}, - }, - execution::{ - execution_entry_point::{ExecutionEntryPoint, ExecutionResult}, - TransactionExecutionContext, - }, - hash_utils::calculate_contract_address, - parser_errors::ParserError, - serde_structs::read_abi, - services::api::contract_classes::{ - compiled_class::CompiledClass, deprecated_contract_class::ContractClass, - }, - state::{cached_state::CachedState, state_api::State}, - state::{ - contract_class_cache::PermanentContractClassCache, - in_memory_state_reader::InMemoryStateReader, ExecutionResourcesManager, StateDiff, - }, - transaction::{error::TransactionError, InvokeFunction}, - utils::{felt_to_hash, string_to_hash, Address}, -}; -use std::{ - path::PathBuf, - sync::{Arc, Mutex}, -}; - -#[derive(Parser)] -struct Cli { - #[command(subcommand)] - command: Commands, -} - -#[derive(Subcommand)] -enum Commands { - Declare(DeclareArgs), - Deploy(DeployArgs), - Invoke(InvokeArgs), - Call(CallArgs), - #[command(name = "starknet_in_rust")] - Devnet(DevnetArgs), -} - -#[derive(Args, Serialize, Deserialize)] -pub struct DeclareArgs { - #[arg(long)] - contract: PathBuf, -} - -#[derive(Args, Serialize, Deserialize)] -struct DeployArgs { - #[arg(long = "class_hash")] - class_hash: String, - #[arg(long, default_value = "1111")] - salt: i32, - #[arg(long, num_args=1.., value_delimiter = ' ')] - inputs: Option>, -} - -#[derive(Args, Serialize, Deserialize)] -struct InvokeArgs { - #[arg(long)] - address: String, - #[arg(long)] - abi: PathBuf, - #[arg(long)] - function: String, - #[arg(long, num_args=1.., value_delimiter = ' ')] - inputs: Option>, - #[arg(long)] - hash: Option, -} - -#[derive(Args, Serialize, Deserialize)] -struct CallArgs { - #[arg(long)] - address: String, - #[arg(long)] - abi: PathBuf, - #[arg(long)] - function: String, - #[arg(long, num_args=1.., value_delimiter = ' ')] - inputs: Option>, -} - -#[derive(Args)] -struct DevnetArgs { - #[arg(long, default_value = "7878")] - port: u16, -} - -struct AppState { - cached_state: Mutex>, -} - -fn declare_parser( - cached_state: &mut CachedState, - args: &DeclareArgs, -) -> Result<(Felt252, Felt252), ParserError> { - let contract_class = - ContractClass::from_path(&args.contract).map_err(ContractAddressError::Program)?; - let class_hash = compute_deprecated_class_hash(&contract_class)?; - cached_state.set_contract_class( - &felt_to_hash(&class_hash), - &CompiledClass::Deprecated(Arc::new(contract_class.clone())), - )?; - - let tx_hash = calculate_declare_deprecated_transaction_hash( - &contract_class, - Felt252::ZERO, - &Address(0.into()), - 0, - *DECLARE_VERSION, - Felt252::ZERO, - )?; - Ok((class_hash, tx_hash)) -} - -fn deploy_parser( - cached_state: &mut CachedState, - args: &DeployArgs, -) -> Result<(Felt252, Felt252), ParserError> { - let constructor_calldata = match &args.inputs { - Some(vec) => vec.iter().map(|&n| n.into()).collect(), - None => Vec::new(), - }; - let address = calculate_contract_address( - &args.salt.into(), - &Felt252::from_hex(&args.class_hash) - .map_err(|_| ParserError::ParseFelt(args.class_hash.clone()))?, - &constructor_calldata, - Address(0.into()), - )?; - - cached_state.deploy_contract(Address(address), string_to_hash(&args.class_hash))?; - let tx_hash = deprecated_calculate_deploy_transaction_hash( - 0.into(), - &Address(address), - &constructor_calldata, - Felt252::ZERO, - )?; - Ok((address, tx_hash)) -} - -fn invoke_parser( - cached_state: &mut CachedState, - args: &InvokeArgs, -) -> Result<(Felt252, Felt252), ParserError> { - let contract_address = Address( - Felt252::from_hex(&args.address) - .map_err(|_| ParserError::ParseFelt(args.address.clone()))?, - ); - let class_hash = cached_state.get_class_hash_at(&contract_address)?; - let contract_class: ContractClass = cached_state - .get_contract_class(&class_hash)? - .try_into() - .map_err(StateError::from)?; - let function_entrypoint_indexes = read_abi(&args.abi); - let transaction_hash = args.hash.clone().map(|f| { - Felt252::from_hex(&f) - .map_err(|_| ParserError::ParseFelt(f.clone())) - .unwrap() - }); - let entry_points_by_type = contract_class.entry_points_by_type().clone(); - let (entry_point_index, entry_point_type) = function_entrypoint_indexes - .get(&args.function) - .ok_or_else(|| ParserError::FunctionEntryPoint(args.function.clone()))?; - - let entrypoint_selector = entry_points_by_type - .get(entry_point_type) - .ok_or(ParserError::EntryPointType(*entry_point_type))? - .get(*entry_point_index) - .ok_or(ParserError::EntryPointIndex(*entry_point_index))? - .selector(); - - let calldata = match &args.inputs { - Some(vec) => vec.iter().map(|&n| n.into()).collect(), - None => Vec::new(), - }; - let internal_invoke = InvokeFunction::new_with_tx_hash( - contract_address.clone(), - *entrypoint_selector, - Default::default(), - *TRANSACTION_VERSION, - calldata.clone(), - vec![], - Some(Felt252::ZERO), - transaction_hash.unwrap(), - )?; - let mut transactional_state = cached_state.create_transactional()?; - let _tx_info = internal_invoke.apply( - &mut transactional_state, - &BlockContext::default(), - 0, - #[cfg(feature = "cairo-native")] - None, - )?; - cached_state.apply_state_update(&StateDiff::from_cached_state(transactional_state.cache())?)?; - - let tx_hash = deprecated_calculate_transaction_hash_common( - TransactionHashPrefix::Invoke, - *TRANSACTION_VERSION, - &contract_address, - *entrypoint_selector, - &calldata, - 0, - Felt252::ZERO, - &[], - )?; - - Ok((contract_address.0, tx_hash)) -} - -fn call_parser( - cached_state: &mut CachedState, - args: &CallArgs, -) -> Result, ParserError> { - let contract_address = Address( - Felt252::from_hex(&args.address) - .map_err(|_| ParserError::ParseFelt(args.address.clone()))?, - ); - let class_hash = cached_state.get_class_hash_at(&contract_address)?; - let contract_class: ContractClass = cached_state - .get_contract_class(&class_hash)? - .try_into() - .map_err(StateError::from)?; - let function_entrypoint_indexes = read_abi(&args.abi); - let entry_points_by_type = contract_class.entry_points_by_type().clone(); - let (entry_point_index, entry_point_type) = function_entrypoint_indexes - .get(&args.function) - .ok_or_else(|| ParserError::FunctionEntryPoint(args.function.clone()))?; - - let entrypoint_selector = entry_points_by_type - .get(entry_point_type) - .ok_or(ParserError::EntryPointType(*entry_point_type))? - .get(*entry_point_index) - .ok_or(ParserError::EntryPointIndex(*entry_point_index))? - .selector(); - let caller_address = Address(0.into()); - let calldata = match &args.inputs { - Some(vec) => vec.iter().map(|&n| n.into()).collect(), - None => Vec::new(), - }; - let execution_entry_point = ExecutionEntryPoint::new( - contract_address, - calldata, - *entrypoint_selector, - caller_address, - *entry_point_type, - None, - None, - 0, - ); - let block_context = BlockContext::default(); - let ExecutionResult { call_info, .. } = execution_entry_point.execute( - cached_state, - &block_context, - &mut ExecutionResourcesManager::default(), - &mut TransactionExecutionContext::default(), - false, - block_context.invoke_tx_max_n_steps(), - #[cfg(feature = "cairo-native")] - None, - )?; - - let call_info = call_info.ok_or(TransactionError::CallInfoIsNone)?; - - Ok(call_info.retdata) -} - -async fn devnet_parser(devnet_args: &DevnetArgs) -> Result<(), ParserError> { - start_devnet(devnet_args.port).await?; - Ok(()) -} - -#[post("/declare")] -async fn declare_req(data: web::Data, args: web::Json) -> HttpResponse { - let mut cached_state = data.cached_state.lock().unwrap(); - match declare_parser(&mut cached_state, &args) { - Ok(t) => HttpResponse::Ok().json(t), - Err(e) => HttpResponse::ExpectationFailed().body(e.to_string()), - } -} - -#[post("/deploy")] -async fn deploy_req(data: web::Data, args: web::Json) -> HttpResponse { - let mut cached_state = data.cached_state.lock().unwrap(); - match deploy_parser(&mut cached_state, &args) { - Ok(t) => HttpResponse::Ok().json(t), - Err(e) => HttpResponse::ExpectationFailed().body(e.to_string()), - } -} - -#[post("/invoke")] -async fn invoke_req(data: web::Data, args: web::Json) -> HttpResponse { - let mut cached_state = data.cached_state.lock().unwrap(); - match invoke_parser(&mut cached_state, &args) { - Ok(t) => HttpResponse::Ok().json(t), - Err(e) => HttpResponse::ExpectationFailed().body(e.to_string()), - } -} - -#[post("/call")] -async fn call_req(data: web::Data, args: web::Json) -> HttpResponse { - println!("call received"); - let mut cached_state = data.cached_state.lock().unwrap(); - match call_parser(&mut cached_state, &args) { - Ok(t) => HttpResponse::Ok().json(t), - Err(e) => HttpResponse::ExpectationFailed().body(e.to_string()), - } -} - -pub async fn start_devnet(port: u16) -> Result<(), std::io::Error> { - let cached_state = web::Data::new(AppState { - cached_state: Mutex::new(CachedState::new( - Arc::new(InMemoryStateReader::default()), - Arc::new(PermanentContractClassCache::default()), - )), - }); - - HttpServer::new(move || { - App::new() - .app_data(cached_state.clone()) - .service(declare_req) - .service(deploy_req) - .service(invoke_req) - .service(call_req) - }) - .bind(("127.0.0.1", port))? - .run() - .await -} - -#[actix_web::main] -async fn main() -> Result<(), ParserError> { - let cli = Cli::parse(); - match &cli.command { - Commands::Declare(declare_args) => { - let response = awc::Client::new() - .post("http://127.0.0.1:7878/declare") - .send_json(&declare_args) - .await; - match response { - Ok(mut resp) => { - match resp.json::<(Felt252, Felt252)>().await { - Ok(body) => println!("Declare transaction was sent.\nContract class hash: 0x{:x}\nTransaction hash: 0x{:x}", felt_to_biguint(body.0), felt_to_biguint(body.1)), - Err(e) => println!("{e}") - } - }, - Err(ref e) => println!("{e}"), - }; - Ok(()) - } - Commands::Deploy(deploy_args) => { - let response = awc::Client::new() - .post("http://127.0.0.1:7878/deploy") - .send_json(&deploy_args) - .await; - match response { - Ok(mut resp) => { - match resp.json::<(Felt252, Felt252)>().await { - Ok(body) => println!("Invoke transaction for contract deployment was sent.\nContract address: 0x{:x}\nTransaction hash: 0x{:x}", felt_to_biguint(body.0), felt_to_biguint(body.1)), - Err(e) => println!("{e}") - } - }, - Err(ref e) => println!("{e}"), - }; - Ok(()) - } - Commands::Invoke(invoke_args) => { - let response = awc::Client::new() - .post("http://127.0.0.1:7878/invoke") - .send_json(&invoke_args) - .await; - match response { - Ok(mut resp) => { - match resp.json::<(Felt252, Felt252)>().await { - Ok(body) => println!("Invoke transaction was sent.\nContract address: 0x{:x}\nTransaction hash: 0x{:x}", felt_to_biguint(body.0), felt_to_biguint(body.1)), - Err(e) => println!("{e}") - } - }, - Err(ref e) => println!("{e}"), - }; - Ok(()) - } - Commands::Call(call_args) => { - let response = awc::Client::new() - .post("http://127.0.0.1:7878/call") - .send_json(&call_args) - .await; - match response { - Ok(mut resp) => match resp.json::>().await { - Ok(body) => println!( - "{}", - body.iter() - .fold(String::new(), |acc, arg| acc + &format!("{arg}")) - ), - Err(e) => println!("{e}"), - }, - Err(ref e) => println!("{e}"), - }; - Ok(()) - } - Commands::Devnet(devnet_args) => devnet_parser(devnet_args).await, - }?; - Ok(()) -} From 79626de4d04e053c86ea0dff72fa9c4a0ddf6216 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 5 Feb 2024 18:51:14 -0300 Subject: [PATCH 48/50] Remove internal from variable names in tests --- src/transaction/declare.rs | 70 +++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index 73d28d947..74b4c263a 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -146,7 +146,7 @@ impl Declare { check_account_tx_fields_version(&account_tx_fields, version)?; let validate_entry_point_selector = *VALIDATE_DECLARE_ENTRY_POINT_SELECTOR; - let internal_declare = Declare { + let declare = Declare { sierra_contract_class: sierra_contract_class.to_owned(), sierra_class_hash, sender_address, @@ -164,7 +164,7 @@ impl Declare { skip_nonce_check: false, }; - Ok(internal_declare) + Ok(declare) } // creates a new instance of a declare but without the computation of the transaction hash. @@ -640,9 +640,9 @@ mod tests { CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); - // create internal declare v2 + // create declare - let internal_declare = Declare::new_with_tx_hash( + let declare = Declare::new_with_tx_hash( &sierra_contract_class, None, casm_class_hash, @@ -661,20 +661,20 @@ mod tests { let mut state = CachedState::new(state_reader, Arc::new(casm_contract_class_cache)); // call compile and store - assert!(internal_declare + assert!(declare .compile_and_store_casm_class(&mut state) .is_ok()); // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( - internal_declare.sierra_contract_class.unwrap().clone(), + declare.sierra_contract_class.unwrap().clone(), true, ) .unwrap(); - let internal_declare_compiled_class_hash = - ClassHash::from(internal_declare.compiled_class_hash); + let declare_compiled_class_hash = + ClassHash::from(declare.compiled_class_hash); let casm_class = match state - .get_contract_class(&internal_declare_compiled_class_hash) + .get_contract_class(&declare_compiled_class_hash) .unwrap() { CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), @@ -710,9 +710,9 @@ mod tests { CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); - // create internal declare v2 + // create declare - let internal_declare = Declare::new_with_tx_hash( + let declare = Declare::new_with_tx_hash( &sierra_contract_class, Some(casm_class), casm_class_hash, @@ -731,20 +731,20 @@ mod tests { let mut state = CachedState::new(state_reader, Arc::new(casm_contract_class_cache)); // call compile and store - assert!(internal_declare + assert!(declare .compile_and_store_casm_class(&mut state) .is_ok()); // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( - internal_declare.sierra_contract_class.unwrap(), + declare.sierra_contract_class.unwrap(), true, ) .unwrap(); - let internal_declare_compiled_class_hash = - ClassHash::from(internal_declare.compiled_class_hash); + let declare_compiled_class_hash = + ClassHash::from(declare.compiled_class_hash); let casm_class = match state - .get_contract_class(&internal_declare_compiled_class_hash) + .get_contract_class(&declare_compiled_class_hash) .unwrap() { CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), @@ -781,9 +781,9 @@ mod tests { CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); - // create internal declare v2 + // create declare tx - let internal_declare = Declare::new_with_sierra_class_hash_and_tx_hash( + let declare = Declare::new_with_sierra_class_hash_and_tx_hash( Some(sierra_contract_class), sierra_class_hash, Some(casm_class), @@ -803,20 +803,20 @@ mod tests { let mut state = CachedState::new(state_reader, Arc::new(casm_contract_class_cache)); // call compile and store - assert!(internal_declare + assert!(declare .compile_and_store_casm_class(&mut state) .is_ok()); // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( - internal_declare.sierra_contract_class.unwrap(), + declare.sierra_contract_class.unwrap(), true, ) .unwrap(); - let internal_declare_compiled_class_hash = - ClassHash::from(internal_declare.compiled_class_hash); + let declare_compiled_class_hash = + ClassHash::from(declare.compiled_class_hash); let casm_class = match state - .get_contract_class(&internal_declare_compiled_class_hash) + .get_contract_class(&declare_compiled_class_hash) .unwrap() { CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), @@ -852,9 +852,9 @@ mod tests { CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); - // create internal declare v2 + // create declare tx - let internal_declare = Declare::new_with_tx_hash( + let declare = Declare::new_with_tx_hash( &sierra_contract_class, None, casm_class_hash, @@ -873,20 +873,20 @@ mod tests { let mut state = CachedState::new(state_reader, Arc::new(casm_contract_class_cache)); // call compile and store - assert!(internal_declare + assert!(declare .compile_and_store_casm_class(&mut state) .is_ok()); // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( - internal_declare.sierra_contract_class.unwrap().clone(), + declare.sierra_contract_class.unwrap().clone(), true, ) .unwrap(); - let internal_declare_compiled_class_hash = - ClassHash::from(internal_declare.compiled_class_hash); + let declare_compiled_class_hash = + ClassHash::from(declare.compiled_class_hash); let casm_class = match state - .get_contract_class(&internal_declare_compiled_class_hash) + .get_contract_class(&declare_compiled_class_hash) .unwrap() { CompiledClass::Casm { casm, .. } => casm.as_ref().clone(), @@ -923,9 +923,9 @@ mod tests { let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); let sended_class_hash = Felt252::from(5); - // create internal declare v2 + // create declare - let internal_declare = Declare::new_with_tx_hash( + let declare = Declare::new_with_tx_hash( &sierra_contract_class, None, sended_class_hash, @@ -948,7 +948,7 @@ mod tests { casm_class_hash, sended_class_hash ); assert_eq!( - internal_declare + declare .compile_and_store_casm_class(&mut state) .unwrap_err() .to_string(), @@ -977,7 +977,7 @@ mod tests { let chain_id = StarknetChainId::TestNet.to_felt(); // declare tx - let internal_declare = Declare::new( + let declare = Declare::new( &sierra_contract_class, None, Felt252::ONE, @@ -989,7 +989,7 @@ mod tests { Felt252::ZERO, ) .unwrap(); - let result = internal_declare.execute( + let result = declare.execute( &mut CachedState::::default(), &BlockContext::default(), #[cfg(feature = "cairo-native")] From 3fb91e927ee9cce8088c8081f7edfb3c33048640 Mon Sep 17 00:00:00 2001 From: Federica Date: Mon, 5 Feb 2024 18:55:07 -0300 Subject: [PATCH 49/50] Fmt + fix typo --- src/transaction/declare.rs | 46 +++++++++++++------------------------- 1 file changed, 15 insertions(+), 31 deletions(-) diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index 74b4c263a..e7587c59c 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -43,7 +43,7 @@ use { /// Represents a declare transaction in the starknet network. /// Declare creates a blueprint of a contract class that is used to deploy instances of the contract -/// Declare is meant to be used with the new cairo contract sintax, starting from Cairo1. +/// Declare is meant to be used with the new cairo contract syntax, starting from Cairo1. #[derive(Debug, Clone)] pub struct Declare { pub sender_address: Address, @@ -661,9 +661,7 @@ mod tests { let mut state = CachedState::new(state_reader, Arc::new(casm_contract_class_cache)); // call compile and store - assert!(declare - .compile_and_store_casm_class(&mut state) - .is_ok()); + assert!(declare.compile_and_store_casm_class(&mut state).is_ok()); // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( @@ -671,8 +669,7 @@ mod tests { true, ) .unwrap(); - let declare_compiled_class_hash = - ClassHash::from(declare.compiled_class_hash); + let declare_compiled_class_hash = ClassHash::from(declare.compiled_class_hash); let casm_class = match state .get_contract_class(&declare_compiled_class_hash) .unwrap() @@ -731,18 +728,13 @@ mod tests { let mut state = CachedState::new(state_reader, Arc::new(casm_contract_class_cache)); // call compile and store - assert!(declare - .compile_and_store_casm_class(&mut state) - .is_ok()); + assert!(declare.compile_and_store_casm_class(&mut state).is_ok()); // test we can retreive the data - let expected_casm_class = CasmContractClass::from_contract_class( - declare.sierra_contract_class.unwrap(), - true, - ) - .unwrap(); - let declare_compiled_class_hash = - ClassHash::from(declare.compiled_class_hash); + let expected_casm_class = + CasmContractClass::from_contract_class(declare.sierra_contract_class.unwrap(), true) + .unwrap(); + let declare_compiled_class_hash = ClassHash::from(declare.compiled_class_hash); let casm_class = match state .get_contract_class(&declare_compiled_class_hash) .unwrap() @@ -803,18 +795,13 @@ mod tests { let mut state = CachedState::new(state_reader, Arc::new(casm_contract_class_cache)); // call compile and store - assert!(declare - .compile_and_store_casm_class(&mut state) - .is_ok()); + assert!(declare.compile_and_store_casm_class(&mut state).is_ok()); // test we can retreive the data - let expected_casm_class = CasmContractClass::from_contract_class( - declare.sierra_contract_class.unwrap(), - true, - ) - .unwrap(); - let declare_compiled_class_hash = - ClassHash::from(declare.compiled_class_hash); + let expected_casm_class = + CasmContractClass::from_contract_class(declare.sierra_contract_class.unwrap(), true) + .unwrap(); + let declare_compiled_class_hash = ClassHash::from(declare.compiled_class_hash); let casm_class = match state .get_contract_class(&declare_compiled_class_hash) .unwrap() @@ -873,9 +860,7 @@ mod tests { let mut state = CachedState::new(state_reader, Arc::new(casm_contract_class_cache)); // call compile and store - assert!(declare - .compile_and_store_casm_class(&mut state) - .is_ok()); + assert!(declare.compile_and_store_casm_class(&mut state).is_ok()); // test we can retreive the data let expected_casm_class = CasmContractClass::from_contract_class( @@ -883,8 +868,7 @@ mod tests { true, ) .unwrap(); - let declare_compiled_class_hash = - ClassHash::from(declare.compiled_class_hash); + let declare_compiled_class_hash = ClassHash::from(declare.compiled_class_hash); let casm_class = match state .get_contract_class(&declare_compiled_class_hash) .unwrap() From 62b19c24c413f9402ca33fd149915596c5277cb4 Mon Sep 17 00:00:00 2001 From: Federica Date: Wed, 7 Feb 2024 18:22:58 -0300 Subject: [PATCH 50/50] fmt --- bench/internals.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bench/internals.rs b/bench/internals.rs index b8462b88d..a3f254920 100644 --- a/bench/internals.rs +++ b/bench/internals.rs @@ -18,7 +18,9 @@ use starknet_in_rust::{ cached_state::CachedState, contract_class_cache::PermanentContractClassCache, in_memory_state_reader::InMemoryStateReader, state_api::State, }, - transaction::{declare_deprecated::DeclareDeprecated, Address, Deploy, DeployAccount, InvokeFunction}, + transaction::{ + declare_deprecated::DeclareDeprecated, Address, Deploy, DeployAccount, InvokeFunction, + }, utils::ClassHash, }; use std::{hint::black_box, sync::Arc};