From 656f9cc4dd43b5a40937ff0843582910ca3213c1 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Thu, 29 Jun 2023 11:14:00 -0300 Subject: [PATCH 1/4] Add remaining gas to InvokeFunction execute call --- src/transaction/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index bdc850531..432c79d42 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -60,7 +60,7 @@ impl Transaction { Transaction::DeclareV2(tx) => tx.execute(state, block_context), Transaction::Deploy(tx) => tx.execute(state, block_context), Transaction::DeployAccount(tx) => tx.execute(state, block_context), - Transaction::InvokeFunction(tx) => tx.execute(state, block_context, 0), + Transaction::InvokeFunction(tx) => tx.execute(state, block_context, remaining_gas), Transaction::L1Handler(tx) => tx.execute(state, block_context, remaining_gas), } } From ec4cbcddef05df8239d05a22c975485fcaa8c4d2 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Thu, 29 Jun 2023 16:01:24 -0300 Subject: [PATCH 2/4] Replace all_cairo by starknet layout --- src/execution/execution_entry_point.rs | 4 ++-- src/runner/mod.rs | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/execution/execution_entry_point.rs b/src/execution/execution_entry_point.rs index 741590f43..e19cbf466 100644 --- a/src/execution/execution_entry_point.rs +++ b/src/execution/execution_entry_point.rs @@ -302,7 +302,7 @@ impl ExecutionEntryPoint { // create starknet runner let mut vm = VirtualMachine::new(false); - let mut cairo_runner = CairoRunner::new(&contract_class.program, "all_cairo", false)?; + let mut cairo_runner = CairoRunner::new(&contract_class.program, "starknet", false)?; cairo_runner.initialize_function_runner(&mut vm)?; validate_contract_deployed(state, &self.contract_address)?; @@ -415,7 +415,7 @@ impl ExecutionEntryPoint { // get a program from the casm contract class let program: Program = contract_class.as_ref().clone().try_into()?; // create and initialize a cairo runner for running cairo 1 programs. - let mut cairo_runner = CairoRunner::new(&program, "all_cairo", false)?; + let mut cairo_runner = CairoRunner::new(&program, "starknet", false)?; cairo_runner.initialize_function_runner_cairo_1( &mut vm, diff --git a/src/runner/mod.rs b/src/runner/mod.rs index 281666d61..729ade949 100644 --- a/src/runner/mod.rs +++ b/src/runner/mod.rs @@ -411,7 +411,7 @@ mod test { #[test] fn prepare_os_context_test() { let program = cairo_vm::types::program::Program::default(); - let cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); + let cairo_runner = CairoRunner::new(&program, "starknet", false).unwrap(); let mut vm = VirtualMachine::new(true); let os_context = StarknetRunner::>>::prepare_os_context_cairo0(&cairo_runner, &mut vm); @@ -425,7 +425,7 @@ mod test { #[test] fn run_from_entrypoint_should_fail_with_no_exec_base() { let program = cairo_vm::types::program::Program::default(); - let cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); + let cairo_runner = CairoRunner::new(&program, "starknet", false).unwrap(); let vm = VirtualMachine::new(true); let mut state = CachedState::::default(); @@ -441,7 +441,7 @@ mod test { #[test] fn get_os_segment_ptr_range_should_fail_when_ptr_offset_is_not_zero() { let program = cairo_vm::types::program::Program::default(); - let cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); + let cairo_runner = CairoRunner::new(&program, "starknet", false).unwrap(); let vm = VirtualMachine::new(true); let mut state = CachedState::::default(); @@ -460,7 +460,7 @@ mod test { #[test] fn validate_segment_pointers_should_fail_when_offset_is_not_zero() { let program = cairo_vm::types::program::Program::default(); - let cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); + let cairo_runner = CairoRunner::new(&program, "starknet", false).unwrap(); let vm = VirtualMachine::new(true); let mut state = CachedState::::default(); @@ -482,7 +482,7 @@ mod test { #[test] fn validate_segment_pointers_should_fail_when_base_is_not_a_value() { let program = cairo_vm::types::program::Program::default(); - let cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); + let cairo_runner = CairoRunner::new(&program, "starknet", false).unwrap(); let vm = VirtualMachine::new(true); let mut state = CachedState::::default(); @@ -504,7 +504,7 @@ mod test { #[test] fn validate_segment_pointers_should_fail_with_invalid_segment_size() { let program = cairo_vm::types::program::Program::default(); - let cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); + let cairo_runner = CairoRunner::new(&program, "starknet", false).unwrap(); let vm = VirtualMachine::new(true); let mut state = CachedState::::default(); @@ -524,7 +524,7 @@ mod test { #[test] fn validate_segment_pointers_should_fail_when_stop_is_not_a_value() { let program = cairo_vm::types::program::Program::default(); - let cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); + let cairo_runner = CairoRunner::new(&program, "starknet", false).unwrap(); let mut vm = VirtualMachine::new(true); vm.add_memory_segment(); vm.compute_segments_effective_sizes(); @@ -547,7 +547,7 @@ mod test { #[test] fn validate_segment_pointers_should_fail_with_invalid_stop_pointer() { let program = cairo_vm::types::program::Program::default(); - let cairo_runner = CairoRunner::new(&program, "all_cairo", false).unwrap(); + let cairo_runner = CairoRunner::new(&program, "starknet", false).unwrap(); let mut vm = VirtualMachine::new(true); vm.add_memory_segment(); vm.compute_segments_effective_sizes(); From 1fdb33e6b7d0f2e725a31ec1e98ab7fefcfe0811 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Fri, 30 Jun 2023 12:20:20 -0300 Subject: [PATCH 3/4] Fix fee transfer --- src/lib.rs | 38 +++++++++++++++++++++++++++++++---- src/testing/mod.rs | 12 +++++------ src/transaction/fee.rs | 2 +- starknet_programs/ERC20.cairo | 2 +- tests/internals.rs | 10 ++++----- 5 files changed, 47 insertions(+), 17 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 813f2c5a6..90a4ae28e 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -178,8 +178,11 @@ mod test { use crate::definitions::constants::EXECUTE_ENTRY_POINT_SELECTOR; use crate::estimate_fee; use crate::estimate_message_fee; + use crate::execution::execution_entry_point::ExecutionEntryPoint; + use crate::execution::TransactionExecutionContext; use crate::services::api::contract_classes::deprecated_contract_class::ContractClass; - use crate::testing::{create_account_tx_test_state, TEST_CONTRACT_ADDRESS, TEST_CONTRACT_PATH}; + use crate::testing::TEST_CONTRACT_PATH; + use crate::testing::{create_account_tx_test_state, TEST_CONTRACT_ADDRESS}; use crate::transaction::{InvokeFunction, L1Handler, Transaction}; use crate::utils::felt_to_hash; use cairo_lang_starknet::casm_contract_class::CasmContractClass; @@ -206,8 +209,35 @@ mod test { let entrypoints = contract_class.entry_points_by_type; let entrypoint_selector = &entrypoints.get(&EntryPointType::External).unwrap()[0].selector; - let (transaction_context, state) = create_account_tx_test_state().unwrap(); + let (block_context, mut state) = create_account_tx_test_state().unwrap(); + // Add balance to account + let calldata = [TEST_CONTRACT_ADDRESS.0.clone(), 0.into(), 1000.into()].to_vec(); + + let fee_transfer_call = ExecutionEntryPoint::new( + block_context.starknet_os_config.fee_token_address.clone(), + calldata, + felt_str!("37313232031488507829243159589199778096432170431839144894988167447577083165"), // mint entrypoint + block_context.starknet_os_config.fee_token_address.clone(), + EntryPointType::External, + None, + None, + 100000, + ); + + let mut tx_execution_context = TransactionExecutionContext::default(); + let mut resources_manager = ExecutionResourcesManager::default(); + let _fee_transfer_exec = fee_transfer_call + .execute( + &mut state, + &block_context, + &mut resources_manager, + &mut tx_execution_context, + false, + ) + .unwrap(); + + // Fibonacci let calldata = [1.into(), 1.into(), 10.into()].to_vec(); let invoke_function = InvokeFunction::new( TEST_CONTRACT_ADDRESS.clone(), @@ -223,8 +253,8 @@ mod test { .unwrap(); let transaction = Transaction::InvokeFunction(invoke_function); - let estimated_fee = estimate_fee(&transaction, state, &transaction_context).unwrap(); - assert_eq!(estimated_fee, (0, 0)); + let estimated_fee = estimate_fee(&transaction, state, &block_context).unwrap(); + assert_eq!(estimated_fee, (12, 0)); } #[test] diff --git a/src/testing/mod.rs b/src/testing/mod.rs index 2ebd1a37e..60bda230d 100644 --- a/src/testing/mod.rs +++ b/src/testing/mod.rs @@ -57,15 +57,15 @@ lazy_static! { // Others. // Blockifier had this value hardcoded to 2. - pub static ref ACTUAL_FEE: Felt252 = Felt252::zero(); + pub static ref ACTUAL_FEE: Felt252 = Felt252::from(10000000); } -pub fn new_starknet_general_config_for_testing() -> BlockContext { +pub fn new_starknet_block_context_for_testing() -> BlockContext { BlockContext::new( StarknetOsConfig::new( StarknetChainId::TestNet, TEST_ERC20_CONTRACT_ADDRESS.clone(), - 0, + 1, ), 0, 0, @@ -87,7 +87,7 @@ where pub fn create_account_tx_test_state( ) -> Result<(BlockContext, CachedState), Box> { - let general_config = new_starknet_general_config_for_testing(); + let block_context = new_starknet_block_context_for_testing(); let test_contract_class_hash = felt_to_hash(&TEST_CLASS_HASH.clone()); let test_account_contract_class_hash = felt_to_hash(&TEST_ACCOUNT_CONTRACT_CLASS_HASH.clone()); @@ -109,7 +109,7 @@ pub fn create_account_tx_test_state( let test_contract_address = TEST_CONTRACT_ADDRESS.clone(); let test_account_contract_address = TEST_ACCOUNT_CONTRACT_ADDRESS.clone(); - let test_erc20_address = general_config + let test_erc20_address = block_context .starknet_os_config() .fee_token_address() .clone(); @@ -165,5 +165,5 @@ pub fn create_account_tx_test_state( Some(HashMap::new()), ); - Ok((general_config, cached_state)) + Ok((block_context, cached_state)) } diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 809ac797b..2928dc8a9 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -36,8 +36,8 @@ pub(crate) fn execute_fee_transfer( let calldata = [ block_context.block_info.sequencer_address.0.clone(), - Felt252::from(actual_fee), 0.into(), + Felt252::from(actual_fee), ] .to_vec(); diff --git a/starknet_programs/ERC20.cairo b/starknet_programs/ERC20.cairo index 8ea8e8221..eaa436609 100644 --- a/starknet_programs/ERC20.cairo +++ b/starknet_programs/ERC20.cairo @@ -157,7 +157,7 @@ func permissionedMint{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_chec recipient: felt, amount: Uint256 ) { alloc_locals; - permitted_minter_only(); + //permitted_minter_only(); <- We remove this to make testing easier local syscall_ptr: felt* = syscall_ptr; ERC20_mint(recipient=recipient, amount=amount); diff --git a/tests/internals.rs b/tests/internals.rs index 8a15b83b4..a7d10b17a 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -758,21 +758,21 @@ fn expected_declare_fee_transfer_info() -> CallInfo { Felt252::zero(), ], accessed_storage_keys: HashSet::from([ - [ - 2, 162, 196, 156, 77, 186, 13, 145, 179, 79, 42, 222, 133, 212, 29, 9, 86, 31, 154, - 119, 136, 76, 21, 186, 42, 176, 242, 36, 27, 8, 13, 236, - ], [ 7, 35, 151, 50, 8, 99, 155, 120, 57, 206, 41, 143, 127, 254, 166, 30, 63, 149, 51, 135, 45, 239, 215, 171, 219, 145, 2, 61, 180, 101, 136, 18, ], + [ + 2, 162, 196, 156, 77, 186, 13, 145, 179, 79, 42, 222, 133, 212, 29, 9, 86, 31, 154, + 119, 136, 76, 21, 186, 42, 176, 242, 36, 27, 8, 13, 235, + ], [ 7, 35, 151, 50, 8, 99, 155, 120, 57, 206, 41, 143, 127, 254, 166, 30, 63, 149, 51, 135, 45, 239, 215, 171, 219, 145, 2, 61, 180, 101, 136, 19, ], [ 2, 162, 196, 156, 77, 186, 13, 145, 179, 79, 42, 222, 133, 212, 29, 9, 86, 31, 154, - 119, 136, 76, 21, 186, 42, 176, 242, 36, 27, 8, 13, 235, + 119, 136, 76, 21, 186, 42, 176, 242, 36, 27, 8, 13, 236, ], ]), execution_resources: ExecutionResources { From 4b4e89eaf665604b1c4823483569a2660f7d0318 Mon Sep 17 00:00:00 2001 From: matias-gonz Date: Mon, 3 Jul 2023 10:13:37 -0300 Subject: [PATCH 4/4] Fix test_simulate_declare_v2 --- src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index 30d32f484..8fb9c1708 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -841,7 +841,7 @@ mod test { 100_000_000, false, false, - false, + true, ) .unwrap(); }