Skip to content

Commit 8e85355

Browse files
committed
Enable cheating contract_address in tests internally
Towards #3331 commit-id:1f9d52c8
1 parent a90a0c7 commit 8e85355

File tree

5 files changed

+51
-7
lines changed

5 files changed

+51
-7
lines changed

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,13 +155,12 @@ pub fn get_cheated_exec_info_ptr(
155155
}
156156
}
157157

158-
if cheated_data.caller_address.is_some() {
159-
new_exec_info[2] = MaybeRelocatable::Int(
160-
cheated_data
161-
.caller_address
162-
.expect("No caller address value found for the cheated caller address contract")
163-
.into_(),
164-
);
158+
if let Some(caller_address) = cheated_data.caller_address {
159+
new_exec_info[2] = MaybeRelocatable::Int(caller_address.into_());
160+
}
161+
162+
if let Some(contract_address) = cheated_data.contract_address {
163+
new_exec_info[3] = MaybeRelocatable::Int(contract_address.into_());
165164
}
166165

167166
vm.load_data(ptr_cheated_exec_info, &new_exec_info).unwrap();

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: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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+
/// Overrides the contract address for the default test address.
12+
/// After this function is called, any call to `starknet::get_contract_address()`
13+
/// within the test context will return the provided `contract_address`.
14+
/// - `contract_address` - The contract address to use for the default test address.
15+
pub(crate) fn start_cheat_contract_address(contract_address: ContractAddress) {
16+
let mut execution_info: ExecutionInfoMock = Default::default();
17+
18+
execution_info
19+
.contract_address =
20+
Operation::Start(
21+
CheatArguments {
22+
value: contract_address, span: CheatSpan::Indefinite, target: test_address(),
23+
},
24+
);
25+
26+
cheat_execution_info(execution_info);
27+
}
28+
29+
/// Cancels the `start_cheat_contract_address`.
30+
pub(crate) fn stop_cheat_contract_address() {
31+
let mut execution_info: ExecutionInfoMock = Default::default();
32+
33+
execution_info.contract_address = Operation::Stop(test_address());
34+
35+
cheat_execution_info(execution_info);
36+
}

0 commit comments

Comments
 (0)