From 7115778fdb05b2bbd41577a0071ab992df54814e Mon Sep 17 00:00:00 2001 From: Moody Salem Date: Fri, 26 Apr 2024 08:12:56 -0400 Subject: [PATCH] prevent canceled proposal from executing --- src/governor.cairo | 1 + src/governor_test.cairo | 27 +++++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/governor.cairo b/src/governor.cairo index 915887c..a536f36 100644 --- a/src/governor.cairo +++ b/src/governor.cairo @@ -307,6 +307,7 @@ pub mod Governor { assert(proposal.proposer.is_non_zero(), 'DOES_NOT_EXIST'); assert(proposal.execution_state.executed.is_zero(), 'ALREADY_EXECUTED'); + assert(proposal.execution_state.canceled.is_zero(), 'PROPOSAL_CANCELED'); let timestamp_current = get_block_timestamp(); // we cannot tell if a proposal is executed if it is executed at timestamp 0 diff --git a/src/governor_test.cairo b/src/governor_test.cairo index 2d1d916..286e2a0 100644 --- a/src/governor_test.cairo +++ b/src/governor_test.cairo @@ -563,6 +563,33 @@ fn test_execute_valid_proposal() { assert_eq!(token.balanceOf(recipient()), 100); } +#[test] +#[should_panic(expected: ('PROPOSAL_CANCELED', 'ENTRYPOINT_FAILED'))] +fn test_canceled_proposal_cannot_be_executed() { + let (staker, token, governor, config) = setup(); + let id = create_proposal(governor, token, staker); + + token.transfer(governor.contract_address, 100); + + token.approve(staker.contract_address, config.quorum.into()); + staker.stake(voter1()); + + advance_time(config.voting_start_delay); + set_contract_address(proposer()); + governor.vote(id, true); + set_contract_address(voter1()); + governor.vote(id, true); + + set_contract_address(proposer()); + governor.cancel(id); + + advance_time(config.voting_period); + + set_contract_address(anyone()); + + governor.execute(transfer_call(token: token, recipient: recipient(), amount: 100)); +} + #[test] #[should_panic(expected: ('VOTING_NOT_ENDED', 'ENTRYPOINT_FAILED'))] fn test_execute_before_voting_ends_should_fail() {