-
Notifications
You must be signed in to change notification settings - Fork 159
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Fix panic if event don't follow constraints (#1932)
<!-- Reference any GitHub issues resolved by this PR --> ## Introduced changes <!-- A brief description of the changes --> - Fixes https://t.me/starknet_foundry/777
- Loading branch information
Showing
7 changed files
with
209 additions
and
13 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
use starknet::ContractAddress; | ||
|
||
#[starknet::interface] | ||
trait ITooManyEvents<TContractState> { | ||
fn emit_too_many_events(self: @TContractState, count: felt252); | ||
fn emit_too_many_keys(self: @TContractState, count: felt252); | ||
fn emit_too_many_data(self: @TContractState, count: felt252); | ||
} | ||
|
||
#[starknet::contract] | ||
mod TooManyEvents { | ||
#[storage] | ||
struct Storage {} | ||
|
||
#[abi(embed_v0)] | ||
impl TooManyEventsImpl of super::ITooManyEvents<ContractState> { | ||
fn emit_too_many_events(self: @ContractState, mut count: felt252) { | ||
while count != 0 { | ||
starknet::emit_event_syscall(array![0].span(), array![0].span()).unwrap(); | ||
count -= 1; | ||
}; | ||
} | ||
fn emit_too_many_keys(self: @ContractState, mut count: felt252) { | ||
let mut arr = array![]; | ||
while count != 0 { | ||
arr.append(0); | ||
count -= 1; | ||
}; | ||
|
||
starknet::emit_event_syscall(arr.span(), array![0].span()).unwrap(); | ||
} | ||
fn emit_too_many_data(self: @ContractState, mut count: felt252) { | ||
let mut arr = array![]; | ||
while count != 0 { | ||
arr.append(0); | ||
count -= 1; | ||
}; | ||
|
||
starknet::emit_event_syscall(array![0].span(), arr.span()).unwrap(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,5 +27,6 @@ mod spy_events; | |
mod store_load; | ||
mod syscalls; | ||
mod test_state; | ||
mod too_many_events; | ||
mod trace; | ||
mod warp; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,153 @@ | ||
use blockifier::versioned_constants::{EventLimits, VersionedConstants}; | ||
use indoc::formatdoc; | ||
use std::path::Path; | ||
use test_utils::runner::{assert_case_output_contains, assert_failed, assert_passed, Contract}; | ||
use test_utils::running_tests::run_test_case; | ||
|
||
#[test] | ||
fn ok_events() { | ||
let EventLimits { | ||
max_data_length, | ||
max_keys_length, | ||
max_n_emitted_events, | ||
} = VersionedConstants::latest_constants().tx_event_limits; | ||
|
||
let test = test_utils::test_case!( | ||
&formatdoc!( | ||
r#" | ||
use starknet::ContractAddress; | ||
use snforge_std::{{ declare, ContractClassTrait, store, load }}; | ||
#[starknet::interface] | ||
trait ITooManyEvents<TContractState> {{ | ||
fn emit_too_many_events(self: @TContractState, count: felt252); | ||
fn emit_too_many_keys(self: @TContractState, count: felt252); | ||
fn emit_too_many_data(self: @TContractState, count: felt252); | ||
}} | ||
fn deploy_contract() -> ITooManyEventsDispatcher {{ | ||
let contract = declare("TooManyEvents"); | ||
let contract_address = contract.deploy(@array![]).unwrap(); | ||
ITooManyEventsDispatcher {{ contract_address }} | ||
}} | ||
#[test] | ||
fn emit_ok_many_events() {{ | ||
let deployed = deploy_contract(); | ||
deployed.emit_too_many_events({max_n_emitted_events}); | ||
assert(1 == 1, ''); | ||
}} | ||
#[test] | ||
fn emit_ok_many_keys() {{ | ||
let deployed = deploy_contract(); | ||
deployed.emit_too_many_keys({max_keys_length}); | ||
assert(1 == 1, ''); | ||
}} | ||
#[test] | ||
fn emit_ok_many_data() {{ | ||
let deployed = deploy_contract(); | ||
deployed.emit_too_many_data({max_data_length}); | ||
assert(1 == 1, ''); | ||
}} | ||
"# | ||
), | ||
Contract::from_code_path( | ||
"TooManyEvents".to_string(), | ||
Path::new("tests/data/contracts/too_many_events.cairo"), | ||
) | ||
.unwrap() | ||
); | ||
|
||
let result = run_test_case(&test); | ||
|
||
assert_passed(&result); | ||
} | ||
#[test] | ||
fn too_many_events() { | ||
let EventLimits { | ||
max_data_length, | ||
max_keys_length, | ||
max_n_emitted_events, | ||
} = VersionedConstants::latest_constants().tx_event_limits; | ||
|
||
let emit_too_many_events = max_n_emitted_events + 1; | ||
let emit_too_many_keys = max_keys_length + 1; | ||
let emit_too_many_data = max_data_length + 1; | ||
|
||
let test = test_utils::test_case!( | ||
&formatdoc!( | ||
r#" | ||
use starknet::ContractAddress; | ||
use snforge_std::{{ declare, ContractClassTrait, store, load }}; | ||
#[starknet::interface] | ||
trait ITooManyEvents<TContractState> {{ | ||
fn emit_too_many_events(self: @TContractState, count: felt252); | ||
fn emit_too_many_keys(self: @TContractState, count: felt252); | ||
fn emit_too_many_data(self: @TContractState, count: felt252); | ||
}} | ||
fn deploy_contract() -> ITooManyEventsDispatcher {{ | ||
let contract = declare("TooManyEvents"); | ||
let contract_address = contract.deploy(@array![]).unwrap(); | ||
ITooManyEventsDispatcher {{ contract_address }} | ||
}} | ||
#[test] | ||
fn emit_too_many_events() {{ | ||
let deployed = deploy_contract(); | ||
deployed.emit_too_many_events({emit_too_many_events}); | ||
assert(1 == 1, ''); | ||
}} | ||
#[test] | ||
fn emit_too_many_keys() {{ | ||
let deployed = deploy_contract(); | ||
deployed.emit_too_many_keys({emit_too_many_keys}); | ||
assert(1 == 1, ''); | ||
}} | ||
#[test] | ||
fn emit_too_many_data() {{ | ||
let deployed = deploy_contract(); | ||
deployed.emit_too_many_data({emit_too_many_data}); | ||
assert(1 == 1, ''); | ||
}} | ||
"# | ||
), | ||
Contract::from_code_path( | ||
"TooManyEvents".to_string(), | ||
Path::new("tests/data/contracts/too_many_events.cairo"), | ||
) | ||
.unwrap() | ||
); | ||
|
||
let result = run_test_case(&test); | ||
|
||
assert_failed(&result); | ||
assert_case_output_contains( | ||
&result, | ||
"emit_too_many_events", | ||
&format!("Got an exception while executing a hint: Exceeded the maximum number of events, number events: {emit_too_many_events}, max number events: {max_n_emitted_events}."), | ||
); | ||
assert_case_output_contains( | ||
&result, | ||
"emit_too_many_data", | ||
&format!("Got an exception while executing a hint: Exceeded the maximum data length, data length: {emit_too_many_data}, max data length: {max_data_length}."), | ||
); | ||
assert_case_output_contains( | ||
&result, | ||
"emit_too_many_keys", | ||
&format!("Got an exception while executing a hint: Exceeded the maximum keys length, keys length: {emit_too_many_keys}, max keys length: {max_keys_length}."), | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters