From d73a8850981642529ce7138e81f51d7d34a99433 Mon Sep 17 00:00:00 2001 From: dd0sxx Date: Sat, 9 Dec 2023 16:13:40 -0500 Subject: [PATCH 1/2] it builds! --- .../ERC20TokenholderActionCreator.sol | 2 +- src/token-voting/ERC20TokenholderCaster.sol | 21 +- .../ERC721TokenholderActionCreator.sol | 2 +- src/token-voting/ERC721TokenholderCaster.sol | 21 +- src/token-voting/LlamaTokenVotingFactory.sol | 40 ++- src/token-voting/TokenholderActionCreator.sol | 6 +- src/token-voting/TokenholderCaster.sol | 270 +++++++++--------- .../token-voting/ERC20TokenholderCaster.t.sol | 252 ++++++++-------- .../ERC721TokenholderCaster.t.sol | 252 ++++++++-------- .../LlamaTokenVotingFactory.t.sol | 16 +- test/utils/LlamaCoreSigUtils.sol | 36 +-- 11 files changed, 448 insertions(+), 470 deletions(-) diff --git a/src/token-voting/ERC20TokenholderActionCreator.sol b/src/token-voting/ERC20TokenholderActionCreator.sol index a2fde41..9619b04 100644 --- a/src/token-voting/ERC20TokenholderActionCreator.sol +++ b/src/token-voting/ERC20TokenholderActionCreator.sol @@ -23,7 +23,7 @@ contract ERC20TokenholderActionCreator is TokenholderActionCreator { /// The `initializer` modifier ensures that this function can be invoked at most once. /// @param _token The ERC20 token to be used for voting. /// @param _llamaCore The `LlamaCore` contract for this Llama instance. - /// @param _role The role used by this contract to cast approvals and disapprovals. + /// @param _role The role used by this contract to cast approvals and vetos. /// @param _creationThreshold The default number of tokens required to create an action. This must /// be in the same decimals as the token. For example, if the token has 18 decimals and you want a /// creation threshold of 1000 tokens, pass in 1000e18. diff --git a/src/token-voting/ERC20TokenholderCaster.sol b/src/token-voting/ERC20TokenholderCaster.sol index 1ae50af..65a027e 100644 --- a/src/token-voting/ERC20TokenholderCaster.sol +++ b/src/token-voting/ERC20TokenholderCaster.sol @@ -7,7 +7,7 @@ import {ERC20Votes} from "@openzeppelin/token/ERC20/extensions/ERC20Votes.sol"; /// @title ERC20TokenholderCaster /// @author Llama (devsdosomething@llama.xyz) -/// @notice This contract lets holders of a given governance ERC20Votes token cast approvals and disapprovals +/// @notice This contract lets holders of a given governance ERC20Votes token cast approvals and vetos /// on created actions. contract ERC20TokenholderCaster is TokenholderCaster { ERC20Votes public token; @@ -23,17 +23,14 @@ contract ERC20TokenholderCaster is TokenholderCaster { /// The `initializer` modifier ensures that this function can be invoked at most once. /// @param _token The ERC20 token to be used for voting. /// @param _llamaCore The `LlamaCore` contract for this Llama instance. - /// @param _role The role used by this contract to cast approvals and disapprovals. - /// @param _minApprovalPct The minimum % of approvals required to submit approvals to `LlamaCore`. - /// @param _minDisapprovalPct The minimum % of disapprovals required to submit disapprovals to `LlamaCore`. - function initialize( - ERC20Votes _token, - ILlamaCore _llamaCore, - uint8 _role, - uint256 _minApprovalPct, - uint256 _minDisapprovalPct - ) external initializer { - __initializeTokenholderCasterMinimalProxy(_llamaCore, _role, _minApprovalPct, _minDisapprovalPct); + /// @param _role The role used by this contract to cast approvals and vetos. + /// @param _voteQuorum The minimum % of approvals required to submit approvals to `LlamaCore`. + /// @param _vetoQuorum The minimum % of vetos required to submit vetos to `LlamaCore`. + function initialize(ERC20Votes _token, ILlamaCore _llamaCore, uint8 _role, uint256 _voteQuorum, uint256 _vetoQuorum) + external + initializer + { + __initializeTokenholderCasterMinimalProxy(_llamaCore, _role, _voteQuorum, _vetoQuorum); token = _token; uint256 totalSupply = token.totalSupply(); if (totalSupply == 0) revert InvalidTokenAddress(); diff --git a/src/token-voting/ERC721TokenholderActionCreator.sol b/src/token-voting/ERC721TokenholderActionCreator.sol index bfaf78f..0009a77 100644 --- a/src/token-voting/ERC721TokenholderActionCreator.sol +++ b/src/token-voting/ERC721TokenholderActionCreator.sol @@ -24,7 +24,7 @@ contract ERC721TokenholderActionCreator is TokenholderActionCreator { /// The `initializer` modifier ensures that this function can be invoked at most once. /// @param _token The ERC721 token to be used for voting. /// @param _llamaCore The `LlamaCore` contract for this Llama instance. - /// @param _role The role used by this contract to cast approvals and disapprovals. + /// @param _role The role used by this contract to cast approvals and vetos. /// @param _creationThreshold The default number of tokens required to create an action. This must /// be in the same decimals as the token. For example, if the token has 18 decimals and you want a /// creation threshold of 1000 tokens, pass in 1000e18. diff --git a/src/token-voting/ERC721TokenholderCaster.sol b/src/token-voting/ERC721TokenholderCaster.sol index fa9f2c3..374643a 100644 --- a/src/token-voting/ERC721TokenholderCaster.sol +++ b/src/token-voting/ERC721TokenholderCaster.sol @@ -8,7 +8,7 @@ import {IERC721} from "@openzeppelin/token/ERC721/IERC721.sol"; /// @title ERC721TokenholderCaster /// @author Llama (devsdosomething@llama.xyz) -/// @notice This contract lets holders of a given governance ERC721Votes token cast approvals and disapprovals +/// @notice This contract lets holders of a given governance ERC721Votes token cast approvals and vetos /// on created actions. contract ERC721TokenholderCaster is TokenholderCaster { ERC721Votes public token; @@ -24,17 +24,14 @@ contract ERC721TokenholderCaster is TokenholderCaster { /// The `initializer` modifier ensures that this function can be invoked at most once. /// @param _token The ERC721 token to be used for voting. /// @param _llamaCore The `LlamaCore` contract for this Llama instance. - /// @param _role The role used by this contract to cast approvals and disapprovals. - /// @param _minApprovalPct The minimum % of approvals required to submit approvals to `LlamaCore`. - /// @param _minDisapprovalPct The minimum % of disapprovals required to submit disapprovals to `LlamaCore`. - function initialize( - ERC721Votes _token, - ILlamaCore _llamaCore, - uint8 _role, - uint256 _minApprovalPct, - uint256 _minDisapprovalPct - ) external initializer { - __initializeTokenholderCasterMinimalProxy(_llamaCore, _role, _minApprovalPct, _minDisapprovalPct); + /// @param _role The role used by this contract to cast approvals and vetos. + /// @param _voteQuorum The minimum % of approvals required to submit approvals to `LlamaCore`. + /// @param _vetoQuorum The minimum % of vetos required to submit vetos to `LlamaCore`. + function initialize(ERC721Votes _token, ILlamaCore _llamaCore, uint8 _role, uint256 _voteQuorum, uint256 _vetoQuorum) + external + initializer + { + __initializeTokenholderCasterMinimalProxy(_llamaCore, _role, _voteQuorum, _vetoQuorum); token = _token; if (!token.supportsInterface(type(IERC721).interfaceId)) revert InvalidTokenAddress(); } diff --git a/src/token-voting/LlamaTokenVotingFactory.sol b/src/token-voting/LlamaTokenVotingFactory.sol index cc703db..346f722 100644 --- a/src/token-voting/LlamaTokenVotingFactory.sol +++ b/src/token-voting/LlamaTokenVotingFactory.sol @@ -20,12 +20,8 @@ contract LlamaTokenVotingFactory { event ERC20TokenholderActionCreatorCreated(address actionCreator, address indexed token); event ERC721TokenholderActionCreatorCreated(address actionCreator, address indexed token); - event ERC20TokenholderCasterCreated( - address caster, address indexed token, uint256 minApprovalPct, uint256 minDisapprovalPct - ); - event ERC721TokenholderCasterCreated( - address caster, address indexed token, uint256 minApprovalPct, uint256 minDisapprovalPct - ); + event ERC20TokenholderCasterCreated(address caster, address indexed token, uint256 voteQuorum, uint256 vetoQuorum); + event ERC721TokenholderCasterCreated(address caster, address indexed token, uint256 voteQuorum, uint256 vetoQuorum); /// @notice The ERC20 Tokenholder Action Creator (logic) contract. ERC20TokenholderActionCreator public immutable ERC20_TOKENHOLDER_ACTION_CREATOR_LOGIC; @@ -59,12 +55,12 @@ contract LlamaTokenVotingFactory { ///@param token The address of the token to be used for voting. ///@param isERC20 Whether the token is an ERC20 or ERC721. ///@param actionCreatorRole The role required by the TokenholderActionCreator to create an action. - ///@param casterRole The role required by the TokenholderCaster to cast approvals and disapprovals. + ///@param casterRole The role required by the TokenholderCaster to cast approvals and vetos. ///@param creationThreshold The number of tokens required to create an action (set to 0 if not deploying action /// creator). - ///@param minApprovalPct The minimum percentage of tokens required to approve an action (set to 0 if not deploying + ///@param voteQuorum The minimum percentage of tokens required to approve an action (set to 0 if not deploying /// caster). - ///@param minDisapprovalPct The minimum percentage of tokens required to disapprove an action (set to 0 if not + ///@param vetoQuorum The minimum percentage of tokens required to disapprove an action (set to 0 if not /// deploying caster). function deployTokenVotingModule( address token, @@ -72,20 +68,18 @@ contract LlamaTokenVotingFactory { uint8 actionCreatorRole, uint8 casterRole, uint256 creationThreshold, - uint256 minApprovalPct, - uint256 minDisapprovalPct + uint256 voteQuorum, + uint256 vetoQuorum ) external returns (address actionCreator, address caster) { ILlamaCore core = ILlamaCore(ILlamaExecutor(msg.sender).LLAMA_CORE()); if (isERC20) { actionCreator = address(_deployERC20TokenholderActionCreator(ERC20Votes(token), core, actionCreatorRole, creationThreshold)); - caster = - address(_deployERC20TokenholderCaster(ERC20Votes(token), core, casterRole, minApprovalPct, minDisapprovalPct)); + caster = address(_deployERC20TokenholderCaster(ERC20Votes(token), core, casterRole, voteQuorum, vetoQuorum)); } else { actionCreator = address(_deployERC721TokenholderActionCreator(ERC721Votes(token), core, actionCreatorRole, creationThreshold)); - caster = - address(_deployERC721TokenholderCaster(ERC721Votes(token), core, casterRole, minApprovalPct, minDisapprovalPct)); + caster = address(_deployERC721TokenholderCaster(ERC721Votes(token), core, casterRole, voteQuorum, vetoQuorum)); } } @@ -127,31 +121,31 @@ contract LlamaTokenVotingFactory { ERC20Votes token, ILlamaCore llamaCore, uint8 role, - uint256 minApprovalPct, - uint256 minDisapprovalPct + uint256 voteQuorum, + uint256 vetoQuorum ) internal returns (ERC20TokenholderCaster caster) { caster = ERC20TokenholderCaster( Clones.cloneDeterministic( address(ERC20_TOKENHOLDER_CASTER_LOGIC), keccak256(abi.encodePacked(address(token), msg.sender)) ) ); - caster.initialize(token, llamaCore, role, minApprovalPct, minDisapprovalPct); - emit ERC20TokenholderCasterCreated(address(caster), address(token), minApprovalPct, minDisapprovalPct); + caster.initialize(token, llamaCore, role, voteQuorum, vetoQuorum); + emit ERC20TokenholderCasterCreated(address(caster), address(token), voteQuorum, vetoQuorum); } function _deployERC721TokenholderCaster( ERC721Votes token, ILlamaCore llamaCore, uint8 role, - uint256 minApprovalPct, - uint256 minDisapprovalPct + uint256 voteQuorum, + uint256 vetoQuorum ) internal returns (ERC721TokenholderCaster caster) { caster = ERC721TokenholderCaster( Clones.cloneDeterministic( address(ERC721_TOKENHOLDER_CASTER_LOGIC), keccak256(abi.encodePacked(address(token), msg.sender)) ) ); - caster.initialize(token, llamaCore, role, minApprovalPct, minDisapprovalPct); - emit ERC721TokenholderCasterCreated(address(caster), address(token), minApprovalPct, minDisapprovalPct); + caster.initialize(token, llamaCore, role, voteQuorum, vetoQuorum); + emit ERC721TokenholderCasterCreated(address(caster), address(token), voteQuorum, vetoQuorum); } } diff --git a/src/token-voting/TokenholderActionCreator.sol b/src/token-voting/TokenholderActionCreator.sol index 79ad3a9..9d5575f 100644 --- a/src/token-voting/TokenholderActionCreator.sol +++ b/src/token-voting/TokenholderActionCreator.sol @@ -23,7 +23,7 @@ abstract contract TokenholderActionCreator is Initializable { /// @notice The default number of tokens required to create an action. uint256 public creationThreshold; - /// @notice The role used by this contract to cast approvals and disapprovals. + /// @notice The role used by this contract to cast approvals and vetos. /// @dev This role is expected to have the permissions to create appropriate actions. uint8 public role; @@ -51,7 +51,7 @@ abstract contract TokenholderActionCreator is Initializable { /// @notice Mapping of token holder to function selectors to current nonces for EIP-712 signatures. /// @dev This is used to prevent replay attacks by incrementing the nonce for each operation (`createAction`, - /// `cancelAction`, `castApproval` and `castDisapproval`) signed by the token holder. + /// `cancelAction`, `castApproval` and `castVeto`) signed by the token holder. mapping(address tokenHolder => mapping(bytes4 selector => uint256 currentNonce)) public nonces; /// @dev Emitted when an action is canceled. @@ -105,7 +105,7 @@ abstract contract TokenholderActionCreator is Initializable { /// @dev This will be called by the `initialize` of the inheriting contract. /// @param _llamaCore The `LlamaCore` contract for this Llama instance. - /// @param _role The role used by this contract to cast approvals and disapprovals. + /// @param _role The role used by this contract to cast approvals and vetos. /// @param _creationThreshold The default number of tokens required to create an action. This must /// be in the same decimals as the token. For example, if the token has 18 decimals and you want a /// creation threshold of 1000 tokens, pass in 1000e18. diff --git a/src/token-voting/TokenholderCaster.sol b/src/token-voting/TokenholderCaster.sol index c342609..8250115 100644 --- a/src/token-voting/TokenholderCaster.sol +++ b/src/token-voting/TokenholderCaster.sol @@ -12,7 +12,7 @@ import {ILlamaRelativeStrategyBase} from "src/interfaces/ILlamaRelativeStrategyB /// @title TokenholderCaster /// @author Llama (devsdosomething@llama.xyz) -/// @notice This contract lets holders of a given governance token cast approvals and disapprovals +/// @notice This contract lets holders of a given governance token cast votes and vetos /// on created actions. /// @dev This contract is deployed by `LlamaTokenVotingFactory`. Anyone can deploy this contract using the factory, but /// it must hold a Policy from the specified `LlamaCore` instance to actually be able to cast on an action. This @@ -25,68 +25,68 @@ abstract contract TokenholderCaster is Initializable { /// @dev Cast counts and submission data. struct CastData { - uint96 approvalsFor; // Number of approvals casted for this action. This is the standard approval in `LlamaCore`. - uint96 approvalsAbstain; // Number of abstentions casted for this action. This does not exist in `LlamaCore`. - uint96 approvalsAgainst; // Number of approvals casted against this action. This does not exist in `LlamaCore`. - bool approvalSubmitted; // True if the approvals have been submitted to `LlamaCore, false otherwise. - uint96 disapprovalsFor; // Number of disapprovals casted for this action. This is the standard disapproval in + uint96 votesFor; // Number of votes casted for this action. This is the standard approval in `LlamaCore`. + uint96 votesAbstain; // Number of abstentions casted for this action. This does not exist in `LlamaCore`. + uint96 votesAgainst; // Number of votes casted against this action. This does not exist in `LlamaCore`. + bool voteSubmitted; // True if the votes have been submitted to `LlamaCore, false otherwise. + uint96 vetosFor; // Number of vetos casted for this action. This is the standard disapproval in // `LlamaCore`. - uint96 disapprovalsAbstain; // Number of abstentions casted for this action. This does not exist in `LlamaCore`. - uint96 disapprovalsAgainst; // Number of disapprovals casted against this action. This does not exist in + uint96 vetosAbstain; // Number of abstentions casted for this action. This does not exist in `LlamaCore`. + uint96 vetosAgainst; // Number of vetos casted against this action. This does not exist in // `LlamaCore`. - bool disapprovalSubmitted; // True if the disapprovals have been submitted to `LlamaCore`, false otherwise. - mapping(address tokenholder => bool) castApproval; // True if tokenholder casted approval, false otherwise. - mapping(address tokenholder => bool) castDisapproval; // True if tokenholder casted disapproval, false otherwise. + bool vetoSubmitted; // True if the vetos have been submitted to `LlamaCore`, false otherwise. + mapping(address tokenholder => bool) castVote; // True if tokenholder casted vote, false otherwise. + mapping(address tokenholder => bool) castVeto; // True if tokenholder casted veto, false otherwise. } // ======================== // ======== Errors ======== // ======================== - /// @dev Thrown when a user tries to cast approval but the action has expired. + /// @dev Thrown when a user tries to cast vote but the action has expired. error ActionExpired(); - /// @dev Thrown when a user tries to cast approval but the action is not active. + /// @dev Thrown when a user tries to cast vote but the action is not active. error ActionNotActive(); - /// @dev Thrown when a user tries to cast disapproval but but the action is not approved. + /// @dev Thrown when a user tries to cast veto but but the action is not approved. error ActionNotApproved(); - /// @dev Thrown when a user tries to cast approval but has already casted. - error AlreadyCastApproval(); + /// @dev Thrown when a user tries to cast vote but has already casted. + error AlreadyCastVote(); - /// @dev Thrown when a user tries to cast approval but the casts have already been submitted to `LlamaCore`. - error AlreadySubmittedApproval(); + /// @dev Thrown when a user tries to cast vote but the casts have already been submitted to `LlamaCore`. + error AlreadySubmittedVote(); - /// @dev Thrown when a user tries to cast disapproval but has already casted. - error AlreadyCastDisapproval(); + /// @dev Thrown when a user tries to cast veto but has already casted. + error AlreadyCastVeto(); - /// @dev Thrown when a user tries to cast disapproval but the casts have already been submitted to `LlamaCore. - error AlreadySubmittedDisapproval(); + /// @dev Thrown when a user tries to cast veto but the casts have already been submitted to `LlamaCore. + error AlreadySubmittedVeto(); - /// @dev Thrown when a user tries to cast (dis)approval but the casting period has ended. + /// @dev Thrown when a user tries to cast vote/veto but the casting period has ended. error CastingPeriodOver(); - /// @dev Thrown when a user tries to cast (dis)approval but the action cannot be submitted yet. + /// @dev Thrown when a user tries to cast vote/veto but the action cannot be submitted yet. error CantSubmitYet(); /// @dev Thrown when a user tries to create an action but the clock mode is not supported. error ClockModeNotSupported(string clockMode); - /// @dev Thrown when a user tries to cast (dis)approval but the (dis)approvals surpass the approvals. - error ForDoesNotSurpassAgainst(uint256 approvals, uint256 disapprovals); + /// @dev Thrown when a user tries to cast vote/veto but the vote/vetos surpass the votes. + error ForDoesNotSurpassAgainst(uint256 votes, uint256 vetos); - /// @dev Thrown when a user tries to submit approvals but there are not enough approvals. - error InsufficientApprovals(uint256 approvals, uint256 threshold); + /// @dev Thrown when a user tries to submit votes but there are not enough votes. + error InsufficientVotes(uint256 votes, uint256 threshold); /// @dev Thrown when a user tries to cast but does not have enough tokens. error InsufficientBalance(uint256 balance); - /// @dev Thrown when an invalid `approvalThreshold` is passed to the constructor. - error InvalidMinApprovalPct(uint256 approvalThreshold); + /// @dev Thrown when an invalid `voteQuorum` is passed to the constructor. + error InvalidVoteQuorum(uint256 approvalThreshold); - /// @dev Thrown when an invalid `disapprovalThreshold` is passed to the constructor. - error InvalidMinDisapprovalPct(uint256 disapprovalThreshold); + /// @dev Thrown when an invalid `vetoThreshold` is passed to the constructor. + error InvalidVetoQuorum(uint256 vetoThreshold); /// @dev Thrown when an invalid `llamaCore` address is passed to the constructor. error InvalidLlamaCoreAddress(); @@ -103,36 +103,36 @@ abstract contract TokenholderCaster is Initializable { /// @dev Thrown when an invalid `role` is passed to the constructor. error RoleNotInitialized(uint8 role); - /// @dev Thrown when a user tries to submit (dis)approval but the submission period has ended. + /// @dev Thrown when a user tries to submit vote/veto but the submission period has ended. error SubmissionPeriodOver(); // ======================== // ======== Events ======== // ======================== - /// @dev Emitted when an approval is cast. - /// @dev This is almost the same as the `ApprovalCast` event from `LlamaCore`, with the addition of the support field. + /// @dev Emitted when a vote is cast. + /// @dev This is almost the same as the `VoteCast` event from `LlamaCore`, with the addition of the support field. /// The two events will be nearly identical, with the `tokenholder` being the main difference. This version will emit /// the address of the tokenholder that casted, while the `LlamaCore` version will emit the address of this contract /// as the action creator. Additionally, there is no `role` emitted here as all tokenholders are eligible to vote. - event ApprovalCast( + event VoteCast( uint256 id, address indexed tokenholder, uint8 indexed role, uint8 indexed support, uint256 quantity, string reason ); - /// @dev Emitted when cast approvals are submitted to the `LlamaCore` contract. - event ApprovalsSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); + /// @dev Emitted when cast votes are submitted to the `LlamaCore` contract. + event VotesSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); - /// @dev Emitted when a disapproval is cast. - /// @dev This is the same as the `DisapprovalCast` event from `LlamaCore`. The two events will be + /// @dev Emitted when a veto is cast. + /// @dev This is the same as the `VetoCast` event from `LlamaCore`. The two events will be /// nearly identical, with the `tokenholder` being the only difference. This version will emit /// the address of the tokenholder that casted, while the `LlamaCore` version will emit the /// address of this contract as the action creator. - event DisapprovalCast( + event VetoCast( uint256 id, address indexed tokenholder, uint8 indexed role, uint8 indexed support, uint256 quantity, string reason ); - /// @dev Emitted when cast approvals are submitted to the `LlamaCore` contract. - event DisapprovalsSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); + /// @dev Emitted when cast votes are submitted to the `LlamaCore` contract. + event VetosSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); // ================================================= // ======== Constants and Storage Variables ======== // ================================================= @@ -146,13 +146,13 @@ abstract contract TokenholderCaster is Initializable { /// @notice The core contract for this Llama instance. ILlamaCore public llamaCore; - /// @notice The minimum % of approvals required to submit approvals to `LlamaCore`. - uint256 public minApprovalPct; + /// @notice The minimum % of votes required to submit votes to `LlamaCore`. + uint256 public voteQuorum; - /// @notice The minimum % of disapprovals required to submit disapprovals to `LlamaCore`. - uint256 public minDisapprovalPct; + /// @notice The minimum % of vetos required to submit vetos to `LlamaCore`. + uint256 public vetoQuorum; - /// @notice The role used by this contract to cast approvals and disapprovals. + /// @notice The role used by this contract to cast votes and vetos. /// @dev This role is expected to have the ability to force approve and disapprove actions. uint8 public role; @@ -160,14 +160,14 @@ abstract contract TokenholderCaster is Initializable { bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"); - /// @notice EIP-712 castApproval typehash. - bytes32 internal constant CAST_APPROVAL_BY_SIG_TYPEHASH = keccak256( - "CastApproval(address tokenHolder,uint8 support,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" + /// @notice EIP-712 castVote typehash. + bytes32 internal constant CAST_VOTE_BY_SIG_TYPEHASH = keccak256( + "CastVote(address tokenHolder,uint8 support,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" ); - /// @notice EIP-712 castDisapproval typehash. - bytes32 internal constant CAST_DISAPPROVAL_BY_SIG_TYPEHASH = keccak256( - "CastDisapproval(address tokenHolder,uint8 role,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" + /// @notice EIP-712 castVeto typehash. + bytes32 internal constant CAST_VETO_BY_SIG_TYPEHASH = keccak256( + "CastVeto(address tokenHolder,uint8 role,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" ); /// @dev EIP-712 actionInfo typehash. @@ -180,46 +180,44 @@ abstract contract TokenholderCaster is Initializable { /// @notice Mapping of tokenholders to function selectors to current nonces for EIP-712 signatures. /// @dev This is used to prevent replay attacks by incrementing the nonce for each operation (`createAction`, - /// `cancelAction`, `castApproval` and `castDisapproval`) signed by the tokenholders. + /// `cancelAction`, `castVote` and `castVeto`) signed by the tokenholders. mapping(address tokenholders => mapping(bytes4 selector => uint256 currentNonce)) public nonces; /// @dev This will be called by the `initialize` of the inheriting contract. /// @param _llamaCore The `LlamaCore` contract for this Llama instance. - /// @param _role The role used by this contract to cast approvals and disapprovals. - /// @param _minApprovalPct The minimum % of approvals required to submit approvals to `LlamaCore`. - /// @param _minDisapprovalPct The minimum % of disapprovals required to submit disapprovals to `LlamaCore`. + /// @param _role The role used by this contract to cast votes and vetos. + /// @param _voteQuorum The minimum % of votes required to submit votes to `LlamaCore`. + /// @param _vetoQuorum The minimum % of vetos required to submit vetos to `LlamaCore`. function __initializeTokenholderCasterMinimalProxy( ILlamaCore _llamaCore, uint8 _role, - uint256 _minApprovalPct, - uint256 _minDisapprovalPct + uint256 _voteQuorum, + uint256 _vetoQuorum ) internal { if (_llamaCore.actionsCount() < 0) revert InvalidLlamaCoreAddress(); if (_role > _llamaCore.policy().numRoles()) revert RoleNotInitialized(_role); - if (_minApprovalPct > ONE_HUNDRED_IN_BPS || _minApprovalPct <= 0) revert InvalidMinApprovalPct(_minApprovalPct); - if (_minDisapprovalPct > ONE_HUNDRED_IN_BPS || _minDisapprovalPct <= 0) { - revert InvalidMinDisapprovalPct(_minDisapprovalPct); - } + if (_voteQuorum > ONE_HUNDRED_IN_BPS || _voteQuorum <= 0) revert InvalidVoteQuorum(_voteQuorum); + if (_vetoQuorum > ONE_HUNDRED_IN_BPS || _vetoQuorum <= 0) revert InvalidVetoQuorum(_vetoQuorum); llamaCore = _llamaCore; role = _role; - minApprovalPct = _minApprovalPct; - minDisapprovalPct = _minDisapprovalPct; + voteQuorum = _voteQuorum; + vetoQuorum = _vetoQuorum; } - /// @notice How tokenholders add their support of the approval of an action with a reason. + /// @notice How tokenholders add their support to the vote of an action with a reason. /// @dev Use `""` for `reason` if there is no reason. /// @param actionInfo Data required to create an action. - /// @param support The tokenholder's support of the approval of the action. + /// @param support The tokenholder's support of the vote of the action. /// 0 = Against /// 1 = For /// 2 = Abstain, but this is not currently supported. - /// @param reason The reason given for the approval by the tokenholder. - function castApproval(ActionInfo calldata actionInfo, uint8 support, string calldata reason) external { - _castApproval(msg.sender, actionInfo, support, reason); + /// @param reason The reason given for the vote by the tokenholder. + function castVote(ActionInfo calldata actionInfo, uint8 support, string calldata reason) external { + _castVote(msg.sender, actionInfo, support, reason); } - function castApprovalBySig( + function castVoteBySig( address caster, uint8 support, ActionInfo calldata actionInfo, @@ -228,25 +226,25 @@ abstract contract TokenholderCaster is Initializable { bytes32 r, bytes32 s ) external { - bytes32 digest = _getCastApprovalTypedDataHash(caster, support, actionInfo, reason); + bytes32 digest = _getCastVoteTypedDataHash(caster, support, actionInfo, reason); address signer = ecrecover(digest, v, r, s); if (signer == address(0) || signer != caster) revert InvalidSignature(); - _castApproval(signer, actionInfo, support, reason); + _castVote(signer, actionInfo, support, reason); } - /// @notice How tokenholders add their support of the dapproval of an action with a reason. + /// @notice How tokenholders add their support to the veto of an action with a reason. /// @dev Use `""` for `reason` if there is no reason. /// @param actionInfo Data required to create an action. - /// @param support The tokenholder's support of the approval of the action. + /// @param support The tokenholder's support of the veto of the action. /// 0 = Against /// 1 = For /// 2 = Abstain, but this is not currently supported. - /// @param reason The reason given for the approval by the tokenholder. - function castDisapproval(ActionInfo calldata actionInfo, uint8 support, string calldata reason) external { - _castDisapproval(msg.sender, actionInfo, support, reason); + /// @param reason The reason given for the veto by the tokenholder. + function castVeto(ActionInfo calldata actionInfo, uint8 support, string calldata reason) external { + _castVeto(msg.sender, actionInfo, support, reason); } - function castDisapprovalBySig( + function castVetoBySig( address caster, uint8 support, ActionInfo calldata actionInfo, @@ -255,26 +253,26 @@ abstract contract TokenholderCaster is Initializable { bytes32 r, bytes32 s ) external { - bytes32 digest = _getCastDisapprovalTypedDataHash(caster, support, actionInfo, reason); + bytes32 digest = _getCastVetoTypedDataHash(caster, support, actionInfo, reason); address signer = ecrecover(digest, v, r, s); if (signer == address(0) || signer != caster) revert InvalidSignature(); - _castDisapproval(signer, actionInfo, support, reason); + _castVeto(signer, actionInfo, support, reason); } - /// @notice Submits cast approvals to the `LlamaCore` contract. + /// @notice Submits cast votes to the `LlamaCore` contract. /// @param actionInfo Data required to create an action. /// @dev this function can be called by anyone - function submitApprovals(ActionInfo calldata actionInfo) external { + function submitVotes(ActionInfo calldata actionInfo) external { Action memory action = llamaCore.getAction(actionInfo.id); - if (casts[actionInfo.id].approvalSubmitted) revert AlreadySubmittedApproval(); + if (casts[actionInfo.id].voteSubmitted) revert AlreadySubmittedVote(); // check to make sure the casting period has ended - uint256 approvalPeriod = ILlamaRelativeStrategyBase(address(actionInfo.strategy)).approvalPeriod(); - if (block.timestamp < action.creationTime + (approvalPeriod * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS) { + uint256 votingPeriod = ILlamaRelativeStrategyBase(address(actionInfo.strategy)).approvalPeriod(); + if (block.timestamp < action.creationTime + (votingPeriod * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS) { revert CantSubmitYet(); } - if (block.timestamp > action.creationTime + approvalPeriod) revert SubmissionPeriodOver(); + if (block.timestamp > action.creationTime + votingPeriod) revert SubmissionPeriodOver(); /// @dev only timestamp mode is supported for now. string memory clockMode = _getClockMode(); @@ -283,29 +281,29 @@ abstract contract TokenholderCaster is Initializable { } uint256 totalSupply = _getPastTotalSupply(action.creationTime - 1); - uint96 approvalsFor = casts[actionInfo.id].approvalsFor; - uint96 approvalsAgainst = casts[actionInfo.id].approvalsAgainst; - uint96 approvalsAbstain = casts[actionInfo.id].approvalsAbstain; - uint256 threshold = FixedPointMathLib.mulDivUp(totalSupply, minApprovalPct, ONE_HUNDRED_IN_BPS); - if (approvalsFor < threshold) revert InsufficientApprovals(approvalsFor, threshold); - if (approvalsFor <= approvalsAgainst) revert ForDoesNotSurpassAgainst(approvalsFor, approvalsAgainst); - - casts[actionInfo.id].approvalSubmitted = true; + uint96 votesFor = casts[actionInfo.id].votesFor; + uint96 votesAgainst = casts[actionInfo.id].votesAgainst; + uint96 votesAbstain = casts[actionInfo.id].votesAbstain; + uint256 threshold = FixedPointMathLib.mulDivUp(totalSupply, voteQuorum, ONE_HUNDRED_IN_BPS); + if (votesFor < threshold) revert InsufficientVotes(votesFor, threshold); + if (votesFor <= votesAgainst) revert ForDoesNotSurpassAgainst(votesFor, votesAgainst); + + casts[actionInfo.id].voteSubmitted = true; llamaCore.castApproval(role, actionInfo, ""); - emit ApprovalsSubmitted(actionInfo.id, approvalsFor, approvalsAgainst, approvalsAbstain); + emit VotesSubmitted(actionInfo.id, votesFor, votesAgainst, votesAbstain); } - /// @notice Submits cast approvals to the `LlamaCore` contract. + /// @notice Submits cast votes to the `LlamaCore` contract. /// @param actionInfo Data required to create an action. /// @dev this function can be called by anyone - function submitDisapprovals(ActionInfo calldata actionInfo) external { + function submitVetos(ActionInfo calldata actionInfo) external { Action memory action = llamaCore.getAction(actionInfo.id); actionInfo.strategy.checkIfDisapprovalEnabled(actionInfo, msg.sender, role); // Reverts if not allowed. - if (casts[actionInfo.id].disapprovalSubmitted) revert AlreadySubmittedDisapproval(); + if (casts[actionInfo.id].vetoSubmitted) revert AlreadySubmittedVeto(); uint256 queuingPeriod = ILlamaRelativeStrategyBase(address(actionInfo.strategy)).queuingPeriod(); - // check to make sure the current timestamp is within the submitDisapprovalBuffer 9period + // check to make sure the current timestamp is within the submitVetoBuffer period if (block.timestamp < action.minExecutionTime - (queuingPeriod * ONE_THIRD_IN_BPS) / ONE_HUNDRED_IN_BPS) { revert CantSubmitYet(); } @@ -317,26 +315,24 @@ abstract contract TokenholderCaster is Initializable { } uint256 totalSupply = _getPastTotalSupply(action.creationTime - 1); - uint96 disapprovalsFor = casts[actionInfo.id].disapprovalsFor; - uint96 disapprovalsAgainst = casts[actionInfo.id].disapprovalsAgainst; - uint96 disapprovalsAbstain = casts[actionInfo.id].disapprovalsAbstain; - uint256 threshold = FixedPointMathLib.mulDivUp(totalSupply, minDisapprovalPct, ONE_HUNDRED_IN_BPS); - if (disapprovalsFor < threshold) revert InsufficientApprovals(disapprovalsFor, threshold); - if (disapprovalsFor <= disapprovalsAgainst) revert ForDoesNotSurpassAgainst(disapprovalsFor, disapprovalsAgainst); - - casts[actionInfo.id].disapprovalSubmitted = true; + uint96 vetosFor = casts[actionInfo.id].vetosFor; + uint96 vetosAgainst = casts[actionInfo.id].vetosAgainst; + uint96 vetosAbstain = casts[actionInfo.id].vetosAbstain; + uint256 threshold = FixedPointMathLib.mulDivUp(totalSupply, vetoQuorum, ONE_HUNDRED_IN_BPS); + if (vetosFor < threshold) revert InsufficientVotes(vetosFor, threshold); + if (vetosFor <= vetosAgainst) revert ForDoesNotSurpassAgainst(vetosFor, vetosAgainst); + + casts[actionInfo.id].vetoSubmitted = true; llamaCore.castDisapproval(role, actionInfo, ""); - emit DisapprovalsSubmitted(actionInfo.id, disapprovalsFor, disapprovalsAgainst, disapprovalsAbstain); + emit VetosSubmitted(actionInfo.id, vetosFor, vetosAgainst, vetosAbstain); } - function _castApproval(address caster, ActionInfo calldata actionInfo, uint8 support, string calldata reason) - internal - { + function _castVote(address caster, ActionInfo calldata actionInfo, uint8 support, string calldata reason) internal { Action memory action = llamaCore.getAction(actionInfo.id); actionInfo.strategy.checkIfApprovalEnabled(actionInfo, caster, role); // Reverts if not allowed. if (llamaCore.getActionState(actionInfo) != uint8(ActionState.Active)) revert ActionNotActive(); - if (casts[actionInfo.id].castApproval[caster]) revert AlreadyCastApproval(); + if (casts[actionInfo.id].castVote[caster]) revert AlreadyCastVote(); if ( block.timestamp > action.creationTime @@ -347,22 +343,20 @@ abstract contract TokenholderCaster is Initializable { uint256 balance = _getPastVotes(caster, action.creationTime - 1); _preCastAssertions(balance, support); - if (support == 0) casts[actionInfo.id].approvalsAgainst += LlamaUtils.toUint96(balance); - else if (support == 1) casts[actionInfo.id].approvalsFor += LlamaUtils.toUint96(balance); - else if (support == 2) casts[actionInfo.id].approvalsAbstain += LlamaUtils.toUint96(balance); - casts[actionInfo.id].castApproval[caster] = true; - emit ApprovalCast(actionInfo.id, caster, role, support, balance, reason); + if (support == 0) casts[actionInfo.id].votesAgainst += LlamaUtils.toUint96(balance); + else if (support == 1) casts[actionInfo.id].votesFor += LlamaUtils.toUint96(balance); + else if (support == 2) casts[actionInfo.id].votesAbstain += LlamaUtils.toUint96(balance); + casts[actionInfo.id].castVote[caster] = true; + emit VoteCast(actionInfo.id, caster, role, support, balance, reason); } - function _castDisapproval(address caster, ActionInfo calldata actionInfo, uint8 support, string calldata reason) - internal - { + function _castVeto(address caster, ActionInfo calldata actionInfo, uint8 support, string calldata reason) internal { Action memory action = llamaCore.getAction(actionInfo.id); actionInfo.strategy.checkIfDisapprovalEnabled(actionInfo, caster, role); // Reverts if not allowed. if (!actionInfo.strategy.isActionApproved(actionInfo)) revert ActionNotApproved(); if (actionInfo.strategy.isActionExpired(actionInfo)) revert ActionExpired(); - if (casts[actionInfo.id].castDisapproval[caster]) revert AlreadyCastDisapproval(); + if (casts[actionInfo.id].castVeto[caster]) revert AlreadyCastVeto(); if ( block.timestamp > action.minExecutionTime @@ -373,11 +367,11 @@ abstract contract TokenholderCaster is Initializable { uint256 balance = _getPastVotes(caster, action.creationTime - 1); _preCastAssertions(balance, support); - if (support == 0) casts[actionInfo.id].disapprovalsAgainst += LlamaUtils.toUint96(balance); - else if (support == 1) casts[actionInfo.id].disapprovalsFor += LlamaUtils.toUint96(balance); - else if (support == 2) casts[actionInfo.id].disapprovalsAbstain += LlamaUtils.toUint96(balance); - casts[actionInfo.id].castDisapproval[caster] = true; - emit DisapprovalCast(actionInfo.id, caster, role, support, balance, reason); + if (support == 0) casts[actionInfo.id].vetosAgainst += LlamaUtils.toUint96(balance); + else if (support == 1) casts[actionInfo.id].vetosFor += LlamaUtils.toUint96(balance); + else if (support == 2) casts[actionInfo.id].vetosAbstain += LlamaUtils.toUint96(balance); + casts[actionInfo.id].castVeto[caster] = true; + emit VetoCast(actionInfo.id, caster, role, support, balance, reason); } function _preCastAssertions(uint256 balance, uint8 support) internal view { @@ -422,17 +416,17 @@ abstract contract TokenholderCaster is Initializable { ); } - /// @dev Returns the hash of the ABI-encoded EIP-712 message for the `CastApproval` domain, which can be used to + /// @dev Returns the hash of the ABI-encoded EIP-712 message for the `CastVote` domain, which can be used to /// recover the signer. - function _getCastApprovalTypedDataHash( + function _getCastVoteTypedDataHash( address tokenholder, uint8 support, ActionInfo calldata actionInfo, string calldata reason ) internal returns (bytes32) { - bytes32 castApprovalHash = keccak256( + bytes32 castVoteHash = keccak256( abi.encode( - CAST_APPROVAL_BY_SIG_TYPEHASH, + CAST_VOTE_BY_SIG_TYPEHASH, tokenholder, support, _getActionInfoHash(actionInfo), @@ -441,20 +435,20 @@ abstract contract TokenholderCaster is Initializable { ) ); - return keccak256(abi.encodePacked("\x19\x01", _getDomainHash(), castApprovalHash)); + return keccak256(abi.encodePacked("\x19\x01", _getDomainHash(), castVoteHash)); } - /// @dev Returns the hash of the ABI-encoded EIP-712 message for the `CastDisapproval` domain, which can be used to + /// @dev Returns the hash of the ABI-encoded EIP-712 message for the `CastVeto` domain, which can be used to /// recover the signer. - function _getCastDisapprovalTypedDataHash( + function _getCastVetoTypedDataHash( address tokenholder, uint8 support, ActionInfo calldata actionInfo, string calldata reason ) internal returns (bytes32) { - bytes32 castDisapprovalHash = keccak256( + bytes32 castVetoHash = keccak256( abi.encode( - CAST_DISAPPROVAL_BY_SIG_TYPEHASH, + CAST_VETO_BY_SIG_TYPEHASH, tokenholder, support, _getActionInfoHash(actionInfo), @@ -463,7 +457,7 @@ abstract contract TokenholderCaster is Initializable { ) ); - return keccak256(abi.encodePacked("\x19\x01", _getDomainHash(), castDisapprovalHash)); + return keccak256(abi.encodePacked("\x19\x01", _getDomainHash(), castVetoHash)); } /// @dev Returns the hash of `actionInfo`. diff --git a/test/token-voting/ERC20TokenholderCaster.t.sol b/test/token-voting/ERC20TokenholderCaster.t.sol index e9f70c2..b0a2dbb 100644 --- a/test/token-voting/ERC20TokenholderCaster.t.sol +++ b/test/token-voting/ERC20TokenholderCaster.t.sol @@ -17,17 +17,17 @@ import {ERC20TokenholderCaster} from "src/token-voting/ERC20TokenholderCaster.so import {TokenholderCaster} from "src/token-voting/TokenholderCaster.sol"; contract ERC20TokenholderCasterTest is LlamaTokenVotingTestSetup, LlamaCoreSigUtils { - event ApprovalCast( + event VoteCast( uint256 id, address indexed policyholder, uint8 indexed role, uint8 indexed support, uint256 quantity, string reason ); - event ApprovalsSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); + event VotesSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); - event DisapprovalCast( + event VetoCast( uint256 id, address indexed policyholder, uint8 indexed role, uint8 indexed support, uint256 quantity, string reason ); - event DisapprovalsSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); + event VetosSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); ActionInfo actionInfo; ERC20TokenholderCaster erc20TokenholderCaster; @@ -73,22 +73,22 @@ contract ERC20TokenholderCasterTest is LlamaTokenVotingTestSetup, LlamaCoreSigUt ); } - function castApprovalsFor() public { + function castVotesFor() public { vm.prank(tokenHolder1); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); vm.prank(tokenHolder2); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); vm.prank(tokenHolder3); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); } - function castDisapprovalsFor() public { + function castVetosFor() public { vm.prank(tokenHolder1); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); vm.prank(tokenHolder2); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); vm.prank(tokenHolder3); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); } } @@ -116,20 +116,20 @@ contract ERC20TokenholderCasterTest is LlamaTokenVotingTestSetup, LlamaCoreSigUt // new ERC20TokenholderCaster(erc20VotesToken, ILlamaCore(address(CORE)), uint8(255), uint256(1), uint256(1)); // } -// function test_RevertsIf_InvalidMinApprovalPct() public { -// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidMinApprovalPct.selector, uint256(0))); +// function test_RevertsIf_InvalidVoteQuorum() public { +// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidVoteQuorum.selector, uint256(0))); // new ERC20TokenholderCaster(erc20VotesToken, ILlamaCore(address(CORE)), tokenVotingCasterRole, uint256(0), // uint256(1)); -// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidMinApprovalPct.selector, uint256(10_001))); +// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidVoteQuorum.selector, uint256(10_001))); // new ERC20TokenholderCaster(erc20VotesToken, ILlamaCore(address(CORE)), tokenVotingCasterRole, uint256(10_001), // uint256(1)); // } -// function test_RevertsIf_InvalidMinDisapprovalPct() public { -// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidMinDisapprovalPct.selector, uint256(0))); +// function test_RevertsIf_InvalidVetoQuorum() public { +// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidVetoQuorum.selector, uint256(0))); // new ERC20TokenholderCaster(erc20VotesToken, ILlamaCore(address(CORE)), tokenVotingCasterRole, uint256(1), // uint256(0)); -// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidMinDisapprovalPct.selector, uint256(10_001))); +// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidVetoQuorum.selector, uint256(10_001))); // new ERC20TokenholderCaster(erc20VotesToken, ILlamaCore(address(CORE)), tokenVotingCasterRole, uint256(1), // uint256(10_001)); // } @@ -155,7 +155,7 @@ contract CastApproval is ERC20TokenholderCasterTest { function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); - erc20TokenholderCaster.castApproval(notActionInfo, 1, ""); + erc20TokenholderCaster.castVote(notActionInfo, 1, ""); } function test_RevertsIf_ApprovalNotEnabled() public { @@ -167,44 +167,44 @@ contract CastApproval is ERC20TokenholderCasterTest { casterWithWrongRole.initialize(erc20VotesToken, CORE, madeUpRole, ERC20_MIN_APPROVAL_PCT, ERC20_MIN_DISAPPROVAL_PCT); vm.expectRevert(abi.encodeWithSelector(ILlamaRelativeStrategyBase.InvalidRole.selector, tokenVotingCasterRole)); - casterWithWrongRole.castApproval(actionInfo, 1, ""); + casterWithWrongRole.castVote(actionInfo, 1, ""); } function test_RevertsIf_ActionNotActive() public { vm.warp(block.timestamp + 1 days + 1); vm.expectRevert(TokenholderCaster.ActionNotActive.selector); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); } - function test_RevertsIf_AlreadyCastApproval() public { + function test_RevertsIf_AlreadyCastVote() public { vm.startPrank(tokenHolder1); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); - vm.expectRevert(TokenholderCaster.AlreadyCastApproval.selector); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + vm.expectRevert(TokenholderCaster.AlreadyCastVote.selector); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); } function test_RevertsIf_InvalidSupport() public { vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidSupport.selector, uint8(3))); - erc20TokenholderCaster.castApproval(actionInfo, 3, ""); + erc20TokenholderCaster.castVote(actionInfo, 3, ""); } function test_RevertsIf_CastingPeriodOver() public { vm.warp(block.timestamp + ((1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS) + 1); // 2/3 of the approval period vm.expectRevert(TokenholderCaster.CastingPeriodOver.selector); vm.prank(tokenHolder1); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); } function test_RevertsIf_InsufficientBalance() public { vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientBalance.selector, 0)); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); } function test_CastsApprovalCorrectly(uint8 support) public { support = uint8(bound(support, 0, 2)); vm.expectEmit(); - emit ApprovalCast( + emit VoteCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -213,12 +213,12 @@ contract CastApproval is ERC20TokenholderCasterTest { "" ); vm.prank(tokenHolder1); - erc20TokenholderCaster.castApproval(actionInfo, support, ""); + erc20TokenholderCaster.castVote(actionInfo, support, ""); } function test_CastsApprovalCorrectly_WithReason() public { vm.expectEmit(); - emit ApprovalCast( + emit VoteCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -227,7 +227,7 @@ contract CastApproval is ERC20TokenholderCasterTest { "reason" ); vm.prank(tokenHolder1); - erc20TokenholderCaster.castApproval(actionInfo, 1, "reason"); + erc20TokenholderCaster.castVote(actionInfo, 1, "reason"); } } @@ -241,26 +241,26 @@ contract CastApprovalBySig is ERC20TokenholderCasterTest { view returns (uint8 v, bytes32 r, bytes32 s) { - LlamaCoreSigUtils.CastApproval memory castApproval = LlamaCoreSigUtils.CastApproval({ + LlamaCoreSigUtils.CastApproval memory castVote = LlamaCoreSigUtils.CastApproval({ actionInfo: _actionInfo, support: 1, reason: "", tokenHolder: tokenHolder1, nonce: 0 }); - bytes32 digest = getCastApprovalTypedDataHash(castApproval); + bytes32 digest = getCastApprovalTypedDataHash(castVote); (v, r, s) = vm.sign(privateKey, digest); } - function castApprovalBySig(ActionInfo memory _actionInfo, uint8 support, uint8 v, bytes32 r, bytes32 s) internal { - erc20TokenholderCaster.castApprovalBySig(tokenHolder1, support, _actionInfo, "", v, r, s); + function castVoteBySig(ActionInfo memory _actionInfo, uint8 support, uint8 v, bytes32 r, bytes32 s) internal { + erc20TokenholderCaster.castVoteBySig(tokenHolder1, support, _actionInfo, "", v, r, s); } function test_CastsApprovalBySig() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); vm.expectEmit(); - emit ApprovalCast( + emit VoteCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -269,24 +269,24 @@ contract CastApprovalBySig is ERC20TokenholderCasterTest { "" ); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); } function test_CheckNonceIncrements() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - assertEq(erc20TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castApprovalBySig.selector), 0); - castApprovalBySig(actionInfo, 1, v, r, s); - assertEq(erc20TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castApprovalBySig.selector), 1); + assertEq(erc20TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castVoteBySig.selector), 0); + castVoteBySig(actionInfo, 1, v, r, s); + assertEq(erc20TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castVoteBySig.selector), 1); } function test_OperationCannotBeReplayed() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); // Invalid Signature error since the recovered signer address during the second call is not the same as // erc20VotesTokenholder since nonce has increased. vm.expectRevert(TokenholderCaster.InvalidSignature.selector); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); } function test_RevertIf_SignerIsNotTokenHolder() public { @@ -295,7 +295,7 @@ contract CastApprovalBySig is ERC20TokenholderCasterTest { // Invalid Signature error since the recovered signer address is not the same as the erc20VotesTokenholder passed // in as parameter. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); } function test_RevertIf_SignerIsZeroAddress() public { @@ -303,19 +303,19 @@ contract CastApprovalBySig is ERC20TokenholderCasterTest { // Invalid Signature error since the recovered signer address is zero address due to invalid signature values // (v,r,s). vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castApprovalBySig(actionInfo, 1, (v + 1), r, s); + castVoteBySig(actionInfo, 1, (v + 1), r, s); } function test_RevertIf_TokenHolderIncrementsNonce() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); vm.prank(tokenHolder1); - erc20TokenholderCaster.incrementNonce(ILlamaCore.castApprovalBySig.selector); + erc20TokenholderCaster.incrementNonce(TokenholderCaster.castVoteBySig.selector); // Invalid Signature error since the recovered signer address during the call is not the same as // erc20VotesTokenholder since nonce has increased. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); } } @@ -323,18 +323,18 @@ contract CastDisapproval is ERC20TokenholderCasterTest { function setUp() public virtual override { ERC20TokenholderCasterTest.setUp(); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.prank(tokenHolder1); - erc20TokenholderCaster.submitApprovals(actionInfo); + erc20TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); - erc20TokenholderCaster.castDisapproval(notActionInfo, tokenVotingCasterRole, ""); + erc20TokenholderCaster.castVeto(notActionInfo, tokenVotingCasterRole, ""); } function test_RevertsIf_DisapprovalNotEnabled() public { @@ -346,38 +346,38 @@ contract CastDisapproval is ERC20TokenholderCasterTest { casterWithWrongRole.initialize(erc20VotesToken, CORE, madeUpRole, ERC20_MIN_APPROVAL_PCT, ERC20_MIN_DISAPPROVAL_PCT); vm.expectRevert(abi.encodeWithSelector(ILlamaRelativeStrategyBase.InvalidRole.selector, tokenVotingCasterRole)); - casterWithWrongRole.castDisapproval(actionInfo, madeUpRole, ""); + casterWithWrongRole.castVeto(actionInfo, madeUpRole, ""); } - function test_RevertsIf_AlreadyCastApproval() public { + function test_RevertsIf_AlreadyCastVote() public { vm.startPrank(tokenHolder1); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); - vm.expectRevert(TokenholderCaster.AlreadyCastDisapproval.selector); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + vm.expectRevert(TokenholderCaster.AlreadyCastVeto.selector); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); } function test_RevertsIf_InvalidSupport() public { vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidSupport.selector, uint8(3))); - erc20TokenholderCaster.castDisapproval(actionInfo, 3, ""); + erc20TokenholderCaster.castVeto(actionInfo, 3, ""); } function test_RevertsIf_CastingPeriodOver() public { // TODO why do we need to add 2 here vm.warp(block.timestamp + 2 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); // 2/3 of the approval period vm.expectRevert(TokenholderCaster.CastingPeriodOver.selector); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); } function test_RevertsIf_InsufficientBalance() public { vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientBalance.selector, 0)); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); } function test_CastsDisapprovalCorrectly(uint8 support) public { support = uint8(bound(support, 0, 2)); vm.expectEmit(); - emit DisapprovalCast( + emit VetoCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -386,12 +386,12 @@ contract CastDisapproval is ERC20TokenholderCasterTest { "" ); vm.prank(tokenHolder1); - erc20TokenholderCaster.castDisapproval(actionInfo, support, ""); + erc20TokenholderCaster.castVeto(actionInfo, support, ""); } function test_CastsDisapprovalCorrectly_WithReason() public { vm.expectEmit(); - emit DisapprovalCast( + emit VetoCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -400,7 +400,7 @@ contract CastDisapproval is ERC20TokenholderCasterTest { "reason" ); vm.prank(tokenHolder1); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, "reason"); + erc20TokenholderCaster.castVeto(actionInfo, 1, "reason"); } } @@ -408,12 +408,12 @@ contract CastDisapprovalBySig is ERC20TokenholderCasterTest { function setUp() public virtual override { ERC20TokenholderCasterTest.setUp(); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.prank(tokenHolder1); - erc20TokenholderCaster.submitApprovals(actionInfo); + erc20TokenholderCaster.submitVotes(actionInfo); } function createOffchainSignature(ActionInfo memory _actionInfo, uint256 privateKey) @@ -421,26 +421,26 @@ contract CastDisapprovalBySig is ERC20TokenholderCasterTest { view returns (uint8 v, bytes32 r, bytes32 s) { - LlamaCoreSigUtils.CastDisapproval memory castDisapproval = LlamaCoreSigUtils.CastDisapproval({ + LlamaCoreSigUtils.CastDisapproval memory castVeto = LlamaCoreSigUtils.CastDisapproval({ actionInfo: _actionInfo, support: 1, reason: "", tokenHolder: tokenHolder1, nonce: 0 }); - bytes32 digest = getCastDisapprovalTypedDataHash(castDisapproval); + bytes32 digest = getCastDisapprovalTypedDataHash(castVeto); (v, r, s) = vm.sign(privateKey, digest); } - function castDisapprovalBySig(ActionInfo memory _actionInfo, uint8 v, bytes32 r, bytes32 s) internal { - erc20TokenholderCaster.castDisapprovalBySig(tokenHolder1, 1, _actionInfo, "", v, r, s); + function castVetoBySig(ActionInfo memory _actionInfo, uint8 v, bytes32 r, bytes32 s) internal { + erc20TokenholderCaster.castVetoBySig(tokenHolder1, 1, _actionInfo, "", v, r, s); } function test_CastsDisapprovalBySig() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); vm.expectEmit(); - emit DisapprovalCast( + emit VetoCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -449,28 +449,28 @@ contract CastDisapprovalBySig is ERC20TokenholderCasterTest { "" ); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); // assertEq(CORE.getAction(0).totalDisapprovals, 1); - // assertEq(CORE.disapprovals(0, disapproverDrake), true); + // assertEq(CORE.vetos(0, disapproverDrake), true); } function test_CheckNonceIncrements() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - assertEq(erc20TokenholderCaster.nonces(tokenHolder1, ILlamaCore.castDisapprovalBySig.selector), 0); - castDisapprovalBySig(actionInfo, v, r, s); - assertEq(erc20TokenholderCaster.nonces(tokenHolder1, ILlamaCore.castDisapprovalBySig.selector), 1); + assertEq(erc20TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castVetoBySig.selector), 0); + castVetoBySig(actionInfo, v, r, s); + assertEq(erc20TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castVetoBySig.selector), 1); } function test_OperationCannotBeReplayed() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); // Invalid Signature error since the recovered signer address during the second call is not the same as // erc20VotesTokenholder // since nonce has increased. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); } function test_RevertIf_SignerIsNotPolicyHolder() public { @@ -480,7 +480,7 @@ contract CastDisapprovalBySig is ERC20TokenholderCasterTest { // erc20VotesTokenholder // since nonce has increased. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); } function test_RevertIf_SignerIsZeroAddress() public { @@ -488,27 +488,27 @@ contract CastDisapprovalBySig is ERC20TokenholderCasterTest { // Invalid Signature error since the recovered signer address is zero address due to invalid signature values // (v,r,s). vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castDisapprovalBySig(actionInfo, (v + 1), r, s); + castVetoBySig(actionInfo, (v + 1), r, s); } function test_RevertIf_PolicyholderIncrementsNonce() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); vm.prank(tokenHolder1); - erc20TokenholderCaster.incrementNonce(ILlamaCore.castDisapprovalBySig.selector); + erc20TokenholderCaster.incrementNonce(TokenholderCaster.castVetoBySig.selector); // Invalid Signature error since the recovered signer address during the second call is not the same as policyholder // since nonce has increased. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); } function test_FailsIfDisapproved() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - // First disapproval. + // First veto. vm.expectEmit(); - emit DisapprovalCast( + emit VetoCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -516,16 +516,16 @@ contract CastDisapprovalBySig is ERC20TokenholderCasterTest { erc20VotesToken.getPastVotes(tokenHolder1, erc20VotesToken.clock() - 1), "" ); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); // assertEq(CORE.getAction(actionInfo.id).totalDisapprovals, 1); - // Second disapproval. + // Second veto. vm.prank(tokenHolder2); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); vm.warp(block.timestamp + 1 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - erc20TokenholderCaster.submitDisapprovals(actionInfo); + erc20TokenholderCaster.submitVetos(actionInfo); // Assertions. ActionState state = ActionState(CORE.getActionState(actionInfo)); @@ -540,7 +540,7 @@ contract SubmitApprovals is ERC20TokenholderCasterTest { function setUp() public virtual override { ERC20TokenholderCasterTest.setUp(); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); } @@ -548,57 +548,57 @@ contract SubmitApprovals is ERC20TokenholderCasterTest { function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); - erc20TokenholderCaster.submitApprovals(notActionInfo); + erc20TokenholderCaster.submitVotes(notActionInfo); } - function test_RevertsIf_AlreadySubmittedApproval() public { + function test_RevertsIf_AlreadySubmittedVote() public { vm.startPrank(tokenHolder1); - erc20TokenholderCaster.submitApprovals(actionInfo); + erc20TokenholderCaster.submitVotes(actionInfo); - vm.expectRevert(TokenholderCaster.AlreadySubmittedApproval.selector); - erc20TokenholderCaster.submitApprovals(actionInfo); + vm.expectRevert(TokenholderCaster.AlreadySubmittedVote.selector); + erc20TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_SubmissionPeriodOver() public { // TODO why do we need to add 2 here vm.warp(block.timestamp + ((1 days * ONE_THIRD_IN_BPS) / ONE_HUNDRED_IN_BPS) + 2); // 1/3 of the approval period vm.expectRevert(TokenholderCaster.SubmissionPeriodOver.selector); - erc20TokenholderCaster.submitApprovals(actionInfo); + erc20TokenholderCaster.submitVotes(actionInfo); } - function test_RevertsIf_InsufficientApprovals() public { + function test_RevertsIf_InsufficientVotes() public { actionInfo = _createActionWithTokenVotingStrategy(tokenVotingStrategy); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientApprovals.selector, 0, 75_000e18)); - erc20TokenholderCaster.submitApprovals(actionInfo); + vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientVotes.selector, 0, 75_000e18)); + erc20TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_CastingPeriodNotOver() public { actionInfo = _createActionWithTokenVotingStrategy(tokenVotingStrategy); vm.warp(block.timestamp + (1 days * ONE_THIRD_IN_BPS) / ONE_HUNDRED_IN_BPS); // 1/3 of the approval period vm.expectRevert(TokenholderCaster.CantSubmitYet.selector); - erc20TokenholderCaster.submitApprovals(actionInfo); + erc20TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_ForDoesNotSurpassAgainst() public { actionInfo = _createActionWithTokenVotingStrategy(tokenVotingStrategy); vm.prank(tokenHolder1); - erc20TokenholderCaster.castApproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVote(actionInfo, 1, ""); vm.prank(tokenHolder2); - erc20TokenholderCaster.castApproval(actionInfo, 0, ""); + erc20TokenholderCaster.castVote(actionInfo, 0, ""); vm.prank(tokenHolder3); - erc20TokenholderCaster.castApproval(actionInfo, 0, ""); + erc20TokenholderCaster.castVote(actionInfo, 0, ""); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.ForDoesNotSurpassAgainst.selector, 250_000e18, 500_000e18)); - erc20TokenholderCaster.submitApprovals(actionInfo); + erc20TokenholderCaster.submitVotes(actionInfo); } function test_SubmitsApprovalsCorrectly() public { vm.expectEmit(); - emit ApprovalsSubmitted(actionInfo.id, 750_000e18, 0, 0); - erc20TokenholderCaster.submitApprovals(actionInfo); + emit VotesSubmitted(actionInfo.id, 750_000e18, 0, 0); + erc20TokenholderCaster.submitVotes(actionInfo); } } @@ -606,18 +606,18 @@ contract SubmitDisapprovals is ERC20TokenholderCasterTest { function setUp() public virtual override { ERC20TokenholderCasterTest.setUp(); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - erc20TokenholderCaster.submitApprovals(actionInfo); + erc20TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); - erc20TokenholderCaster.submitDisapprovals(notActionInfo); + erc20TokenholderCaster.submitVetos(notActionInfo); } function test_RevertsIf_DisapprovalNotEnabled() public { @@ -629,10 +629,10 @@ contract SubmitDisapprovals is ERC20TokenholderCasterTest { ); casterWithWrongRole.initialize(erc20VotesToken, CORE, madeUpRole, ERC20_MIN_APPROVAL_PCT, ERC20_MIN_DISAPPROVAL_PCT); vm.expectRevert(abi.encodeWithSelector(ILlamaRelativeStrategyBase.InvalidRole.selector, tokenVotingCasterRole)); - casterWithWrongRole.submitDisapprovals(actionInfo); + casterWithWrongRole.submitVetos(actionInfo); } - function test_RevertsIf_AlreadySubmittedDisapproval() public { + function test_RevertsIf_AlreadySubmittedVeto() public { Action memory action = CORE.getAction(actionInfo.id); vm.warp( action.minExecutionTime @@ -640,61 +640,61 @@ contract SubmitDisapprovals is ERC20TokenholderCasterTest { / ONE_HUNDRED_IN_BPS ); - castDisapprovalsFor(); + castVetosFor(); vm.startPrank(tokenHolder1); - erc20TokenholderCaster.submitDisapprovals(actionInfo); + erc20TokenholderCaster.submitVetos(actionInfo); - vm.expectRevert(TokenholderCaster.AlreadySubmittedDisapproval.selector); - erc20TokenholderCaster.submitDisapprovals(actionInfo); + vm.expectRevert(TokenholderCaster.AlreadySubmittedVeto.selector); + erc20TokenholderCaster.submitVetos(actionInfo); } function test_RevertsIf_SubmissionPeriodOver() public { - castDisapprovalsFor(); + castVetosFor(); vm.warp(block.timestamp + 1 days); vm.expectRevert(TokenholderCaster.SubmissionPeriodOver.selector); - erc20TokenholderCaster.submitDisapprovals(actionInfo); + erc20TokenholderCaster.submitVetos(actionInfo); } function test_RevertsIf_InsufficientDisapprovals() public { actionInfo = _createActionWithTokenVotingStrategy(tokenVotingStrategy); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - erc20TokenholderCaster.submitApprovals(actionInfo); + erc20TokenholderCaster.submitVotes(actionInfo); //TODO why add 1 here vm.warp(block.timestamp + 1 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientApprovals.selector, 0, 75_000e18)); - erc20TokenholderCaster.submitDisapprovals(actionInfo); + vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientVotes.selector, 0, 75_000e18)); + erc20TokenholderCaster.submitVetos(actionInfo); } function test_RevertsIf_CastingPeriodNotOver() public { vm.warp(block.timestamp + (1 days * 3333) / ONE_HUNDRED_IN_BPS); // 1/3 of the approval period vm.expectRevert(TokenholderCaster.CantSubmitYet.selector); - erc20TokenholderCaster.submitDisapprovals(actionInfo); + erc20TokenholderCaster.submitVetos(actionInfo); } function test_RevertsIf_ForDoesNotSurpassAgainst() public { vm.prank(tokenHolder1); - erc20TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc20TokenholderCaster.castVeto(actionInfo, 1, ""); vm.prank(tokenHolder2); - erc20TokenholderCaster.castDisapproval(actionInfo, 0, ""); + erc20TokenholderCaster.castVeto(actionInfo, 0, ""); vm.prank(tokenHolder3); - erc20TokenholderCaster.castDisapproval(actionInfo, 0, ""); + erc20TokenholderCaster.castVeto(actionInfo, 0, ""); // TODO why add 1 here? vm.warp(block.timestamp + 1 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.ForDoesNotSurpassAgainst.selector, 250_000e18, 500_000e18)); - erc20TokenholderCaster.submitDisapprovals(actionInfo); + erc20TokenholderCaster.submitVetos(actionInfo); } function test_SubmitsDisapprovalsCorrectly() public { - castDisapprovalsFor(); + castVetosFor(); //TODO why add 1 here? vm.warp(block.timestamp + 1 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.expectEmit(); - emit DisapprovalsSubmitted(actionInfo.id, 750_000e18, 0, 0); - erc20TokenholderCaster.submitDisapprovals(actionInfo); + emit VetosSubmitted(actionInfo.id, 750_000e18, 0, 0); + erc20TokenholderCaster.submitVetos(actionInfo); } } diff --git a/test/token-voting/ERC721TokenholderCaster.t.sol b/test/token-voting/ERC721TokenholderCaster.t.sol index 40c7d1a..8fa7172 100644 --- a/test/token-voting/ERC721TokenholderCaster.t.sol +++ b/test/token-voting/ERC721TokenholderCaster.t.sol @@ -17,17 +17,17 @@ import {ERC721TokenholderCaster} from "src/token-voting/ERC721TokenholderCaster. import {TokenholderCaster} from "src/token-voting/TokenholderCaster.sol"; contract ERC721TokenholderCasterTest is LlamaTokenVotingTestSetup, LlamaCoreSigUtils { - event ApprovalCast( + event VoteCast( uint256 id, address indexed policyholder, uint8 indexed role, uint8 indexed support, uint256 quantity, string reason ); - event ApprovalsSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); + event VotesSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); - event DisapprovalCast( + event VetoCast( uint256 id, address indexed policyholder, uint8 indexed role, uint8 indexed support, uint256 quantity, string reason ); - event DisapprovalsSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); + event VetosSubmitted(uint256 id, uint96 quantityFor, uint96 quantityAgainst, uint96 quantityAbstain); ActionInfo actionInfo; ERC721TokenholderCaster erc721TokenholderCaster; @@ -73,22 +73,22 @@ contract ERC721TokenholderCasterTest is LlamaTokenVotingTestSetup, LlamaCoreSigU ); } - function castApprovalsFor() public { + function castVotesFor() public { vm.prank(tokenHolder1); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); vm.prank(tokenHolder2); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); vm.prank(tokenHolder3); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); } - function castDisapprovalsFor() public { + function castVetosFor() public { vm.prank(tokenHolder1); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); vm.prank(tokenHolder2); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); vm.prank(tokenHolder3); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); } } @@ -116,20 +116,20 @@ contract ERC721TokenholderCasterTest is LlamaTokenVotingTestSetup, LlamaCoreSigU // new ERC721TokenholderCaster(erc721VotesToken, ILlamaCore(address(CORE)), uint8(255), uint256(1), uint256(1)); // } -// function test_RevertsIf_InvalidMinApprovalPct() public { -// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidMinApprovalPct.selector, uint256(0))); +// function test_RevertsIf_InvalidVoteQuorum() public { +// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidVoteQuorum.selector, uint256(0))); // new ERC721TokenholderCaster(erc721VotesToken, ILlamaCore(address(CORE)), tokenVotingCasterRole, uint256(0), // uint256(1)); -// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidMinApprovalPct.selector, uint256(10_001))); +// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidVoteQuorum.selector, uint256(10_001))); // new ERC721TokenholderCaster(erc721VotesToken, ILlamaCore(address(CORE)), tokenVotingCasterRole, uint256(10_001), // uint256(1)); // } -// function test_RevertsIf_InvalidMinDisapprovalPct() public { -// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidMinDisapprovalPct.selector, uint256(0))); +// function test_RevertsIf_InvalidVetoQuorum() public { +// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidVetoQuorum.selector, uint256(0))); // new ERC721TokenholderCaster(erc721VotesToken, ILlamaCore(address(CORE)), tokenVotingCasterRole, uint256(1), // uint256(0)); -// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidMinDisapprovalPct.selector, uint256(10_001))); +// vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidVetoQuorum.selector, uint256(10_001))); // new ERC721TokenholderCaster(erc721VotesToken, ILlamaCore(address(CORE)), tokenVotingCasterRole, uint256(1), // uint256(10_001)); // } @@ -156,7 +156,7 @@ contract CastApproval is ERC721TokenholderCasterTest { function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); - erc721TokenholderCaster.castApproval(notActionInfo, 1, ""); + erc721TokenholderCaster.castVote(notActionInfo, 1, ""); } function test_RevertsIf_ApprovalNotEnabled() public { @@ -170,44 +170,44 @@ contract CastApproval is ERC721TokenholderCasterTest { ); vm.expectRevert(abi.encodeWithSelector(ILlamaRelativeStrategyBase.InvalidRole.selector, tokenVotingCasterRole)); - casterWithWrongRole.castApproval(actionInfo, 1, ""); + casterWithWrongRole.castVote(actionInfo, 1, ""); } function test_RevertsIf_ActionNotActive() public { vm.warp(block.timestamp + 1 days + 1); vm.expectRevert(TokenholderCaster.ActionNotActive.selector); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); } - function test_RevertsIf_AlreadyCastApproval() public { + function test_RevertsIf_AlreadyCastVote() public { vm.startPrank(tokenHolder1); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); - vm.expectRevert(TokenholderCaster.AlreadyCastApproval.selector); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + vm.expectRevert(TokenholderCaster.AlreadyCastVote.selector); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); } function test_RevertsIf_InvalidSupport() public { vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidSupport.selector, uint8(3))); - erc721TokenholderCaster.castApproval(actionInfo, 3, ""); + erc721TokenholderCaster.castVote(actionInfo, 3, ""); } function test_RevertsIf_CastingPeriodOver() public { vm.warp(block.timestamp + ((1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS) + 1); // 2/3 of the approval period vm.expectRevert(TokenholderCaster.CastingPeriodOver.selector); vm.prank(tokenHolder1); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); } function test_RevertsIf_InsufficientBalance() public { vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientBalance.selector, 0)); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); } function test_CastsApprovalCorrectly(uint8 support) public { support = uint8(bound(support, 0, 2)); vm.expectEmit(); - emit ApprovalCast( + emit VoteCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -216,12 +216,12 @@ contract CastApproval is ERC721TokenholderCasterTest { "" ); vm.prank(tokenHolder1); - erc721TokenholderCaster.castApproval(actionInfo, support, ""); + erc721TokenholderCaster.castVote(actionInfo, support, ""); } function test_CastsApprovalCorrectly_WithReason() public { vm.expectEmit(); - emit ApprovalCast( + emit VoteCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -230,7 +230,7 @@ contract CastApproval is ERC721TokenholderCasterTest { "reason" ); vm.prank(tokenHolder1); - erc721TokenholderCaster.castApproval(actionInfo, 1, "reason"); + erc721TokenholderCaster.castVote(actionInfo, 1, "reason"); } } @@ -244,26 +244,26 @@ contract CastApprovalBySig is ERC721TokenholderCasterTest { view returns (uint8 v, bytes32 r, bytes32 s) { - LlamaCoreSigUtils.CastApproval memory castApproval = LlamaCoreSigUtils.CastApproval({ + LlamaCoreSigUtils.CastApproval memory castVote = LlamaCoreSigUtils.CastApproval({ actionInfo: _actionInfo, support: 1, reason: "", tokenHolder: tokenHolder1, nonce: 0 }); - bytes32 digest = getCastApprovalTypedDataHash(castApproval); + bytes32 digest = getCastApprovalTypedDataHash(castVote); (v, r, s) = vm.sign(privateKey, digest); } - function castApprovalBySig(ActionInfo memory _actionInfo, uint8 support, uint8 v, bytes32 r, bytes32 s) internal { - erc721TokenholderCaster.castApprovalBySig(tokenHolder1, support, _actionInfo, "", v, r, s); + function castVoteBySig(ActionInfo memory _actionInfo, uint8 support, uint8 v, bytes32 r, bytes32 s) internal { + erc721TokenholderCaster.castVoteBySig(tokenHolder1, support, _actionInfo, "", v, r, s); } function test_CastsApprovalBySig() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); vm.expectEmit(); - emit ApprovalCast( + emit VoteCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -272,24 +272,24 @@ contract CastApprovalBySig is ERC721TokenholderCasterTest { "" ); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); } function test_CheckNonceIncrements() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - assertEq(erc721TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castApprovalBySig.selector), 0); - castApprovalBySig(actionInfo, 1, v, r, s); - assertEq(erc721TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castApprovalBySig.selector), 1); + assertEq(erc721TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castVoteBySig.selector), 0); + castVoteBySig(actionInfo, 1, v, r, s); + assertEq(erc721TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castVoteBySig.selector), 1); } function test_OperationCannotBeReplayed() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); // Invalid Signature error since the recovered signer address during the second call is not the same as // erc20VotesTokenholder since nonce has increased. vm.expectRevert(TokenholderCaster.InvalidSignature.selector); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); } function test_RevertIf_SignerIsNotTokenHolder() public { @@ -298,7 +298,7 @@ contract CastApprovalBySig is ERC721TokenholderCasterTest { // Invalid Signature error since the recovered signer address is not the same as the erc20VotesTokenholder passed // in as parameter. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); } function test_RevertIf_SignerIsZeroAddress() public { @@ -306,19 +306,19 @@ contract CastApprovalBySig is ERC721TokenholderCasterTest { // Invalid Signature error since the recovered signer address is zero address due to invalid signature values // (v,r,s). vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castApprovalBySig(actionInfo, 1, (v + 1), r, s); + castVoteBySig(actionInfo, 1, (v + 1), r, s); } function test_RevertIf_TokenHolderIncrementsNonce() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); vm.prank(tokenHolder1); - erc721TokenholderCaster.incrementNonce(ILlamaCore.castApprovalBySig.selector); + erc721TokenholderCaster.incrementNonce(TokenholderCaster.castVoteBySig.selector); // Invalid Signature error since the recovered signer address during the call is not the same as // erc20VotesTokenholder since nonce has increased. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castApprovalBySig(actionInfo, 1, v, r, s); + castVoteBySig(actionInfo, 1, v, r, s); } } @@ -326,18 +326,18 @@ contract CastDisapproval is ERC721TokenholderCasterTest { function setUp() public virtual override { ERC721TokenholderCasterTest.setUp(); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.prank(tokenHolder1); - erc721TokenholderCaster.submitApprovals(actionInfo); + erc721TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); - erc721TokenholderCaster.castDisapproval(notActionInfo, tokenVotingCasterRole, ""); + erc721TokenholderCaster.castVeto(notActionInfo, tokenVotingCasterRole, ""); } function test_RevertsIf_DisapprovalNotEnabled() public { @@ -351,38 +351,38 @@ contract CastDisapproval is ERC721TokenholderCasterTest { ); vm.expectRevert(abi.encodeWithSelector(ILlamaRelativeStrategyBase.InvalidRole.selector, tokenVotingCasterRole)); - casterWithWrongRole.castDisapproval(actionInfo, madeUpRole, ""); + casterWithWrongRole.castVeto(actionInfo, madeUpRole, ""); } - function test_RevertsIf_AlreadyCastApproval() public { + function test_RevertsIf_AlreadyCastVote() public { vm.startPrank(tokenHolder1); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); - vm.expectRevert(TokenholderCaster.AlreadyCastDisapproval.selector); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + vm.expectRevert(TokenholderCaster.AlreadyCastVeto.selector); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); } function test_RevertsIf_InvalidSupport() public { vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InvalidSupport.selector, uint8(3))); - erc721TokenholderCaster.castDisapproval(actionInfo, 3, ""); + erc721TokenholderCaster.castVeto(actionInfo, 3, ""); } function test_RevertsIf_CastingPeriodOver() public { // TODO why do we need to add 2 here vm.warp(block.timestamp + 2 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); // 2/3 of the approval period vm.expectRevert(TokenholderCaster.CastingPeriodOver.selector); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); } function test_RevertsIf_InsufficientBalance() public { vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientBalance.selector, 0)); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); } function test_CastsDisapprovalCorrectly(uint8 support) public { support = uint8(bound(support, 0, 2)); vm.expectEmit(); - emit DisapprovalCast( + emit VetoCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -391,12 +391,12 @@ contract CastDisapproval is ERC721TokenholderCasterTest { "" ); vm.prank(tokenHolder1); - erc721TokenholderCaster.castDisapproval(actionInfo, support, ""); + erc721TokenholderCaster.castVeto(actionInfo, support, ""); } function test_CastsDisapprovalCorrectly_WithReason() public { vm.expectEmit(); - emit DisapprovalCast( + emit VetoCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -405,7 +405,7 @@ contract CastDisapproval is ERC721TokenholderCasterTest { "reason" ); vm.prank(tokenHolder1); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, "reason"); + erc721TokenholderCaster.castVeto(actionInfo, 1, "reason"); } } @@ -413,12 +413,12 @@ contract CastDisapprovalBySig is ERC721TokenholderCasterTest { function setUp() public virtual override { ERC721TokenholderCasterTest.setUp(); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.prank(tokenHolder1); - erc721TokenholderCaster.submitApprovals(actionInfo); + erc721TokenholderCaster.submitVotes(actionInfo); } function createOffchainSignature(ActionInfo memory _actionInfo, uint256 privateKey) @@ -426,26 +426,26 @@ contract CastDisapprovalBySig is ERC721TokenholderCasterTest { view returns (uint8 v, bytes32 r, bytes32 s) { - LlamaCoreSigUtils.CastDisapproval memory castDisapproval = LlamaCoreSigUtils.CastDisapproval({ + LlamaCoreSigUtils.CastDisapproval memory castVeto = LlamaCoreSigUtils.CastDisapproval({ actionInfo: _actionInfo, support: 1, reason: "", tokenHolder: tokenHolder1, nonce: 0 }); - bytes32 digest = getCastDisapprovalTypedDataHash(castDisapproval); + bytes32 digest = getCastDisapprovalTypedDataHash(castVeto); (v, r, s) = vm.sign(privateKey, digest); } - function castDisapprovalBySig(ActionInfo memory _actionInfo, uint8 v, bytes32 r, bytes32 s) internal { - erc721TokenholderCaster.castDisapprovalBySig(tokenHolder1, 1, _actionInfo, "", v, r, s); + function castVetoBySig(ActionInfo memory _actionInfo, uint8 v, bytes32 r, bytes32 s) internal { + erc721TokenholderCaster.castVetoBySig(tokenHolder1, 1, _actionInfo, "", v, r, s); } function test_CastsDisapprovalBySig() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); vm.expectEmit(); - emit DisapprovalCast( + emit VetoCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -454,28 +454,28 @@ contract CastDisapprovalBySig is ERC721TokenholderCasterTest { "" ); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); // assertEq(CORE.getAction(0).totalDisapprovals, 1); - // assertEq(CORE.disapprovals(0, disapproverDrake), true); + // assertEq(CORE.vetos(0, disapproverDrake), true); } function test_CheckNonceIncrements() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - assertEq(erc721TokenholderCaster.nonces(tokenHolder1, ILlamaCore.castDisapprovalBySig.selector), 0); - castDisapprovalBySig(actionInfo, v, r, s); - assertEq(erc721TokenholderCaster.nonces(tokenHolder1, ILlamaCore.castDisapprovalBySig.selector), 1); + assertEq(erc721TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castVetoBySig.selector), 0); + castVetoBySig(actionInfo, v, r, s); + assertEq(erc721TokenholderCaster.nonces(tokenHolder1, TokenholderCaster.castVetoBySig.selector), 1); } function test_OperationCannotBeReplayed() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); // Invalid Signature error since the recovered signer address during the second call is not the same as // erc20VotesTokenholder // since nonce has increased. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); } function test_RevertIf_SignerIsNotPolicyHolder() public { @@ -485,7 +485,7 @@ contract CastDisapprovalBySig is ERC721TokenholderCasterTest { // erc20VotesTokenholder // since nonce has increased. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); } function test_RevertIf_SignerIsZeroAddress() public { @@ -493,27 +493,27 @@ contract CastDisapprovalBySig is ERC721TokenholderCasterTest { // Invalid Signature error since the recovered signer address is zero address due to invalid signature values // (v,r,s). vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castDisapprovalBySig(actionInfo, (v + 1), r, s); + castVetoBySig(actionInfo, (v + 1), r, s); } function test_RevertIf_PolicyholderIncrementsNonce() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); vm.prank(tokenHolder1); - erc721TokenholderCaster.incrementNonce(ILlamaCore.castDisapprovalBySig.selector); + erc721TokenholderCaster.incrementNonce(TokenholderCaster.castVetoBySig.selector); // Invalid Signature error since the recovered signer address during the second call is not the same as policyholder // since nonce has increased. vm.expectRevert(ILlamaCore.InvalidSignature.selector); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); } function test_FailsIfDisapproved() public { (uint8 v, bytes32 r, bytes32 s) = createOffchainSignature(actionInfo, tokenHolder1PrivateKey); - // First disapproval. + // First veto. vm.expectEmit(); - emit DisapprovalCast( + emit VetoCast( actionInfo.id, tokenHolder1, tokenVotingCasterRole, @@ -521,16 +521,16 @@ contract CastDisapprovalBySig is ERC721TokenholderCasterTest { erc721VotesToken.getPastVotes(tokenHolder1, erc721VotesToken.clock() - 1), "" ); - castDisapprovalBySig(actionInfo, v, r, s); + castVetoBySig(actionInfo, v, r, s); // assertEq(CORE.getAction(actionInfo.id).totalDisapprovals, 1); - // Second disapproval. + // Second veto. vm.prank(tokenHolder2); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); vm.warp(block.timestamp + 1 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - erc721TokenholderCaster.submitDisapprovals(actionInfo); + erc721TokenholderCaster.submitVetos(actionInfo); // Assertions. ActionState state = ActionState(CORE.getActionState(actionInfo)); @@ -545,7 +545,7 @@ contract SubmitApprovals is ERC721TokenholderCasterTest { function setUp() public virtual override { ERC721TokenholderCasterTest.setUp(); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); } @@ -553,57 +553,57 @@ contract SubmitApprovals is ERC721TokenholderCasterTest { function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); - erc721TokenholderCaster.submitApprovals(notActionInfo); + erc721TokenholderCaster.submitVotes(notActionInfo); } - function test_RevertsIf_AlreadySubmittedApproval() public { + function test_RevertsIf_AlreadySubmittedVote() public { vm.startPrank(tokenHolder1); - erc721TokenholderCaster.submitApprovals(actionInfo); + erc721TokenholderCaster.submitVotes(actionInfo); - vm.expectRevert(TokenholderCaster.AlreadySubmittedApproval.selector); - erc721TokenholderCaster.submitApprovals(actionInfo); + vm.expectRevert(TokenholderCaster.AlreadySubmittedVote.selector); + erc721TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_SubmissionPeriodOver() public { // TODO why do we need to add 2 here vm.warp(block.timestamp + ((1 days * ONE_THIRD_IN_BPS) / ONE_HUNDRED_IN_BPS) + 2); // 1/3 of the approval period vm.expectRevert(TokenholderCaster.SubmissionPeriodOver.selector); - erc721TokenholderCaster.submitApprovals(actionInfo); + erc721TokenholderCaster.submitVotes(actionInfo); } - function test_RevertsIf_InsufficientApprovals() public { + function test_RevertsIf_InsufficientVotes() public { actionInfo = _createActionWithTokenVotingStrategy(tokenVotingStrategy); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientApprovals.selector, 0, 1)); - erc721TokenholderCaster.submitApprovals(actionInfo); + vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientVotes.selector, 0, 1)); + erc721TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_CastingPeriodNotOver() public { actionInfo = _createActionWithTokenVotingStrategy(tokenVotingStrategy); vm.warp(block.timestamp + (1 days * ONE_THIRD_IN_BPS) / ONE_HUNDRED_IN_BPS); // 1/3 of the approval period vm.expectRevert(TokenholderCaster.CantSubmitYet.selector); - erc721TokenholderCaster.submitApprovals(actionInfo); + erc721TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_ForDoesNotSurpassAgainst() public { actionInfo = _createActionWithTokenVotingStrategy(tokenVotingStrategy); vm.prank(tokenHolder1); - erc721TokenholderCaster.castApproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVote(actionInfo, 1, ""); vm.prank(tokenHolder2); - erc721TokenholderCaster.castApproval(actionInfo, 0, ""); + erc721TokenholderCaster.castVote(actionInfo, 0, ""); vm.prank(tokenHolder3); - erc721TokenholderCaster.castApproval(actionInfo, 0, ""); + erc721TokenholderCaster.castVote(actionInfo, 0, ""); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.ForDoesNotSurpassAgainst.selector, 1, 2)); - erc721TokenholderCaster.submitApprovals(actionInfo); + erc721TokenholderCaster.submitVotes(actionInfo); } function test_SubmitsApprovalsCorrectly() public { vm.expectEmit(); - emit ApprovalsSubmitted(actionInfo.id, 3, 0, 0); - erc721TokenholderCaster.submitApprovals(actionInfo); + emit VotesSubmitted(actionInfo.id, 3, 0, 0); + erc721TokenholderCaster.submitVotes(actionInfo); } } @@ -611,18 +611,18 @@ contract SubmitDisapprovals is ERC721TokenholderCasterTest { function setUp() public virtual override { ERC721TokenholderCasterTest.setUp(); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - erc721TokenholderCaster.submitApprovals(actionInfo); + erc721TokenholderCaster.submitVotes(actionInfo); } function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); - erc721TokenholderCaster.submitDisapprovals(notActionInfo); + erc721TokenholderCaster.submitVetos(notActionInfo); } function test_RevertsIf_DisapprovalNotEnabled() public { @@ -636,10 +636,10 @@ contract SubmitDisapprovals is ERC721TokenholderCasterTest { erc721VotesToken, CORE, madeUpRole, ERC721_MIN_APPROVAL_PCT, ERC721_MIN_DISAPPROVAL_PCT ); vm.expectRevert(abi.encodeWithSelector(ILlamaRelativeStrategyBase.InvalidRole.selector, tokenVotingCasterRole)); - casterWithWrongRole.submitDisapprovals(actionInfo); + casterWithWrongRole.submitVetos(actionInfo); } - function test_RevertsIf_AlreadySubmittedDisapproval() public { + function test_RevertsIf_AlreadySubmittedVeto() public { Action memory action = CORE.getAction(actionInfo.id); vm.warp( action.minExecutionTime @@ -647,61 +647,61 @@ contract SubmitDisapprovals is ERC721TokenholderCasterTest { / ONE_HUNDRED_IN_BPS ); - castDisapprovalsFor(); + castVetosFor(); vm.startPrank(tokenHolder1); - erc721TokenholderCaster.submitDisapprovals(actionInfo); + erc721TokenholderCaster.submitVetos(actionInfo); - vm.expectRevert(TokenholderCaster.AlreadySubmittedDisapproval.selector); - erc721TokenholderCaster.submitDisapprovals(actionInfo); + vm.expectRevert(TokenholderCaster.AlreadySubmittedVeto.selector); + erc721TokenholderCaster.submitVetos(actionInfo); } function test_RevertsIf_SubmissionPeriodOver() public { - castDisapprovalsFor(); + castVetosFor(); vm.warp(block.timestamp + 1 days); vm.expectRevert(TokenholderCaster.SubmissionPeriodOver.selector); - erc721TokenholderCaster.submitDisapprovals(actionInfo); + erc721TokenholderCaster.submitVetos(actionInfo); } function test_RevertsIf_InsufficientDisapprovals() public { actionInfo = _createActionWithTokenVotingStrategy(tokenVotingStrategy); - castApprovalsFor(); + castVotesFor(); vm.warp(block.timestamp + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - erc721TokenholderCaster.submitApprovals(actionInfo); + erc721TokenholderCaster.submitVotes(actionInfo); //TODO why add 1 here vm.warp(block.timestamp + 1 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); - vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientApprovals.selector, 0, 1)); - erc721TokenholderCaster.submitDisapprovals(actionInfo); + vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.InsufficientVotes.selector, 0, 1)); + erc721TokenholderCaster.submitVetos(actionInfo); } function test_RevertsIf_CastingPeriodNotOver() public { vm.warp(block.timestamp + (1 days * 3333) / ONE_HUNDRED_IN_BPS); // 1/3 of the approval period vm.expectRevert(TokenholderCaster.CantSubmitYet.selector); - erc721TokenholderCaster.submitDisapprovals(actionInfo); + erc721TokenholderCaster.submitVetos(actionInfo); } function test_RevertsIf_ForDoesNotSurpassAgainst() public { vm.prank(tokenHolder1); - erc721TokenholderCaster.castDisapproval(actionInfo, 1, ""); + erc721TokenholderCaster.castVeto(actionInfo, 1, ""); vm.prank(tokenHolder2); - erc721TokenholderCaster.castDisapproval(actionInfo, 0, ""); + erc721TokenholderCaster.castVeto(actionInfo, 0, ""); vm.prank(tokenHolder3); - erc721TokenholderCaster.castDisapproval(actionInfo, 0, ""); + erc721TokenholderCaster.castVeto(actionInfo, 0, ""); // TODO why add 1 here? vm.warp(block.timestamp + 1 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.expectRevert(abi.encodeWithSelector(TokenholderCaster.ForDoesNotSurpassAgainst.selector, 1, 2)); - erc721TokenholderCaster.submitDisapprovals(actionInfo); + erc721TokenholderCaster.submitVetos(actionInfo); } function test_SubmitsDisapprovalsCorrectly() public { - castDisapprovalsFor(); + castVetosFor(); //TODO why add 1 here? vm.warp(block.timestamp + 1 + (1 days * TWO_THIRDS_IN_BPS) / ONE_HUNDRED_IN_BPS); vm.expectEmit(); - emit DisapprovalsSubmitted(actionInfo.id, 3, 0, 0); - erc721TokenholderCaster.submitDisapprovals(actionInfo); + emit VetosSubmitted(actionInfo.id, 3, 0, 0); + erc721TokenholderCaster.submitVetos(actionInfo); } } diff --git a/test/token-voting/LlamaTokenVotingFactory.t.sol b/test/token-voting/LlamaTokenVotingFactory.t.sol index 75a6811..2af0817 100644 --- a/test/token-voting/LlamaTokenVotingFactory.t.sol +++ b/test/token-voting/LlamaTokenVotingFactory.t.sol @@ -18,12 +18,8 @@ import {LlamaTokenVotingFactory} from "src/token-voting/LlamaTokenVotingFactory. contract LlamaTokenVotingFactoryTest is LlamaTokenVotingTestSetup { event ERC20TokenholderActionCreatorCreated(address actionCreator, address indexed token); event ERC721TokenholderActionCreatorCreated(address actionCreator, address indexed token); - event ERC20TokenholderCasterCreated( - address caster, address indexed token, uint256 minApprovalPct, uint256 minDisapprovalPct - ); - event ERC721TokenholderCasterCreated( - address caster, address indexed token, uint256 minApprovalPct, uint256 minDisapprovalPct - ); + event ERC20TokenholderCasterCreated(address caster, address indexed token, uint256 voteQuorum, uint256 vetoQuorum); + event ERC721TokenholderCasterCreated(address caster, address indexed token, uint256 voteQuorum, uint256 vetoQuorum); event ActionThresholdSet(uint256 newThreshold); function setUp() public override { @@ -133,8 +129,8 @@ contract DeployTokenVotingModule is LlamaTokenVotingFactoryTest { assertEq(address(erc20TokenholderCaster.token()), address(erc20VotesToken)); assertEq(address(erc20TokenholderCaster.llamaCore()), address(CORE)); assertEq(erc20TokenholderCaster.role(), tokenVotingCasterRole); - assertEq(erc20TokenholderCaster.minApprovalPct(), ERC20_MIN_APPROVAL_PCT); - assertEq(erc20TokenholderCaster.minDisapprovalPct(), ERC20_MIN_DISAPPROVAL_PCT); + assertEq(erc20TokenholderCaster.voteQuorum(), ERC20_MIN_APPROVAL_PCT); + assertEq(erc20TokenholderCaster.vetoQuorum(), ERC20_MIN_DISAPPROVAL_PCT); } function test_CanDeployERC721TokenVotingModule() public { @@ -185,7 +181,7 @@ contract DeployTokenVotingModule is LlamaTokenVotingFactoryTest { assertEq(address(erc721TokenholderCaster.token()), address(erc721VotesToken)); assertEq(address(erc721TokenholderCaster.llamaCore()), address(CORE)); assertEq(erc721TokenholderCaster.role(), tokenVotingCasterRole); - assertEq(erc721TokenholderCaster.minApprovalPct(), ERC721_MIN_APPROVAL_PCT); - assertEq(erc721TokenholderCaster.minDisapprovalPct(), ERC721_MIN_DISAPPROVAL_PCT); + assertEq(erc721TokenholderCaster.voteQuorum(), ERC721_MIN_APPROVAL_PCT); + assertEq(erc721TokenholderCaster.vetoQuorum(), ERC721_MIN_DISAPPROVAL_PCT); } } diff --git a/test/utils/LlamaCoreSigUtils.sol b/test/utils/LlamaCoreSigUtils.sol index ad44bd7..60f0630 100644 --- a/test/utils/LlamaCoreSigUtils.sol +++ b/test/utils/LlamaCoreSigUtils.sol @@ -57,12 +57,12 @@ contract LlamaCoreSigUtils { "CancelAction(address tokenHolder,ActionInfo actionInfo,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" ); - /// @notice EIP-712 castApproval typehash. + /// @notice EIP-712 castVote typehash. bytes32 internal constant CAST_APPROVAL_TYPEHASH = keccak256( "CastApproval(address tokenHolder,uint8 support,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" ); - /// @notice EIP-712 castDisapproval typehash. + /// @notice EIP-712 castVeto typehash. bytes32 internal constant CAST_DISAPPROVAL_TYPEHASH = keccak256( "CastDisapproval(address tokenHolder,uint8 role,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" ); @@ -125,43 +125,43 @@ contract LlamaCoreSigUtils { } /// @notice Returns the hash of CastApproval. - function getCastApprovalHash(CastApproval memory castApproval) internal pure returns (bytes32) { + function getCastApprovalHash(CastApproval memory castVote) internal pure returns (bytes32) { return keccak256( abi.encode( CAST_APPROVAL_TYPEHASH, - castApproval.tokenHolder, - castApproval.support, - getActionInfoHash(castApproval.actionInfo), - keccak256(bytes(castApproval.reason)), - castApproval.nonce + castVote.tokenHolder, + castVote.support, + getActionInfoHash(castVote.actionInfo), + keccak256(bytes(castVote.reason)), + castVote.nonce ) ); } /// @notice Returns the hash of the fully encoded EIP-712 message for the CastApproval domain, which can be used to /// recover the signer. - function getCastApprovalTypedDataHash(CastApproval memory castApproval) internal view returns (bytes32) { - return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCastApprovalHash(castApproval))); + function getCastApprovalTypedDataHash(CastApproval memory castVote) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCastApprovalHash(castVote))); } /// @notice Returns the hash of CastDisapprovalBySig. - function getCastDisapprovalHash(CastDisapproval memory castDisapproval) internal pure returns (bytes32) { + function getCastDisapprovalHash(CastDisapproval memory castVeto) internal pure returns (bytes32) { return keccak256( abi.encode( CAST_DISAPPROVAL_TYPEHASH, - castDisapproval.tokenHolder, - castDisapproval.support, - getActionInfoHash(castDisapproval.actionInfo), - keccak256(bytes(castDisapproval.reason)), - castDisapproval.nonce + castVeto.tokenHolder, + castVeto.support, + getActionInfoHash(castVeto.actionInfo), + keccak256(bytes(castVeto.reason)), + castVeto.nonce ) ); } /// @notice Returns the hash of the fully encoded EIP-712 message for the CastDisapproval domain, which can be used to /// recover the signer. - function getCastDisapprovalTypedDataHash(CastDisapproval memory castDisapproval) internal view returns (bytes32) { - return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCastDisapprovalHash(castDisapproval))); + function getCastDisapprovalTypedDataHash(CastDisapproval memory castVeto) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCastDisapprovalHash(castVeto))); } /// @notice Returns the hash of ActionInfo. From 1cd49a5c3d7923ef4d596a37f7467979765e0805 Mon Sep 17 00:00:00 2001 From: dd0sxx Date: Sat, 9 Dec 2023 16:16:28 -0500 Subject: [PATCH 2/2] ok it builds again --- .../token-voting/ERC20TokenholderCaster.t.sol | 30 ++++++---------- .../ERC721TokenholderCaster.t.sol | 30 ++++++---------- test/utils/LlamaCoreSigUtils.sol | 36 +++++++++---------- 3 files changed, 38 insertions(+), 58 deletions(-) diff --git a/test/token-voting/ERC20TokenholderCaster.t.sol b/test/token-voting/ERC20TokenholderCaster.t.sol index b0a2dbb..389aaf3 100644 --- a/test/token-voting/ERC20TokenholderCaster.t.sol +++ b/test/token-voting/ERC20TokenholderCaster.t.sol @@ -151,7 +151,7 @@ contract ERC20TokenholderCasterTest is LlamaTokenVotingTestSetup, LlamaCoreSigUt // } // } -contract CastApproval is ERC20TokenholderCasterTest { +contract CastVote is ERC20TokenholderCasterTest { function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); @@ -231,7 +231,7 @@ contract CastApproval is ERC20TokenholderCasterTest { } } -contract CastApprovalBySig is ERC20TokenholderCasterTest { +contract CastVoteBySig is ERC20TokenholderCasterTest { function setUp() public virtual override { ERC20TokenholderCasterTest.setUp(); } @@ -241,14 +241,9 @@ contract CastApprovalBySig is ERC20TokenholderCasterTest { view returns (uint8 v, bytes32 r, bytes32 s) { - LlamaCoreSigUtils.CastApproval memory castVote = LlamaCoreSigUtils.CastApproval({ - actionInfo: _actionInfo, - support: 1, - reason: "", - tokenHolder: tokenHolder1, - nonce: 0 - }); - bytes32 digest = getCastApprovalTypedDataHash(castVote); + LlamaCoreSigUtils.CastVote memory castVote = + LlamaCoreSigUtils.CastVote({actionInfo: _actionInfo, support: 1, reason: "", tokenHolder: tokenHolder1, nonce: 0}); + bytes32 digest = getCastVoteTypedDataHash(castVote); (v, r, s) = vm.sign(privateKey, digest); } @@ -319,7 +314,7 @@ contract CastApprovalBySig is ERC20TokenholderCasterTest { } } -contract CastDisapproval is ERC20TokenholderCasterTest { +contract CastVeto is ERC20TokenholderCasterTest { function setUp() public virtual override { ERC20TokenholderCasterTest.setUp(); @@ -404,7 +399,7 @@ contract CastDisapproval is ERC20TokenholderCasterTest { } } -contract CastDisapprovalBySig is ERC20TokenholderCasterTest { +contract CastVetoBySig is ERC20TokenholderCasterTest { function setUp() public virtual override { ERC20TokenholderCasterTest.setUp(); @@ -421,14 +416,9 @@ contract CastDisapprovalBySig is ERC20TokenholderCasterTest { view returns (uint8 v, bytes32 r, bytes32 s) { - LlamaCoreSigUtils.CastDisapproval memory castVeto = LlamaCoreSigUtils.CastDisapproval({ - actionInfo: _actionInfo, - support: 1, - reason: "", - tokenHolder: tokenHolder1, - nonce: 0 - }); - bytes32 digest = getCastDisapprovalTypedDataHash(castVeto); + LlamaCoreSigUtils.CastVeto memory castVeto = + LlamaCoreSigUtils.CastVeto({actionInfo: _actionInfo, support: 1, reason: "", tokenHolder: tokenHolder1, nonce: 0}); + bytes32 digest = getCastVetoTypedDataHash(castVeto); (v, r, s) = vm.sign(privateKey, digest); } diff --git a/test/token-voting/ERC721TokenholderCaster.t.sol b/test/token-voting/ERC721TokenholderCaster.t.sol index 8fa7172..820745a 100644 --- a/test/token-voting/ERC721TokenholderCaster.t.sol +++ b/test/token-voting/ERC721TokenholderCaster.t.sol @@ -152,7 +152,7 @@ contract ERC721TokenholderCasterTest is LlamaTokenVotingTestSetup, LlamaCoreSigU // } // } -contract CastApproval is ERC721TokenholderCasterTest { +contract CastVote is ERC721TokenholderCasterTest { function test_RevertsIf_ActionInfoMismatch(ActionInfo memory notActionInfo) public { vm.assume(notActionInfo.id != actionInfo.id); vm.expectRevert(); @@ -234,7 +234,7 @@ contract CastApproval is ERC721TokenholderCasterTest { } } -contract CastApprovalBySig is ERC721TokenholderCasterTest { +contract CastVoteBySig is ERC721TokenholderCasterTest { function setUp() public virtual override { ERC721TokenholderCasterTest.setUp(); } @@ -244,14 +244,9 @@ contract CastApprovalBySig is ERC721TokenholderCasterTest { view returns (uint8 v, bytes32 r, bytes32 s) { - LlamaCoreSigUtils.CastApproval memory castVote = LlamaCoreSigUtils.CastApproval({ - actionInfo: _actionInfo, - support: 1, - reason: "", - tokenHolder: tokenHolder1, - nonce: 0 - }); - bytes32 digest = getCastApprovalTypedDataHash(castVote); + LlamaCoreSigUtils.CastVote memory castVote = + LlamaCoreSigUtils.CastVote({actionInfo: _actionInfo, support: 1, reason: "", tokenHolder: tokenHolder1, nonce: 0}); + bytes32 digest = getCastVoteTypedDataHash(castVote); (v, r, s) = vm.sign(privateKey, digest); } @@ -322,7 +317,7 @@ contract CastApprovalBySig is ERC721TokenholderCasterTest { } } -contract CastDisapproval is ERC721TokenholderCasterTest { +contract CastVeto is ERC721TokenholderCasterTest { function setUp() public virtual override { ERC721TokenholderCasterTest.setUp(); @@ -409,7 +404,7 @@ contract CastDisapproval is ERC721TokenholderCasterTest { } } -contract CastDisapprovalBySig is ERC721TokenholderCasterTest { +contract CastVetoBySig is ERC721TokenholderCasterTest { function setUp() public virtual override { ERC721TokenholderCasterTest.setUp(); @@ -426,14 +421,9 @@ contract CastDisapprovalBySig is ERC721TokenholderCasterTest { view returns (uint8 v, bytes32 r, bytes32 s) { - LlamaCoreSigUtils.CastDisapproval memory castVeto = LlamaCoreSigUtils.CastDisapproval({ - actionInfo: _actionInfo, - support: 1, - reason: "", - tokenHolder: tokenHolder1, - nonce: 0 - }); - bytes32 digest = getCastDisapprovalTypedDataHash(castVeto); + LlamaCoreSigUtils.CastVeto memory castVeto = + LlamaCoreSigUtils.CastVeto({actionInfo: _actionInfo, support: 1, reason: "", tokenHolder: tokenHolder1, nonce: 0}); + bytes32 digest = getCastVetoTypedDataHash(castVeto); (v, r, s) = vm.sign(privateKey, digest); } diff --git a/test/utils/LlamaCoreSigUtils.sol b/test/utils/LlamaCoreSigUtils.sol index 60f0630..18579cc 100644 --- a/test/utils/LlamaCoreSigUtils.sol +++ b/test/utils/LlamaCoreSigUtils.sol @@ -27,7 +27,7 @@ contract LlamaCoreSigUtils { uint256 nonce; } - struct CastApproval { + struct CastVote { address tokenHolder; uint8 support; ActionInfo actionInfo; @@ -35,7 +35,7 @@ contract LlamaCoreSigUtils { uint256 nonce; } - struct CastDisapproval { + struct CastVeto { address tokenHolder; uint8 support; ActionInfo actionInfo; @@ -58,13 +58,13 @@ contract LlamaCoreSigUtils { ); /// @notice EIP-712 castVote typehash. - bytes32 internal constant CAST_APPROVAL_TYPEHASH = keccak256( - "CastApproval(address tokenHolder,uint8 support,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" + bytes32 internal constant CAST_VOTE_TYPEHASH = keccak256( + "CastVote(address tokenHolder,uint8 support,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" ); /// @notice EIP-712 castVeto typehash. - bytes32 internal constant CAST_DISAPPROVAL_TYPEHASH = keccak256( - "CastDisapproval(address tokenHolder,uint8 role,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" + bytes32 internal constant CAST_VETO_TYPEHASH = keccak256( + "CastVeto(address tokenHolder,uint8 role,ActionInfo actionInfo,string reason,uint256 nonce)ActionInfo(uint256 id,address creator,uint8 creatorRole,address strategy,address target,uint256 value,bytes data)" ); /// @notice EIP-712 actionInfo typehash. @@ -124,11 +124,11 @@ contract LlamaCoreSigUtils { return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCancelActionHash(cancelAction))); } - /// @notice Returns the hash of CastApproval. - function getCastApprovalHash(CastApproval memory castVote) internal pure returns (bytes32) { + /// @notice Returns the hash of CastVote. + function getCastVoteHash(CastVote memory castVote) internal pure returns (bytes32) { return keccak256( abi.encode( - CAST_APPROVAL_TYPEHASH, + CAST_VOTE_TYPEHASH, castVote.tokenHolder, castVote.support, getActionInfoHash(castVote.actionInfo), @@ -138,17 +138,17 @@ contract LlamaCoreSigUtils { ); } - /// @notice Returns the hash of the fully encoded EIP-712 message for the CastApproval domain, which can be used to + /// @notice Returns the hash of the fully encoded EIP-712 message for the CastVote domain, which can be used to /// recover the signer. - function getCastApprovalTypedDataHash(CastApproval memory castVote) internal view returns (bytes32) { - return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCastApprovalHash(castVote))); + function getCastVoteTypedDataHash(CastVote memory castVote) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCastVoteHash(castVote))); } - /// @notice Returns the hash of CastDisapprovalBySig. - function getCastDisapprovalHash(CastDisapproval memory castVeto) internal pure returns (bytes32) { + /// @notice Returns the hash of CastVetoBySig. + function getCastVetoHash(CastVeto memory castVeto) internal pure returns (bytes32) { return keccak256( abi.encode( - CAST_DISAPPROVAL_TYPEHASH, + CAST_VETO_TYPEHASH, castVeto.tokenHolder, castVeto.support, getActionInfoHash(castVeto.actionInfo), @@ -158,10 +158,10 @@ contract LlamaCoreSigUtils { ); } - /// @notice Returns the hash of the fully encoded EIP-712 message for the CastDisapproval domain, which can be used to + /// @notice Returns the hash of the fully encoded EIP-712 message for the CastVeto domain, which can be used to /// recover the signer. - function getCastDisapprovalTypedDataHash(CastDisapproval memory castVeto) internal view returns (bytes32) { - return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCastDisapprovalHash(castVeto))); + function getCastVetoTypedDataHash(CastVeto memory castVeto) internal view returns (bytes32) { + return keccak256(abi.encodePacked("\x19\x01", DOMAIN_SEPARATOR, getCastVetoHash(castVeto))); } /// @notice Returns the hash of ActionInfo.