Skip to content

Commit 48d4446

Browse files
authored
Merge pull request #272 from neotheprogramist/v8-get-storage-proof
V8 get storage proof tests
2 parents 6dd461b + 068e7ed commit 48d4446

File tree

18 files changed

+1117
-6
lines changed

18 files changed

+1117
-6
lines changed

contracts/src/lib.cairo

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@ mod smpl16;
2626
mod smpl17;
2727
mod smpl18;
2828
mod smpl19;
29+
mod smpl20;
30+
mod smpl21;
31+
mod smpl22;
2932
mod exec_acc;
3033

3134
/// Paymaster implementation.

contracts/src/smpl20.cairo

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#[starknet::interface]
2+
pub trait IHelloStarknet<TContractState> {
3+
fn increase_balance(ref self: TContractState, amount: felt252);
4+
fn get_balance(self: @TContractState) -> felt252;
5+
}
6+
7+
#[starknet::contract]
8+
mod HelloStarknet {
9+
use starknet::storage::Map;
10+
11+
#[storage]
12+
struct Storage {
13+
balance: felt252,
14+
balances: Map<felt252, felt252>,
15+
another_arg11: felt252,
16+
}
17+
18+
#[event]
19+
#[derive(Drop, starknet::Event)]
20+
enum Event {
21+
DepositFromL1: DepositFromL1,
22+
}
23+
24+
#[derive(Drop, starknet::Event)]
25+
struct DepositFromL1 {
26+
#[key]
27+
user: felt252,
28+
#[key]
29+
amount: felt252,
30+
}
31+
32+
#[l1_handler]
33+
fn deposit(ref self: ContractState, from_address: felt252, user: felt252, amount: felt252) {
34+
let balance = self.balances.read(user);
35+
self.balances.write(user, balance + amount);
36+
self.emit(DepositFromL1 { user, amount });
37+
}
38+
39+
#[abi(embed_v0)]
40+
impl HelloStarknetImpl of super::IHelloStarknet<ContractState> {
41+
fn increase_balance(ref self: ContractState, amount: felt252) {
42+
self.balance.write(self.balance.read() + amount);
43+
}
44+
45+
fn get_balance(self: @ContractState) -> felt252 {
46+
self.balance.read()
47+
}
48+
}
49+
}

contracts/src/smpl21.cairo

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#[starknet::interface]
2+
pub trait IHelloStarknet<TContractState> {
3+
fn increase_balance(ref self: TContractState, amount: felt252);
4+
fn get_balance(self: @TContractState) -> felt252;
5+
}
6+
7+
#[starknet::contract]
8+
mod HelloStarknet {
9+
use starknet::storage::Map;
10+
11+
#[storage]
12+
struct Storage {
13+
balance: felt252,
14+
balances: Map<felt252, felt252>,
15+
another_arg12: felt252,
16+
}
17+
18+
#[event]
19+
#[derive(Drop, starknet::Event)]
20+
enum Event {
21+
DepositFromL1: DepositFromL1,
22+
}
23+
24+
#[derive(Drop, starknet::Event)]
25+
struct DepositFromL1 {
26+
#[key]
27+
user: felt252,
28+
#[key]
29+
amount: felt252,
30+
}
31+
32+
#[l1_handler]
33+
fn deposit(ref self: ContractState, from_address: felt252, user: felt252, amount: felt252) {
34+
let balance = self.balances.read(user);
35+
self.balances.write(user, balance + amount);
36+
self.emit(DepositFromL1 { user, amount });
37+
}
38+
39+
#[abi(embed_v0)]
40+
impl HelloStarknetImpl of super::IHelloStarknet<ContractState> {
41+
fn increase_balance(ref self: ContractState, amount: felt252) {
42+
self.balance.write(self.balance.read() + amount);
43+
}
44+
45+
fn get_balance(self: @ContractState) -> felt252 {
46+
self.balance.read()
47+
}
48+
}
49+
}

contracts/src/smpl22.cairo

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#[starknet::interface]
2+
pub trait IHelloStarknet<TContractState> {
3+
fn increase_balance(ref self: TContractState, amount: felt252);
4+
fn get_balance(self: @TContractState) -> felt252;
5+
}
6+
7+
#[starknet::contract]
8+
mod HelloStarknet {
9+
use starknet::storage::Map;
10+
11+
#[storage]
12+
struct Storage {
13+
balance: felt252,
14+
balances: Map<felt252, felt252>,
15+
another_arg13: felt252,
16+
}
17+
18+
#[event]
19+
#[derive(Drop, starknet::Event)]
20+
enum Event {
21+
DepositFromL1: DepositFromL1,
22+
}
23+
24+
#[derive(Drop, starknet::Event)]
25+
struct DepositFromL1 {
26+
#[key]
27+
user: felt252,
28+
#[key]
29+
amount: felt252,
30+
}
31+
32+
#[l1_handler]
33+
fn deposit(ref self: ContractState, from_address: felt252, user: felt252, amount: felt252) {
34+
let balance = self.balances.read(user);
35+
self.balances.write(user, balance + amount);
36+
self.emit(DepositFromL1 { user, amount });
37+
}
38+
39+
#[abi(embed_v0)]
40+
impl HelloStarknetImpl of super::IHelloStarknet<ContractState> {
41+
fn increase_balance(ref self: ContractState, amount: felt252) {
42+
self.balance.write(self.balance.read() + amount);
43+
}
44+
45+
fn get_balance(self: @ContractState) -> felt252 {
46+
self.balance.read()
47+
}
48+
}
49+
}

openrpc-testgen/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ pub trait SetupableTrait: Sized {
3232
}
3333

3434
pub trait RandomizableAccountsTrait {
35+
#[allow(clippy::result_large_err)]
3536
fn random_accounts(
3637
&self,
3738
) -> Result<SingleOwnerAccount<JsonRpcClient<HttpTransport>, LocalWallet>, OpenRpcTestGenError>;

openrpc-testgen/src/suite_openrpc/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ pub mod test_get_events_deploy_account;
6363
pub mod test_get_events_transfer;
6464
pub mod test_get_nonce;
6565
pub mod test_get_state_update;
66+
pub mod test_get_storage_class_proof;
67+
pub mod test_get_storage_contract_proof;
68+
pub mod test_get_storage_contract_storage_proof;
6669
pub mod test_get_transaction_by_hash_declare;
6770
pub mod test_get_transaction_by_hash_deploy;
6871
pub mod test_get_transaction_by_hash_deploy_account;

openrpc-testgen/src/suite_openrpc/suite_deploy/suite_contract_calls/test_get_storage_at.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,13 @@ impl RunnableTrait for TestCase {
132132
)
133133
);
134134

135+
println!(
136+
"deployed_contract_address {:#?}",
137+
test_input.deployed_contract_address,
138+
);
139+
140+
println!("contract_balance_slot {:#?}", contract_balance_slot);
141+
135142
Ok(Self {})
136143
}
137144
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
use std::{path::PathBuf, str::FromStr};
2+
3+
use crate::{
4+
assert_result,
5+
utils::{
6+
v7::{
7+
accounts::account::{Account, ConnectedAccount},
8+
endpoints::{
9+
declare_contract::get_compiled_contract, errors::OpenRpcTestGenError,
10+
utils::wait_for_sent_transaction,
11+
},
12+
providers::provider::Provider,
13+
},
14+
v8::types::MerkleTree,
15+
},
16+
RandomizableAccountsTrait, RunnableTrait,
17+
};
18+
use starknet_types_core::hash::{Poseidon, StarkHash};
19+
use starknet_types_rpc::{BlockId, BlockTag};
20+
21+
#[derive(Clone, Debug)]
22+
pub struct TestCase {}
23+
24+
impl RunnableTrait for TestCase {
25+
type Input = super::TestSuiteOpenRpc;
26+
27+
async fn run(test_input: &Self::Input) -> Result<Self, OpenRpcTestGenError> {
28+
let (flattened_sierra_class, compiled_class_hash) = get_compiled_contract(
29+
PathBuf::from_str(
30+
"target/dev/contracts_contracts_smpl20_HelloStarknet.contract_class.json",
31+
)?,
32+
PathBuf::from_str(
33+
"target/dev/contracts_contracts_smpl20_HelloStarknet.compiled_contract_class.json",
34+
)?,
35+
)
36+
.await?;
37+
38+
let sender = test_input.random_paymaster_account.random_accounts()?;
39+
40+
let declare_result = sender
41+
.declare_v3(flattened_sierra_class, compiled_class_hash)
42+
.send()
43+
.await?;
44+
45+
wait_for_sent_transaction(
46+
declare_result.transaction_hash,
47+
&test_input.random_paymaster_account.random_accounts()?,
48+
)
49+
.await?;
50+
51+
let storage_proof = test_input
52+
.random_paymaster_account
53+
.provider()
54+
.get_storage_proof(
55+
BlockId::Tag(BlockTag::Latest),
56+
Some(vec![declare_result.class_hash]),
57+
None,
58+
None,
59+
)
60+
.await?;
61+
62+
let merkle_tree = MerkleTree::from_proof(
63+
storage_proof.classes_proof,
64+
Some(storage_proof.global_roots.classes_tree_root),
65+
);
66+
67+
let expected_child =
68+
merkle_tree.compute_expected_child_for_class_proof(&compiled_class_hash);
69+
let valid_proof = merkle_tree.verify_proof(&expected_child, Poseidon::hash)?;
70+
assert_result!(valid_proof, "Class proof verification failed");
71+
72+
Ok(Self {})
73+
}
74+
}

0 commit comments

Comments
 (0)