编译器
0.8.25+commit.b61c2a91
文件 1 的 18:AccessControl.sol
文件 6 的 18:IAccessControl.sol
文件 11 的 18:IReverseRegistrar.sol
文件 13 的 18:MessageHashUtils.sol
文件 14 的 18:ReverseClaimer.sol
文件 15 的 18:SignatureChecker.sol
文件 16 的 18:SignedMath.sol
文件 18 的 18:Veto.sol
pragma solidity ^0.8.25;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.9/contracts/governance/IGovernor.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v5.0/contracts/access/AccessControl.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v5.0/contracts/utils/cryptography/SignatureChecker.sol";
import "https://github.com/ensdomains/ens-contracts/blob/21736916300b26cb8ea1802dbf6c9ff054adaeab/contracts/reverseRegistrar/ReverseClaimer.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v5.0/contracts/utils/cryptography/MessageHashUtils.sol";
contract Veto is AccessControl, ReverseClaimer {
IGovernor public governor;
string public pledge;
bytes32 public constant VETO_CANDIDATE_ROLE = keccak256("VETO_CANDIDATE_ROLE");
bytes32 public constant VETO_ROLE = keccak256("VETO_ROLE");
enum VoteType {
Against,
For,
Abstain
}
error InvalidSignature();
error AccessDenied();
event NewGovernor(address governor);
constructor(ENS ens, address _governor, string memory _pledge) ReverseClaimer(ens, msg.sender) {
governor = IGovernor(_governor);
emit NewGovernor(_governor);
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
pledge = _pledge;
}
function setGovernor(address _governor) external onlyRole(DEFAULT_ADMIN_ROLE) {
governor = IGovernor(_governor);
emit NewGovernor(_governor);
}
function enableVeto(bytes memory signature) external onlyRole(VETO_CANDIDATE_ROLE) {
if(!SignatureChecker.isValidSignatureNow(msg.sender, MessageHashUtils.toEthSignedMessageHash(bytes(pledge)), signature)) {
revert InvalidSignature();
}
_grantRole(VETO_ROLE, msg.sender);
_revokeRole(VETO_CANDIDATE_ROLE, msg.sender);
}
function castVote(uint256 proposalId) public virtual onlyRole(VETO_ROLE) returns (uint256 balance) {
return governor.castVote(proposalId, uint8(VoteType.Against));
}
function castVoteWithReason(
uint256 proposalId,
string calldata reason
) public virtual onlyRole(VETO_ROLE) returns (uint256 balance) {
return governor.castVoteWithReason(proposalId, uint8(VoteType.Against), reason);
}
}
{
"compilationTarget": {
"Veto.sol": "Veto"
},
"evmVersion": "cancun",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract ENS","name":"ens","type":"address"},{"internalType":"address","name":"_governor","type":"address"},{"internalType":"string","name":"_pledge","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"AccessDenied","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governor","type":"address"}],"name":"NewGovernor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VETO_CANDIDATE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VETO_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"castVote","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"reason","type":"string"}],"name":"castVoteWithReason","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"enableVeto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"contract IGovernor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pledge","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governor","type":"address"}],"name":"setGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]