Skip to content

Commit 37884c8

Browse files
committed
forked block tests
1 parent e48339c commit 37884c8

File tree

2 files changed

+60
-22
lines changed

2 files changed

+60
-22
lines changed

crates/katana/rpc/rpc/src/starknet/mod.rs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -738,10 +738,8 @@ impl<EF: ExecutorFactory> StarknetApi<EF> {
738738
}
739739
}
740740

741-
if let Some(num) =
742-
BlockIdReader::convert_block_id(provider, block_id)?.map(BlockHashOrNumber::Num)
743-
{
744-
let block = katana_rpc_types_builder::BlockBuilder::new(num, provider)
741+
if let Some(num) = provider.convert_block_id(block_id)? {
742+
let block = katana_rpc_types_builder::BlockBuilder::new(num.into(), provider)
745743
.build()?
746744
.map(MaybePendingBlockWithTxs::Block);
747745

@@ -805,15 +803,15 @@ impl<EF: ExecutorFactory> StarknetApi<EF> {
805803
}
806804
}
807805

808-
let block_num = BlockIdReader::convert_block_id(provider, block_id)?
809-
.map(BlockHashOrNumber::Num)
810-
.ok_or(StarknetApiError::BlockNotFound)?;
811-
812-
let block = katana_rpc_types_builder::BlockBuilder::new(block_num, provider)
813-
.build_with_receipts()?
814-
.ok_or(StarknetApiError::BlockNotFound)?;
806+
if let Some(num) = provider.convert_block_id(block_id)? {
807+
let block = katana_rpc_types_builder::BlockBuilder::new(num.into(), provider)
808+
.build_with_receipts()?
809+
.map(MaybePendingBlockWithReceipts::Block);
815810

816-
StarknetApiResult::Ok(Some(MaybePendingBlockWithReceipts::Block(block)))
811+
StarknetApiResult::Ok(block)
812+
} else {
813+
StarknetApiResult::Ok(None)
814+
}
817815
})
818816
.await?;
819817

crates/katana/rpc/rpc/tests/forking.rs

Lines changed: 50 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -82,20 +82,28 @@ async fn can_fork() -> Result<()> {
8282
async fn assert_get_block_methods(provider: &impl Provider, num: BlockNumber) -> Result<()> {
8383
let id = BlockIdOrTag::Number(num);
8484

85-
let block = provider.get_block_with_txs(id).await?;
85+
let block =
86+
provider.get_block_with_txs(id).await.context(format!("failed to get block {num}"))?;
8687
assert_matches!(block, MaybePendingBlockWithTxs::Block(b) if b.block_number == num);
8788

88-
let block = provider.get_block_with_receipts(id).await?;
89+
let block = provider
90+
.get_block_with_receipts(id)
91+
.await
92+
.context(format!("failed to get block {num} w/ receipts"))?;
8993
assert_matches!(block, starknet::core::types::MaybePendingBlockWithReceipts::Block(b) if b.block_number == num);
9094

91-
let block = provider.get_block_with_tx_hashes(id).await?;
95+
let block = provider
96+
.get_block_with_tx_hashes(id)
97+
.await
98+
.context(format!("failed to get block {num} w/ hashes"))?;
9299
assert_matches!(block, starknet::core::types::MaybePendingBlockWithTxHashes::Block(b) if b.block_number == num);
93100

94101
let result = provider.get_block_transaction_count(id).await;
95102
assert!(result.is_ok());
96103

97-
let state = provider.get_state_update(id).await?;
98-
assert_matches!(state, starknet::core::types::MaybePendingStateUpdate::Update(_));
104+
// TODO: uncomment this once we include genesis forked state update
105+
// let state = provider.get_state_update(id).await?;
106+
// assert_matches!(state, starknet::core::types::MaybePendingStateUpdate::Update(_));
99107

100108
Ok(())
101109
}
@@ -104,19 +112,51 @@ async fn assert_get_block_methods(provider: &impl Provider, num: BlockNumber) ->
104112
async fn forked_blocks() -> Result<()> {
105113
let (_sequencer, provider, _) = setup_test().await;
106114

107-
let block_num = FORK_BLOCK_NUMBER;
115+
// -----------------------------------------------------------------------
116+
// Get the forked block
117+
118+
// https://sepolia.voyager.online/block/0x208950cfcbba73ecbda1c14e4d58d66a8d60655ea1b9dcf07c16014ae8a93cd
119+
let block_num = FORK_BLOCK_NUMBER; // 268471
108120
assert_get_block_methods(&provider, block_num).await?;
109121

110-
let block_num = FORK_BLOCK_NUMBER - 5;
122+
// -----------------------------------------------------------------------
123+
// Get a block before the forked block
124+
125+
// https://sepolia.voyager.online/block/0x42dc67af5003d212ac6cd784e72db945ea4d619898f30f422358ff215cbe1e4
126+
let block_num = FORK_BLOCK_NUMBER - 5; // 268466
111127
assert_get_block_methods(&provider, block_num).await?;
112128

129+
// -----------------------------------------------------------------------
130+
// Get a block that is locally generated
131+
113132
let block_num = FORK_BLOCK_NUMBER + 5;
114133
assert_get_block_methods(&provider, block_num).await?;
115134

135+
// -----------------------------------------------------------------------
136+
// Get a block that only exist in the forked chain
137+
138+
// https://sepolia.voyager.online/block/0x347a9fa25700e7a2d8f26b39c0ecf765be9a78c559b9cae722a659f25182d10
139+
// We only created 10 local blocks so this is fine.
140+
let id = BlockIdOrTag::Number(270_328);
141+
let result = provider.get_block_with_txs(id).await.unwrap_err();
142+
assert_provider_starknet_err!(result, StarknetError::BlockNotFound);
143+
144+
let result = provider.get_block_with_receipts(id).await.unwrap_err();
145+
assert_provider_starknet_err!(result, StarknetError::BlockNotFound);
146+
147+
let result = provider.get_block_with_tx_hashes(id).await.unwrap_err();
148+
assert_provider_starknet_err!(result, StarknetError::BlockNotFound);
149+
150+
let result = provider.get_block_transaction_count(id).await.unwrap_err();
151+
assert_provider_starknet_err!(result, StarknetError::BlockNotFound);
152+
153+
let result = provider.get_state_update(id).await.unwrap_err();
154+
assert_provider_starknet_err!(result, StarknetError::BlockNotFound);
155+
116156
// -----------------------------------------------------------------------
117157
// Get block that doesn't exist on the both the forked and local chain
118158

119-
let id = BlockIdOrTag::Number(BlockNumber::MAX);
159+
let id = BlockIdOrTag::Number(i64::MAX as u64);
120160
let result = provider.get_block_with_txs(id).await.unwrap_err();
121161
assert_provider_starknet_err!(result, StarknetError::BlockNotFound);
122162

@@ -139,13 +179,13 @@ async fn assert_get_transaction_methods(provider: &impl Provider, tx_hash: TxHas
139179
let tx = provider
140180
.get_transaction_by_hash(tx_hash)
141181
.await
142-
.with_context(|| format!("failed to get tx {tx_hash:#x}"))?;
182+
.context(format!("failed to get tx {tx_hash:#x}"))?;
143183
assert_eq!(*tx.transaction_hash(), tx_hash);
144184

145185
let tx = provider
146186
.get_transaction_receipt(tx_hash)
147187
.await
148-
.with_context(|| format!("failed to get receipt {tx_hash:#x}"))?;
188+
.context(format!("failed to get receipt {tx_hash:#x}"))?;
149189
assert_eq!(*tx.receipt.transaction_hash(), tx_hash);
150190

151191
let result = provider.get_transaction_status(tx_hash).await;

0 commit comments

Comments
 (0)