Skip to content

Commit 2e50c47

Browse files
committed
fix(provider): fix return invalid proofs
1 parent d4862e6 commit 2e50c47

File tree

4 files changed

+26
-8
lines changed

4 files changed

+26
-8
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/storage/provider/provider/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ katana-chain-spec.workspace = true
4343
katana-contracts.workspace = true
4444
katana-runner.workspace = true
4545

46+
similar-asserts.workspace = true
4647
alloy-primitives.workspace = true
4748
lazy_static.workspace = true
4849
rand.workspace = true

crates/storage/provider/provider/src/providers/fork/state.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ impl<Db: Database> StateProofProvider for LatestStateProvider<Db> {
219219
let result = self.fork_db.backend.get_contracts_proofs(addresses, fork_point)?;
220220
let proofs = result.expect("proofs should exist for block");
221221

222-
Ok(proofs.classes_proof.nodes.into())
222+
Ok(proofs.contracts_proof.nodes.into())
223223
} else {
224224
Err(ProviderError::StateProofNotSupported)
225225
}
@@ -490,7 +490,7 @@ impl<Db: Database> StateProofProvider for HistoricalStateProvider<Db> {
490490
let result = self.fork_db.backend.get_contracts_proofs(addresses, self.provider.block())?;
491491
let proofs = result.expect("block should exist");
492492

493-
Ok(proofs.classes_proof.nodes.into())
493+
Ok(proofs.contracts_proof.nodes.into())
494494
}
495495

496496
fn storage_multiproof(

crates/storage/provider/provider/tests/fork.rs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use katana_provider::api::transaction::{ReceiptProvider, TransactionProvider};
1313
use katana_provider::providers::fork::ForkedProvider;
1414
use katana_provider::ProviderError;
1515
use katana_rpc_client::starknet::Client as StarknetClient;
16-
use katana_rpc_types::Nodes;
16+
use katana_rpc_types::MerkleNode;
1717

1818
const SEPOLIA_RPC_URL: &str = "https://api.cartridge.gg/x/starknet/sepolia";
1919
const FORK_BLOCK_NUMBER: u64 = 2888618;
@@ -298,14 +298,16 @@ async fn historical_fork_state() {
298298
assert!(result2.is_some());
299299
}
300300

301-
#[ignore]
302301
#[tokio::test(flavor = "multi_thread")]
303302
async fn pre_fork_state_proof() {
304303
let starknet_client = StarknetClient::new(SEPOLIA_RPC_URL.try_into().unwrap());
305304

306305
// always use the latest block number of the forked chain because most nodes may not support
307306
// proofs for too old blocks
308-
let latest_block_number = starknet_client.block_number().await.unwrap().block_number;
307+
//
308+
// we take the previous block because there were some instances where the latest block was not
309+
// available or supported by the node.
310+
let latest_block_number = starknet_client.block_number().await.unwrap().block_number - 1;
309311
let provider = ForkedProvider::new_ephemeral(latest_block_number, starknet_client.clone());
310312

311313
let state = provider.latest().unwrap();
@@ -318,18 +320,32 @@ async fn pre_fork_state_proof() {
318320
.await
319321
.unwrap();
320322

321-
assert_eq!(Nodes::from(proofs), expected_proofs.classes_proof.nodes);
323+
// TODO: assert the nodes ordering - ensure they are in the same order. currently, pathfinder
324+
// doesn't return the nodes in the same order as katana.
325+
assert_eq!(proofs.0.len(), expected_proofs.classes_proof.nodes.len());
326+
for expected_node in expected_proofs.classes_proof.nodes.0.into_iter() {
327+
let node_hash = expected_node.node_hash;
328+
let actual_node = proofs.0.get(&node_hash).cloned().map(MerkleNode::from);
329+
assert_eq!(Some(expected_node.node), actual_node)
330+
}
322331

323332
let contracts =
324-
vec![address!("0x0164b86b8fC5C0c84d3c53Bc95760F290420Ea2a32ed49A44fd046683a1CaAc2")];
333+
vec![address!("0x04f4e29add19afa12c868ba1f4439099f225403ff9a71fe667eebb50e13518d3")];
325334
let proofs = state.contract_multiproof(contracts.clone()).unwrap();
326335

327336
let expected_proofs = starknet_client
328337
.get_storage_proof(latest_block_number.into(), None, Some(contracts), None)
329338
.await
330339
.unwrap();
331340

332-
assert_eq!(Nodes::from(proofs), expected_proofs.classes_proof.nodes);
341+
// TODO: assert the nodes ordering - ensure they are in the same order. currently, pathfinder
342+
// doesn't return the nodes in the same order as katana.
343+
assert_eq!(proofs.0.len(), expected_proofs.contracts_proof.nodes.len());
344+
for expected_node in expected_proofs.contracts_proof.nodes.0.into_iter() {
345+
let node_hash = expected_node.node_hash;
346+
let actual_node = proofs.0.get(&node_hash).cloned().map(MerkleNode::from);
347+
assert_eq!(Some(expected_node.node), actual_node)
348+
}
333349
}
334350

335351
#[tokio::test]

0 commit comments

Comments
 (0)