Skip to content

Commit eddea12

Browse files
committed
Enable cheating contract_address in tests internally
Towards #3331 commit-id:1f9d52c8
1 parent 4353811 commit eddea12

File tree

5 files changed

+49
-0
lines changed

5 files changed

+49
-0
lines changed

crates/cheatnet/src/runtime_extensions/call_to_blockifier_runtime_extension/execution/execution_info.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,15 @@ pub fn get_cheated_exec_info_ptr(
164164
);
165165
}
166166

167+
if cheated_data.contract_address.is_some() {
168+
new_exec_info[3] = MaybeRelocatable::Int(
169+
cheated_data
170+
.contract_address
171+
.expect("No contract address value found for the cheated contract address contract")
172+
.into_(),
173+
);
174+
}
175+
167176
vm.load_data(ptr_cheated_exec_info, &new_exec_info).unwrap();
168177

169178
ptr_cheated_exec_info

crates/cheatnet/src/runtime_extensions/forge_runtime_extension/cheatcodes/cheat_execution_info.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ pub struct ExecutionInfoMock {
5959
pub block_info: BlockInfoMock,
6060
pub tx_info: TxInfoMock,
6161
pub caller_address: CheatStatus<ContractAddress>,
62+
pub contract_address: CheatStatus<ContractAddress>,
6263
}
6364

6465
#[derive(CairoDeserialize, Clone, Default, Debug)]
@@ -90,11 +91,13 @@ pub struct ExecutionInfoMockOperations {
9091
pub block_info: BlockInfoMockOperations,
9192
pub tx_info: TxInfoMockOperations,
9293
pub caller_address: Operation<ContractAddress>,
94+
pub contract_address: Operation<ContractAddress>,
9395
}
9496

9597
macro_rules! for_all_fields {
9698
($macro:ident!) => {
9799
$macro!(caller_address);
100+
$macro!(contract_address);
98101

99102
$macro!(block_info.block_number);
100103
$macro!(block_info.block_timestamp);

crates/cheatnet/src/state.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,7 @@ pub struct CheatedData {
353353
pub block_number: Option<u64>,
354354
pub block_timestamp: Option<u64>,
355355
pub caller_address: Option<ContractAddress>,
356+
pub contract_address: Option<ContractAddress>,
356357
pub sequencer_address: Option<ContractAddress>,
357358
pub tx_info: CheatedTxInfo,
358359
}
@@ -422,6 +423,7 @@ impl CheatnetState {
422423
block_number: execution_info.block_info.block_number.as_value(),
423424
block_timestamp: execution_info.block_info.block_timestamp.as_value(),
424425
caller_address: execution_info.caller_address.as_value(),
426+
contract_address: execution_info.contract_address.as_value(),
425427
sequencer_address: execution_info.block_info.sequencer_address.as_value(),
426428
tx_info: CheatedTxInfo {
427429
version: execution_info.tx_info.version.as_value(),

snforge_std/src/cheatcodes/execution_info.cairo

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ use snforge_std::cheatcodes::CheatSpan;
44
use crate::cheatcode::execute_cheatcode_and_deserialize;
55

66
pub mod caller_address;
7+
#[doc(hidden)]
8+
pub mod contract_address;
79
pub mod block_number;
810
pub mod block_timestamp;
911
pub mod sequencer_address;
@@ -123,6 +125,7 @@ struct ExecutionInfoMock {
123125
block_info: BlockInfoMock,
124126
tx_info: TxInfoMock,
125127
caller_address: Operation<ContractAddress>,
128+
contract_address: Operation<ContractAddress>,
126129
}
127130

128131
impl ExecutionInfoMockImpl of Default<ExecutionInfoMock> {
@@ -133,6 +136,7 @@ impl ExecutionInfoMockImpl of Default<ExecutionInfoMock> {
133136
block_info: Default::default(),
134137
tx_info: Default::default(),
135138
caller_address: Operation::Retain,
139+
contract_address: Operation::Retain,
136140
}
137141
}
138142
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// These cheatcodes are currently used only internally by the `interact_with_state` cheatcode,
2+
// and are specifically intended to cheat on the `TEST_ADDRESS`.
3+
// They are not exposed through the public API in a general form, as there are no known use cases
4+
// that would require them.
5+
6+
use super::{
7+
ExecutionInfoMock, cheat_execution_info, Operation, ContractAddress, CheatArguments, CheatSpan,
8+
};
9+
use crate::test_address;
10+
11+
pub(crate) fn start_cheat_contract_address(contract_address: ContractAddress) {
12+
let mut execution_info: ExecutionInfoMock = Default::default();
13+
14+
execution_info
15+
.contract_address =
16+
Operation::Start(
17+
CheatArguments {
18+
value: contract_address, span: CheatSpan::Indefinite, target: test_address(),
19+
},
20+
);
21+
22+
cheat_execution_info(execution_info);
23+
}
24+
25+
pub(crate) fn stop_cheat_contract_address() {
26+
let mut execution_info: ExecutionInfoMock = Default::default();
27+
28+
execution_info.contract_address = Operation::Stop(test_address());
29+
30+
cheat_execution_info(execution_info);
31+
}

0 commit comments

Comments
 (0)