From 4e0dcff6df3fd4dd67a8f6adb0fb57146a44bbae Mon Sep 17 00:00:00 2001 From: antiyro Date: Mon, 17 Jun 2024 12:32:29 +0200 Subject: [PATCH 1/5] get class hash at --- Cargo.lock | 1 + unit_tests/tests/test_get_class_hash_at.rs | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0b1a618..6df7a92 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2815,6 +2815,7 @@ name = "unit_tests" version = "0.1.0" dependencies = [ "anyhow", + "base64 0.13.1", "colored", "env_logger", "flate2", diff --git a/unit_tests/tests/test_get_class_hash_at.rs b/unit_tests/tests/test_get_class_hash_at.rs index 4437eee..a1c98c1 100644 --- a/unit_tests/tests/test_get_class_hash_at.rs +++ b/unit_tests/tests/test_get_class_hash_at.rs @@ -85,21 +85,20 @@ async fn fail_non_existing_contract(clients: HashMap>) { let deoxys = &clients[DEOXYS]; let pathfinder = &clients[PATHFINDER]; let class_hash_deoxys = deoxys .get_class_hash_at( - BlockId::Tag(BlockTag::Latest), + BlockId::Number(200000), FieldElement::from_hex_be(STARKGATE_ETH_CONTRACT_ADDR).unwrap(), ) .await .expect("Error waiting for response from Deoxys node"); let class_hash_pathfinder = pathfinder .get_class_hash_at( - BlockId::Tag(BlockTag::Latest), + BlockId::Number(200000), FieldElement::from_hex_be(STARKGATE_ETH_CONTRACT_ADDR).unwrap(), ) .await From e9799742af3d199f38ee2e3845e4e61d56fd3810 Mon Sep 17 00:00:00 2001 From: antiyro Date: Mon, 17 Jun 2024 13:30:15 +0200 Subject: [PATCH 2/5] sort --- unit_tests/tests/test_get_state_update.rs | 30 ++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/unit_tests/tests/test_get_state_update.rs b/unit_tests/tests/test_get_state_update.rs index b1a6768..14aeec0 100644 --- a/unit_tests/tests/test_get_state_update.rs +++ b/unit_tests/tests/test_get_state_update.rs @@ -5,7 +5,7 @@ use common::*; use starknet_core::types::{BlockId, StarknetError}; use starknet_providers::{jsonrpc::HttpTransport, JsonRpcClient, Provider}; -use std::collections::HashMap; +use std::{collections::HashMap, os::macos::raw}; /// Test for the `get_state_update` Deoxys RPC method /// # Arguments @@ -46,8 +46,9 @@ async fn fail_non_existing_block(clients: HashMap>) { let deoxys = &clients[DEOXYS]; let pathfinder = &clients[PATHFINDER]; + let juno = &clients[JUNO]; - let block_number = BlockId::Number(100); + let block_number = BlockId::Number(10000); let response_deoxys = deoxys .get_state_update(block_number) @@ -57,6 +58,29 @@ async fn work_existing_block(clients: HashMap = raw_deoxys.chars().collect(); + sorted_deoxys.sort(); // Use sort instead of sort_unstable + let sorted_deoxys: String = sorted_deoxys.into_iter().collect(); + + let mut sorted_pathfinder: Vec = raw_pathfinder.chars().collect(); + sorted_pathfinder.sort(); // Use sort instead of sort_unstable + let sorted_pathfinder: String = sorted_pathfinder.into_iter().collect(); + + let mut sorted_juno: Vec = raw_juno.chars().collect(); + sorted_juno.sort(); // Use sort instead of sort_unstable + let sorted_juno: String = sorted_juno.into_iter().collect(); + + assert_eq!(sorted_deoxys, sorted_pathfinder, "The sorted responses do not match"); + assert_eq!(sorted_deoxys, sorted_juno, "The sorted responses do not match"); + assert_eq!(sorted_juno, sorted_pathfinder, "The sorted responses do not match"); } + From 7a6e4c3d42711fcb56fed213237a98f8233b2638 Mon Sep 17 00:00:00 2001 From: antiyro Date: Mon, 17 Jun 2024 14:52:49 +0200 Subject: [PATCH 3/5] sorted state updates --- unit_tests/tests/test_get_state_update.rs | 141 +++++++++++++++++++--- 1 file changed, 125 insertions(+), 16 deletions(-) diff --git a/unit_tests/tests/test_get_state_update.rs b/unit_tests/tests/test_get_state_update.rs index 14aeec0..aae9445 100644 --- a/unit_tests/tests/test_get_state_update.rs +++ b/unit_tests/tests/test_get_state_update.rs @@ -3,9 +3,35 @@ mod common; use common::*; -use starknet_core::types::{BlockId, StarknetError}; +use starknet_core::types::{BlockId, BlockTag, MaybePendingStateUpdate, StarknetError, StateUpdate}; use starknet_providers::{jsonrpc::HttpTransport, JsonRpcClient, Provider}; -use std::{collections::HashMap, os::macos::raw}; +use std::collections::HashMap; + +pub fn extract_and_sort_state_update(maybe_update: MaybePendingStateUpdate) -> Option { + match maybe_update { + MaybePendingStateUpdate::Update(state_update) => Some(sort_state_update(state_update)), + MaybePendingStateUpdate::PendingUpdate(_) => None, // or handle pending update if necessary + } +} + +pub fn sort_state_update(state_update: StateUpdate) -> StateUpdate { + let mut sorted_state_update = state_update.clone(); + let state_diff = &mut sorted_state_update.state_diff; + let storage_diffs = &mut state_diff.storage_diffs; + + for storage_diff in storage_diffs.iter_mut() { + storage_diff.storage_entries.sort_by_key(|x| x.key); + } + + storage_diffs.sort_by_key(|x| x.address); + state_diff.deprecated_declared_classes.sort(); + state_diff.declared_classes.sort_by_key(|x| x.class_hash); + state_diff.deployed_contracts.sort_by_key(|x| x.address); + state_diff.replaced_classes.sort_by_key(|x| x.contract_address); + state_diff.nonces.sort_by_key(|x| x.contract_address); + + sorted_state_update +} /// Test for the `get_state_update` Deoxys RPC method /// # Arguments @@ -43,12 +69,12 @@ async fn fail_non_existing_block(clients: HashMap>) { +async fn work_genesis_block(clients: HashMap>) { let deoxys = &clients[DEOXYS]; let pathfinder = &clients[PATHFINDER]; let juno = &clients[JUNO]; - let block_number = BlockId::Number(10000); + let block_number = BlockId::Number(0); let response_deoxys = deoxys .get_state_update(block_number) @@ -63,24 +89,107 @@ async fn work_existing_block(clients: HashMap>) { + let deoxys = &clients[DEOXYS]; + let pathfinder = &clients[PATHFINDER]; + let juno = &clients[JUNO]; - let mut sorted_deoxys: Vec = raw_deoxys.chars().collect(); - sorted_deoxys.sort(); // Use sort instead of sort_unstable - let sorted_deoxys: String = sorted_deoxys.into_iter().collect(); + let block_number = BlockId::Number(250000); - let mut sorted_pathfinder: Vec = raw_pathfinder.chars().collect(); - sorted_pathfinder.sort(); // Use sort instead of sort_unstable - let sorted_pathfinder: String = sorted_pathfinder.into_iter().collect(); + let response_deoxys = deoxys + .get_state_update(block_number) + .await + .expect("Deoxys : Error while getting the state update"); + let response_pathfinder = pathfinder + .get_state_update(block_number) + .await + .expect("RPC : Error while getting the state update"); + let response_juno = juno + .get_state_update(block_number) + .await + .expect("RPC : Error while getting the state update"); - let mut sorted_juno: Vec = raw_juno.chars().collect(); - sorted_juno.sort(); // Use sort instead of sort_unstable - let sorted_juno: String = sorted_juno.into_iter().collect(); + // Extract and sort the updates + let sorted_deoxys = extract_and_sort_state_update(response_deoxys); + let sorted_pathfinder = extract_and_sort_state_update(response_pathfinder); + let sorted_juno = extract_and_sort_state_update(response_juno); assert_eq!(sorted_deoxys, sorted_pathfinder, "The sorted responses do not match"); assert_eq!(sorted_deoxys, sorted_juno, "The sorted responses do not match"); assert_eq!(sorted_juno, sorted_pathfinder, "The sorted responses do not match"); } +#[rstest] +#[tokio::test] +async fn work_loop_existing_block(clients: HashMap>) { + let deoxys = &clients[DEOXYS]; + let pathfinder = &clients[PATHFINDER]; + let juno = &clients[JUNO]; + + for i in 0..5q { + let block_number = BlockId::Number(i * 10000); + let response_deoxys = deoxys + .get_state_update(block_number) + .await + .expect("Deoxys : Error while getting the state update"); + let response_pathfinder = pathfinder + .get_state_update(block_number) + .await + .expect("RPC : Error while getting the state update"); + let response_juno = juno + .get_state_update(block_number) + .await + .expect("RPC : Error while getting the state update"); + + // Extract and sort the updates + let sorted_deoxys = extract_and_sort_state_update(response_deoxys); + let sorted_pathfinder = extract_and_sort_state_update(response_pathfinder); + let sorted_juno = extract_and_sort_state_update(response_juno); + + assert_eq!(sorted_deoxys, sorted_pathfinder, "The sorted responses do not match"); + assert_eq!(sorted_deoxys, sorted_juno, "The sorted responses do not match"); + assert_eq!(sorted_juno, sorted_pathfinder, "The sorted responses do not match"); + } +} + +#[rstest] +#[tokio::test] +async fn work_block_pending(clients: HashMap>) { + let deoxys = &clients[DEOXYS]; + let pathfinder = &clients[PATHFINDER]; + let juno = &clients[JUNO]; + + let block_number = BlockId::Tag(BlockTag::Pending); + let response_deoxys = deoxys + .get_state_update(block_number) + .await + .expect("Deoxys : Error while getting the state update"); + let response_pathfinder = pathfinder + .get_state_update(block_number) + .await + .expect("RPC : Error while getting the state update"); + let response_juno = juno + .get_state_update(block_number) + .await + .expect("RPC : Error while getting the state update"); + + // Extract and sort the updates + let sorted_deoxys = extract_and_sort_state_update(response_deoxys); + let sorted_pathfinder = extract_and_sort_state_update(response_pathfinder); + let sorted_juno = extract_and_sort_state_update(response_juno); + + assert_eq!(sorted_deoxys, sorted_pathfinder, "The sorted responses do not match"); + assert_eq!(sorted_deoxys, sorted_juno, "The sorted responses do not match"); + assert_eq!(sorted_juno, sorted_pathfinder, "The sorted responses do not match"); +} From a9d3669ae1ca595aeb3bca9c13cce61344a708ef Mon Sep 17 00:00:00 2001 From: antiyro Date: Mon, 17 Jun 2024 14:53:04 +0200 Subject: [PATCH 4/5] fixed --- unit_tests/tests/test_get_state_update.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit_tests/tests/test_get_state_update.rs b/unit_tests/tests/test_get_state_update.rs index aae9445..b25dfb1 100644 --- a/unit_tests/tests/test_get_state_update.rs +++ b/unit_tests/tests/test_get_state_update.rs @@ -137,7 +137,7 @@ async fn work_loop_existing_block(clients: HashMap Date: Mon, 17 Jun 2024 14:54:49 +0200 Subject: [PATCH 5/5] working --- unit_tests/tests/test_get_state_update.rs | 32 +++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/unit_tests/tests/test_get_state_update.rs b/unit_tests/tests/test_get_state_update.rs index b25dfb1..cd46deb 100644 --- a/unit_tests/tests/test_get_state_update.rs +++ b/unit_tests/tests/test_get_state_update.rs @@ -165,6 +165,7 @@ async fn work_loop_existing_block(clients: HashMap>) { let deoxys = &clients[DEOXYS]; let pathfinder = &clients[PATHFINDER]; @@ -193,3 +194,34 @@ async fn work_block_pending(clients: HashMap>) { + let deoxys = &clients[DEOXYS]; + let pathfinder = &clients[PATHFINDER]; + let juno = &clients[JUNO]; + + let block_number = BlockId::Tag(BlockTag::Latest); + let response_deoxys = deoxys + .get_state_update(block_number) + .await + .expect("Deoxys : Error while getting the state update"); + let response_pathfinder = pathfinder + .get_state_update(block_number) + .await + .expect("RPC : Error while getting the state update"); + let response_juno = juno + .get_state_update(block_number) + .await + .expect("RPC : Error while getting the state update"); + + // Extract and sort the updates + let sorted_deoxys = extract_and_sort_state_update(response_deoxys); + let sorted_pathfinder = extract_and_sort_state_update(response_pathfinder); + let sorted_juno = extract_and_sort_state_update(response_juno); + + assert_eq!(sorted_deoxys, sorted_pathfinder, "The sorted responses do not match"); + assert_eq!(sorted_deoxys, sorted_juno, "The sorted responses do not match"); + assert_eq!(sorted_juno, sorted_pathfinder, "The sorted responses do not match"); +}