From a509df5b81cb921665f916e3449ee25051fc6f74 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Thu, 26 Sep 2024 15:35:22 -0600 Subject: [PATCH 1/7] Implementation of eth_get_transaction_count function --- crates/contracts/src/kakarot_core/eth_rpc.cairo | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/contracts/src/kakarot_core/eth_rpc.cairo b/crates/contracts/src/kakarot_core/eth_rpc.cairo index e7180d44b..0d2ea61b9 100644 --- a/crates/contracts/src/kakarot_core/eth_rpc.cairo +++ b/crates/contracts/src/kakarot_core/eth_rpc.cairo @@ -132,7 +132,11 @@ pub impl EthRPC< } fn eth_get_transaction_count(self: @TContractState, address: EthAddress) -> u64 { - panic!("unimplemented") + let kakarot_state = KakarotState::get_state(); + let starknet_address = kakarot_state.compute_starknet_address(address); + let account = IAccountDispatcher { contract_address: starknet_address }; + let nonce = account.get_nonce(); + nonce } fn eth_chain_id(self: @TContractState) -> u64 { From 129a41647053a70c81e9b61f274cdc00613ee652 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Thu, 26 Sep 2024 16:29:16 -0600 Subject: [PATCH 2/7] Refactoring validate nonce in validation.cairo --- crates/evm/src/backend/validation.cairo | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/evm/src/backend/validation.cairo b/crates/evm/src/backend/validation.cairo index e2202e5d2..ec1e8efe0 100644 --- a/crates/evm/src/backend/validation.cairo +++ b/crates/evm/src/backend/validation.cairo @@ -29,7 +29,9 @@ pub fn validate_eth_tx(kakarot_state: @KakarotCore::ContractState, tx: Transacti // Validate nonce let starknet_caller_address = get_caller_address(); let account = IAccountDispatcher { contract_address: starknet_caller_address }; - assert(account.get_nonce() == tx.nonce(), 'Invalid nonce'); + let eth_address = account.get_evm_address(); + let nonce = kakarot_state.eth_get_transaction_count(eth_address); + assert(nonce == tx.nonce(), 'Invalid nonce'); // Validate gas let gas_limit = tx.gas_limit(); From eba1923d1572810694f02cc0096cfa273041e5c8 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Fri, 27 Sep 2024 07:38:40 -0600 Subject: [PATCH 3/7] Changing the deprecated function --- crates/contracts/src/kakarot_core/eth_rpc.cairo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/contracts/src/kakarot_core/eth_rpc.cairo b/crates/contracts/src/kakarot_core/eth_rpc.cairo index 0d2ea61b9..a35df4585 100644 --- a/crates/contracts/src/kakarot_core/eth_rpc.cairo +++ b/crates/contracts/src/kakarot_core/eth_rpc.cairo @@ -133,7 +133,7 @@ pub impl EthRPC< fn eth_get_transaction_count(self: @TContractState, address: EthAddress) -> u64 { let kakarot_state = KakarotState::get_state(); - let starknet_address = kakarot_state.compute_starknet_address(address); + let starknet_address = kakarot_state.get_starknet_address(address); let account = IAccountDispatcher { contract_address: starknet_address }; let nonce = account.get_nonce(); nonce From 8ea657f227990cf70eb4fc9884e379ed1b4d13c3 Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Sat, 28 Sep 2024 09:30:29 -0600 Subject: [PATCH 4/7] Validating nonce without new function --- crates/evm/src/backend/validation.cairo | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/crates/evm/src/backend/validation.cairo b/crates/evm/src/backend/validation.cairo index ec1e8efe0..e2202e5d2 100644 --- a/crates/evm/src/backend/validation.cairo +++ b/crates/evm/src/backend/validation.cairo @@ -29,9 +29,7 @@ pub fn validate_eth_tx(kakarot_state: @KakarotCore::ContractState, tx: Transacti // Validate nonce let starknet_caller_address = get_caller_address(); let account = IAccountDispatcher { contract_address: starknet_caller_address }; - let eth_address = account.get_evm_address(); - let nonce = kakarot_state.eth_get_transaction_count(eth_address); - assert(nonce == tx.nonce(), 'Invalid nonce'); + assert(account.get_nonce() == tx.nonce(), 'Invalid nonce'); // Validate gas let gas_limit = tx.gas_limit(); From 93c2afd12e499494cb8895104632c970eeaf375e Mon Sep 17 00:00:00 2001 From: Gerson2102 Date: Sat, 28 Sep 2024 19:32:44 -0600 Subject: [PATCH 5/7] Adding method to interface and test it --- crates/contracts/src/kakarot_core/eth_rpc.cairo | 9 +++++++++ crates/contracts/src/kakarot_core/interface.cairo | 3 +++ 2 files changed, 12 insertions(+) diff --git a/crates/contracts/src/kakarot_core/eth_rpc.cairo b/crates/contracts/src/kakarot_core/eth_rpc.cairo index a35df4585..34076c35c 100644 --- a/crates/contracts/src/kakarot_core/eth_rpc.cairo +++ b/crates/contracts/src/kakarot_core/eth_rpc.cairo @@ -232,6 +232,7 @@ mod tests { use evm::test_utils::{sequencer_evm_address, evm_address}; use snforge_std::{start_cheat_chain_id_global, stop_cheat_chain_id_global}; use utils::constants::POW_2_53; + use evm::test_utils::evm_address; fn set_up() -> KakarotCore::ContractState { // Define the kakarot state to access contract functions @@ -244,6 +245,14 @@ mod tests { stop_cheat_chain_id_global(); } + #[test] + fn test_eth_get_transaction_count() { + let (_, kakarot_core) = setup_contracts_for_testing(); + let _ = deploy_eoa(kakarot_core, evm_address()); + // Deployed eoa should return a zero nonce + assert_eq!(kakarot_core.eth_get_transaction_count(evm_address()), 0); + } + #[test] fn test_eth_get_balance() { let (native_token, kakarot_core) = setup_contracts_for_testing(); diff --git a/crates/contracts/src/kakarot_core/interface.cairo b/crates/contracts/src/kakarot_core/interface.cairo index 603a52f42..aa5e8e9fa 100644 --- a/crates/contracts/src/kakarot_core/interface.cairo +++ b/crates/contracts/src/kakarot_core/interface.cairo @@ -88,6 +88,9 @@ pub trait IExtendedKakarotCore { /// Executes an EVM transaction and possibly modifies the state fn eth_send_transaction(ref self: TContractState, tx: Transaction) -> (bool, Span, u64); + // Returns the transaction count (nonce) of the specified address + fn eth_get_transaction_count(self: @TContractState, address: EthAddress) -> u64; + /// Upgrade the KakarotCore smart contract /// Using replace_class_syscall fn upgrade(ref self: TContractState, new_class_hash: ClassHash); From 9307546b552298ed1c1da5da5466debedb4bcdce Mon Sep 17 00:00:00 2001 From: enitrat Date: Mon, 30 Sep 2024 14:27:56 +0200 Subject: [PATCH 6/7] fix tests --- crates/contracts/src/kakarot_core/eth_rpc.cairo | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/crates/contracts/src/kakarot_core/eth_rpc.cairo b/crates/contracts/src/kakarot_core/eth_rpc.cairo index 34076c35c..cd1fbce3d 100644 --- a/crates/contracts/src/kakarot_core/eth_rpc.cairo +++ b/crates/contracts/src/kakarot_core/eth_rpc.cairo @@ -134,6 +134,7 @@ pub impl EthRPC< fn eth_get_transaction_count(self: @TContractState, address: EthAddress) -> u64 { let kakarot_state = KakarotState::get_state(); let starknet_address = kakarot_state.get_starknet_address(address); + println!("starknet_address: {:?}", starknet_address); let account = IAccountDispatcher { contract_address: starknet_address }; let nonce = account.get_nonce(); nonce @@ -229,10 +230,10 @@ mod tests { use crate::kakarot_core::eth_rpc::IEthRPC; use crate::kakarot_core::interface::IExtendedKakarotCoreDispatcherTrait; use crate::test_utils::{setup_contracts_for_testing, fund_account_with_native_token}; - use evm::test_utils::{sequencer_evm_address, evm_address}; - use snforge_std::{start_cheat_chain_id_global, stop_cheat_chain_id_global}; + use evm::test_utils::{sequencer_evm_address, evm_address, uninitialized_account}; + use snforge_std::{start_mock_call, start_cheat_chain_id_global, stop_cheat_chain_id_global, test_address}; use utils::constants::POW_2_53; - use evm::test_utils::evm_address; + use utils::helpers::compute_starknet_address; fn set_up() -> KakarotCore::ContractState { // Define the kakarot state to access contract functions @@ -247,10 +248,13 @@ mod tests { #[test] fn test_eth_get_transaction_count() { - let (_, kakarot_core) = setup_contracts_for_testing(); - let _ = deploy_eoa(kakarot_core, evm_address()); + let kakarot_state = set_up(); // Deployed eoa should return a zero nonce - assert_eq!(kakarot_core.eth_get_transaction_count(evm_address()), 0); + let starknet_address = compute_starknet_address( + test_address(), evm_address(), 0.try_into().unwrap() // Using 0 as the kakarot storage is empty + ); + start_mock_call::(starknet_address, selector!("get_nonce"), 1); + assert_eq!(kakarot_state.eth_get_transaction_count(evm_address()), 1); } #[test] From 741bbd5efe7495f6f1328e0a744f2dff48eb4024 Mon Sep 17 00:00:00 2001 From: enitrat Date: Mon, 30 Sep 2024 15:25:30 +0200 Subject: [PATCH 7/7] fmt --- crates/contracts/src/kakarot_core/eth_rpc.cairo | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/crates/contracts/src/kakarot_core/eth_rpc.cairo b/crates/contracts/src/kakarot_core/eth_rpc.cairo index cd1fbce3d..c824fb4f6 100644 --- a/crates/contracts/src/kakarot_core/eth_rpc.cairo +++ b/crates/contracts/src/kakarot_core/eth_rpc.cairo @@ -231,7 +231,9 @@ mod tests { use crate::kakarot_core::interface::IExtendedKakarotCoreDispatcherTrait; use crate::test_utils::{setup_contracts_for_testing, fund_account_with_native_token}; use evm::test_utils::{sequencer_evm_address, evm_address, uninitialized_account}; - use snforge_std::{start_mock_call, start_cheat_chain_id_global, stop_cheat_chain_id_global, test_address}; + use snforge_std::{ + start_mock_call, start_cheat_chain_id_global, stop_cheat_chain_id_global, test_address + }; use utils::constants::POW_2_53; use utils::helpers::compute_starknet_address; @@ -251,7 +253,9 @@ mod tests { let kakarot_state = set_up(); // Deployed eoa should return a zero nonce let starknet_address = compute_starknet_address( - test_address(), evm_address(), 0.try_into().unwrap() // Using 0 as the kakarot storage is empty + test_address(), + evm_address(), + 0.try_into().unwrap() // Using 0 as the kakarot storage is empty ); start_mock_call::(starknet_address, selector!("get_nonce"), 1); assert_eq!(kakarot_state.eth_get_transaction_count(evm_address()), 1);