Skip to content

Commit 3586a93

Browse files
committed
Remove deploy as cheatcode
Towards #3659 commit-id:012afbae
1 parent 8bd4b64 commit 3586a93

File tree

8 files changed

+106
-69
lines changed

8 files changed

+106
-69
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414
- `snforge` now supports [oracles](https://docs.swmansion.com/cairo-oracle/) with `--experimental-oracles` flag.
1515
- `--trace-components` flag to allow selecting which components of the trace to do display. Read more [here](https://foundry-rs.github.io/starknet-foundry/snforge-advanced-features/debugging.html#trace-components)
1616

17+
### Changed
18+
19+
- `deploy` method on `ContractClass` instance now fails immediately upon encountering an error, preventing the error from being caught. This change aligns with the behavior of the `deploy_syscall` on the network
20+
1721
### Cast
1822

1923
#### Added

crates/cheatnet/src/runtime_extensions/forge_runtime_extension/mod.rs

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::runtime_extensions::{
1111
forge_runtime_extension::cheatcodes::{
1212
CheatcodeError,
1313
declare::declare,
14-
deploy::{deploy, deploy_at},
14+
deploy::deploy_at,
1515
generate_random_felt::generate_random_felt,
1616
get_class_hash::get_class_hash,
1717
l1_handler_execute::l1_handler_execute,
@@ -191,23 +191,6 @@ impl<'a> ExtensionLogic for ForgeExtension<'a> {
191191

192192
handle_declare_deploy_result(declare(*state, &contract_name, self.contracts_data))
193193
}
194-
"deploy" => {
195-
let class_hash = input_reader.read()?;
196-
let calldata: Vec<_> = input_reader.read()?;
197-
let cheatnet_runtime = &mut extended_runtime.extended_runtime;
198-
let syscall_handler = &mut cheatnet_runtime.extended_runtime.hint_handler;
199-
200-
syscall_handler.increment_syscall_count_by(&SyscallSelector::Deploy, 1);
201-
syscall_handler
202-
.increment_linear_factor_by(&SyscallSelector::Deploy, calldata.len());
203-
204-
handle_declare_deploy_result(deploy(
205-
syscall_handler,
206-
cheatnet_runtime.extension.cheatnet_state,
207-
&class_hash,
208-
&calldata,
209-
))
210-
}
211194
"deploy_at" => {
212195
let class_hash = input_reader.read()?;
213196
let calldata: Vec<_> = input_reader.read()?;
@@ -239,6 +222,16 @@ impl<'a> ExtensionLogic for ForgeExtension<'a> {
239222

240223
Ok(CheatcodeHandlingResult::from_serializable(contract_address))
241224
}
225+
// Internal cheat code to guarantee unique salts for each deployment
226+
// when deploying via a method of the `ContractClass` struct.
227+
"get_salt" => {
228+
let state = &mut *extended_runtime.extended_runtime.extension.cheatnet_state;
229+
230+
let salt = state.get_salt();
231+
state.increment_deploy_salt_base();
232+
233+
Ok(CheatcodeHandlingResult::from_serializable(salt))
234+
}
242235
"var" => {
243236
let name: String = input_reader.read::<ByteArray>()?.to_string();
244237

crates/conversions/src/felt.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use crate::{
77
use anyhow::{Context, Result, anyhow, bail};
88
use conversions::padded_felt::PaddedFelt;
99
use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector, Nonce};
10+
use starknet_api::transaction::fields::ContractAddressSalt;
1011
use starknet_types_core::felt::Felt;
1112
use std::vec;
1213

@@ -22,6 +23,12 @@ impl FromConv<ContractAddress> for Felt {
2223
}
2324
}
2425

26+
impl FromConv<ContractAddressSalt> for Felt {
27+
fn from_(value: ContractAddressSalt) -> Felt {
28+
value.0.into_()
29+
}
30+
}
31+
2532
impl FromConv<Nonce> for Felt {
2633
fn from_(value: Nonce) -> Felt {
2734
value.0.into_()

crates/conversions/src/serde/serialize/serialize_impl.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use starknet::core::types::{
66
};
77
use starknet_api::core::EthAddress;
88
use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector, Nonce};
9-
use starknet_api::transaction::fields::Calldata;
9+
use starknet_api::transaction::fields::{Calldata, ContractAddressSalt};
1010
use starknet_types_core::felt::Felt;
1111
use std::{
1212
cell::{Ref, RefCell},
@@ -226,6 +226,7 @@ macro_rules! impl_serialize_for_tuple {
226226
impl_serialize_for_felt_type!(Felt);
227227
impl_serialize_for_felt_type!(ClassHash);
228228
impl_serialize_for_felt_type!(ContractAddress);
229+
impl_serialize_for_felt_type!(ContractAddressSalt);
229230
impl_serialize_for_felt_type!(Nonce);
230231
impl_serialize_for_felt_type!(EntryPointSelector);
231232
impl_serialize_for_felt_type!(EthAddress);

crates/forge/tests/integration/deploy.rs

Lines changed: 63 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,41 +5,6 @@ use test_utils::runner::{Contract, assert_passed};
55
use test_utils::running_tests::run_test_case;
66
use test_utils::test_case;
77

8-
#[test]
9-
fn error_handling() {
10-
let test = test_case!(
11-
indoc!(
12-
r#"
13-
use result::ResultTrait;
14-
use snforge_std::{ declare, ContractClass, ContractClassTrait, DeclareResultTrait };
15-
use array::ArrayTrait;
16-
17-
#[test]
18-
fn error_handling() {
19-
let contract = declare("PanickingConstructor").unwrap().contract_class();
20-
21-
match contract.deploy(@ArrayTrait::new()) {
22-
Result::Ok(_) => panic_with_felt252('Should have panicked'),
23-
Result::Err(panic_data) => {
24-
assert(*panic_data.at(0_usize) == 'PANIK', *panic_data.at(0_usize));
25-
assert(*panic_data.at(1_usize) == 'DEJTA', *panic_data.at(1_usize));
26-
}
27-
}
28-
}
29-
"#
30-
),
31-
Contract::from_code_path(
32-
"PanickingConstructor".to_string(),
33-
Path::new("tests/data/contracts/panicking_constructor.cairo"),
34-
)
35-
.unwrap()
36-
);
37-
38-
let result = run_test_case(&test, ForgeTrackedResource::CairoSteps);
39-
40-
assert_passed(&result);
41-
}
42-
438
#[test]
449
fn deploy_syscall_check() {
4510
let test = test_case!(
@@ -229,3 +194,66 @@ fn constructor_retdata_struct() {
229194

230195
assert_passed(&result);
231196
}
197+
198+
#[test]
199+
fn deploy_twice() {
200+
let test = test_case!(
201+
indoc!(
202+
r#"
203+
use snforge_std::{ContractClassTrait, DeclareResultTrait, declare};
204+
205+
#[test]
206+
fn deploy_twice() {
207+
let contract = declare("DeployChecker").unwrap().contract_class();
208+
let constructor_calldata = array![1];
209+
210+
let (contract_address_1, _) = contract.deploy(@constructor_calldata).unwrap();
211+
let (contract_address_2, _) = contract.deploy(@constructor_calldata).unwrap();
212+
213+
assert(contract_address_1 != contract_address_2, 'Addresses should differ');
214+
}
215+
"#
216+
),
217+
Contract::from_code_path(
218+
"DeployChecker".to_string(),
219+
Path::new("tests/data/contracts/deploy_checker.cairo"),
220+
)
221+
.unwrap()
222+
);
223+
224+
let result = run_test_case(&test, ForgeTrackedResource::CairoSteps);
225+
226+
assert_passed(&result);
227+
}
228+
229+
#[test]
230+
fn verify_precalculate_address() {
231+
let test = test_case!(
232+
indoc!(
233+
r#"
234+
use snforge_std::{ContractClassTrait, DeclareResultTrait, declare};
235+
236+
#[test]
237+
fn precalculate_and_deploy() {
238+
let contract = declare("DeployChecker").unwrap().contract_class();
239+
let constructor_calldata = array![1234];
240+
241+
let precalculated_address = contract.precalculate_address(@constructor_calldata);
242+
243+
let (contract_address, _) = contract.deploy(@constructor_calldata).unwrap();
244+
245+
assert(precalculated_address == contract_address, 'Addresses should not differ');
246+
}
247+
"#
248+
),
249+
Contract::from_code_path(
250+
"DeployChecker".to_string(),
251+
Path::new("tests/data/contracts/deploy_checker.cairo"),
252+
)
253+
.unwrap()
254+
);
255+
256+
let result = run_test_case(&test, ForgeTrackedResource::CairoSteps);
257+
258+
assert_passed(&result);
259+
}

crates/forge/tests/integration/gas.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ fn multiple_storage_writes_cost_cairo_steps() {
724724
GasVector {
725725
l1_gas: GasAmount(0),
726726
l1_data_gas: GasAmount(192),
727-
l2_gas: GasAmount(400_000),
727+
l2_gas: GasAmount(360_000),
728728
},
729729
);
730730
}
@@ -1270,7 +1270,7 @@ fn snforge_std_deploy_cost_sierra_gas() {
12701270
GasVector {
12711271
l1_gas: GasAmount(0),
12721272
l1_data_gas: GasAmount(96),
1273-
l2_gas: GasAmount(615_644),
1273+
l2_gas: GasAmount(605_664),
12741274
},
12751275
);
12761276
}
@@ -1348,7 +1348,7 @@ fn contract_keccak_cost_sierra_gas() {
13481348
GasVector {
13491349
l1_gas: GasAmount(0),
13501350
l1_data_gas: GasAmount(96),
1351-
l2_gas: GasAmount(1_351_235),
1351+
l2_gas: GasAmount(1_342_425),
13521352
},
13531353
);
13541354
}
@@ -1393,7 +1393,7 @@ fn contract_range_check_cost_sierra_gas() {
13931393
GasVector {
13941394
l1_gas: GasAmount(0),
13951395
l1_data_gas: GasAmount(96),
1396-
l2_gas: GasAmount(339_740),
1396+
l2_gas: GasAmount(330_930),
13971397
},
13981398
);
13991399
}
@@ -1444,7 +1444,7 @@ fn storage_write_cost_sierra_gas() {
14441444
GasVector {
14451445
l1_gas: GasAmount(0),
14461446
l1_data_gas: GasAmount(192),
1447-
l2_gas: GasAmount(287_560),
1447+
l2_gas: GasAmount(278_750),
14481448
},
14491449
);
14501450
}
@@ -1502,7 +1502,7 @@ fn multiple_storage_writes_cost_sierra_gas() {
15021502
GasVector {
15031503
l1_gas: GasAmount(0),
15041504
l1_data_gas: GasAmount(192),
1505-
l2_gas: GasAmount(395_020),
1505+
l2_gas: GasAmount(386_210),
15061506
},
15071507
);
15081508
}
@@ -1552,7 +1552,7 @@ fn l1_message_cost_sierra_gas() {
15521552
GasVector {
15531553
l1_gas: GasAmount(29524),
15541554
l1_data_gas: GasAmount(96),
1555-
l2_gas: GasAmount(291_390),
1555+
l2_gas: GasAmount(282_580),
15561556
},
15571557
);
15581558
}
@@ -1616,7 +1616,7 @@ fn l1_message_cost_for_proxy_sierra_gas() {
16161616
GasVector {
16171617
l1_gas: GasAmount(29524),
16181618
l1_data_gas: GasAmount(192),
1619-
l2_gas: GasAmount(561_090),
1619+
l2_gas: GasAmount(543_170),
16201620
},
16211621
);
16221622
}
@@ -1708,7 +1708,7 @@ fn events_contract_cost_sierra_gas() {
17081708
GasVector {
17091709
l1_gas: GasAmount(0),
17101710
l1_data_gas: GasAmount(96),
1711-
l2_gas: GasAmount(1_185_300),
1711+
l2_gas: GasAmount(1_176_490),
17121712
},
17131713
);
17141714
}
@@ -1777,7 +1777,7 @@ fn nested_call_cost_sierra_gas() {
17771777
GasVector {
17781778
l1_gas: GasAmount(0),
17791779
l1_data_gas: GasAmount(288),
1780-
l2_gas: GasAmount(1_962_262),
1780+
l2_gas: GasAmount(1_938_832),
17811781
},
17821782
);
17831783
}
@@ -1848,7 +1848,7 @@ fn nested_call_cost_in_forked_contract_sierra_gas() {
18481848
GasVector {
18491849
l1_gas: GasAmount(0),
18501850
l1_data_gas: GasAmount(192),
1851-
l2_gas: GasAmount(1_818_362),
1851+
l2_gas: GasAmount(1_802_842),
18521852
},
18531853
);
18541854
}

snforge_std/src/cheatcodes/contract_class.cairo

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ impl ContractClassImpl of ContractClassTrait {
6666
fn deploy(
6767
self: @ContractClass, constructor_calldata: @Array::<felt252>,
6868
) -> SyscallResult<(ContractAddress, Span<felt252>)> {
69-
let mut inputs = _prepare_calldata(self.class_hash, constructor_calldata);
69+
let salt: felt252 = execute_cheatcode_and_deserialize::<'get_salt'>(array![].span());
7070

71-
execute_cheatcode_and_deserialize::<'deploy'>(inputs.span())
71+
starknet::syscalls::deploy_syscall(
72+
*self.class_hash, salt, constructor_calldata.span(), false,
73+
)
7274
}
7375

7476
fn deploy_at(

snforge_std_deprecated/src/cheatcodes/contract_class.cairo

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ impl ContractClassImpl of ContractClassTrait {
6666
fn deploy(
6767
self: @ContractClass, constructor_calldata: @Array::<felt252>,
6868
) -> SyscallResult<(ContractAddress, Span<felt252>)> {
69-
let mut inputs = _prepare_calldata(self.class_hash, constructor_calldata);
69+
let salt: felt252 = execute_cheatcode_and_deserialize::<'get_salt'>(array![].span());
7070

71-
execute_cheatcode_and_deserialize::<'deploy'>(inputs.span())
71+
starknet::syscalls::deploy_syscall(
72+
*self.class_hash, salt, constructor_calldata.span(), false,
73+
)
7274
}
7375

7476
fn deploy_at(

0 commit comments

Comments
 (0)