Skip to content

Commit 2e845a1

Browse files
committed
Add tests for deploy_syscall
1 parent b048885 commit 2e845a1

File tree

3 files changed

+76
-6
lines changed

3 files changed

+76
-6
lines changed

crates/forge/tests/data/simple_package_with_cheats/src/lib.cairo

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,55 @@
1+
use starknet::{ClassHash, ContractAddress};
2+
13
#[starknet::interface]
24
pub trait IHelloStarknet<TContractState> {
35
fn increase_balance(ref self: TContractState, amount: felt252);
46
fn get_balance(self: @TContractState) -> felt252;
57
fn get_block_number(self: @TContractState) -> u64;
68
}
79

10+
#[starknet::interface]
11+
pub trait ICheatedConstructor<TContractState> {
12+
fn get_stored_block_number(self: @TContractState) -> u64;
13+
}
14+
15+
#[starknet::contract]
16+
pub mod CheatedConstructor {
17+
use starknet::get_block_number;
18+
use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
19+
20+
#[storage]
21+
struct Storage {
22+
block_number: u64,
23+
}
24+
25+
#[constructor]
26+
fn constructor(ref self: ContractState) {
27+
let block_number = get_block_number();
28+
self.block_number.write(block_number);
29+
}
30+
31+
#[abi(embed_v0)]
32+
impl ICheatedConstructorImpl of super::ICheatedConstructor<ContractState> {
33+
fn get_stored_block_number(self: @ContractState) -> u64 {
34+
self.block_number.read()
35+
}
36+
}
37+
}
38+
839
#[starknet::interface]
940
pub trait IHelloStarknetProxy<TContractState> {
1041
fn get_block_number(self: @TContractState) -> u64;
1142
fn get_block_number_library_call(self: @TContractState) -> u64;
43+
fn deploy_cheated_constructor_contract(
44+
ref self: TContractState, class_hash: ClassHash, salt: felt252,
45+
) -> ContractAddress;
1246
}
1347

1448
#[starknet::contract]
1549
pub mod HelloStarknetProxy {
16-
use starknet::ContractAddress;
1750
use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
18-
use starknet::syscalls::get_class_hash_at_syscall;
51+
use starknet::syscalls::{deploy_syscall, get_class_hash_at_syscall};
52+
use starknet::{ClassHash, ContractAddress};
1953
use crate::{
2054
IHelloStarknetDispatcher, IHelloStarknetDispatcherTrait, IHelloStarknetLibraryDispatcher,
2155
};
@@ -44,6 +78,13 @@ pub mod HelloStarknetProxy {
4478
let library_dispatcher = IHelloStarknetLibraryDispatcher { class_hash };
4579
library_dispatcher.get_block_number()
4680
}
81+
82+
fn deploy_cheated_constructor_contract(
83+
ref self: ContractState, class_hash: ClassHash, salt: felt252,
84+
) -> ContractAddress {
85+
let (address, _) = deploy_syscall(class_hash, salt, array![].span(), false).unwrap();
86+
address
87+
}
4788
}
4889
}
4990

crates/forge/tests/data/simple_package_with_cheats/tests/contract.cairo

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use core::array::ArrayTrait;
22
use core::result::ResultTrait;
33
use simple_package_with_cheats::{
4-
IHelloStarknetDispatcher, IHelloStarknetDispatcherTrait, IHelloStarknetProxyDispatcher,
4+
ICheatedConstructorDispatcher, ICheatedConstructorDispatcherTrait, IHelloStarknetDispatcher,
5+
IHelloStarknetDispatcherTrait, IHelloStarknetProxyDispatcher,
56
IHelloStarknetProxyDispatcherTrait,
67
};
78
use snforge_std::cheatcodes::contract_class::DeclareResultTrait;
@@ -67,3 +68,30 @@ fn call_and_invoke_library_call() {
6768
let block_number = dispatcher.get_block_number_library_call();
6869
assert(block_number == 123, 'block_number == 123');
6970
}
71+
72+
#[test]
73+
fn deploy_syscall() {
74+
let contract = declare("HelloStarknet").unwrap().contract_class();
75+
let constructor_calldata = @ArrayTrait::new();
76+
let (contract_address, _) = contract.deploy(constructor_calldata).unwrap();
77+
78+
let proxy_contract = declare("HelloStarknetProxy").unwrap().contract_class();
79+
let mut constructor_calldata = ArrayTrait::new();
80+
contract_address.serialize(ref constructor_calldata);
81+
let (proxy_contract_address, _) = proxy_contract.deploy(@constructor_calldata).unwrap();
82+
let dispatcher = IHelloStarknetProxyDispatcher { contract_address: proxy_contract_address };
83+
84+
let class_hash = declare("CheatedConstructor").unwrap().contract_class().class_hash;
85+
86+
let contract_address = dispatcher.deploy_cheated_constructor_contract(*class_hash, 111);
87+
let cheated_constructor_dispatcher = ICheatedConstructorDispatcher { contract_address };
88+
let block_number = cheated_constructor_dispatcher.get_stored_block_number();
89+
assert(block_number == 2000, 'block_number == 2000');
90+
91+
start_cheat_block_number_global(123);
92+
93+
let contract_address = dispatcher.deploy_cheated_constructor_contract(*class_hash, 222);
94+
let cheated_constructor_dispatcher = ICheatedConstructorDispatcher { contract_address };
95+
let block_number = cheated_constructor_dispatcher.get_stored_block_number();
96+
assert(block_number == 123, 'block_number == 123');
97+
}

crates/forge/tests/e2e/running.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,14 @@ fn simple_package_with_cheats() {
6363
[..]Finished[..]
6464
6565
66-
Collected 3 test(s) from simple_package_with_cheats package
66+
Collected 4 test(s) from simple_package_with_cheats package
6767
Running 0 test(s) from src/
68-
Running 3 test(s) from tests/
68+
Running 4 test(s) from tests/
6969
[PASS] simple_package_with_cheats_integrationtest::contract::call_and_invoke [..]
7070
[PASS] simple_package_with_cheats_integrationtest::contract::call_and_invoke_proxy [..]
7171
[PASS] simple_package_with_cheats_integrationtest::contract::call_and_invoke_library_call [..]
72-
Tests: 3 passed, 0 failed, 0 ignored, 0 filtered out
72+
[PASS] simple_package_with_cheats_integrationtest::contract::deploy_syscall [..]
73+
Tests: 4 passed, 0 failed, 0 ignored, 0 filtered out
7374
"},
7475
);
7576
}

0 commit comments

Comments
 (0)