diff --git a/contracts/DualGovernance.sol b/contracts/DualGovernance.sol index e8c6e0b7..12a73b7b 100644 --- a/contracts/DualGovernance.sol +++ b/contracts/DualGovernance.sol @@ -200,7 +200,9 @@ contract DualGovernance is IDualGovernance { revert ProposalSubmissionBlocked(); } Proposers.Proposer memory proposer = _proposers.getProposer(msg.sender); - proposalId = TIMELOCK.submit(proposer.account, proposer.executor, calls, metadata); + proposalId = TIMELOCK.submit(proposer.executor, calls); + + emit ProposalSubmitted(proposer.account, proposalId, metadata); } /// @notice Schedules a previously submitted proposal for execution in the Dual Governance system. diff --git a/contracts/EmergencyProtectedTimelock.sol b/contracts/EmergencyProtectedTimelock.sol index 331f4502..2861c658 100644 --- a/contracts/EmergencyProtectedTimelock.sol +++ b/contracts/EmergencyProtectedTimelock.sol @@ -102,19 +102,12 @@ contract EmergencyProtectedTimelock is IEmergencyProtectedTimelock { // --- /// @notice Submits a new proposal to execute a series of calls through an executor. - /// @param proposer The address of the proposer submitting the proposal. /// @param executor The address of the executor contract that will execute the calls. /// @param calls An array of `ExternalCall` structs representing the calls to be executed. - /// @param metadata A string containing additional information about the proposal. /// @return newProposalId The id of the newly created proposal. - function submit( - address proposer, - address executor, - ExternalCall[] calldata calls, - string calldata metadata - ) external returns (uint256 newProposalId) { + function submit(address executor, ExternalCall[] calldata calls) external returns (uint256 newProposalId) { _timelockState.checkCallerIsGovernance(); - newProposalId = _proposals.submit(proposer, executor, calls, metadata); + newProposalId = _proposals.submit(executor, calls); } /// @notice Schedules a proposal for execution after a specified delay. diff --git a/contracts/Executor.sol b/contracts/Executor.sol index 53e64014..dd649fc5 100644 --- a/contracts/Executor.sol +++ b/contracts/Executor.sol @@ -14,7 +14,8 @@ contract Executor is IExternalExecutor, Ownable { // Events // --- - event Execute(address indexed sender, address indexed target, uint256 ethValue, bytes data); + event ETHReceived(address sender, uint256 value); + event Executed(address indexed target, uint256 ethValue, bytes data, bytes returndata); // --- // Constructor @@ -32,10 +33,12 @@ contract Executor is IExternalExecutor, Ownable { /// @param payload The calldata for the function call. function execute(address target, uint256 value, bytes calldata payload) external payable { _checkOwner(); - Address.functionCallWithValue(target, payload, value); - emit Execute(msg.sender, target, value, payload); + bytes memory returndata = Address.functionCallWithValue(target, payload, value); + emit Executed(target, value, payload, returndata); } /// @notice Allows the contract to receive ether. - receive() external payable {} + receive() external payable { + emit ETHReceived(msg.sender, msg.value); + } } diff --git a/contracts/TimelockedGovernance.sol b/contracts/TimelockedGovernance.sol index 25f08fd3..348d927e 100644 --- a/contracts/TimelockedGovernance.sol +++ b/contracts/TimelockedGovernance.sol @@ -51,7 +51,8 @@ contract TimelockedGovernance is IGovernance { string calldata metadata ) external returns (uint256 proposalId) { _checkCallerIsGovernance(); - return TIMELOCK.submit(msg.sender, TIMELOCK.getAdminExecutor(), calls, metadata); + proposalId = TIMELOCK.submit(TIMELOCK.getAdminExecutor(), calls); + emit ProposalSubmitted(msg.sender, proposalId, metadata); } /// @notice Schedules a submitted proposal. diff --git a/contracts/interfaces/IGovernance.sol b/contracts/interfaces/IGovernance.sol index 51652b40..ebf31d6d 100644 --- a/contracts/interfaces/IGovernance.sol +++ b/contracts/interfaces/IGovernance.sol @@ -6,6 +6,8 @@ import {ITimelock} from "./ITimelock.sol"; import {ExternalCall} from "../libraries/ExternalCalls.sol"; interface IGovernance { + event ProposalSubmitted(address indexed proposerAccount, uint256 indexed proposalId, string metadata); + function TIMELOCK() external view returns (ITimelock); function submitProposal( ExternalCall[] calldata calls, diff --git a/contracts/interfaces/ITimelock.sol b/contracts/interfaces/ITimelock.sol index f94fe3e6..234a000d 100644 --- a/contracts/interfaces/ITimelock.sol +++ b/contracts/interfaces/ITimelock.sol @@ -16,12 +16,7 @@ interface ITimelock { ProposalStatus status; } - function submit( - address proposer, - address executor, - ExternalCall[] calldata calls, - string calldata metadata - ) external returns (uint256 newProposalId); + function submit(address executor, ExternalCall[] calldata calls) external returns (uint256 newProposalId); function schedule(uint256 proposalId) external; function execute(uint256 proposalId) external; function cancelAllNonExecutedProposals() external; diff --git a/contracts/libraries/ExecutableProposals.sol b/contracts/libraries/ExecutableProposals.sol index 295b8e6e..e385f667 100644 --- a/contracts/libraries/ExecutableProposals.sol +++ b/contracts/libraries/ExecutableProposals.sol @@ -87,9 +87,7 @@ library ExecutableProposals { // Events // --- - event ProposalSubmitted( - uint256 indexed id, address indexed proposer, address indexed executor, ExternalCall[] calls, string metadata - ); + event ProposalSubmitted(uint256 indexed id, address indexed executor, ExternalCall[] calls); event ProposalScheduled(uint256 indexed id); event ProposalExecuted(uint256 indexed id); event ProposalsCancelledTill(uint256 proposalId); @@ -100,17 +98,13 @@ library ExecutableProposals { /// @notice Submits a new proposal with the specified executor and external calls. /// @param self The context of the Executable Proposal library. - /// @param proposer The address of the proposer submitting the proposal. /// @param executor The address authorized to execute the proposal. /// @param calls The list of external calls to include in the proposal. - /// @param metadata Metadata describing the proposal. /// @return newProposalId The id of the newly submitted proposal. function submit( Context storage self, - address proposer, address executor, - ExternalCall[] memory calls, - string memory metadata + ExternalCall[] memory calls ) internal returns (uint256 newProposalId) { if (calls.length == 0) { revert EmptyCalls(); @@ -129,7 +123,7 @@ library ExecutableProposals { newProposal.calls.push(calls[i]); } - emit ProposalSubmitted(newProposalId, proposer, executor, calls, metadata); + emit ProposalSubmitted(newProposalId, executor, calls); } /// @notice Marks a previously submitted proposal as scheduled for execution if the required delay period diff --git a/test/mocks/TimelockMock.sol b/test/mocks/TimelockMock.sol index 7ae66eab..a818ab26 100644 --- a/test/mocks/TimelockMock.sol +++ b/test/mocks/TimelockMock.sol @@ -26,12 +26,7 @@ contract TimelockMock is ITimelock { address internal governance; - function submit( - address, - address, - ExternalCall[] calldata, - string calldata - ) external returns (uint256 newProposalId) { + function submit(address, ExternalCall[] calldata) external returns (uint256 newProposalId) { newProposalId = submittedProposals.length + OFFSET; submittedProposals.push(newProposalId); canScheduleProposal[newProposalId] = false; diff --git a/test/unit/DualGovernance.t.sol b/test/unit/DualGovernance.t.sol index 20263fdc..31c1293b 100644 --- a/test/unit/DualGovernance.t.sol +++ b/test/unit/DualGovernance.t.sol @@ -14,7 +14,10 @@ import {Tiebreaker} from "contracts/libraries/Tiebreaker.sol"; import {Resealer} from "contracts/libraries/Resealer.sol"; import {Status as ProposalStatus} from "contracts/libraries/ExecutableProposals.sol"; import {Proposers} from "contracts/libraries/Proposers.sol"; + +import {IGovernance} from "contracts/interfaces/IGovernance.sol"; import {IResealManager} from "contracts/interfaces/IResealManager.sol"; + import { DualGovernanceConfig, IDualGovernanceConfigProvider, @@ -225,13 +228,15 @@ contract DualGovernanceUnitTests is UnitTest { function test_submitProposal_HappyPath() external { ExternalCall[] memory calls = _generateExternalCalls(); Proposers.Proposer memory proposer = _dualGovernance.getProposer(address(this)); - vm.expectCall( - address(_timelock), - 0, - abi.encodeWithSelector(TimelockMock.submit.selector, address(this), proposer.executor, calls, "") - ); + vm.expectCall(address(_timelock), 0, abi.encodeCall(TimelockMock.submit, (proposer.executor, calls))); + + uint256 expectedProposalId = 1; + string memory metadata = "New proposal description"; - uint256 proposalId = _dualGovernance.submitProposal(calls, ""); + vm.expectEmit(); + emit IGovernance.ProposalSubmitted(proposer.account, expectedProposalId, metadata); + + uint256 proposalId = _dualGovernance.submitProposal(calls, metadata); uint256[] memory submittedProposals = _timelock.getSubmittedProposals(); assertEq(submittedProposals.length, 1); @@ -1107,11 +1112,11 @@ contract DualGovernanceUnitTests is UnitTest { vm.expectEmit(); emit DualGovernanceStateMachine.ConfigProviderSet(IDualGovernanceConfigProvider(address(newConfigProvider))); vm.expectEmit(); - emit Executor.Execute( - address(this), + emit Executor.Executed( address(_dualGovernance), 0, - abi.encodeWithSelector(DualGovernance.setConfigProvider.selector, address(newConfigProvider)) + abi.encodeWithSelector(DualGovernance.setConfigProvider.selector, address(newConfigProvider)), + new bytes(0) ); vm.expectCall( @@ -2420,8 +2425,7 @@ contract DualGovernanceUnitTests is UnitTest { // --- function _submitMockProposal() internal { - // mock timelock doesn't uses proposal data - _timelock.submit(msg.sender, address(0), new ExternalCall[](0), ""); + _timelock.submit(address(0), new ExternalCall[](0)); } function _scheduleProposal(uint256 proposalId, Timestamp submittedAt) internal { diff --git a/test/unit/EmergencyProtectedTimelock.t.sol b/test/unit/EmergencyProtectedTimelock.t.sol index bc00a00c..f308fa23 100644 --- a/test/unit/EmergencyProtectedTimelock.t.sol +++ b/test/unit/EmergencyProtectedTimelock.t.sol @@ -186,21 +186,19 @@ contract EmergencyProtectedTimelockUnitTests is UnitTest { vm.prank(stranger); vm.expectRevert(abi.encodeWithSelector(TimelockState.CallerIsNotGovernance.selector, [stranger])); - _timelock.submit(stranger, _adminExecutor, new ExternalCall[](0), ""); + _timelock.submit(_adminExecutor, new ExternalCall[](0)); assertEq(_timelock.getProposalsCount(), 0); } function test_submit_HappyPath() external { string memory testMetadata = "testMetadata"; - vm.expectEmit(true, true, true, true); + vm.expectEmit(); emit ExecutableProposals.ProposalSubmitted( - 1, _dualGovernance, _adminExecutor, _getMockTargetRegularStaffCalls(address(_targetMock)), testMetadata + 1, _adminExecutor, _getMockTargetRegularStaffCalls(address(_targetMock)) ); vm.prank(_dualGovernance); - _timelock.submit( - _dualGovernance, _adminExecutor, _getMockTargetRegularStaffCalls(address(_targetMock)), testMetadata - ); + _timelock.submit(_adminExecutor, _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_timelock.getProposalsCount(), 1); @@ -593,7 +591,7 @@ contract EmergencyProtectedTimelockUnitTests is UnitTest { function test_emergencyExecute_RevertOn_ModeNotActive() external { vm.startPrank(_dualGovernance); - _timelock.submit(_dualGovernance, _adminExecutor, _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _timelock.submit(_adminExecutor, _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_timelock.getProposalsCount(), 1); @@ -1045,8 +1043,8 @@ contract EmergencyProtectedTimelockUnitTests is UnitTest { vm.startPrank(_dualGovernance); ExternalCall[] memory executorCalls = _getMockTargetRegularStaffCalls(address(_targetMock)); ExternalCall[] memory anotherExecutorCalls = _getMockTargetRegularStaffCalls(address(_anotherTargetMock)); - _timelock.submit(_dualGovernance, _adminExecutor, executorCalls, ""); - _timelock.submit(_dualGovernance, _adminExecutor, anotherExecutorCalls, ""); + _timelock.submit(_adminExecutor, executorCalls); + _timelock.submit(_adminExecutor, anotherExecutorCalls); (ITimelock.ProposalDetails memory submittedProposal, ExternalCall[] memory calls) = _timelock.getProposal(1); @@ -1203,7 +1201,7 @@ contract EmergencyProtectedTimelockUnitTests is UnitTest { function test_getProposalCalls() external { ExternalCall[] memory executorCalls = _getMockTargetRegularStaffCalls(address(_targetMock)); vm.prank(_dualGovernance); - _timelock.submit(_dualGovernance, _adminExecutor, executorCalls, ""); + _timelock.submit(_adminExecutor, executorCalls); ExternalCall[] memory calls = _timelock.getProposalCalls(1); @@ -1254,7 +1252,7 @@ contract EmergencyProtectedTimelockUnitTests is UnitTest { function _submitProposal() internal { vm.prank(_dualGovernance); - _timelock.submit(_dualGovernance, _adminExecutor, _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _timelock.submit(_adminExecutor, _getMockTargetRegularStaffCalls(address(_targetMock))); } function _scheduleProposal(uint256 proposalId) internal { diff --git a/test/unit/Executor.t.sol b/test/unit/Executor.t.sol new file mode 100644 index 00000000..086f7515 --- /dev/null +++ b/test/unit/Executor.t.sol @@ -0,0 +1,153 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.26; + +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {Address} from "@openzeppelin/contracts/utils/Address.sol"; + +import {Executor} from "contracts/Executor.sol"; +import {UnitTest} from "test/utils/unit-test.sol"; + +contract ExecutorTarget { + event NonPayableMethodCalled(address caller); + event PayableMethodCalled(address caller, uint256 value); + + function nonPayableMethod() external { + emit NonPayableMethodCalled(msg.sender); + } + + function payableMethod() external payable { + emit PayableMethodCalled(msg.sender, msg.value); + } +} + +contract ExecutorUnitTests is UnitTest { + address internal _owner = makeAddr("OWNER"); + + Executor internal _executor; + ExecutorTarget internal _target; + + function setUp() external { + _target = new ExecutorTarget(); + _executor = new Executor(_owner); + } + + function test_constructor_HappyPath() external { + assertEq(_executor.owner(), _owner); + } + + function test_constructor_RevertOn_ZeroOwnerAddress() external { + vm.expectRevert(abi.encodeWithSelector(Ownable.OwnableInvalidOwner.selector, address(0))); + new Executor(address(0)); + } + + // --- + // execute() + // --- + + function test_execute_HappyPath_NonPayableMethod_ZeroValue() external { + vm.expectEmit(); + emit ExecutorTarget.NonPayableMethodCalled(address(_executor)); + + vm.expectEmit(); + emit Executor.Executed(address(_target), 0, abi.encodeCall(_target.nonPayableMethod, ()), new bytes(0)); + + vm.prank(_owner); + _executor.execute({target: address(_target), value: 0, payload: abi.encodeCall(_target.nonPayableMethod, ())}); + } + + function test_execute_HappyPath_PayableMethod_ZeroValue() external { + vm.expectEmit(); + emit ExecutorTarget.PayableMethodCalled(address(_executor), 0); + + vm.expectEmit(); + emit Executor.Executed(address(_target), 0, abi.encodeCall(_target.payableMethod, ()), new bytes(0)); + + vm.prank(_owner); + _executor.execute({target: address(_target), value: 0, payload: abi.encodeCall(_target.payableMethod, ())}); + } + + function test_execute_HappyPath_PayableMethod_NonZeroValue() external { + uint256 valueAmount = 1 ether; + + vm.deal(address(_executor), valueAmount); + + assertEq(address(_target).balance, 0); + assertEq(address(_executor).balance, 1 ether); + + vm.expectEmit(); + emit ExecutorTarget.PayableMethodCalled(address(_executor), valueAmount); + + vm.expectEmit(); + emit Executor.Executed(address(_target), valueAmount, abi.encodeCall(_target.payableMethod, ()), new bytes(0)); + + vm.prank(_owner); + _executor.execute({ + target: address(_target), + value: valueAmount, + payload: abi.encodeCall(_target.payableMethod, ()) + }); + + assertEq(address(_target).balance, valueAmount); + assertEq(address(_executor).balance, 0); + } + + function test_execute_RevertOn_NonPayableMethod_NonZeroValue() external { + uint256 callValue = 1 ether; + + vm.deal(address(_executor), callValue); + assertEq(address(_executor).balance, callValue); + + vm.prank(_owner); + vm.expectRevert(Address.FailedInnerCall.selector); + _executor.execute({ + target: address(_target), + value: callValue, + payload: abi.encodeCall(_target.nonPayableMethod, ()) + }); + } + // --- + // receive() + // --- + + function test_receive_HappyPath() external { + uint256 sendValue = 1 ether; + + vm.deal(address(this), sendValue); + + assertEq(address(this).balance, sendValue); + assertEq(address(_executor).balance, 0); + + Address.sendValue(payable(address(_executor)), sendValue); + + assertEq(address(this).balance, 0); + assertEq(address(_executor).balance, sendValue); + } + + function test_receive_HappyPath_UsingSend() external { + uint256 sendValue = 1 ether; + + vm.deal(address(this), sendValue); + + assertEq(address(this).balance, sendValue); + assertEq(address(_executor).balance, 0); + + bool success = payable(address(_executor)).send(sendValue); + + assertTrue(success); + assertEq(address(this).balance, 0); + assertEq(address(_executor).balance, sendValue); + } + + // --- + // Custom call + // --- + + function test_RevertOnInvalidMethodCall() external { + vm.prank(_owner); + (bool success, bytes memory returndata) = + address(_executor).call{value: 1 ether}(abi.encodeWithSelector(bytes4(0xdeadbeaf), 42)); + + assertFalse(success); + assertEq(returndata, new bytes(0)); + } +} diff --git a/test/unit/TimelockedGovernance.t.sol b/test/unit/TimelockedGovernance.t.sol index 8437bb55..10a6f35e 100644 --- a/test/unit/TimelockedGovernance.t.sol +++ b/test/unit/TimelockedGovernance.t.sol @@ -2,6 +2,7 @@ pragma solidity 0.8.26; import {ITimelock} from "contracts/interfaces/ITimelock.sol"; +import {IGovernance} from "contracts/interfaces/IGovernance.sol"; import {TimelockedGovernance} from "contracts/TimelockedGovernance.sol"; import {UnitTest} from "test/utils/unit-test.sol"; @@ -43,8 +44,14 @@ contract TimelockedGovernanceUnitTests is UnitTest { function test_submit_proposal() external { assertEq(_timelock.getSubmittedProposals().length, 0); + uint256 expectedProposalId = 1; + string memory metadata = "proposal description"; + + vm.expectEmit(); + emit IGovernance.ProposalSubmitted(_governance, expectedProposalId, metadata); + vm.prank(_governance); - _timelockedGovernance.submitProposal(_getMockTargetRegularStaffCalls(address(0x1)), ""); + _timelockedGovernance.submitProposal(_getMockTargetRegularStaffCalls(address(0x1)), metadata); assertEq(_timelock.getSubmittedProposals().length, 1); } diff --git a/test/unit/libraries/ExecutableProposals.t.sol b/test/unit/libraries/ExecutableProposals.t.sol index 6da61154..4613d4ac 100644 --- a/test/unit/libraries/ExecutableProposals.t.sol +++ b/test/unit/libraries/ExecutableProposals.t.sol @@ -32,7 +32,7 @@ contract ExecutableProposalsUnitTests is UnitTest { function test_submit_reverts_if_empty_proposals() external { vm.expectRevert(ExecutableProposals.EmptyCalls.selector); - _proposals.submit(proposer, address(0), new ExternalCall[](0), "Empty calls"); + _proposals.submit(address(0), new ExternalCall[](0)); } function test_submit_proposal() external { @@ -41,14 +41,13 @@ contract ExecutableProposalsUnitTests is UnitTest { ExternalCall[] memory calls = _getMockTargetRegularStaffCalls(address(_targetMock)); uint256 expectedProposalId = proposalsCount + PROPOSAL_ID_OFFSET; - string memory description = "Regular staff calls"; vm.expectEmit(); - emit ExecutableProposals.ProposalSubmitted(expectedProposalId, proposer, address(_executor), calls, description); + emit ExecutableProposals.ProposalSubmitted(expectedProposalId, address(_executor), calls); vm.recordLogs(); - _proposals.submit(proposer, address(_executor), calls, description); + _proposals.submit(address(_executor), calls); Vm.Log[] memory entries = vm.getRecordedLogs(); assertEq(entries.length, 1); @@ -74,7 +73,7 @@ contract ExecutableProposalsUnitTests is UnitTest { function testFuzz_schedule_proposal(Duration delay) external { vm.assume(delay > Durations.ZERO && delay.toSeconds() <= MAX_DURATION_VALUE); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 expectedProposalId = 1; ExecutableProposals.Proposal memory proposal = _proposals.proposals[expectedProposalId]; @@ -110,7 +109,7 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_cannot_schedule_proposal_twice() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = 1; _proposals.schedule(proposalId, Durations.ZERO); @@ -125,7 +124,7 @@ contract ExecutableProposalsUnitTests is UnitTest { function testFuzz_cannot_schedule_proposal_before_delay_passed(Duration delay) external { vm.assume(delay > Durations.ZERO && delay.toSeconds() <= MAX_DURATION_VALUE); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); _wait(delay.minusSeconds(1 seconds)); @@ -136,7 +135,7 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_cannot_schedule_cancelled_proposal() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); _proposals.cancelAll(); uint256 proposalId = _proposals.getProposalsCount(); @@ -152,7 +151,7 @@ contract ExecutableProposalsUnitTests is UnitTest { function testFuzz_execute_proposal(Duration delay) external { vm.assume(delay > Durations.ZERO && delay.toSeconds() <= MAX_DURATION_VALUE); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); _proposals.schedule(proposalId, Durations.ZERO); @@ -192,7 +191,7 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_cannot_execute_unscheduled_proposal() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); vm.expectRevert( @@ -204,7 +203,7 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_cannot_execute_twice() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); _proposals.schedule(proposalId, Durations.ZERO); _proposals.execute(proposalId, Durations.ZERO); @@ -218,7 +217,7 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_cannot_execute_cancelled_proposal() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); _proposals.schedule(proposalId, Durations.ZERO); _proposals.cancelAll(); @@ -233,7 +232,7 @@ contract ExecutableProposalsUnitTests is UnitTest { function testFuzz_cannot_execute_before_delay_passed(Duration delay) external { vm.assume(delay > Durations.ZERO && delay.toSeconds() <= MAX_DURATION_VALUE); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); _proposals.schedule(proposalId, Durations.ZERO); @@ -244,8 +243,8 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_cancel_all_proposals() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalsCount = _proposals.getProposalsCount(); @@ -261,7 +260,7 @@ contract ExecutableProposalsUnitTests is UnitTest { // TODO: change this test completely to use getters function test_get_proposal_info_and_external_calls() external { ExternalCall[] memory expectedCalls = _getMockTargetRegularStaffCalls(address(_targetMock)); - _proposals.submit(proposer, address(_executor), expectedCalls, ""); + _proposals.submit(address(_executor), expectedCalls); uint256 proposalId = _proposals.getProposalsCount(); ITimelock.ProposalDetails memory proposalDetails = _proposals.getProposalDetails(proposalId); @@ -323,7 +322,7 @@ contract ExecutableProposalsUnitTests is UnitTest { function test_get_cancelled_proposal() external { ExternalCall[] memory expectedCalls = _getMockTargetRegularStaffCalls(address(_targetMock)); - _proposals.submit(proposer, address(_executor), expectedCalls, ""); + _proposals.submit(address(_executor), expectedCalls); uint256 proposalId = _proposals.getProposalsCount(); ITimelock.ProposalDetails memory proposalDetails = _proposals.getProposalDetails(proposalId); @@ -382,16 +381,16 @@ contract ExecutableProposalsUnitTests is UnitTest { function test_count_proposals() external { assertEq(_proposals.getProposalsCount(), 0); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_proposals.getProposalsCount(), 1); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_proposals.getProposalsCount(), 2); _proposals.schedule(1, Durations.ZERO); assertEq(_proposals.getProposalsCount(), 2); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_proposals.getProposalsCount(), 3); _proposals.schedule(2, Durations.ZERO); @@ -400,7 +399,7 @@ contract ExecutableProposalsUnitTests is UnitTest { _proposals.execute(1, Durations.ZERO); assertEq(_proposals.getProposalsCount(), 3); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_proposals.getProposalsCount(), 4); _proposals.cancelAll(); @@ -409,7 +408,7 @@ contract ExecutableProposalsUnitTests is UnitTest { function test_can_execute_proposal() external { Duration delay = Durations.from(100 seconds); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); assert(!_proposals.canExecute(proposalId, Durations.ZERO)); @@ -428,7 +427,7 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_can_not_execute_cancelled_proposal() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); _proposals.schedule(proposalId, Durations.ZERO); @@ -439,18 +438,18 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_cancelAll_DoesNotModifyStateOfExecutedProposals() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_proposals.getProposalsCount(), 1); uint256 executedProposalId = 1; _proposals.schedule(executedProposalId, Durations.ZERO); _proposals.execute(executedProposalId, Durations.ZERO); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_proposals.getProposalsCount(), 2); uint256 scheduledProposalId = 2; _proposals.schedule(scheduledProposalId, Durations.ZERO); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); assertEq(_proposals.getProposalsCount(), 3); uint256 submittedProposalId = 3; @@ -472,7 +471,7 @@ contract ExecutableProposalsUnitTests is UnitTest { function test_can_schedule_proposal() external { Duration delay = Durations.from(100 seconds); - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); assert(!_proposals.canSchedule(proposalId, delay)); @@ -487,7 +486,7 @@ contract ExecutableProposalsUnitTests is UnitTest { } function test_can_not_schedule_cancelled_proposal() external { - _proposals.submit(proposer, address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock)), ""); + _proposals.submit(address(_executor), _getMockTargetRegularStaffCalls(address(_targetMock))); uint256 proposalId = _proposals.getProposalsCount(); assert(_proposals.canSchedule(proposalId, Durations.ZERO));