diff --git a/Cargo.lock b/Cargo.lock index 8647ae5..af017f8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1272,9 +1272,9 @@ dependencies = [ "quote", "serde", "serde_json", - "starknet", - "starknet-core", - "starknet-providers", + "starknet 0.7.0", + "starknet-core 0.7.2", + "starknet-providers 0.7.0", "syn 2.0.48", "tokio", "url", @@ -2147,14 +2147,29 @@ name = "starknet" version = "0.7.0" source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36#64ebc364c0c346e81b715c5b4a3b32ef37b055c8" dependencies = [ - "starknet-accounts", - "starknet-contract", - "starknet-core", - "starknet-crypto", - "starknet-ff", - "starknet-macros", - "starknet-providers", - "starknet-signers", + "starknet-accounts 0.6.1", + "starknet-contract 0.6.0", + "starknet-core 0.7.2", + "starknet-crypto 0.6.1 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "starknet-macros 0.1.4", + "starknet-providers 0.7.0", + "starknet-signers 0.5.0", +] + +[[package]] +name = "starknet" +version = "0.8.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "starknet-accounts 0.7.0", + "starknet-contract 0.7.0", + "starknet-core 0.8.0", + "starknet-crypto 0.6.1 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", + "starknet-macros 0.1.5", + "starknet-providers 0.8.0", + "starknet-signers 0.6.0", ] [[package]] @@ -2164,9 +2179,22 @@ source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36#64ebc3 dependencies = [ "async-trait", "auto_impl", - "starknet-core", - "starknet-providers", - "starknet-signers", + "starknet-core 0.7.2", + "starknet-providers 0.7.0", + "starknet-signers 0.5.0", + "thiserror", +] + +[[package]] +name = "starknet-accounts" +version = "0.7.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "async-trait", + "auto_impl", + "starknet-core 0.8.0", + "starknet-providers 0.8.0", + "starknet-signers 0.6.0", "thiserror", ] @@ -2178,9 +2206,23 @@ dependencies = [ "serde", "serde_json", "serde_with", - "starknet-accounts", - "starknet-core", - "starknet-providers", + "starknet-accounts 0.6.1", + "starknet-core 0.7.2", + "starknet-providers 0.7.0", + "thiserror", +] + +[[package]] +name = "starknet-contract" +version = "0.7.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "serde", + "serde_json", + "serde_with", + "starknet-accounts 0.7.0", + "starknet-core 0.8.0", + "starknet-providers 0.8.0", "thiserror", ] @@ -2197,8 +2239,25 @@ dependencies = [ "serde_json_pythonic", "serde_with", "sha3", - "starknet-crypto", - "starknet-ff", + "starknet-crypto 0.6.1 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", +] + +[[package]] +name = "starknet-core" +version = "0.8.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "base64 0.21.6", + "flate2", + "hex", + "serde", + "serde_json", + "serde_json_pythonic", + "serde_with", + "sha3", + "starknet-crypto 0.6.1 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", ] [[package]] @@ -2214,9 +2273,28 @@ dependencies = [ "num-traits", "rfc6979", "sha2", - "starknet-crypto-codegen", - "starknet-curve", - "starknet-ff", + "starknet-crypto-codegen 0.3.2 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "starknet-curve 0.4.0 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "zeroize", +] + +[[package]] +name = "starknet-crypto" +version = "0.6.1" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "crypto-bigint", + "hex", + "hmac", + "num-bigint", + "num-integer", + "num-traits", + "rfc6979", + "sha2", + "starknet-crypto-codegen 0.3.2 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", + "starknet-curve 0.4.0 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", "zeroize", ] @@ -2225,8 +2303,18 @@ name = "starknet-crypto-codegen" version = "0.3.2" source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36#64ebc364c0c346e81b715c5b4a3b32ef37b055c8" dependencies = [ - "starknet-curve", - "starknet-ff", + "starknet-curve 0.4.0 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "syn 2.0.48", +] + +[[package]] +name = "starknet-crypto-codegen" +version = "0.3.2" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "starknet-curve 0.4.0 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", "syn 2.0.48", ] @@ -2235,7 +2323,15 @@ name = "starknet-curve" version = "0.4.0" source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36#64ebc364c0c346e81b715c5b4a3b32ef37b055c8" dependencies = [ - "starknet-ff", + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", +] + +[[package]] +name = "starknet-curve" +version = "0.4.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "starknet-ff 0.3.5 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", ] [[package]] @@ -2251,12 +2347,34 @@ dependencies = [ "serde", ] +[[package]] +name = "starknet-ff" +version = "0.3.5" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "ark-ff", + "bigdecimal", + "crypto-bigint", + "getrandom", + "hex", + "serde", +] + [[package]] name = "starknet-macros" version = "0.1.4" source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36#64ebc364c0c346e81b715c5b4a3b32ef37b055c8" dependencies = [ - "starknet-core", + "starknet-core 0.7.2", + "syn 2.0.48", +] + +[[package]] +name = "starknet-macros" +version = "0.1.5" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "starknet-core 0.8.0", "syn 2.0.48", ] @@ -2274,7 +2392,26 @@ dependencies = [ "serde", "serde_json", "serde_with", - "starknet-core", + "starknet-core 0.7.2", + "thiserror", + "url", +] + +[[package]] +name = "starknet-providers" +version = "0.8.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "async-trait", + "auto_impl", + "ethereum-types", + "flate2", + "log", + "reqwest", + "serde", + "serde_json", + "serde_with", + "starknet-core 0.8.0", "thiserror", "url", ] @@ -2289,8 +2426,23 @@ dependencies = [ "crypto-bigint", "eth-keystore", "rand", - "starknet-core", - "starknet-crypto", + "starknet-core 0.7.2", + "starknet-crypto 0.6.1 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=64ebc36)", + "thiserror", +] + +[[package]] +name = "starknet-signers" +version = "0.6.0" +source = "git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803#96c6803118773d9fd1d74fcf1465763f11a080a1" +dependencies = [ + "async-trait", + "auto_impl", + "crypto-bigint", + "eth-keystore", + "rand", + "starknet-core 0.8.0", + "starknet-crypto 0.6.1 (git+https://github.com/xJonathanLEI/starknet-rs.git?rev=96c6803)", "thiserror", ] @@ -2655,9 +2807,11 @@ dependencies = [ "rstest", "serde", "serde_json", - "starknet", - "starknet-core", - "starknet-providers", + "starknet 0.8.0", + "starknet-accounts 0.7.0", + "starknet-core 0.8.0", + "starknet-providers 0.8.0", + "starknet-signers 0.6.0", "tokio", "url", ] diff --git a/unit_tests/Cargo.toml b/unit_tests/Cargo.toml index 2255c0a..fb95f28 100644 --- a/unit_tests/Cargo.toml +++ b/unit_tests/Cargo.toml @@ -9,12 +9,14 @@ edition = "2021" anyhow = "1.0.79" rstest = "0.18.2" tokio = { version = "1", features = ["full"] } -starknet = { git = "https://github.com/xJonathanLEI/starknet-rs.git", rev = "64ebc36", default-features = false } -starknet-core = { git = "https://github.com/xJonathanLEI/starknet-rs.git", rev = "64ebc36", default-features = false } -starknet-providers = { git = "https://github.com/xJonathanLEI/starknet-rs.git", rev = "64ebc36", default-features = false } +url = "2.5.0" +starknet = { git = "https://github.com/xJonathanLEI/starknet-rs.git", rev = "96c6803", default-features = false } +starknet-core = { git = "https://github.com/xJonathanLEI/starknet-rs.git", rev = "96c6803", default-features = false } +starknet-providers = { git = "https://github.com/xJonathanLEI/starknet-rs.git", rev = "96c6803", default-features = false } +starknet-accounts = { git = "https://github.com/xJonathanLEI/starknet-rs.git", rev = "96c6803", default-features = false } +starknet-signers = { git = "https://github.com/xJonathanLEI/starknet-rs.git", rev = "96c6803", default-features = false } env_logger = "0.10.1" macro_utils = { path = "../macro_utils/" } -url = "2.5.0" [dev-dependencies] jsonrpsee = { version = "0.21.0", features = ["client"] } diff --git a/unit_tests/src/constants.rs b/unit_tests/src/constants.rs index c4a9e5c..070ee5b 100644 --- a/unit_tests/src/constants.rs +++ b/unit_tests/src/constants.rs @@ -142,6 +142,12 @@ pub const ETHEREUM_ADDRESS: &str = ""; pub const INVALID_ETHEREUM_ADDRESS: &str = ""; pub const SELECTOR_NAME: &str = ""; +/// +/// Value to be used as a signer for simulate_transaction tests. +/// +pub const SIGNER_PRIVATE: &str = ""; +pub const ARGENT_CONTRACT_ADDRESS: &str = ""; + pub const ERR_DEOXYS: &str = "Error waiting for response from Deoxys client"; pub const ERR_PATHFINDER: &str = "Error waiting for response from Pathfinder client"; diff --git a/unit_tests/src/lib.rs b/unit_tests/src/lib.rs index d1d3efd..c948462 100644 --- a/unit_tests/src/lib.rs +++ b/unit_tests/src/lib.rs @@ -1,10 +1,14 @@ #![feature(assert_matches)] use constants::*; +use starknet_accounts::{Account, Call, ConnectedAccount, Execution, SingleOwnerAccount}; +use starknet_core::chain_id; use starknet_core::{ types::{BroadcastedInvokeTransaction, BroadcastedTransaction, FieldElement}, utils::get_selector_from_name, }; +use starknet_providers::{jsonrpc::HttpTransport, JsonRpcClient}; +use starknet_signers::{LocalWallet, SigningKey}; pub mod constants; pub mod fixtures; @@ -48,3 +52,103 @@ impl TransactionFactory for BadTransactionFactory { }) } } + +pub struct MaxFeeTransactionFactory; + +impl TransactionFactory for MaxFeeTransactionFactory { + fn build(_: Option) -> BroadcastedTransaction { + BroadcastedTransaction::Invoke(BroadcastedInvokeTransaction { + max_fee: FieldElement::from_hex_be("0x100000000000000000000000000000000").unwrap(), + signature: vec![], + nonce: FieldElement::ZERO, + sender_address: FieldElement::from_hex_be(ACCOUNT_CONTRACT).unwrap(), + calldata: vec![ + FieldElement::from_hex_be(TEST_CONTRACT_ADDRESS).unwrap(), + get_selector_from_name("sqrt").unwrap(), + FieldElement::from_hex_be("1").unwrap(), + FieldElement::from(81u8), + ], + is_query: false, + }) + } +} + +type RpcAccount<'a> = SingleOwnerAccount<&'a JsonRpcClient, LocalWallet>; + +pub fn build_single_owner_account<'a>( + rpc: &'a JsonRpcClient, + private_key: &str, + account_address: &str, + is_legacy: bool, +) -> RpcAccount<'a> { + let signer = LocalWallet::from(SigningKey::from_secret_scalar( + FieldElement::from_hex_be(private_key).unwrap(), + )); + let account_address = + FieldElement::from_hex_be(account_address).expect("Invalid Contract Address"); + let execution_encoding = if is_legacy { + starknet_accounts::ExecutionEncoding::Legacy + } else { + starknet_accounts::ExecutionEncoding::New + }; + SingleOwnerAccount::new( + rpc, + signer, + account_address, + chain_id::TESTNET, + execution_encoding, + ) +} + +#[allow(async_fn_in_trait)] +pub trait PrepareInvoke { + async fn prepare_invoke( + &self, + calls: Vec, + nonce: FieldElement, + max_fee: FieldElement, + query_only: bool, + ) -> BroadcastedInvokeTransaction; +} + +impl PrepareInvoke for SingleOwnerAccount<&JsonRpcClient, LocalWallet> { + async fn prepare_invoke( + &self, + calls: Vec, + nonce: FieldElement, + max_fee: FieldElement, + query_only: bool, + ) -> BroadcastedInvokeTransaction + where + Self: Account + ConnectedAccount, + { + let prepared_execution = Execution::new(calls, self) + .nonce(nonce) + .max_fee(max_fee) + .prepared() + .unwrap(); + prepared_execution + .get_invoke_request(query_only) + .await + .unwrap() + } +} + +pub fn generate_call( + contract_address: &str, + function_name: &str, + calldata_values: Vec, +) -> Call { + let to = FieldElement::from_hex_be(contract_address).unwrap(); + let selector = get_selector_from_name(function_name).unwrap(); + let calldata = calldata_values + .into_iter() + .map(FieldElement::from) + .collect(); + + Call { + to, + selector, + calldata, + } +} diff --git a/unit_tests/tests/test_call.rs b/unit_tests/tests/test_call.rs index 832ce3e..cd70692 100644 --- a/unit_tests/tests/test_call.rs +++ b/unit_tests/tests/test_call.rs @@ -9,10 +9,7 @@ use starknet_core::{ types::{BlockId, BlockTag, FieldElement, FunctionCall, StarknetError}, utils::get_selector_from_name, }; -use starknet_providers::{ - jsonrpc::HttpTransport, JsonRpcClient, MaybeUnknownErrorCode, Provider, ProviderError, - StarknetErrorWithMessage, -}; +use starknet_providers::{jsonrpc::HttpTransport, JsonRpcClient, Provider, ProviderError}; /// /// Unit test for `starknet_call` @@ -39,11 +36,8 @@ async fn fail_non_existing_block(clients: HashMap) { assert_matches!( response_deoxys, - Some(ProviderError::StarknetError(StarknetErrorWithMessage { - message: _, - code: MaybeUnknownErrorCode::Unknown(-32602) - })) + Some(ProviderError::StarknetError( + StarknetError::UnexpectedError(_) + )) //previous error : Unknown(-32602) ) } @@ -101,10 +97,9 @@ async fn fail_invalid_block_range(deoxys: JsonRpcClient) { // for some reason a block range of 0 results in an internal error assert_matches!( response_deoxys, - Some(ProviderError::StarknetError(StarknetErrorWithMessage { - message: _, - code: MaybeUnknownErrorCode::Unknown(-32603) - })) + Some(ProviderError::StarknetError( + StarknetError::UnexpectedError(_) + )) //previous error : Unknown(-32603) ) } diff --git a/unit_tests/tests/test_get_nonce.rs b/unit_tests/tests/test_get_nonce.rs index 1fe33f8..9c30955 100644 --- a/unit_tests/tests/test_get_nonce.rs +++ b/unit_tests/tests/test_get_nonce.rs @@ -5,10 +5,7 @@ use std::{assert_matches::assert_matches, collections::HashMap}; use common::*; use starknet_core::types::{BlockId, BlockTag, FieldElement, StarknetError}; -use starknet_providers::{ - jsonrpc::HttpTransport, JsonRpcClient, MaybeUnknownErrorCode, Provider, ProviderError, - StarknetErrorWithMessage, -}; +use starknet_providers::{jsonrpc::HttpTransport, JsonRpcClient, Provider, ProviderError}; /// /// Test for RPC call starknet_getNonce. @@ -47,10 +44,7 @@ async fn fail_non_existing_block(clients: HashMap>) { + let deoxys = &clients[DEOXYS]; + + let ok_invoke_transaction = OkTransactionFactory::build(Some(FieldElement::ZERO)); + + assert_matches!( + deoxys + .simulate_transactions( + BlockId::Hash(FieldElement::ZERO), + &[ok_invoke_transaction], + [] + ) + .await, + Err(ProviderError::StarknetError(StarknetError::BlockNotFound)) + ); +} + +#[rstest] +#[tokio::test] +async fn fail_max_fee_too_big(clients: HashMap>) { + let deoxys = &clients[DEOXYS]; + + let max_fee_transaction = MaxFeeTransactionFactory::build(Some(FieldElement::ZERO)); + + assert_matches!( + deoxys + .simulate_transactions(BlockId::Tag(BlockTag::Latest), &[max_fee_transaction], []) + .await, + Err(ProviderError::StarknetError( + StarknetError::UnexpectedError(_) + )) //TODO : compare this code error to pathfinder to be sure + ); +} + +#[rstest] +#[tokio::test] +async fn fail_if_one_txn_cannot_be_executed( + clients: HashMap>, +) { + let deoxys = &clients[DEOXYS]; + + let bad_invoke_transaction = BadTransactionFactory::build(None); + let ok_invoke_transaction = OkTransactionFactory::build(Some(FieldElement::ONE)); + + assert_matches!( + deoxys + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[bad_invoke_transaction, ok_invoke_transaction,], + [] + ) + .await, + Err(ProviderError::StarknetError(StarknetError::ContractError( + _ + ))) + ); +} + +#[rstest] +#[tokio::test] +async fn works_ok_on_no_validate(clients: HashMap>) { + let deoxys = &clients[DEOXYS]; + let pathfinder = &clients[PATHFINDER]; + + let tx = BroadcastedInvokeTransaction { + max_fee: FieldElement::from(420u16), + signature: vec![], + nonce: FieldElement::ZERO, + sender_address: FieldElement::from_hex_be(ACCOUNT_CONTRACT).unwrap(), + calldata: vec![ + FieldElement::from_hex_be(TEST_CONTRACT_ADDRESS).unwrap(), + get_selector_from_name("sqrt").unwrap(), + FieldElement::from_hex_be("1").unwrap(), + FieldElement::from(81u8), + ], + is_query: false, + }; + + let invoke_transaction = BroadcastedTransaction::Invoke(tx.clone()); + let invoke_transaction_2 = invoke_transaction.clone(); + + let invoked_transaction = BroadcastedTransaction::Invoke(BroadcastedInvokeTransaction { + nonce: FieldElement::ONE, + ..tx + }); + + let invoked_transaction_2 = invoked_transaction.clone(); + + let deoxys_simulations = deoxys + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[invoke_transaction, invoked_transaction], + [], + ) + .await + .unwrap(); + + let pathfinder_simulations = pathfinder + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[invoke_transaction_2, invoked_transaction_2], + [], + ) + .await + .unwrap(); + + assert_eq!(deoxys_simulations.len(), pathfinder_simulations.len()); + assert_eq!(deoxys_simulations, pathfinder_simulations); +} + +#[rstest] +#[tokio::test] +async fn works_ok_on_validate_with_signature( + clients: HashMap>, +) { + let deoxys = &clients[DEOXYS]; + let pathfinder = &clients[PATHFINDER]; + + let deoxys_funding_account = + build_single_owner_account(deoxys, SIGNER_PRIVATE, ARGENT_CONTRACT_ADDRESS, true); + let pathfinder_funding_account = + build_single_owner_account(pathfinder, SIGNER_PRIVATE, ARGENT_CONTRACT_ADDRESS, true); + let deoxys_nonce = deoxys_funding_account + .get_nonce() + .await + .expect("Failed to get deoxys nonce"); + let pathfinder_nonce = pathfinder_funding_account + .get_nonce() + .await + .expect("Failed to get pathfinder nonce"); + + let max_fee = FieldElement::from(1000u16); + + let deoxys_calls = vec![generate_call(TEST_CONTRACT_ADDRESS, "sqrt", vec![81u8])]; + let pathfinder_calls = vec![generate_call(TEST_CONTRACT_ADDRESS, "sqrt", vec![81u8])]; + + let tx_deoxys = deoxys_funding_account + .prepare_invoke(deoxys_calls, deoxys_nonce, max_fee, false) + .await; + let tx_pathfinder = pathfinder_funding_account + .prepare_invoke(pathfinder_calls, pathfinder_nonce, max_fee, false) + .await; + + let invoke_transaction_deoxys = BroadcastedTransaction::Invoke(tx_deoxys); + let invoke_transaction_pathfinder = BroadcastedTransaction::Invoke(tx_pathfinder); + + let deoxys_simulations = deoxys + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[invoke_transaction_deoxys], + [], + ) + .await + .unwrap(); + let pathfinder_simulations = pathfinder + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[invoke_transaction_pathfinder], + [], + ) + .await + .unwrap(); + + assert_eq!(deoxys_simulations.len(), pathfinder_simulations.len()); + assert_eq!(deoxys_simulations, pathfinder_simulations); +} + +#[rstest] +#[tokio::test] +async fn works_ok_on_validate_without_signature_with_skip_validate( + clients: HashMap>, +) { + let deoxys = &clients[DEOXYS]; + let pathfinder = &clients[PATHFINDER]; + + let deoxys_funding_account = + build_single_owner_account(&deoxys, SIGNER_PRIVATE, ARGENT_CONTRACT_ADDRESS, true); + let pathfinder_funding_account = + build_single_owner_account(&pathfinder, SIGNER_PRIVATE, ARGENT_CONTRACT_ADDRESS, true); + let deoxys_nonce = deoxys_funding_account + .get_nonce() + .await + .expect("Failed to get deoxys nonce"); + let pathfinder_nonce = pathfinder_funding_account + .get_nonce() + .await + .expect("Failed to get pathfinder nonce"); + + let max_fee = FieldElement::from(1000u16); + + let deoxys_calls = vec![generate_call(TEST_CONTRACT_ADDRESS, "sqrt", vec![81u8])]; + let pathfinder_calls = vec![generate_call(TEST_CONTRACT_ADDRESS, "sqrt", vec![81u8])]; + + let tx_deoxys = deoxys_funding_account + .prepare_invoke(deoxys_calls, deoxys_nonce, max_fee, false) + .await; + let tx_pathfinder = pathfinder_funding_account + .prepare_invoke(pathfinder_calls, pathfinder_nonce, max_fee, false) + .await; + + let invoke_transaction_deoxys = BroadcastedTransaction::Invoke(tx_deoxys); + let invoke_transaction_pathfinder = BroadcastedTransaction::Invoke(tx_pathfinder); + + let deoxys_simulations = deoxys + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[invoke_transaction_deoxys], + [SimulationFlag::SkipValidate], + ) + .await + .unwrap(); + + let pathfinder_simulations = pathfinder + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[invoke_transaction_pathfinder], + [SimulationFlag::SkipValidate], + ) + .await + .unwrap(); + + assert_eq!(deoxys_simulations.len(), pathfinder_simulations.len()); + assert_eq!(deoxys_simulations, pathfinder_simulations); +} + +#[rstest] +#[tokio::test] +async fn works_ok_without_max_fee_with_skip_fee_charge( + clients: HashMap>, +) { + let deoxys = &clients[DEOXYS]; + let pathfinder = &clients[PATHFINDER]; + + let tx = BroadcastedInvokeTransaction { + max_fee: FieldElement::from(0u8), + signature: vec![], + nonce: FieldElement::ZERO, + sender_address: FieldElement::from_hex_be(ACCOUNT_CONTRACT).unwrap(), + calldata: vec![ + FieldElement::from_hex_be(TEST_CONTRACT_ADDRESS).unwrap(), + get_selector_from_name("sqrt").unwrap(), + FieldElement::from_hex_be("1").unwrap(), + FieldElement::from(81u8), + ], + is_query: false, + }; + + let invoke_transaction = BroadcastedTransaction::Invoke(tx.clone()); + let invoke_transaction_2 = invoke_transaction.clone(); + + let invoked_transaction_deoxys = BroadcastedTransaction::Invoke(BroadcastedInvokeTransaction { + nonce: FieldElement::ONE, + ..tx + }); + let invoked_transaction_pathfinder = invoked_transaction_deoxys.clone(); + + let deoxys_simulations = deoxys + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[invoke_transaction, invoked_transaction_deoxys], + [SimulationFlag::SkipFeeCharge], + ) + .await + .unwrap(); + + let pathfinder_simulations = pathfinder + .simulate_transactions( + BlockId::Tag(BlockTag::Latest), + &[invoke_transaction_2, invoked_transaction_pathfinder], + [SimulationFlag::SkipFeeCharge], + ) + .await + .unwrap(); + + assert_eq!(deoxys_simulations.len(), pathfinder_simulations.len()); + assert_eq!(deoxys_simulations, pathfinder_simulations); +} diff --git a/unit_tests/tests/test_syncing.rs b/unit_tests/tests/test_syncing.rs index 9d51229..b03e8b6 100644 --- a/unit_tests/tests/test_syncing.rs +++ b/unit_tests/tests/test_syncing.rs @@ -1,13 +1,8 @@ mod common; use common::*; -use starknet::{ - core::types::SyncStatusType, - providers::{ - jsonrpc::{HttpTransport, JsonRpcClient}, - Provider, - }, -}; +use starknet_core::types::SyncStatusType; +use starknet_providers::{jsonrpc::HttpTransport, JsonRpcClient, Provider}; use std::collections::HashMap; ///