Sitelet https://github.com/starkware-libs/cairo/commit/0a2f39e39196a45565c9b299542e9e5924665d0b
Skip to content

Commit 0a2f39e

Browse files
authored
bugfix(starknet-plugin): Fixed test deployment hygiene issues. (#10173)
1 parent 6d10ce9 commit 0a2f39e

3 files changed

Lines changed: 65 additions & 16 deletions

File tree

‎crates/cairo-lang-starknet/cairo_level_tests/deployment.cairo‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,40 @@ pub mod advanced {
5151
) {}
5252
}
5353

54+
/// Contract whose constructor parameters are named exactly like the bindings that
55+
/// `deploy_for_test` generates for itself (`class_hash` / `deployment_params` /
56+
/// `calldata`). These must neither collide with those bindings (compile error) nor
57+
/// shadow them (silently dropping the user's `calldata` argument).
58+
#[starknet::contract]
59+
pub mod reserved_ctor_arg_names {
60+
use starknet::storage::{StoragePointerReadAccess, StoragePointerWriteAccess};
61+
#[storage]
62+
struct Storage {
63+
value: felt252,
64+
}
65+
66+
#[constructor]
67+
fn constructor(
68+
ref self: ContractState,
69+
class_hash: felt252,
70+
deployment_params: felt252,
71+
calldata: Array<felt252>,
72+
) {
73+
self.value.write(class_hash + deployment_params + calldata.len().into());
74+
}
75+
76+
#[abi(embed_v0)]
77+
impl ValueImpl of super::IValue<ContractState> {
78+
fn get_value(self: @ContractState) -> felt252 {
79+
self.value.read()
80+
}
81+
82+
fn set_value(ref self: ContractState, value: felt252) {
83+
self.value.write(value);
84+
}
85+
}
86+
}
87+
5488
#[test]
5589
fn test_deploy_in_construct() {
5690
let (contract_address, _) = deploy_syscall(self_caller::TEST_CLASS_HASH, 0, [].span(), false)
@@ -122,3 +156,16 @@ fn test_typed_deploy_default_with_complex_args() {
122156
) == Err(array!['CONTRACT_ALREADY_DEPLOYED']),
123157
);
124158
}
159+
160+
#[test]
161+
fn test_deploy_for_test_reserved_ctor_arg_names() {
162+
// The constructor args named `class_hash` / `deployment_params` / `calldata` must be passed
163+
// through correctly. Pre-fix this failed to compile (E2054, parameter redefinition) and the
164+
// `calldata` arg was silently dropped.
165+
let (contract_address, _) = reserved_ctor_arg_names::deploy_for_test(
166+
reserved_ctor_arg_names::TEST_CLASS_HASH, Default::default(), 10, 20, array![1, 2, 3],
167+
)
168+
.expect('deployment failed');
169+
// 10 + 20 + len([1, 2, 3]) == 33; a dropped `calldata` arg would change the sum.
170+
assert!(IValueDispatcher { contract_address }.get_value() == 33);
171+
}

‎crates/cairo-lang-starknet/src/plugin/plugin_test_data/contracts/diagnostics‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -311,19 +311,19 @@ use starknet::storage::Map as LegacyMap;
311311
pub const TEST_CLASS_HASH: starknet::ClassHash = 0x3bd690d1a73da0d8c43f46ecc3a006978d8343a075e91a1c7a24529e7d244a.try_into().unwrap();
312312
#[cfg(target: 'test')]
313313
pub fn deploy_for_test(
314-
class_hash: starknet::ClassHash,
315-
deployment_params: starknet::deployment::DeploymentParams,
314+
__deploy_class_hash__: starknet::ClassHash,
315+
__deploy_params__: starknet::deployment::DeploymentParams,
316316

317317
) -> starknet::SyscallResult<(starknet::ContractAddress, core::array::Span<felt252>)> {
318-
let mut calldata: core::array::Array<felt252> = core::array::ArrayTrait::new();
318+
let mut __deploy_calldata__: core::array::Array<felt252> = core::array::ArrayTrait::new();
319319

320320

321321

322322
starknet::syscalls::deploy_syscall(
323-
class_hash,
324-
deployment_params.salt,
325-
core::array::ArrayTrait::span(@calldata),
326-
deployment_params.deploy_from_zero,
323+
__deploy_class_hash__,
324+
__deploy_params__.salt,
325+
core::array::ArrayTrait::span(@__deploy_calldata__),
326+
__deploy_params__.deploy_from_zero,
327327
)
328328
}
329329

‎crates/cairo-lang-starknet/src/plugin/starknet_module/contract.rs‎

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -406,8 +406,9 @@ fn generate_deploy_function<'db>(
406406
let type_text = ty.as_syntax_node().get_text_without_trivia(db).long(db);
407407

408408
param_declarations.push(format!("{name}: {type_text}"));
409-
calldata_serialization
410-
.push(format!("core::serde::Serde::<{type_text}>::serialize(@{name}, ref calldata);",));
409+
calldata_serialization.push(format!(
410+
"core::serde::Serde::<{type_text}>::serialize(@{name}, ref __deploy_calldata__);",
411+
));
411412
}
412413

413414
let param_declarations_str = param_declarations.join(",\n");
@@ -417,19 +418,20 @@ fn generate_deploy_function<'db>(
417418
"
418419
#[cfg(target: 'test')]
419420
pub fn deploy_for_test(
420-
class_hash: starknet::ClassHash,
421-
deployment_params: starknet::deployment::DeploymentParams,
421+
__deploy_class_hash__: starknet::ClassHash,
422+
__deploy_params__: starknet::deployment::DeploymentParams,
422423
{param_declarations_str}
423424
) -> starknet::SyscallResult<(starknet::ContractAddress, core::array::Span<felt252>)> {{
424-
let mut calldata: core::array::Array<felt252> = core::array::ArrayTrait::new();
425+
let mut __deploy_calldata__: core::array::Array<felt252> = \
426+
core::array::ArrayTrait::new();
425427
426428
{calldata_serialization_str}
427429
428430
starknet::syscalls::deploy_syscall(
429-
class_hash,
430-
deployment_params.salt,
431-
core::array::ArrayTrait::span(@calldata),
432-
deployment_params.deploy_from_zero,
431+
__deploy_class_hash__,
432+
__deploy_params__.salt,
433+
core::array::ArrayTrait::span(@__deploy_calldata__),
434+
__deploy_params__.deploy_from_zero,
433435
)
434436
}}
435437
"

0 commit comments

Comments
 (0)