Skip to content

Commit 29a4c1b

Browse files
starknet_os_runner: share test utils
1 parent 7d51d4c commit 29a4c1b

File tree

4 files changed

+63
-46
lines changed

4 files changed

+63
-46
lines changed

crates/starknet_os_runner/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ pub mod virtual_block_executor;
55
#[cfg(test)]
66
mod storage_proofs_test;
77
#[cfg(test)]
8+
pub mod test_utils;
9+
#[cfg(test)]
810
mod virtual_block_executor_test;

crates/starknet_os_runner/src/storage_proofs_test.rs

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,23 @@
11
use std::collections::HashSet;
2-
use std::env;
32

43
use blockifier::context::BlockContext;
54
use blockifier::state::cached_state::StateMaps;
6-
use rstest::{fixture, rstest};
5+
use rstest::rstest;
76
use starknet_api::block::BlockNumber;
87
use starknet_api::core::ContractAddress;
98
use starknet_api::state::StorageKey;
109
use starknet_rust::providers::Provider;
1110
use starknet_types_core::felt::Felt;
12-
use url::Url;
1311

1412
use crate::storage_proofs::{RpcStorageProofsProvider, StorageProofProvider};
13+
use crate::test_utils::{rpc_provider, STRK_TOKEN_ADDRESS};
1514
use crate::virtual_block_executor::VirtualBlockExecutionData;
1615

17-
/// Mainnet STRK token contract address.
18-
const STRK_CONTRACT_ADDRESS: Felt =
19-
Felt::from_hex_unchecked("0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d");
20-
2116
/// Fixture: Creates initial reads with the STRK contract and storage slot 0.
22-
#[fixture]
17+
#[rstest::fixture]
2318
fn initial_reads() -> (StateMaps, ContractAddress, StorageKey) {
2419
let mut state_maps = StateMaps::default();
25-
let contract_address = ContractAddress::try_from(STRK_CONTRACT_ADDRESS).unwrap();
20+
let contract_address = ContractAddress::try_from(STRK_TOKEN_ADDRESS).unwrap();
2621

2722
// Add a storage read for slot 0 (commonly used for total_supply or similar).
2823
let storage_key = StorageKey::from(0u32);
@@ -31,24 +26,17 @@ fn initial_reads() -> (StateMaps, ContractAddress, StorageKey) {
3126
(state_maps, contract_address, storage_key)
3227
}
3328

34-
/// Fixture: Creates an RPC provider from the RPC_URL environment variable.
35-
#[fixture]
36-
fn rpc_provider() -> RpcStorageProofsProvider {
37-
let rpc_url_str = env::var("NODE_URL").expect("NODE_URL environment variable must be set");
38-
let rpc_url = Url::parse(&rpc_url_str).expect("Invalid RPC URL");
39-
RpcStorageProofsProvider::new(rpc_url)
40-
}
41-
4229
/// Sanity test that verifies storage proof fetching works with a real RPC endpoint.
4330
///
4431
/// This test is ignored by default because it requires a running RPC node.
45-
/// Run with: `RPC_URL=<your_rpc_url> cargo test -p starknet_os_runner -- --ignored`
32+
/// Run with: `NODE_URL=<your_rpc_url> cargo test -p starknet_os_runner -- --ignored`
4633
#[rstest]
4734
#[ignore]
4835
fn test_get_storage_proofs_from_rpc(
4936
rpc_provider: RpcStorageProofsProvider,
5037
initial_reads: (StateMaps, ContractAddress, StorageKey),
5138
) {
39+
5240
let (state_maps, contract_address, storage_key) = initial_reads;
5341

5442
// Fetch latest block number.
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use std::env;
2+
3+
use blockifier_reexecution::state_reader::rpc_state_reader::RpcStateReader;
4+
use rstest::fixture;
5+
use starknet_api::block::BlockNumber;
6+
use starknet_api::core::ChainId;
7+
use starknet_types_core::felt::Felt;
8+
use url::Url;
9+
10+
use crate::storage_proofs::RpcStorageProofsProvider;
11+
12+
/// Block number to use for testing (mainnet block with known state).
13+
pub const TEST_BLOCK_NUMBER: u64 = 800000;
14+
15+
/// STRK token contract address on mainnet.
16+
pub const STRK_TOKEN_ADDRESS: Felt =
17+
Felt::from_hex_unchecked("0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d");
18+
19+
/// A known account address on mainnet (Starknet Foundation).
20+
pub const SENDER_ADDRESS: Felt =
21+
Felt::from_hex_unchecked("0x01176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8");
22+
23+
/// Gets the RPC URL from the environment (NODE_URL).
24+
pub fn get_rpc_url() -> String {
25+
env::var("NODE_URL").expect("NODE_URL environment variable required for this test")
26+
}
27+
28+
/// Fixture that creates an RpcStateReader for testing.
29+
#[fixture]
30+
pub fn rpc_state_reader() -> RpcStateReader {
31+
let node_url = get_rpc_url();
32+
RpcStateReader::new_with_config_from_url(
33+
node_url,
34+
ChainId::Mainnet,
35+
BlockNumber(TEST_BLOCK_NUMBER),
36+
)
37+
}
38+
39+
/// Fixture that creates an RpcStorageProofsProvider for testing.
40+
#[fixture]
41+
pub fn rpc_provider() -> RpcStorageProofsProvider {
42+
let rpc_url_str = get_rpc_url();
43+
let rpc_url = Url::parse(&rpc_url_str).expect("Invalid RPC URL");
44+
RpcStorageProofsProvider::new(rpc_url)
45+
}

crates/starknet_os_runner/src/virtual_block_executor_test.rs

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
use std::env;
2-
31
use blockifier::blockifier::config::ContractClassManagerConfig;
42
use blockifier::state::contract_class_manager::ContractClassManager;
53
use blockifier::transaction::transaction_execution::Transaction as BlockifierTransaction;
4+
use rstest::rstest;
65
use starknet_api::abi::abi_utils::{get_storage_var_address, selector_from_name};
76
use starknet_api::block::BlockNumber;
87
use starknet_api::core::{ChainId, ContractAddress, Nonce};
@@ -12,18 +11,8 @@ use starknet_api::{calldata, felt, invoke_tx_args};
1211

1312
use crate::errors::VirtualBlockExecutorError;
1413
use crate::virtual_block_executor::{RpcVirtualBlockExecutor, VirtualBlockExecutor};
15-
16-
/// Block number to use for testing (mainnet block with known state).
17-
const TEST_BLOCK_NUMBER: u64 = 800000;
18-
19-
/// STRK token contract address on mainnet.
20-
const STRK_TOKEN_ADDRESS: &str =
21-
"0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d";
22-
23-
/// A known account address on mainnet (Starknet Foundation).
24-
/// This is a Cairo 0 OpenZeppelin account, which uses the following calldata format:
25-
/// [call_array_len, (to, selector, data_offset, data_len)..., calldata_len, calldata...]
26-
const SENDER_ADDRESS: &str = "0x01176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8";
14+
use crate::test_utils::{rpc_state_reader, SENDER_ADDRESS, STRK_TOKEN_ADDRESS, TEST_BLOCK_NUMBER};
15+
use crate::virtual_block_executor::VirtualBlockExecutor;
2716

2817
/// Test wrapper for RpcStateReader that overrides execution flags to skip validation.
2918
struct TestRpcVirtualBlockExecutor(RpcVirtualBlockExecutor);
@@ -72,8 +61,8 @@ impl VirtualBlockExecutor for TestRpcVirtualBlockExecutor {
7261
/// Since we skip validation and fee charging, we can use dummy values for signature,
7362
/// nonce, and resource bounds.
7463
fn construct_balance_of_invoke() -> (Transaction, TransactionHash) {
75-
let strk_token = ContractAddress::try_from(felt!(STRK_TOKEN_ADDRESS)).unwrap();
76-
let sender = ContractAddress::try_from(felt!(SENDER_ADDRESS)).unwrap();
64+
let strk_token = ContractAddress::try_from(STRK_TOKEN_ADDRESS).unwrap();
65+
let sender = ContractAddress::try_from(SENDER_ADDRESS).unwrap();
7766

7867
// Calldata for account's __execute__ (Cairo 0 OZ account format):
7968
// [call_array_len, call_array..., calldata_len, calldata...]
@@ -117,22 +106,15 @@ fn construct_balance_of_invoke() -> (Transaction, TransactionHash) {
117106
/// ```bash
118107
/// NODE_URL=https://your-rpc-node cargo test -p starknet_os_runner -- --ignored
119108
/// ```
120-
#[test]
109+
#[rstest]
121110
#[ignore] // Requires RPC access
122-
fn test_execute_constructed_balance_of_transaction() {
123-
let node_url =
124-
env::var("NODE_URL").expect("NODE_URL environment variable required for this test");
125-
111+
fn test_execute_constructed_balance_of_transaction(rpc_state_reader: RpcStateReader) {
126112
// Construct a balanceOf transaction (with execution flags set).
127113
let (tx, tx_hash) = construct_balance_of_invoke();
128114

129115
// Create the virtual block executor.
130116
let contract_class_manager = ContractClassManager::start(ContractClassManagerConfig::default());
131-
let executor = TestRpcVirtualBlockExecutor(RpcVirtualBlockExecutor::new(
132-
node_url,
133-
ChainId::Mainnet,
134-
BlockNumber(TEST_BLOCK_NUMBER),
135-
));
117+
let executor = TestRpcVirtualBlockExecutor(rpc_state_reader);
136118

137119
// Execute the transaction.
138120
let result = executor
@@ -170,8 +152,8 @@ fn test_execute_constructed_balance_of_transaction() {
170152

171153
// Verify the specific ERC20 balance storage key was read.
172154
// ERC20 contracts store balances in "ERC20_balances" mapping keyed by address.
173-
let strk_token = ContractAddress::try_from(felt!(STRK_TOKEN_ADDRESS)).unwrap();
174-
let sender = ContractAddress::try_from(felt!(SENDER_ADDRESS)).unwrap();
155+
let strk_token = ContractAddress::try_from(STRK_TOKEN_ADDRESS).unwrap();
156+
let sender = ContractAddress::try_from(SENDER_ADDRESS).unwrap();
175157
let balance_storage_key = get_storage_var_address("ERC20_balances", &[*sender.0.key()]);
176158
assert!(
177159
result.initial_reads.storage.contains_key(&(strk_token, balance_storage_key)),

0 commit comments

Comments
 (0)