Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
OptimismGovernor
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {GovernorUpgradeableV2} from "./lib/openzeppelin/v2/GovernorUpgradeableV2.sol";
import {GovernorCountingSimpleUpgradeableV2} from "./lib/openzeppelin/v2/GovernorCountingSimpleUpgradeableV2.sol";
import {GovernorVotesQuorumFractionUpgradeableV2} from
"./lib/openzeppelin/v2/GovernorVotesQuorumFractionUpgradeableV2.sol";
import {GovernorVotesUpgradeableV2} from "./lib/openzeppelin/v2/GovernorVotesUpgradeableV2.sol";
import {GovernorSettingsUpgradeableV2} from "./lib/openzeppelin/v2/GovernorSettingsUpgradeableV2.sol";
import {GovernorTimelockControlUpgradeableV2} from "./lib/openzeppelin/v2/GovernorTimelockControlUpgradeableV2.sol";
import {AddressUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
import {IGovernorUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol";
import {TimersUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol";
import {Initializable} from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {SafeCastUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import {VotingModule} from "./modules/VotingModule.sol";
import {IVotableSupplyOracle} from "./interfaces/IVotableSupplyOracle.sol";
import {IProposalTypesConfigurator} from "./interfaces/IProposalTypesConfigurator.sol";
import {IVotingToken} from "./interfaces/IVotingToken.sol";
import {TimelockControllerUpgradeable} from
"@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol";
import {IGovernorTimelockUpgradeable} from
"@openzeppelin/contracts-upgradeable/governance/extensions/IGovernorTimelockUpgradeable.sol";
contract OptimismGovernor is
Initializable,
GovernorUpgradeableV2,
GovernorCountingSimpleUpgradeableV2,
GovernorVotesUpgradeableV2,
GovernorVotesQuorumFractionUpgradeableV2,
GovernorSettingsUpgradeableV2
{
/*//////////////////////////////////////////////////////////////
LIBRARIES
//////////////////////////////////////////////////////////////*/
using SafeCastUpgradeable for uint256;
using TimersUpgradeable for TimersUpgradeable.BlockNumber;
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event ProposalCreated(
uint256 indexed proposalId,
address indexed proposer,
address[] targets,
uint256[] values,
string[] signatures,
bytes[] calldatas,
uint256 startBlock,
uint256 endBlock,
string description,
uint8 proposalType
);
event ProposalCreated(
uint256 indexed proposalId,
address indexed proposer,
address indexed votingModule,
bytes proposalData,
uint256 startBlock,
uint256 endBlock,
string description,
uint8 proposalType
);
event ProposalTypeUpdated(uint256 indexed proposalId, uint8 proposalType);
event ManagerSet(address indexed oldManager, address indexed newManager);
event ProposalDeadlineUpdated(uint256 proposalId, uint64 deadline);
event TimelockChange(address oldTimelock, address newTimelock);
event ProposalQueued(uint256 proposalId, uint256 eta);
/*//////////////////////////////////////////////////////////////
ERRORS
//////////////////////////////////////////////////////////////*/
error InvalidProposalType(uint8 proposalType);
error InvalidProposalId();
error InvalidRelayTarget(address target);
error InvalidProposalLength();
error InvalidEmptyProposal();
error InvalidVotesBelowThreshold();
error InvalidProposalExists();
error InvalidVoteType();
error NotManagerOrTimelock();
error NotAlligator();
/*//////////////////////////////////////////////////////////////
STORAGE
//////////////////////////////////////////////////////////////*/
/// @notice Max value of `quorum` and `approvalThreshold` in `ProposalType`
uint16 public constant PERCENT_DIVISOR = 10_000;
/// @notice Manager address
address public manager;
/// @notice Approved modules
mapping(address module => bool approved) public approvedModules;
/// @notice Total number of `votes` that `account` has cast for `proposalId`.
/// @dev Replaces non-quantitative `_proposalVotes.hasVoted` to add support for partial voting.
mapping(uint256 proposalId => mapping(address account => uint256 votes)) public weightCast;
/// @notice Alligator address
address public alligator;
/// @notice Votable supply oracle
IVotableSupplyOracle public VOTABLE_SUPPLY_ORACLE;
/// @notice Proposal types configurator
IProposalTypesConfigurator public PROPOSAL_TYPES_CONFIGURATOR;
/// @notice Timelock controller
TimelockControllerUpgradeable internal _timelock;
/// @notice Timelock ids
mapping(uint256 => bytes32) internal _timelockIds;
/// @notice Block number to check if proposal is previous or after upgrade
uint256 internal _upgradeBlock;
/*//////////////////////////////////////////////////////////////
MODIFIERS
//////////////////////////////////////////////////////////////*/
modifier onlyManagerOrTimelock() {
address sender = _msgSender();
if (sender != manager && sender != timelock()) revert NotManagerOrTimelock();
_;
}
modifier onlyAlligator() {
if (_msgSender() != alligator) revert NotAlligator();
_;
}
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor() {
_disableInitializers();
}
/**
* @notice Initialize the governor with the given parameters.
* @param _votingToken The governance token used for voting.
* @param _votableSupplyOracle The votable supply oracle.
* @param _manager The manager address.
* @param _alligator The alligator contract.
* @param _timelockAddress The governance timelock.
* @param _proposalTypesConfigurator Proposal types configurator contract.
* @param _proposalTypes Initial proposal types to set.
*/
function initialize(
IVotingToken _votingToken,
IVotableSupplyOracle _votableSupplyOracle,
address _manager,
address _alligator,
TimelockControllerUpgradeable _timelockAddress,
IProposalTypesConfigurator _proposalTypesConfigurator,
IProposalTypesConfigurator.ProposalType[] calldata _proposalTypes
) public initializer {
__Governor_init("Optimism");
__GovernorCountingSimple_init();
__GovernorVotes_init(_votingToken);
__GovernorSettings_init({initialVotingDelay: 6575, initialVotingPeriod: 46027, initialProposalThreshold: 0});
PROPOSAL_TYPES_CONFIGURATOR = _proposalTypesConfigurator;
VOTABLE_SUPPLY_ORACLE = _votableSupplyOracle;
manager = _manager;
alligator = _alligator;
_timelock = _timelockAddress;
PROPOSAL_TYPES_CONFIGURATOR.initialize(address(this), _proposalTypes);
}
/**
* @notice Reinitializes the contract with updated parameters.
* @param _alligator The new address of the alligator contract.
* @param _votableSupplyOracle The new address of the votable supply oracle.
* @param _proposalTypesConfigurator The new address of the proposal types configurator.
* @param _timelockAddress The address of the timelock.
*/
function reinitialize(
address _alligator,
address _votableSupplyOracle,
address _proposalTypesConfigurator,
TimelockControllerUpgradeable _timelockAddress
) public reinitializer(uint8(VERSION())) {
alligator = _alligator;
VOTABLE_SUPPLY_ORACLE = IVotableSupplyOracle(_votableSupplyOracle);
PROPOSAL_TYPES_CONFIGURATOR = IProposalTypesConfigurator(_proposalTypesConfigurator);
_upgradeBlock = block.number;
_timelock = _timelockAddress;
}
/*//////////////////////////////////////////////////////////////
EXTERNAL FUNCTIONS
//////////////////////////////////////////////////////////////*/
/**
* @dev Count `votes` for `account` on `proposalId` and update `weightCast`.
* Reverts if `votes` exceeds the remaining weight of `account` on `proposalId`.
*
* @param proposalId The id of the proposal to vote on
* @param account The address for which to count votes for, the proxy
* @param votes The number of votes to count
* @param accountVotes The total number of votes delegated to `account`
*/
function increaseWeightCast(uint256 proposalId, address account, uint256 votes, uint256 accountVotes)
external
onlyAlligator
{
require((weightCast[proposalId][account] += votes) <= accountVotes, "Governor: total weight exceeded");
}
/**
* @dev Cast a vote assuming `alligator` is sending the correct voting power, has recorded weight cast
* for proxy addresses and has done the necessary checks.
*
* @param proposalId The id of the proposal to vote on
* @param voter The address who cast the vote on behalf of the proxy
* @param support The support of the vote, `0` for against and `1` for for
* @param reason The reason given for the vote by the voter
* @param votes The number of votes to count
* @param params The params for the vote
*/
function castVoteFromAlligator(
uint256 proposalId,
address voter,
uint8 support,
string memory reason,
uint256 votes,
bytes calldata params
) external onlyAlligator {
require(state(proposalId) == ProposalState.Active, "Governor: vote not currently active");
// Skip `totalWeight` check and count `votes`
ProposalVote storage proposalVote = _proposalVotes[proposalId];
if (!proposalVote.hasVoted[voter]) {
proposalVote.hasVoted[voter] = true;
votes += _getVotes(voter, _proposals[proposalId].voteStart.getDeadline(), "");
}
if (support == uint8(VoteType.Against)) {
proposalVote.againstVotes += votes;
} else if (support == uint8(VoteType.For)) {
proposalVote.forVotes += votes;
} else if (support == uint8(VoteType.Abstain)) {
proposalVote.abstainVotes += votes;
} else {
revert InvalidVoteType();
}
address votingModule = _proposals[proposalId].votingModule;
if (votingModule != address(0)) {
VotingModule(votingModule)._countVote(proposalId, voter, support, votes, params);
}
/// @dev `voter` is emitted in the event instead of `proxy`
emit VoteCastWithParams(voter, proposalId, support, votes, reason, params);
}
/**
* @dev Allows manager to modify the proposalType of a proposal, in case it was set incorrectly.
*/
function editProposalType(uint256 proposalId, uint8 proposalType) external onlyManagerOrTimelock {
if (proposalSnapshot(proposalId) == 0) revert InvalidProposalId();
// Revert if `proposalType` is unset or the proposal has a different voting module
if (
bytes(PROPOSAL_TYPES_CONFIGURATOR.proposalTypes(proposalType).name).length == 0
|| PROPOSAL_TYPES_CONFIGURATOR.proposalTypes(proposalType).module != _proposals[proposalId].votingModule
) {
revert InvalidProposalType(proposalType);
}
_proposals[proposalId].proposalType = proposalType;
emit ProposalTypeUpdated(proposalId, proposalType);
}
/**
* Approve or reject a voting module. Only the manager can call this function.
*
* @param module The address of the voting module to approve or reject.
* @param approved Whether to approve or reject the voting module.
*/
function setModuleApproval(address module, bool approved) external onlyManagerOrTimelock {
approvedModules[module] = approved;
}
/**
* @notice Set the manager address. Only the manager or timelock can call this function.
* @param _newManager The new manager address.
*/
function setManager(address _newManager) external onlyManagerOrTimelock {
emit ManagerSet(manager, _newManager);
manager = _newManager;
}
/**
* @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates
* must be proposed, scheduled, and executed through governance proposals.
*
* CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.
*/
function updateTimelock(TimelockControllerUpgradeable newTimelock) external virtual onlyGovernance {
emit TimelockChange(address(_timelock), address(newTimelock));
_timelock = newTimelock;
}
/**
* @inheritdoc GovernorUpgradeableV2
*/
function relay(address target, uint256 value, bytes calldata data)
external
payable
virtual
override(GovernorUpgradeableV2)
onlyGovernance
{
if (approvedModules[target]) revert InvalidRelayTarget(target);
(bool success, bytes memory returndata) = target.call{value: value}(data);
AddressUpgradeable.verifyCallResult(success, returndata, "Governor: relay reverted without message");
}
/**
* @notice Returns the proposal type of a proposal.
* @param proposalId The id of the proposal.
*/
function getProposalType(uint256 proposalId) external view returns (uint8) {
return _proposals[proposalId].proposalType;
}
/*//////////////////////////////////////////////////////////////
PUBLIC FUNCTIONS
//////////////////////////////////////////////////////////////*/
/**
* @inheritdoc GovernorUpgradeableV2
* @dev Updated version in which default `proposalType` is set to 0.
*/
function propose(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
string memory description
) public virtual override(GovernorUpgradeableV2) returns (uint256) {
return propose(targets, values, calldatas, description, 0);
}
/**
* @notice Propose a new proposal. Only the manager or an address with votes above the proposal threshold can propose.
* See {IGovernor-propose}.
* @dev Updated version of `propose` in which `proposalType` is set and checked.
*/
function propose(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
string memory description,
uint8 proposalType
) public virtual onlyManagerOrTimelock returns (uint256 proposalId) {
// Only manager or timelock can propose, so this check can be skipped (otherwise stack too deep issues)
// address proposer = _msgSender();
// if (proposer != manager && getVotes(proposer, block.number - 1) < proposalThreshold()) {
// revert InvalidVotesBelowThreshold();
// }
if (targets.length != values.length) revert InvalidProposalLength();
if (targets.length != calldatas.length) revert InvalidProposalLength();
if (targets.length == 0) revert InvalidEmptyProposal();
// Revert if `proposalType` is unset or requires module
if (
bytes(PROPOSAL_TYPES_CONFIGURATOR.proposalTypes(proposalType).name).length == 0
|| PROPOSAL_TYPES_CONFIGURATOR.proposalTypes(proposalType).module != address(0)
) {
revert InvalidProposalType(proposalType);
}
proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));
ProposalCore storage proposal = _proposals[proposalId];
if (!proposal.voteStart.isUnset()) revert InvalidProposalExists();
uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();
uint64 deadline = snapshot + votingPeriod().toUint64();
proposal.voteStart.setDeadline(snapshot);
proposal.voteEnd.setDeadline(deadline);
proposal.proposalType = proposalType;
proposal.proposer = _msgSender();
emit ProposalCreated(
proposalId,
_msgSender(),
targets,
values,
new string[](targets.length),
calldatas,
snapshot,
deadline,
description,
proposalType
);
}
/**
* @notice Propose a new proposal using a custom voting module. Only the manager or an address with votes above the
* proposal threshold can propose.
* @param module The address of the voting module to use for this proposal.
* @param proposalData The proposal data to pass to the voting module.
* @param description The description of the proposal.
* @param proposalType The type of the proposal.
* @dev Updated version in which `proposalType` is set and checked.
* @return proposalId The id of the proposal.
*/
function proposeWithModule(
VotingModule module,
bytes memory proposalData,
string memory description,
uint8 proposalType
) public virtual onlyManagerOrTimelock returns (uint256 proposalId) {
address proposer = _msgSender();
if (proposer != manager) {
if (getVotes(proposer, block.number - 1) < proposalThreshold()) revert InvalidVotesBelowThreshold();
}
require(approvedModules[address(module)], "Governor: module not approved");
// Revert if `proposalType` is unset or doesn't match module
if (
bytes(PROPOSAL_TYPES_CONFIGURATOR.proposalTypes(proposalType).name).length == 0
|| PROPOSAL_TYPES_CONFIGURATOR.proposalTypes(proposalType).module != address(module)
) {
revert InvalidProposalType(proposalType);
}
bytes32 descriptionHash = keccak256(bytes(description));
proposalId = hashProposalWithModule(address(module), proposalData, descriptionHash);
ProposalCore storage proposal = _proposals[proposalId];
if (!proposal.voteStart.isUnset()) revert InvalidProposalExists();
uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();
uint64 deadline = snapshot + votingPeriod().toUint64();
proposal.voteStart.setDeadline(snapshot);
proposal.voteEnd.setDeadline(deadline);
proposal.votingModule = address(module);
proposal.proposalType = proposalType;
proposal.proposer = proposer;
module.propose(proposalId, proposalData, descriptionHash);
emit ProposalCreated(
proposalId, proposer, address(module), proposalData, snapshot, deadline, description, proposalType
);
}
function queue(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)
public
returns (uint256)
{
uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);
require(state(proposalId) == ProposalState.Succeeded, "Governor: proposal not successful");
uint256 delay = _timelock.getMinDelay();
_timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);
_timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);
emit ProposalQueued(proposalId, block.timestamp + delay);
return proposalId;
}
/**
* @notice Queue a proposal with a custom voting module. See {GovernorTimelockControlUpgradeableV2-queue}.
*/
function queueWithModule(VotingModule module, bytes memory proposalData, bytes32 descriptionHash)
public
returns (uint256)
{
uint256 proposalId = hashProposalWithModule(address(module), proposalData, descriptionHash);
(address[] memory targets, uint256[] memory values, bytes[] memory calldatas) =
module._formatExecuteParams(proposalId, proposalData);
require(state(proposalId) == ProposalState.Succeeded, "Governor: proposal not successful");
uint256 delay = _timelock.getMinDelay();
_timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);
_timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);
emit ProposalQueued(proposalId, block.timestamp + delay);
return proposalId;
}
/**
* @inheritdoc GovernorUpgradeableV2
*/
function execute(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) public payable override(GovernorUpgradeableV2) returns (uint256) {
uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);
require(state(proposalId) == ProposalState.Queued, "Governor: proposal not queued");
_proposals[proposalId].executed = true;
emit ProposalExecuted(proposalId);
_beforeExecute(proposalId, targets, values, calldatas, descriptionHash);
_execute(proposalId, targets, values, calldatas, descriptionHash);
_afterExecute(proposalId, targets, values, calldatas, descriptionHash);
return proposalId;
}
/**
* Executes a proposal via a custom voting module. See {IGovernor-execute}.
*
* @param module The address of the voting module to use for this proposal.
* @param proposalData The proposal data to pass to the voting module.
* @param descriptionHash The hash of the proposal description.
*/
function executeWithModule(VotingModule module, bytes memory proposalData, bytes32 descriptionHash)
public
payable
virtual
returns (uint256)
{
uint256 proposalId = hashProposalWithModule(address(module), proposalData, descriptionHash);
ProposalState status = state(proposalId);
require(status == ProposalState.Queued, "Governor: proposal not queued");
_proposals[proposalId].executed = true;
emit ProposalExecuted(proposalId);
(address[] memory targets, uint256[] memory values, bytes[] memory calldatas) =
module._formatExecuteParams(proposalId, proposalData);
_beforeExecute(proposalId, targets, values, calldatas, descriptionHash);
_execute(proposalId, targets, values, calldatas, descriptionHash);
_afterExecute(proposalId, targets, values, calldatas, descriptionHash);
return proposalId;
}
/**
* @notice Cancels a proposal. Only the manager, governor timelock, or proposer can cancel.
* @param targets Array of target addresses for proposal calls
* @param values Array of ETH values for proposal calls
* @param calldatas Array of calldata for proposal calls
* @param descriptionHash Hash of proposal description
* @return proposalId The id of the canceled proposal
*/
function cancel(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) public returns (uint256 proposalId) {
proposalId = hashProposal(targets, values, calldatas, descriptionHash);
_cancel(proposalId);
}
/**
* @notice Cancel a proposal with a custom voting module. See {GovernorUpgradeableV2-_cancel}.
* @param module The address of the voting module to use for this proposal.
* @param proposalData The proposal data to pass to the voting module.
* @param descriptionHash The hash of the proposal description.
* @return proposalId The id of the proposal.
*/
function cancelWithModule(VotingModule module, bytes memory proposalData, bytes32 descriptionHash)
public
virtual
returns (uint256 proposalId)
{
proposalId = hashProposalWithModule(address(module), proposalData, descriptionHash);
_cancel(proposalId);
}
/**
* @notice Internal function to cancel a proposal based on a proposal ID.
* @dev This function is called by both `cancel` and `cancelWithModule`
* @param proposalId The id of the proposal to cancel
*/
function _cancel(uint256 proposalId) internal {
address sender = _msgSender();
require(
sender == manager || sender == timelock() || sender == _proposals[proposalId].proposer,
"Governor: only manager, governor timelock, or proposer can cancel"
);
// GovernorUpgradeableV2._cancel
ProposalState status = state(proposalId);
require(
status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,
"Governor: proposal not active"
);
_proposals[proposalId].canceled = true;
emit ProposalCanceled(proposalId);
// GovernorTimelockControlUpgradeableV2._cancel
if (_timelockIds[proposalId] != 0) {
_timelock.cancel(_timelockIds[proposalId]);
delete _timelockIds[proposalId];
}
}
function setProposalDeadline(uint256 proposalId, uint64 deadline) public onlyManagerOrTimelock {
_proposals[proposalId].voteEnd.setDeadline(deadline);
emit ProposalDeadlineUpdated(proposalId, deadline);
}
function setVotingDelay(uint256 newVotingDelay) public override onlyManagerOrTimelock {
_setVotingDelay(newVotingDelay);
}
function setVotingPeriod(uint256 newVotingPeriod) public override onlyManagerOrTimelock {
_setVotingPeriod(newVotingPeriod);
}
function setProposalThreshold(uint256 newProposalThreshold) public override onlyManagerOrTimelock {
_setProposalThreshold(newProposalThreshold);
}
/**
* Returns the quorum for a `proposalId`, in terms of number of votes: `supply * numerator / denominator`.
*
* @dev Based on `votableSupply` by default, but falls back to `totalSupply` if not available.
* @dev Supply is calculated at the proposal snapshot block
* @dev Quorum value is derived from `PROPOSAL_TYPES_CONFIGURATOR`
*/
function quorum(uint256 proposalId) public view virtual override(IGovernorUpgradeable) returns (uint256) {
uint256 snapshotBlock = proposalSnapshot(proposalId);
uint256 supply = votableSupply(snapshotBlock);
// Fallback to total supply if votable supply was unset at `snapshotBlock`
if (supply == 0) {
supply = token.getPastTotalSupply(snapshotBlock);
}
return (supply * PROPOSAL_TYPES_CONFIGURATOR.proposalTypes(_proposals[proposalId].proposalType).quorum)
/ PERCENT_DIVISOR;
}
/**
* Calculate `proposalId` hashing similarly to `hashProposal` but based on `module` and `proposalData`.
* See {IGovernor-hashProposal}.
*
* @param module The address of the voting module to use for this proposal.
* @param proposalData The proposal data to pass to the voting module.
* @param descriptionHash The hash of the proposal description.
* @return The id of the proposal.
*/
function hashProposalWithModule(address module, bytes memory proposalData, bytes32 descriptionHash)
public
view
virtual
returns (uint256)
{
return uint256(keccak256(abi.encode(address(this), module, proposalData, descriptionHash)));
}
function proposalThreshold()
public
view
override(GovernorSettingsUpgradeableV2, GovernorUpgradeableV2)
returns (uint256)
{
return GovernorSettingsUpgradeableV2.proposalThreshold();
}
function state(uint256 proposalId) public view virtual override(GovernorUpgradeableV2) returns (ProposalState) {
ProposalState status = super.state(proposalId);
if (status != ProposalState.Succeeded) {
return status;
} else if (_upgradeBlock != 0 && _proposals[proposalId].voteStart.getDeadline() < _upgradeBlock) {
// Mark successful proposals before upgrade as executed to prevent them from being queued and executed.
return ProposalState.Executed;
}
// core tracks execution, so we just have to check if successful proposal have been queued.
bytes32 queueid = _timelockIds[proposalId];
if (queueid == bytes32(0)) {
return status;
} else if (_timelock.isOperationDone(queueid)) {
return ProposalState.Executed;
} else if (_timelock.isOperationPending(queueid)) {
return ProposalState.Queued;
} else {
return ProposalState.Canceled;
}
}
function supportsInterface(bytes4 interfaceId) public view virtual override(GovernorUpgradeableV2) returns (bool) {
return interfaceId == type(IGovernorTimelockUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Public accessor to check the address of the timelock
*/
function timelock() public view virtual returns (address) {
return address(_timelock);
}
/**
* @dev Public accessor to check the eta of a queued proposal
*/
function proposalEta(uint256 proposalId) public view virtual returns (uint256) {
uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);
return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value
}
/**
* Add support for `weightCast` to check if `account` has voted on `proposalId`.
*/
function hasVoted(uint256 proposalId, address account)
public
view
virtual
override(GovernorCountingSimpleUpgradeableV2, IGovernorUpgradeable)
returns (bool)
{
return weightCast[proposalId][account] != 0 || _proposalVotes[proposalId].hasVoted[account];
}
/**
* @dev Returns the votable supply for the current block number.
*/
function votableSupply() public view virtual returns (uint256) {
return VOTABLE_SUPPLY_ORACLE.votableSupply();
}
/**
* @dev Returns the votable supply for `blockNumber`.
*/
function votableSupply(uint256 blockNumber) public view virtual returns (uint256) {
return VOTABLE_SUPPLY_ORACLE.votableSupply(blockNumber);
}
/**
* @dev See {IGovernor-COUNTING_MODE}.
* Params encoding:
* - modules = custom external params depending on module used
*/
function COUNTING_MODE()
public
pure
virtual
override(GovernorCountingSimpleUpgradeableV2, IGovernorUpgradeable)
returns (string memory)
{
return "support=bravo&quorum=against,for,abstain¶ms=modules";
}
/**
* @dev Returns the current version of the governor.
*/
function VERSION() public pure virtual returns (uint256) {
return 4;
}
/*//////////////////////////////////////////////////////////////
INTERNAL FUNCTIONS
//////////////////////////////////////////////////////////////*/
function _cancel(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) internal override(GovernorUpgradeableV2) returns (uint256) {
uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);
if (_timelockIds[proposalId] != 0) {
_timelock.cancel(_timelockIds[proposalId]);
delete _timelockIds[proposalId];
}
return proposalId;
}
function _execute(
uint256,
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) internal override(GovernorUpgradeableV2) {
_timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);
}
/**
* @dev Updated internal vote casting mechanism which delegates counting logic to voting module,
* in addition to executing standard `_countVote`. See {IGovernor-_castVote}.
*/
function _castVote(uint256 proposalId, address account, uint8 support, string memory reason, bytes memory params)
internal
virtual
override
returns (uint256 weight)
{
require(state(proposalId) == ProposalState.Active, "Governor: vote not currently active");
weight = _getVotes(account, _proposals[proposalId].voteStart.getDeadline(), "");
_countVote(proposalId, account, support, weight, params);
address votingModule = _proposals[proposalId].votingModule;
if (votingModule != address(0)) {
VotingModule(votingModule)._countVote(proposalId, account, support, weight, params);
}
if (params.length == 0) {
emit VoteCast(account, proposalId, support, weight, reason);
} else {
emit VoteCastWithParams(account, proposalId, support, weight, reason, params);
}
}
function _executor() internal view override(GovernorUpgradeableV2) returns (address) {
return address(_timelock);
}
/**
* @dev Updated version in which quorum is based on `proposalId` instead of snapshot block.
*/
function _quorumReached(uint256 proposalId)
internal
view
virtual
override(GovernorCountingSimpleUpgradeableV2, GovernorUpgradeableV2)
returns (bool)
{
(uint256 againstVotes, uint256 forVotes, uint256 abstainVotes) = proposalVotes(proposalId);
return quorum(proposalId) <= againstVotes + forVotes + abstainVotes;
}
/**
* @dev Added logic based on approval voting threshold to determine if vote has succeeded.
*/
function _voteSucceeded(uint256 proposalId)
internal
view
virtual
override(GovernorCountingSimpleUpgradeableV2, GovernorUpgradeableV2)
returns (bool voteSucceeded)
{
ProposalCore storage proposal = _proposals[proposalId];
address votingModule = proposal.votingModule;
if (votingModule != address(0)) {
if (!VotingModule(votingModule)._voteSucceeded(proposalId)) {
return false;
}
}
uint256 approvalThreshold = PROPOSAL_TYPES_CONFIGURATOR.proposalTypes(proposal.proposalType).approvalThreshold;
if (approvalThreshold == 0) return true;
ProposalVote storage proposalVote = _proposalVotes[proposalId];
uint256 forVotes = proposalVote.forVotes;
uint256 totalVotes = forVotes + proposalVote.againstVotes;
if (totalVotes != 0) {
voteSucceeded = (forVotes * PERCENT_DIVISOR) / totalVotes >= approvalThreshold;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (governance/Governor.sol)
pragma solidity ^0.8.0;
import "@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/cryptography/ECDSAUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/cryptography/EIP712Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/math/SafeCastUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/structs/DoubleEndedQueueUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/utils/TimersUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/governance/IGovernorUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
/**
* Modifications:
* - Added `votingModule` and `proposalType` to `ProposalCore` struct
* - Removed checks for Queued and Expired proposal state **(undid this modification)**
*/
abstract contract GovernorUpgradeableV2 is
Initializable,
ContextUpgradeable,
ERC165Upgradeable,
EIP712Upgradeable,
IGovernorUpgradeable,
IERC721ReceiverUpgradeable,
IERC1155ReceiverUpgradeable
{
using DoubleEndedQueueUpgradeable for DoubleEndedQueueUpgradeable.Bytes32Deque;
using SafeCastUpgradeable for uint256;
using TimersUpgradeable for TimersUpgradeable.BlockNumber;
bytes32 public constant BALLOT_TYPEHASH = keccak256("Ballot(uint256 proposalId,uint8 support)");
bytes32 public constant EXTENDED_BALLOT_TYPEHASH =
keccak256("ExtendedBallot(uint256 proposalId,uint8 support,string reason,bytes params)");
struct ProposalCore {
TimersUpgradeable.BlockNumber voteStart;
TimersUpgradeable.BlockNumber voteEnd;
bool executed;
bool canceled;
address votingModule;
uint8 proposalType;
address proposer;
}
string private _name;
mapping(uint256 => ProposalCore) internal _proposals;
// This queue keeps track of the governor operating on itself. Calls to functions protected by the
// {onlyGovernance} modifier needs to be whitelisted in this queue. Whitelisting is set in {_beforeExecute},
// consumed by the {onlyGovernance} modifier and eventually reset in {_afterExecute}. This ensures that the
// execution of {onlyGovernance} protected calls can only be achieved through successful proposals.
DoubleEndedQueueUpgradeable.Bytes32Deque private _governanceCall;
/**
* @dev Restricts a function so it can only be executed through governance proposals. For example, governance
* parameter setters in {GovernorSettings} are protected using this modifier.
*
* The governance executing address may be different from the Governor's own address, for example it could be a
* timelock. This can be customized by modules by overriding {_executor}. The executor is only able to invoke these
* functions during the execution of the governor's {execute} function, and not under any other circumstances. Thus,
* for example, additional timelock proposers are not able to change governance parameters without going through the
* governance protocol (since v4.6).
*/
modifier onlyGovernance() {
require(_msgSender() == _executor(), "Governor: onlyGovernance");
if (_executor() != address(this)) {
bytes32 msgDataHash = keccak256(_msgData());
// loop until popping the expected operation - throw if deque is empty (operation not authorized)
while (_governanceCall.popFront() != msgDataHash) {}
}
_;
}
/**
* @dev Sets the value for {name} and {version}
*/
function __Governor_init(string memory name_) internal onlyInitializing {
__EIP712_init_unchained(name_, version());
__Governor_init_unchained(name_);
}
function __Governor_init_unchained(string memory name_) internal onlyInitializing {
_name = name_;
}
/**
* @dev Function to receive ETH that will be handled by the governor (disabled if executor is a third party contract)
*/
receive() external payable virtual {
require(_executor() == address(this));
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(IERC165Upgradeable, ERC165Upgradeable)
returns (bool)
{
// In addition to the current interfaceId, also support previous version of the interfaceId that did not
// include the castVoteWithReasonAndParams() function as standard
return interfaceId
== (
type(IGovernorUpgradeable).interfaceId ^ this.castVoteWithReasonAndParams.selector
^ this.castVoteWithReasonAndParamsBySig.selector ^ this.getVotesWithParams.selector
) || interfaceId == type(IGovernorUpgradeable).interfaceId
|| interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev See {IGovernor-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IGovernor-version}.
*/
function version() public view virtual override returns (string memory) {
return "1";
}
/**
* @dev See {IGovernor-hashProposal}.
*
* The proposal id is produced by hashing the ABI encoded `targets` array, the `values` array, the `calldatas` array
* and the descriptionHash (bytes32 which itself is the keccak256 hash of the description string). This proposal id
* can be produced from the proposal data which is part of the {ProposalCreated} event. It can even be computed in
* advance, before the proposal is submitted.
*
* Note that the chainId and the governor address are not part of the proposal id computation. Consequently, the
* same proposal (with same operation and same description) will have the same id if submitted on multiple governors
* across multiple networks. This also means that in order to execute the same operation twice (on the same
* governor) the proposer will have to change the description in order to avoid proposal id conflicts.
*/
function hashProposal(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) public pure virtual override returns (uint256) {
return uint256(keccak256(abi.encode(targets, values, calldatas, descriptionHash)));
}
/**
* @dev See {IGovernor-state}.
*/
function state(uint256 proposalId) public view virtual override returns (ProposalState) {
ProposalCore storage proposal = _proposals[proposalId];
if (proposal.executed) {
return ProposalState.Executed;
}
if (proposal.canceled) {
return ProposalState.Canceled;
}
uint256 snapshot = proposalSnapshot(proposalId);
if (snapshot == 0) {
revert("Governor: unknown proposal id");
}
if (snapshot >= block.number) {
return ProposalState.Pending;
}
uint256 deadline = proposalDeadline(proposalId);
if (deadline >= block.number) {
return ProposalState.Active;
}
if (_quorumReached(proposalId) && _voteSucceeded(proposalId)) {
return ProposalState.Succeeded;
} else {
return ProposalState.Defeated;
}
}
/**
* @dev See {IGovernor-proposalSnapshot}.
*/
function proposalSnapshot(uint256 proposalId) public view virtual override returns (uint256) {
return _proposals[proposalId].voteStart.getDeadline();
}
/**
* @dev See {IGovernor-proposalDeadline}.
*/
function proposalDeadline(uint256 proposalId) public view virtual override returns (uint256) {
return _proposals[proposalId].voteEnd.getDeadline();
}
/**
* @dev Part of the Governor Bravo's interface: _"The number of votes required in order for a voter to become a proposer"_.
*/
function proposalThreshold() public view virtual returns (uint256) {
return 0;
}
/**
* @dev Amount of votes already cast passes the threshold limit.
*/
function _quorumReached(uint256 proposalId) internal view virtual returns (bool);
/**
* @dev Is the proposal successful or not.
*/
function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);
/**
* @dev Get the voting weight of `account` at a specific `blockNumber`, for a vote as described by `params`.
*/
function _getVotes(address account, uint256 blockNumber, bytes memory params)
internal
view
virtual
returns (uint256);
/**
* @dev Register a vote for `proposalId` by `account` with a given `support`, voting `weight` and voting `params`.
*
* Note: Support is generic and can represent various things depending on the voting system used.
*/
function _countVote(uint256 proposalId, address account, uint8 support, uint256 weight, bytes memory params)
internal
virtual;
/**
* @dev Default additional encoded parameters used by castVote methods that don't include them
*
* Note: Should be overridden by specific implementations to use an appropriate value, the
* meaning of the additional params, in the context of that implementation
*/
function _defaultParams() internal view virtual returns (bytes memory) {
return "";
}
/**
* @dev See {IGovernor-propose}.
*/
function propose(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
string memory description
) public virtual override returns (uint256) {
require(
getVotes(_msgSender(), block.number - 1) >= proposalThreshold(),
"Governor: proposer votes below proposal threshold"
);
uint256 proposalId = hashProposal(targets, values, calldatas, keccak256(bytes(description)));
require(targets.length == values.length, "Governor: invalid proposal length");
require(targets.length == calldatas.length, "Governor: invalid proposal length");
require(targets.length > 0, "Governor: empty proposal");
ProposalCore storage proposal = _proposals[proposalId];
require(proposal.voteStart.isUnset(), "Governor: proposal already exists");
uint64 snapshot = block.number.toUint64() + votingDelay().toUint64();
uint64 deadline = snapshot + votingPeriod().toUint64();
proposal.voteStart.setDeadline(snapshot);
proposal.voteEnd.setDeadline(deadline);
emit ProposalCreated(
proposalId,
_msgSender(),
targets,
values,
new string[](targets.length),
calldatas,
snapshot,
deadline,
description
);
return proposalId;
}
/**
* @dev See {IGovernor-execute}.
*/
function execute(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) public payable virtual override returns (uint256) {
uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);
ProposalState status = state(proposalId);
require(
status == ProposalState.Succeeded || status == ProposalState.Queued, "Governor: proposal not successful"
);
_proposals[proposalId].executed = true;
emit ProposalExecuted(proposalId);
_beforeExecute(proposalId, targets, values, calldatas, descriptionHash);
_execute(proposalId, targets, values, calldatas, descriptionHash);
_afterExecute(proposalId, targets, values, calldatas, descriptionHash);
return proposalId;
}
/**
* @dev Internal execution mechanism. Can be overridden to implement different execution mechanism
*/
function _execute(
uint256, /* proposalId */
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 /*descriptionHash*/
) internal virtual {
string memory errorMessage = "Governor: call reverted without message";
for (uint256 i = 0; i < targets.length; ++i) {
(bool success, bytes memory returndata) = targets[i].call{value: values[i]}(calldatas[i]);
AddressUpgradeable.verifyCallResult(success, returndata, errorMessage);
}
}
/**
* @dev Hook before execution is triggered.
*/
function _beforeExecute(
uint256, /* proposalId */
address[] memory targets,
uint256[] memory, /* values */
bytes[] memory calldatas,
bytes32 /*descriptionHash*/
) internal virtual {
if (_executor() != address(this)) {
for (uint256 i = 0; i < targets.length; ++i) {
if (targets[i] == address(this)) {
_governanceCall.pushBack(keccak256(calldatas[i]));
}
}
}
}
/**
* @dev Hook after execution is triggered.
*/
function _afterExecute(
uint256, /* proposalId */
address[] memory, /* targets */
uint256[] memory, /* values */
bytes[] memory, /* calldatas */
bytes32 /*descriptionHash*/
) internal virtual {
if (_executor() != address(this)) {
if (!_governanceCall.empty()) {
_governanceCall.clear();
}
}
}
/**
* @dev Internal cancel mechanism: locks up the proposal timer, preventing it from being re-submitted. Marks it as
* canceled to allow distinguishing it from executed proposals.
*
* Emits a {IGovernor-ProposalCanceled} event.
*/
function _cancel(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) internal virtual returns (uint256) {
uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);
ProposalState status = state(proposalId);
require(
status != ProposalState.Canceled && status != ProposalState.Expired && status != ProposalState.Executed,
"Governor: proposal not active"
);
_proposals[proposalId].canceled = true;
emit ProposalCanceled(proposalId);
return proposalId;
}
/**
* @dev See {IGovernor-getVotes}.
*/
function getVotes(address account, uint256 blockNumber) public view virtual override returns (uint256) {
return _getVotes(account, blockNumber, _defaultParams());
}
/**
* @dev See {IGovernor-getVotesWithParams}.
*/
function getVotesWithParams(address account, uint256 blockNumber, bytes memory params)
public
view
virtual
override
returns (uint256)
{
return _getVotes(account, blockNumber, params);
}
/**
* @dev See {IGovernor-castVote}.
*/
function castVote(uint256 proposalId, uint8 support) public virtual override returns (uint256) {
address voter = _msgSender();
return _castVote(proposalId, voter, support, "");
}
/**
* @dev See {IGovernor-castVoteWithReason}.
*/
function castVoteWithReason(uint256 proposalId, uint8 support, string calldata reason)
public
virtual
override
returns (uint256)
{
address voter = _msgSender();
return _castVote(proposalId, voter, support, reason);
}
/**
* @dev See {IGovernor-castVoteWithReasonAndParams}.
*/
function castVoteWithReasonAndParams(uint256 proposalId, uint8 support, string calldata reason, bytes memory params)
public
virtual
override
returns (uint256)
{
address voter = _msgSender();
return _castVote(proposalId, voter, support, reason, params);
}
/**
* @dev See {IGovernor-castVoteBySig}.
*/
function castVoteBySig(uint256 proposalId, uint8 support, uint8 v, bytes32 r, bytes32 s)
public
virtual
override
returns (uint256)
{
address voter = ECDSAUpgradeable.recover(
_hashTypedDataV4(keccak256(abi.encode(BALLOT_TYPEHASH, proposalId, support))), v, r, s
);
return _castVote(proposalId, voter, support, "");
}
/**
* @dev See {IGovernor-castVoteWithReasonAndParamsBySig}.
*/
function castVoteWithReasonAndParamsBySig(
uint256 proposalId,
uint8 support,
string calldata reason,
bytes memory params,
uint8 v,
bytes32 r,
bytes32 s
) public virtual override returns (uint256) {
address voter = ECDSAUpgradeable.recover(
_hashTypedDataV4(
keccak256(
abi.encode(
EXTENDED_BALLOT_TYPEHASH, proposalId, support, keccak256(bytes(reason)), keccak256(params)
)
)
),
v,
r,
s
);
return _castVote(proposalId, voter, support, reason, params);
}
/**
* @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve
* voting weight using {IGovernor-getVotes} and call the {_countVote} internal function. Uses the _defaultParams().
*
* Emits a {IGovernor-VoteCast} event.
*/
function _castVote(uint256 proposalId, address account, uint8 support, string memory reason)
internal
virtual
returns (uint256)
{
return _castVote(proposalId, account, support, reason, _defaultParams());
}
/**
* @dev Internal vote casting mechanism: Check that the vote is pending, that it has not been cast yet, retrieve
* voting weight using {IGovernor-getVotes} and call the {_countVote} internal function.
*
* Emits a {IGovernor-VoteCast} event.
*/
function _castVote(uint256 proposalId, address account, uint8 support, string memory reason, bytes memory params)
internal
virtual
returns (uint256)
{
ProposalCore storage proposal = _proposals[proposalId];
require(state(proposalId) == ProposalState.Active, "Governor: vote not currently active");
uint256 weight = _getVotes(account, proposal.voteStart.getDeadline(), params);
_countVote(proposalId, account, support, weight, params);
if (params.length == 0) {
emit VoteCast(account, proposalId, support, weight, reason);
} else {
emit VoteCastWithParams(account, proposalId, support, weight, reason, params);
}
return weight;
}
/**
* @dev Relays a transaction or function call to an arbitrary target. In cases where the governance executor
* is some contract other than the governor itself, like when using a timelock, this function can be invoked
* in a governance proposal to recover tokens or Ether that was sent to the governor contract by mistake.
* Note that if the executor is simply the governor itself, use of `relay` is redundant.
*/
function relay(address target, uint256 value, bytes calldata data) external payable virtual onlyGovernance {
(bool success, bytes memory returndata) = target.call{value: value}(data);
AddressUpgradeable.verifyCallResult(success, returndata, "Governor: relay reverted without message");
}
/**
* @dev Address through which the governor executes action. Will be overloaded by module that execute actions
* through another contract such as a timelock.
*/
function _executor() internal view virtual returns (address) {
return address(this);
}
/**
* @dev See {IERC721Receiver-onERC721Received}.
*/
function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
/**
* @dev See {IERC1155Receiver-onERC1155Received}.
*/
function onERC1155Received(address, address, uint256, uint256, bytes memory)
public
virtual
override
returns (bytes4)
{
return this.onERC1155Received.selector;
}
/**
* @dev See {IERC1155Receiver-onERC1155BatchReceived}.
*/
function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory)
public
virtual
override
returns (bytes4)
{
return this.onERC1155BatchReceived.selector;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[46] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (governance/extensions/GovernorCountingSimple.sol)
pragma solidity ^0.8.0;
import "./GovernorUpgradeableV2.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
/**
* Modifications:
* - Inherited `GovernorUpgradeableV2`
* - Made _proposalVotes internal
*/
abstract contract GovernorCountingSimpleUpgradeableV2 is Initializable, GovernorUpgradeableV2 {
function __GovernorCountingSimple_init() internal onlyInitializing {}
function __GovernorCountingSimple_init_unchained() internal onlyInitializing {}
/**
* @dev Supported vote types. Matches Governor Bravo ordering.
*/
enum VoteType {
Against,
For,
Abstain
}
struct ProposalVote {
uint256 againstVotes;
uint256 forVotes;
uint256 abstainVotes;
mapping(address => bool) hasVoted;
}
mapping(uint256 => ProposalVote) internal _proposalVotes;
/**
* @dev See {IGovernor-COUNTING_MODE}.
*/
// solhint-disable-next-line func-name-mixedcase
function COUNTING_MODE() public pure virtual override returns (string memory) {
return "support=bravo&quorum=for,abstain";
}
/**
* @dev See {IGovernor-hasVoted}.
*/
function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {
return _proposalVotes[proposalId].hasVoted[account];
}
/**
* @dev Accessor to the internal vote counts.
*/
function proposalVotes(uint256 proposalId)
public
view
virtual
returns (uint256 againstVotes, uint256 forVotes, uint256 abstainVotes)
{
ProposalVote storage proposalVote = _proposalVotes[proposalId];
return (proposalVote.againstVotes, proposalVote.forVotes, proposalVote.abstainVotes);
}
/**
* @dev See {Governor-_quorumReached}.
*/
function _quorumReached(uint256 proposalId) internal view virtual override returns (bool) {
ProposalVote storage proposalVote = _proposalVotes[proposalId];
return quorum(proposalSnapshot(proposalId)) <= proposalVote.forVotes + proposalVote.abstainVotes;
}
/**
* @dev See {Governor-_voteSucceeded}. In this module, the forVotes must be strictly over the againstVotes.
*/
function _voteSucceeded(uint256 proposalId) internal view virtual override returns (bool) {
ProposalVote storage proposalVote = _proposalVotes[proposalId];
return proposalVote.forVotes > proposalVote.againstVotes;
}
/**
* @dev See {Governor-_countVote}. In this module, the support follows the `VoteType` enum (from Governor Bravo).
*/
function _countVote(
uint256 proposalId,
address account,
uint8 support,
uint256 weight,
bytes memory // params
) internal virtual override {
ProposalVote storage proposalVote = _proposalVotes[proposalId];
require(!proposalVote.hasVoted[account], "GovernorVotingSimple: vote already cast");
proposalVote.hasVoted[account] = true;
if (support == uint8(VoteType.Against)) {
proposalVote.againstVotes += weight;
} else if (support == uint8(VoteType.For)) {
proposalVote.forVotes += weight;
} else if (support == uint8(VoteType.Abstain)) {
proposalVote.abstainVotes += weight;
} else {
revert("GovernorVotingSimple: invalid value for enum VoteType");
}
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (governance/extensions/GovernorVotesQuorumFraction.sol)
pragma solidity ^0.8.0;
import "./GovernorVotesUpgradeableV2.sol";
import "@openzeppelin/contracts-upgradeable/utils/CheckpointsUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
// Contract is empty as it was deprecated and only left for storage compatibility
abstract contract GovernorVotesQuorumFractionUpgradeableV2 is Initializable, GovernorVotesUpgradeableV2 {
using CheckpointsUpgradeable for CheckpointsUpgradeable.History;
uint256 private _quorumNumerator; // DEPRECATED
CheckpointsUpgradeable.History internal _quorumNumeratorHistory;
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[48] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorVotes.sol)
pragma solidity ^0.8.0;
import "./GovernorUpgradeableV2.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
import {IVotingToken} from "src/interfaces/IVotingToken.sol";
/**
* Modifications:
* - Inherited `GovernorUpgradeableV2`
* - Replaced `token` with immutable version to optimize gas
*/
abstract contract GovernorVotesUpgradeableV2 is Initializable, GovernorUpgradeableV2 {
IVotingToken public token;
function __GovernorVotes_init(IVotingToken tokenAddress) internal onlyInitializing {
__GovernorVotes_init_unchained(tokenAddress);
}
function __GovernorVotes_init_unchained(IVotingToken tokenAddress) internal onlyInitializing {
token = tokenAddress;
}
/**
* Read the voting weight from the token's built in snapshot mechanism (see {Governor-_getVotes}).
*/
function _getVotes(address account, uint256 blockNumber, bytes memory /*params*/ )
internal
view
virtual
override
returns (uint256)
{
return token.getPastVotes(account, blockNumber);
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (governance/extensions/GovernorSettings.sol)
pragma solidity ^0.8.0;
import "./GovernorUpgradeableV2.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
/**
* Modifications:
* - Inherited `GovernorUpgradeableV2`
*/
abstract contract GovernorSettingsUpgradeableV2 is Initializable, GovernorUpgradeableV2 {
uint256 private _votingDelay;
uint256 private _votingPeriod;
uint256 private _proposalThreshold;
event VotingDelaySet(uint256 oldVotingDelay, uint256 newVotingDelay);
event VotingPeriodSet(uint256 oldVotingPeriod, uint256 newVotingPeriod);
event ProposalThresholdSet(uint256 oldProposalThreshold, uint256 newProposalThreshold);
/**
* @dev Initialize the governance parameters.
*/
function __GovernorSettings_init(
uint256 initialVotingDelay,
uint256 initialVotingPeriod,
uint256 initialProposalThreshold
) internal onlyInitializing {
__GovernorSettings_init_unchained(initialVotingDelay, initialVotingPeriod, initialProposalThreshold);
}
function __GovernorSettings_init_unchained(
uint256 initialVotingDelay,
uint256 initialVotingPeriod,
uint256 initialProposalThreshold
) internal onlyInitializing {
_setVotingDelay(initialVotingDelay);
_setVotingPeriod(initialVotingPeriod);
_setProposalThreshold(initialProposalThreshold);
}
/**
* @dev See {IGovernor-votingDelay}.
*/
function votingDelay() public view virtual override returns (uint256) {
return _votingDelay;
}
/**
* @dev See {IGovernor-votingPeriod}.
*/
function votingPeriod() public view virtual override returns (uint256) {
return _votingPeriod;
}
/**
* @dev See {Governor-proposalThreshold}.
*/
function proposalThreshold() public view virtual override returns (uint256) {
return _proposalThreshold;
}
/**
* @dev Update the voting delay. This operation can only be performed through a governance proposal.
*
* Emits a {VotingDelaySet} event.
*/
function setVotingDelay(uint256 newVotingDelay) public virtual onlyGovernance {
_setVotingDelay(newVotingDelay);
}
/**
* @dev Update the voting period. This operation can only be performed through a governance proposal.
*
* Emits a {VotingPeriodSet} event.
*/
function setVotingPeriod(uint256 newVotingPeriod) public virtual onlyGovernance {
_setVotingPeriod(newVotingPeriod);
}
/**
* @dev Update the proposal threshold. This operation can only be performed through a governance proposal.
*
* Emits a {ProposalThresholdSet} event.
*/
function setProposalThreshold(uint256 newProposalThreshold) public virtual onlyGovernance {
_setProposalThreshold(newProposalThreshold);
}
/**
* @dev Internal setter for the voting delay.
*
* Emits a {VotingDelaySet} event.
*/
function _setVotingDelay(uint256 newVotingDelay) internal virtual {
emit VotingDelaySet(_votingDelay, newVotingDelay);
_votingDelay = newVotingDelay;
}
/**
* @dev Internal setter for the voting period.
*
* Emits a {VotingPeriodSet} event.
*/
function _setVotingPeriod(uint256 newVotingPeriod) internal virtual {
// voting period must be at least one block long
require(newVotingPeriod > 0, "GovernorSettings: voting period too low");
emit VotingPeriodSet(_votingPeriod, newVotingPeriod);
_votingPeriod = newVotingPeriod;
}
/**
* @dev Internal setter for the proposal threshold.
*
* Emits a {ProposalThresholdSet} event.
*/
function _setProposalThreshold(uint256 newProposalThreshold) internal virtual {
emit ProposalThresholdSet(_proposalThreshold, newProposalThreshold);
_proposalThreshold = newProposalThreshold;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[47] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (governance/extensions/GovernorTimelockControl.sol)
pragma solidity ^0.8.0;
import {IGovernorTimelockUpgradeable} from
"@openzeppelin/contracts-upgradeable/governance/extensions/IGovernorTimelockUpgradeable.sol";
import "./GovernorUpgradeableV2.sol";
import "@openzeppelin/contracts-upgradeable/governance/TimelockControllerUpgradeable.sol";
import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol";
/**
* @dev Extension of {Governor} that binds the execution process to an instance of {TimelockController}. This adds a
* delay, enforced by the {TimelockController} to all successful proposal (in addition to the voting duration). The
* {Governor} needs the proposer (and ideally the executor) roles for the {Governor} to work properly.
*
* Using this model means the proposal will be operated by the {TimelockController} and not by the {Governor}. Thus,
* the assets and permissions must be attached to the {TimelockController}. Any asset sent to the {Governor} will be
* inaccessible.
*
* WARNING: Setting up the TimelockController to have additional proposers besides the governor is very risky, as it
* grants them powers that they must be trusted or known not to use: 1) {onlyGovernance} functions like {relay} are
* available to them through the timelock, and 2) approved governance proposals can be blocked by them, effectively
* executing a Denial of Service attack. This risk will be mitigated in a future release.
*
* _Available since v4.3._
*
* Modifications:
* - Inherited `GovernorUpgradeableV2`
* - Made _timelock, _timelockIds internal
*/
abstract contract GovernorTimelockControlUpgradeableV2 is
Initializable,
IGovernorTimelockUpgradeable,
GovernorUpgradeableV2
{
TimelockControllerUpgradeable internal _timelock;
mapping(uint256 => bytes32) internal _timelockIds;
/**
* @dev Emitted when the timelock controller used for proposal execution is modified.
*/
event TimelockChange(address oldTimelock, address newTimelock);
/**
* @dev Set the timelock.
*/
function __GovernorTimelockControl_init(TimelockControllerUpgradeable timelockAddress) internal onlyInitializing {
__GovernorTimelockControl_init_unchained(timelockAddress);
}
function __GovernorTimelockControl_init_unchained(TimelockControllerUpgradeable timelockAddress)
internal
onlyInitializing
{
_updateTimelock(timelockAddress);
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(IERC165Upgradeable, GovernorUpgradeableV2)
returns (bool)
{
return interfaceId == type(IGovernorTimelockUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Overridden version of the {Governor-state} function with added support for the `Queued` status.
*/
function state(uint256 proposalId)
public
view
virtual
override(IGovernorUpgradeable, GovernorUpgradeableV2)
returns (ProposalState)
{
ProposalState status = super.state(proposalId);
if (status != ProposalState.Succeeded) {
return status;
}
// core tracks execution, so we just have to check if successful proposal have been queued.
bytes32 queueid = _timelockIds[proposalId];
if (queueid == bytes32(0)) {
return status;
} else if (_timelock.isOperationDone(queueid)) {
return ProposalState.Executed;
} else if (_timelock.isOperationPending(queueid)) {
return ProposalState.Queued;
} else {
return ProposalState.Canceled;
}
}
/**
* @dev Public accessor to check the address of the timelock
*/
function timelock() public view virtual override returns (address) {
return address(_timelock);
}
/**
* @dev Public accessor to check the eta of a queued proposal
*/
function proposalEta(uint256 proposalId) public view virtual override returns (uint256) {
uint256 eta = _timelock.getTimestamp(_timelockIds[proposalId]);
return eta == 1 ? 0 : eta; // _DONE_TIMESTAMP (1) should be replaced with a 0 value
}
/**
* @dev Function to queue a proposal to the timelock.
*/
function queue(address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash)
public
virtual
override
returns (uint256)
{
uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);
require(state(proposalId) == ProposalState.Succeeded, "Governor: proposal not successful");
uint256 delay = _timelock.getMinDelay();
_timelockIds[proposalId] = _timelock.hashOperationBatch(targets, values, calldatas, 0, descriptionHash);
_timelock.scheduleBatch(targets, values, calldatas, 0, descriptionHash, delay);
emit ProposalQueued(proposalId, block.timestamp + delay);
return proposalId;
}
/**
* @dev Overridden execute function that run the already queued proposal through the timelock.
*/
function _execute(
uint256, /* proposalId */
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) internal virtual override {
_timelock.executeBatch{value: msg.value}(targets, values, calldatas, 0, descriptionHash);
}
/**
* @dev Overridden version of the {Governor-_cancel} function to cancel the timelocked proposal if it as already
* been queued.
*/
// This function can reenter through the external call to the timelock, but we assume the timelock is trusted and
// well behaved (according to TimelockController) and this will not happen.
// slither-disable-next-line reentrancy-no-eth
function _cancel(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) internal virtual override returns (uint256) {
uint256 proposalId = super._cancel(targets, values, calldatas, descriptionHash);
if (_timelockIds[proposalId] != 0) {
_timelock.cancel(_timelockIds[proposalId]);
delete _timelockIds[proposalId];
}
return proposalId;
}
/**
* @dev Address through which the governor executes action. In this case, the timelock.
*/
function _executor() internal view virtual override returns (address) {
return address(_timelock);
}
/**
* @dev Public endpoint to update the underlying timelock instance. Restricted to the timelock itself, so updates
* must be proposed, scheduled, and executed through governance proposals.
*
* CAUTION: It is not recommended to change the timelock while there are other queued governance proposals.
*/
function updateTimelock(TimelockControllerUpgradeable newTimelock) external virtual onlyGovernance {
_updateTimelock(newTimelock);
}
function _updateTimelock(TimelockControllerUpgradeable newTimelock) private {
emit TimelockChange(address(_timelock), address(newTimelock));
_timelock = newTimelock;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[48] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (governance/IGovernor.sol)
pragma solidity ^0.8.0;
import "../utils/introspection/ERC165Upgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Interface of the {Governor} core.
*
* _Available since v4.3._
*/
abstract contract IGovernorUpgradeable is Initializable, IERC165Upgradeable {
function __IGovernor_init() internal onlyInitializing {
}
function __IGovernor_init_unchained() internal onlyInitializing {
}
enum ProposalState {
Pending,
Active,
Canceled,
Defeated,
Succeeded,
Queued,
Expired,
Executed
}
/**
* @dev Emitted when a proposal is created.
*/
event ProposalCreated(
uint256 proposalId,
address proposer,
address[] targets,
uint256[] values,
string[] signatures,
bytes[] calldatas,
uint256 startBlock,
uint256 endBlock,
string description
);
/**
* @dev Emitted when a proposal is canceled.
*/
event ProposalCanceled(uint256 proposalId);
/**
* @dev Emitted when a proposal is executed.
*/
event ProposalExecuted(uint256 proposalId);
/**
* @dev Emitted when a vote is cast without params.
*
* Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.
*/
event VoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);
/**
* @dev Emitted when a vote is cast with params.
*
* Note: `support` values should be seen as buckets. Their interpretation depends on the voting module used.
* `params` are additional encoded parameters. Their intepepretation also depends on the voting module used.
*/
event VoteCastWithParams(
address indexed voter,
uint256 proposalId,
uint8 support,
uint256 weight,
string reason,
bytes params
);
/**
* @notice module:core
* @dev Name of the governor instance (used in building the ERC712 domain separator).
*/
function name() public view virtual returns (string memory);
/**
* @notice module:core
* @dev Version of the governor instance (used in building the ERC712 domain separator). Default: "1"
*/
function version() public view virtual returns (string memory);
/**
* @notice module:voting
* @dev A description of the possible `support` values for {castVote} and the way these votes are counted, meant to
* be consumed by UIs to show correct vote options and interpret the results. The string is a URL-encoded sequence of
* key-value pairs that each describe one aspect, for example `support=bravo&quorum=for,abstain`.
*
* There are 2 standard keys: `support` and `quorum`.
*
* - `support=bravo` refers to the vote options 0 = Against, 1 = For, 2 = Abstain, as in `GovernorBravo`.
* - `quorum=bravo` means that only For votes are counted towards quorum.
* - `quorum=for,abstain` means that both For and Abstain votes are counted towards quorum.
*
* If a counting module makes use of encoded `params`, it should include this under a `params` key with a unique
* name that describes the behavior. For example:
*
* - `params=fractional` might refer to a scheme where votes are divided fractionally between for/against/abstain.
* - `params=erc721` might refer to a scheme where specific NFTs are delegated to vote.
*
* NOTE: The string can be decoded by the standard
* https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams[`URLSearchParams`]
* JavaScript class.
*/
// solhint-disable-next-line func-name-mixedcase
function COUNTING_MODE() public pure virtual returns (string memory);
/**
* @notice module:core
* @dev Hashing function used to (re)build the proposal id from the proposal details..
*/
function hashProposal(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) public pure virtual returns (uint256);
/**
* @notice module:core
* @dev Current state of a proposal, following Compound's convention
*/
function state(uint256 proposalId) public view virtual returns (ProposalState);
/**
* @notice module:core
* @dev Block number used to retrieve user's votes and quorum. As per Compound's Comp and OpenZeppelin's
* ERC20Votes, the snapshot is performed at the end of this block. Hence, voting for this proposal starts at the
* beginning of the following block.
*/
function proposalSnapshot(uint256 proposalId) public view virtual returns (uint256);
/**
* @notice module:core
* @dev Block number at which votes close. Votes close at the end of this block, so it is possible to cast a vote
* during this block.
*/
function proposalDeadline(uint256 proposalId) public view virtual returns (uint256);
/**
* @notice module:user-config
* @dev Delay, in number of block, between the proposal is created and the vote starts. This can be increassed to
* leave time for users to buy voting power, or delegate it, before the voting of a proposal starts.
*/
function votingDelay() public view virtual returns (uint256);
/**
* @notice module:user-config
* @dev Delay, in number of blocks, between the vote start and vote ends.
*
* NOTE: The {votingDelay} can delay the start of the vote. This must be considered when setting the voting
* duration compared to the voting delay.
*/
function votingPeriod() public view virtual returns (uint256);
/**
* @notice module:user-config
* @dev Minimum number of cast voted required for a proposal to be successful.
*
* Note: The `blockNumber` parameter corresponds to the snapshot used for counting vote. This allows to scale the
* quorum depending on values such as the totalSupply of a token at this block (see {ERC20Votes}).
*/
function quorum(uint256 blockNumber) public view virtual returns (uint256);
/**
* @notice module:reputation
* @dev Voting power of an `account` at a specific `blockNumber`.
*
* Note: this can be implemented in a number of ways, for example by reading the delegated balance from one (or
* multiple), {ERC20Votes} tokens.
*/
function getVotes(address account, uint256 blockNumber) public view virtual returns (uint256);
/**
* @notice module:reputation
* @dev Voting power of an `account` at a specific `blockNumber` given additional encoded parameters.
*/
function getVotesWithParams(
address account,
uint256 blockNumber,
bytes memory params
) public view virtual returns (uint256);
/**
* @notice module:voting
* @dev Returns whether `account` has cast a vote on `proposalId`.
*/
function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);
/**
* @dev Create a new proposal. Vote start {IGovernor-votingDelay} blocks after the proposal is created and ends
* {IGovernor-votingPeriod} blocks after the voting starts.
*
* Emits a {ProposalCreated} event.
*/
function propose(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
string memory description
) public virtual returns (uint256 proposalId);
/**
* @dev Execute a successful proposal. This requires the quorum to be reached, the vote to be successful, and the
* deadline to be reached.
*
* Emits a {ProposalExecuted} event.
*
* Note: some module can modify the requirements for execution, for example by adding an additional timelock.
*/
function execute(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) public payable virtual returns (uint256 proposalId);
/**
* @dev Cast a vote
*
* Emits a {VoteCast} event.
*/
function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256 balance);
/**
* @dev Cast a vote with a reason
*
* Emits a {VoteCast} event.
*/
function castVoteWithReason(
uint256 proposalId,
uint8 support,
string calldata reason
) public virtual returns (uint256 balance);
/**
* @dev Cast a vote with a reason and additional encoded parameters
*
* Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.
*/
function castVoteWithReasonAndParams(
uint256 proposalId,
uint8 support,
string calldata reason,
bytes memory params
) public virtual returns (uint256 balance);
/**
* @dev Cast a vote using the user's cryptographic signature.
*
* Emits a {VoteCast} event.
*/
function castVoteBySig(
uint256 proposalId,
uint8 support,
uint8 v,
bytes32 r,
bytes32 s
) public virtual returns (uint256 balance);
/**
* @dev Cast a vote with a reason and additional encoded parameters using the user's cryptographic signature.
*
* Emits a {VoteCast} or {VoteCastWithParams} event depending on the length of params.
*/
function castVoteWithReasonAndParamsBySig(
uint256 proposalId,
uint8 support,
string calldata reason,
bytes memory params,
uint8 v,
bytes32 r,
bytes32 s
) public virtual returns (uint256 balance);
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Timers.sol)
pragma solidity ^0.8.0;
/**
* @dev Tooling for timepoints, timers and delays
*/
library TimersUpgradeable {
struct Timestamp {
uint64 _deadline;
}
function getDeadline(Timestamp memory timer) internal pure returns (uint64) {
return timer._deadline;
}
function setDeadline(Timestamp storage timer, uint64 timestamp) internal {
timer._deadline = timestamp;
}
function reset(Timestamp storage timer) internal {
timer._deadline = 0;
}
function isUnset(Timestamp memory timer) internal pure returns (bool) {
return timer._deadline == 0;
}
function isStarted(Timestamp memory timer) internal pure returns (bool) {
return timer._deadline > 0;
}
function isPending(Timestamp memory timer) internal view returns (bool) {
return timer._deadline > block.timestamp;
}
function isExpired(Timestamp memory timer) internal view returns (bool) {
return isStarted(timer) && timer._deadline <= block.timestamp;
}
struct BlockNumber {
uint64 _deadline;
}
function getDeadline(BlockNumber memory timer) internal pure returns (uint64) {
return timer._deadline;
}
function setDeadline(BlockNumber storage timer, uint64 timestamp) internal {
timer._deadline = timestamp;
}
function reset(BlockNumber storage timer) internal {
timer._deadline = 0;
}
function isUnset(BlockNumber memory timer) internal pure returns (bool) {
return timer._deadline == 0;
}
function isStarted(BlockNumber memory timer) internal pure returns (bool) {
return timer._deadline > 0;
}
function isPending(BlockNumber memory timer) internal view returns (bool) {
return timer._deadline > block.number;
}
function isExpired(BlockNumber memory timer) internal view returns (bool) {
return isStarted(timer) && timer._deadline <= block.number;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol)
pragma solidity ^0.8.2;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* The initialization functions use a version number. Once a version number is used, it is consumed and cannot be
* reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in
* case an upgrade adds a module that needs to be initialized.
*
* For example:
*
* [.hljs-theme-light.nopadding]
* ```
* contract MyToken is ERC20Upgradeable {
* function initialize() initializer public {
* __ERC20_init("MyToken", "MTK");
* }
* }
* contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {
* function initializeV2() reinitializer(2) public {
* __ERC20Permit_init("MyToken");
* }
* }
* ```
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke
* the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() {
* _disableInitializers();
* }
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
* @custom:oz-retyped-from bool
*/
uint8 private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Triggered when the contract has been initialized or reinitialized.
*/
event Initialized(uint8 version);
/**
* @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,
* `onlyInitializing` functions can be used to initialize parent contracts.
*
* Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a
* constructor.
*
* Emits an {Initialized} event.
*/
modifier initializer() {
bool isTopLevelCall = !_initializing;
require(
(isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),
"Initializable: contract is already initialized"
);
_initialized = 1;
if (isTopLevelCall) {
_initializing = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
emit Initialized(1);
}
}
/**
* @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the
* contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be
* used to initialize parent contracts.
*
* A reinitializer may be used after the original initialization step. This is essential to configure modules that
* are added through upgrades and that require initialization.
*
* When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`
* cannot be nested. If one is invoked in the context of another, execution will revert.
*
* Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in
* a contract, executing them in the right order is up to the developer or operator.
*
* WARNING: setting the version to 255 will prevent any future reinitialization.
*
* Emits an {Initialized} event.
*/
modifier reinitializer(uint8 version) {
require(!_initializing && _initialized < version, "Initializable: contract is already initialized");
_initialized = version;
_initializing = true;
_;
_initializing = false;
emit Initialized(version);
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} and {reinitializer} modifiers, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
/**
* @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.
* Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized
* to any version. It is recommended to use this to lock implementation contracts that are designed to be called
* through proxies.
*
* Emits an {Initialized} event the first time it is successfully executed.
*/
function _disableInitializers() internal virtual {
require(!_initializing, "Initializable: contract is initializing");
if (_initialized < type(uint8).max) {
_initialized = type(uint8).max;
emit Initialized(type(uint8).max);
}
}
/**
* @dev Returns the highest version that has been initialized. See {reinitializer}.
*/
function _getInitializedVersion() internal view returns (uint8) {
return _initialized;
}
/**
* @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.
*/
function _isInitializing() internal view returns (bool) {
return _initializing;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SafeCast.sol)
// This file was procedurally generated from scripts/generate/templates/SafeCast.js.
pragma solidity ^0.8.0;
/**
* @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
* checks.
*
* Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
* easily result in undesired exploitation or bugs, since developers usually
* assume that overflows raise errors. `SafeCast` restores this intuition by
* reverting the transaction when such an operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*
* Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
* all math on `uint256` and `int256` and then downcasting.
*/
library SafeCastUpgradeable {
/**
* @dev Returns the downcasted uint248 from uint256, reverting on
* overflow (when the input is greater than largest uint248).
*
* Counterpart to Solidity's `uint248` operator.
*
* Requirements:
*
* - input must fit into 248 bits
*
* _Available since v4.7._
*/
function toUint248(uint256 value) internal pure returns (uint248) {
require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits");
return uint248(value);
}
/**
* @dev Returns the downcasted uint240 from uint256, reverting on
* overflow (when the input is greater than largest uint240).
*
* Counterpart to Solidity's `uint240` operator.
*
* Requirements:
*
* - input must fit into 240 bits
*
* _Available since v4.7._
*/
function toUint240(uint256 value) internal pure returns (uint240) {
require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits");
return uint240(value);
}
/**
* @dev Returns the downcasted uint232 from uint256, reverting on
* overflow (when the input is greater than largest uint232).
*
* Counterpart to Solidity's `uint232` operator.
*
* Requirements:
*
* - input must fit into 232 bits
*
* _Available since v4.7._
*/
function toUint232(uint256 value) internal pure returns (uint232) {
require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits");
return uint232(value);
}
/**
* @dev Returns the downcasted uint224 from uint256, reverting on
* overflow (when the input is greater than largest uint224).
*
* Counterpart to Solidity's `uint224` operator.
*
* Requirements:
*
* - input must fit into 224 bits
*
* _Available since v4.2._
*/
function toUint224(uint256 value) internal pure returns (uint224) {
require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
return uint224(value);
}
/**
* @dev Returns the downcasted uint216 from uint256, reverting on
* overflow (when the input is greater than largest uint216).
*
* Counterpart to Solidity's `uint216` operator.
*
* Requirements:
*
* - input must fit into 216 bits
*
* _Available since v4.7._
*/
function toUint216(uint256 value) internal pure returns (uint216) {
require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits");
return uint216(value);
}
/**
* @dev Returns the downcasted uint208 from uint256, reverting on
* overflow (when the input is greater than largest uint208).
*
* Counterpart to Solidity's `uint208` operator.
*
* Requirements:
*
* - input must fit into 208 bits
*
* _Available since v4.7._
*/
function toUint208(uint256 value) internal pure returns (uint208) {
require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits");
return uint208(value);
}
/**
* @dev Returns the downcasted uint200 from uint256, reverting on
* overflow (when the input is greater than largest uint200).
*
* Counterpart to Solidity's `uint200` operator.
*
* Requirements:
*
* - input must fit into 200 bits
*
* _Available since v4.7._
*/
function toUint200(uint256 value) internal pure returns (uint200) {
require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits");
return uint200(value);
}
/**
* @dev Returns the downcasted uint192 from uint256, reverting on
* overflow (when the input is greater than largest uint192).
*
* Counterpart to Solidity's `uint192` operator.
*
* Requirements:
*
* - input must fit into 192 bits
*
* _Available since v4.7._
*/
function toUint192(uint256 value) internal pure returns (uint192) {
require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits");
return uint192(value);
}
/**
* @dev Returns the downcasted uint184 from uint256, reverting on
* overflow (when the input is greater than largest uint184).
*
* Counterpart to Solidity's `uint184` operator.
*
* Requirements:
*
* - input must fit into 184 bits
*
* _Available since v4.7._
*/
function toUint184(uint256 value) internal pure returns (uint184) {
require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits");
return uint184(value);
}
/**
* @dev Returns the downcasted uint176 from uint256, reverting on
* overflow (when the input is greater than largest uint176).
*
* Counterpart to Solidity's `uint176` operator.
*
* Requirements:
*
* - input must fit into 176 bits
*
* _Available since v4.7._
*/
function toUint176(uint256 value) internal pure returns (uint176) {
require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits");
return uint176(value);
}
/**
* @dev Returns the downcasted uint168 from uint256, reverting on
* overflow (when the input is greater than largest uint168).
*
* Counterpart to Solidity's `uint168` operator.
*
* Requirements:
*
* - input must fit into 168 bits
*
* _Available since v4.7._
*/
function toUint168(uint256 value) internal pure returns (uint168) {
require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits");
return uint168(value);
}
/**
* @dev Returns the downcasted uint160 from uint256, reverting on
* overflow (when the input is greater than largest uint160).
*
* Counterpart to Solidity's `uint160` operator.
*
* Requirements:
*
* - input must fit into 160 bits
*
* _Available since v4.7._
*/
function toUint160(uint256 value) internal pure returns (uint160) {
require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits");
return uint160(value);
}
/**
* @dev Returns the downcasted uint152 from uint256, reverting on
* overflow (when the input is greater than largest uint152).
*
* Counterpart to Solidity's `uint152` operator.
*
* Requirements:
*
* - input must fit into 152 bits
*
* _Available since v4.7._
*/
function toUint152(uint256 value) internal pure returns (uint152) {
require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits");
return uint152(value);
}
/**
* @dev Returns the downcasted uint144 from uint256, reverting on
* overflow (when the input is greater than largest uint144).
*
* Counterpart to Solidity's `uint144` operator.
*
* Requirements:
*
* - input must fit into 144 bits
*
* _Available since v4.7._
*/
function toUint144(uint256 value) internal pure returns (uint144) {
require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits");
return uint144(value);
}
/**
* @dev Returns the downcasted uint136 from uint256, reverting on
* overflow (when the input is greater than largest uint136).
*
* Counterpart to Solidity's `uint136` operator.
*
* Requirements:
*
* - input must fit into 136 bits
*
* _Available since v4.7._
*/
function toUint136(uint256 value) internal pure returns (uint136) {
require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits");
return uint136(value);
}
/**
* @dev Returns the downcasted uint128 from uint256, reverting on
* overflow (when the input is greater than largest uint128).
*
* Counterpart to Solidity's `uint128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*
* _Available since v2.5._
*/
function toUint128(uint256 value) internal pure returns (uint128) {
require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
return uint128(value);
}
/**
* @dev Returns the downcasted uint120 from uint256, reverting on
* overflow (when the input is greater than largest uint120).
*
* Counterpart to Solidity's `uint120` operator.
*
* Requirements:
*
* - input must fit into 120 bits
*
* _Available since v4.7._
*/
function toUint120(uint256 value) internal pure returns (uint120) {
require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits");
return uint120(value);
}
/**
* @dev Returns the downcasted uint112 from uint256, reverting on
* overflow (when the input is greater than largest uint112).
*
* Counterpart to Solidity's `uint112` operator.
*
* Requirements:
*
* - input must fit into 112 bits
*
* _Available since v4.7._
*/
function toUint112(uint256 value) internal pure returns (uint112) {
require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits");
return uint112(value);
}
/**
* @dev Returns the downcasted uint104 from uint256, reverting on
* overflow (when the input is greater than largest uint104).
*
* Counterpart to Solidity's `uint104` operator.
*
* Requirements:
*
* - input must fit into 104 bits
*
* _Available since v4.7._
*/
function toUint104(uint256 value) internal pure returns (uint104) {
require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits");
return uint104(value);
}
/**
* @dev Returns the downcasted uint96 from uint256, reverting on
* overflow (when the input is greater than largest uint96).
*
* Counterpart to Solidity's `uint96` operator.
*
* Requirements:
*
* - input must fit into 96 bits
*
* _Available since v4.2._
*/
function toUint96(uint256 value) internal pure returns (uint96) {
require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
return uint96(value);
}
/**
* @dev Returns the downcasted uint88 from uint256, reverting on
* overflow (when the input is greater than largest uint88).
*
* Counterpart to Solidity's `uint88` operator.
*
* Requirements:
*
* - input must fit into 88 bits
*
* _Available since v4.7._
*/
function toUint88(uint256 value) internal pure returns (uint88) {
require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits");
return uint88(value);
}
/**
* @dev Returns the downcasted uint80 from uint256, reverting on
* overflow (when the input is greater than largest uint80).
*
* Counterpart to Solidity's `uint80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*
* _Available since v4.7._
*/
function toUint80(uint256 value) internal pure returns (uint80) {
require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits");
return uint80(value);
}
/**
* @dev Returns the downcasted uint72 from uint256, reverting on
* overflow (when the input is greater than largest uint72).
*
* Counterpart to Solidity's `uint72` operator.
*
* Requirements:
*
* - input must fit into 72 bits
*
* _Available since v4.7._
*/
function toUint72(uint256 value) internal pure returns (uint72) {
require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits");
return uint72(value);
}
/**
* @dev Returns the downcasted uint64 from uint256, reverting on
* overflow (when the input is greater than largest uint64).
*
* Counterpart to Solidity's `uint64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*
* _Available since v2.5._
*/
function toUint64(uint256 value) internal pure returns (uint64) {
require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
return uint64(value);
}
/**
* @dev Returns the downcasted uint56 from uint256, reverting on
* overflow (when the input is greater than largest uint56).
*
* Counterpart to Solidity's `uint56` operator.
*
* Requirements:
*
* - input must fit into 56 bits
*
* _Available since v4.7._
*/
function toUint56(uint256 value) internal pure returns (uint56) {
require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits");
return uint56(value);
}
/**
* @dev Returns the downcasted uint48 from uint256, reverting on
* overflow (when the input is greater than largest uint48).
*
* Counterpart to Solidity's `uint48` operator.
*
* Requirements:
*
* - input must fit into 48 bits
*
* _Available since v4.7._
*/
function toUint48(uint256 value) internal pure returns (uint48) {
require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits");
return uint48(value);
}
/**
* @dev Returns the downcasted uint40 from uint256, reverting on
* overflow (when the input is greater than largest uint40).
*
* Counterpart to Solidity's `uint40` operator.
*
* Requirements:
*
* - input must fit into 40 bits
*
* _Available since v4.7._
*/
function toUint40(uint256 value) internal pure returns (uint40) {
require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits");
return uint40(value);
}
/**
* @dev Returns the downcasted uint32 from uint256, reverting on
* overflow (when the input is greater than largest uint32).
*
* Counterpart to Solidity's `uint32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*
* _Available since v2.5._
*/
function toUint32(uint256 value) internal pure returns (uint32) {
require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
return uint32(value);
}
/**
* @dev Returns the downcasted uint24 from uint256, reverting on
* overflow (when the input is greater than largest uint24).
*
* Counterpart to Solidity's `uint24` operator.
*
* Requirements:
*
* - input must fit into 24 bits
*
* _Available since v4.7._
*/
function toUint24(uint256 value) internal pure returns (uint24) {
require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits");
return uint24(value);
}
/**
* @dev Returns the downcasted uint16 from uint256, reverting on
* overflow (when the input is greater than largest uint16).
*
* Counterpart to Solidity's `uint16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*
* _Available since v2.5._
*/
function toUint16(uint256 value) internal pure returns (uint16) {
require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
return uint16(value);
}
/**
* @dev Returns the downcasted uint8 from uint256, reverting on
* overflow (when the input is greater than largest uint8).
*
* Counterpart to Solidity's `uint8` operator.
*
* Requirements:
*
* - input must fit into 8 bits
*
* _Available since v2.5._
*/
function toUint8(uint256 value) internal pure returns (uint8) {
require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
return uint8(value);
}
/**
* @dev Converts a signed int256 into an unsigned uint256.
*
* Requirements:
*
* - input must be greater than or equal to 0.
*
* _Available since v3.0._
*/
function toUint256(int256 value) internal pure returns (uint256) {
require(value >= 0, "SafeCast: value must be positive");
return uint256(value);
}
/**
* @dev Returns the downcasted int248 from int256, reverting on
* overflow (when the input is less than smallest int248 or
* greater than largest int248).
*
* Counterpart to Solidity's `int248` operator.
*
* Requirements:
*
* - input must fit into 248 bits
*
* _Available since v4.7._
*/
function toInt248(int256 value) internal pure returns (int248 downcasted) {
downcasted = int248(value);
require(downcasted == value, "SafeCast: value doesn't fit in 248 bits");
}
/**
* @dev Returns the downcasted int240 from int256, reverting on
* overflow (when the input is less than smallest int240 or
* greater than largest int240).
*
* Counterpart to Solidity's `int240` operator.
*
* Requirements:
*
* - input must fit into 240 bits
*
* _Available since v4.7._
*/
function toInt240(int256 value) internal pure returns (int240 downcasted) {
downcasted = int240(value);
require(downcasted == value, "SafeCast: value doesn't fit in 240 bits");
}
/**
* @dev Returns the downcasted int232 from int256, reverting on
* overflow (when the input is less than smallest int232 or
* greater than largest int232).
*
* Counterpart to Solidity's `int232` operator.
*
* Requirements:
*
* - input must fit into 232 bits
*
* _Available since v4.7._
*/
function toInt232(int256 value) internal pure returns (int232 downcasted) {
downcasted = int232(value);
require(downcasted == value, "SafeCast: value doesn't fit in 232 bits");
}
/**
* @dev Returns the downcasted int224 from int256, reverting on
* overflow (when the input is less than smallest int224 or
* greater than largest int224).
*
* Counterpart to Solidity's `int224` operator.
*
* Requirements:
*
* - input must fit into 224 bits
*
* _Available since v4.7._
*/
function toInt224(int256 value) internal pure returns (int224 downcasted) {
downcasted = int224(value);
require(downcasted == value, "SafeCast: value doesn't fit in 224 bits");
}
/**
* @dev Returns the downcasted int216 from int256, reverting on
* overflow (when the input is less than smallest int216 or
* greater than largest int216).
*
* Counterpart to Solidity's `int216` operator.
*
* Requirements:
*
* - input must fit into 216 bits
*
* _Available since v4.7._
*/
function toInt216(int256 value) internal pure returns (int216 downcasted) {
downcasted = int216(value);
require(downcasted == value, "SafeCast: value doesn't fit in 216 bits");
}
/**
* @dev Returns the downcasted int208 from int256, reverting on
* overflow (when the input is less than smallest int208 or
* greater than largest int208).
*
* Counterpart to Solidity's `int208` operator.
*
* Requirements:
*
* - input must fit into 208 bits
*
* _Available since v4.7._
*/
function toInt208(int256 value) internal pure returns (int208 downcasted) {
downcasted = int208(value);
require(downcasted == value, "SafeCast: value doesn't fit in 208 bits");
}
/**
* @dev Returns the downcasted int200 from int256, reverting on
* overflow (when the input is less than smallest int200 or
* greater than largest int200).
*
* Counterpart to Solidity's `int200` operator.
*
* Requirements:
*
* - input must fit into 200 bits
*
* _Available since v4.7._
*/
function toInt200(int256 value) internal pure returns (int200 downcasted) {
downcasted = int200(value);
require(downcasted == value, "SafeCast: value doesn't fit in 200 bits");
}
/**
* @dev Returns the downcasted int192 from int256, reverting on
* overflow (when the input is less than smallest int192 or
* greater than largest int192).
*
* Counterpart to Solidity's `int192` operator.
*
* Requirements:
*
* - input must fit into 192 bits
*
* _Available since v4.7._
*/
function toInt192(int256 value) internal pure returns (int192 downcasted) {
downcasted = int192(value);
require(downcasted == value, "SafeCast: value doesn't fit in 192 bits");
}
/**
* @dev Returns the downcasted int184 from int256, reverting on
* overflow (when the input is less than smallest int184 or
* greater than largest int184).
*
* Counterpart to Solidity's `int184` operator.
*
* Requirements:
*
* - input must fit into 184 bits
*
* _Available since v4.7._
*/
function toInt184(int256 value) internal pure returns (int184 downcasted) {
downcasted = int184(value);
require(downcasted == value, "SafeCast: value doesn't fit in 184 bits");
}
/**
* @dev Returns the downcasted int176 from int256, reverting on
* overflow (when the input is less than smallest int176 or
* greater than largest int176).
*
* Counterpart to Solidity's `int176` operator.
*
* Requirements:
*
* - input must fit into 176 bits
*
* _Available since v4.7._
*/
function toInt176(int256 value) internal pure returns (int176 downcasted) {
downcasted = int176(value);
require(downcasted == value, "SafeCast: value doesn't fit in 176 bits");
}
/**
* @dev Returns the downcasted int168 from int256, reverting on
* overflow (when the input is less than smallest int168 or
* greater than largest int168).
*
* Counterpart to Solidity's `int168` operator.
*
* Requirements:
*
* - input must fit into 168 bits
*
* _Available since v4.7._
*/
function toInt168(int256 value) internal pure returns (int168 downcasted) {
downcasted = int168(value);
require(downcasted == value, "SafeCast: value doesn't fit in 168 bits");
}
/**
* @dev Returns the downcasted int160 from int256, reverting on
* overflow (when the input is less than smallest int160 or
* greater than largest int160).
*
* Counterpart to Solidity's `int160` operator.
*
* Requirements:
*
* - input must fit into 160 bits
*
* _Available since v4.7._
*/
function toInt160(int256 value) internal pure returns (int160 downcasted) {
downcasted = int160(value);
require(downcasted == value, "SafeCast: value doesn't fit in 160 bits");
}
/**
* @dev Returns the downcasted int152 from int256, reverting on
* overflow (when the input is less than smallest int152 or
* greater than largest int152).
*
* Counterpart to Solidity's `int152` operator.
*
* Requirements:
*
* - input must fit into 152 bits
*
* _Available since v4.7._
*/
function toInt152(int256 value) internal pure returns (int152 downcasted) {
downcasted = int152(value);
require(downcasted == value, "SafeCast: value doesn't fit in 152 bits");
}
/**
* @dev Returns the downcasted int144 from int256, reverting on
* overflow (when the input is less than smallest int144 or
* greater than largest int144).
*
* Counterpart to Solidity's `int144` operator.
*
* Requirements:
*
* - input must fit into 144 bits
*
* _Available since v4.7._
*/
function toInt144(int256 value) internal pure returns (int144 downcasted) {
downcasted = int144(value);
require(downcasted == value, "SafeCast: value doesn't fit in 144 bits");
}
/**
* @dev Returns the downcasted int136 from int256, reverting on
* overflow (when the input is less than smallest int136 or
* greater than largest int136).
*
* Counterpart to Solidity's `int136` operator.
*
* Requirements:
*
* - input must fit into 136 bits
*
* _Available since v4.7._
*/
function toInt136(int256 value) internal pure returns (int136 downcasted) {
downcasted = int136(value);
require(downcasted == value, "SafeCast: value doesn't fit in 136 bits");
}
/**
* @dev Returns the downcasted int128 from int256, reverting on
* overflow (when the input is less than smallest int128 or
* greater than largest int128).
*
* Counterpart to Solidity's `int128` operator.
*
* Requirements:
*
* - input must fit into 128 bits
*
* _Available since v3.1._
*/
function toInt128(int256 value) internal pure returns (int128 downcasted) {
downcasted = int128(value);
require(downcasted == value, "SafeCast: value doesn't fit in 128 bits");
}
/**
* @dev Returns the downcasted int120 from int256, reverting on
* overflow (when the input is less than smallest int120 or
* greater than largest int120).
*
* Counterpart to Solidity's `int120` operator.
*
* Requirements:
*
* - input must fit into 120 bits
*
* _Available since v4.7._
*/
function toInt120(int256 value) internal pure returns (int120 downcasted) {
downcasted = int120(value);
require(downcasted == value, "SafeCast: value doesn't fit in 120 bits");
}
/**
* @dev Returns the downcasted int112 from int256, reverting on
* overflow (when the input is less than smallest int112 or
* greater than largest int112).
*
* Counterpart to Solidity's `int112` operator.
*
* Requirements:
*
* - input must fit into 112 bits
*
* _Available since v4.7._
*/
function toInt112(int256 value) internal pure returns (int112 downcasted) {
downcasted = int112(value);
require(downcasted == value, "SafeCast: value doesn't fit in 112 bits");
}
/**
* @dev Returns the downcasted int104 from int256, reverting on
* overflow (when the input is less than smallest int104 or
* greater than largest int104).
*
* Counterpart to Solidity's `int104` operator.
*
* Requirements:
*
* - input must fit into 104 bits
*
* _Available since v4.7._
*/
function toInt104(int256 value) internal pure returns (int104 downcasted) {
downcasted = int104(value);
require(downcasted == value, "SafeCast: value doesn't fit in 104 bits");
}
/**
* @dev Returns the downcasted int96 from int256, reverting on
* overflow (when the input is less than smallest int96 or
* greater than largest int96).
*
* Counterpart to Solidity's `int96` operator.
*
* Requirements:
*
* - input must fit into 96 bits
*
* _Available since v4.7._
*/
function toInt96(int256 value) internal pure returns (int96 downcasted) {
downcasted = int96(value);
require(downcasted == value, "SafeCast: value doesn't fit in 96 bits");
}
/**
* @dev Returns the downcasted int88 from int256, reverting on
* overflow (when the input is less than smallest int88 or
* greater than largest int88).
*
* Counterpart to Solidity's `int88` operator.
*
* Requirements:
*
* - input must fit into 88 bits
*
* _Available since v4.7._
*/
function toInt88(int256 value) internal pure returns (int88 downcasted) {
downcasted = int88(value);
require(downcasted == value, "SafeCast: value doesn't fit in 88 bits");
}
/**
* @dev Returns the downcasted int80 from int256, reverting on
* overflow (when the input is less than smallest int80 or
* greater than largest int80).
*
* Counterpart to Solidity's `int80` operator.
*
* Requirements:
*
* - input must fit into 80 bits
*
* _Available since v4.7._
*/
function toInt80(int256 value) internal pure returns (int80 downcasted) {
downcasted = int80(value);
require(downcasted == value, "SafeCast: value doesn't fit in 80 bits");
}
/**
* @dev Returns the downcasted int72 from int256, reverting on
* overflow (when the input is less than smallest int72 or
* greater than largest int72).
*
* Counterpart to Solidity's `int72` operator.
*
* Requirements:
*
* - input must fit into 72 bits
*
* _Available since v4.7._
*/
function toInt72(int256 value) internal pure returns (int72 downcasted) {
downcasted = int72(value);
require(downcasted == value, "SafeCast: value doesn't fit in 72 bits");
}
/**
* @dev Returns the downcasted int64 from int256, reverting on
* overflow (when the input is less than smallest int64 or
* greater than largest int64).
*
* Counterpart to Solidity's `int64` operator.
*
* Requirements:
*
* - input must fit into 64 bits
*
* _Available since v3.1._
*/
function toInt64(int256 value) internal pure returns (int64 downcasted) {
downcasted = int64(value);
require(downcasted == value, "SafeCast: value doesn't fit in 64 bits");
}
/**
* @dev Returns the downcasted int56 from int256, reverting on
* overflow (when the input is less than smallest int56 or
* greater than largest int56).
*
* Counterpart to Solidity's `int56` operator.
*
* Requirements:
*
* - input must fit into 56 bits
*
* _Available since v4.7._
*/
function toInt56(int256 value) internal pure returns (int56 downcasted) {
downcasted = int56(value);
require(downcasted == value, "SafeCast: value doesn't fit in 56 bits");
}
/**
* @dev Returns the downcasted int48 from int256, reverting on
* overflow (when the input is less than smallest int48 or
* greater than largest int48).
*
* Counterpart to Solidity's `int48` operator.
*
* Requirements:
*
* - input must fit into 48 bits
*
* _Available since v4.7._
*/
function toInt48(int256 value) internal pure returns (int48 downcasted) {
downcasted = int48(value);
require(downcasted == value, "SafeCast: value doesn't fit in 48 bits");
}
/**
* @dev Returns the downcasted int40 from int256, reverting on
* overflow (when the input is less than smallest int40 or
* greater than largest int40).
*
* Counterpart to Solidity's `int40` operator.
*
* Requirements:
*
* - input must fit into 40 bits
*
* _Available since v4.7._
*/
function toInt40(int256 value) internal pure returns (int40 downcasted) {
downcasted = int40(value);
require(downcasted == value, "SafeCast: value doesn't fit in 40 bits");
}
/**
* @dev Returns the downcasted int32 from int256, reverting on
* overflow (when the input is less than smallest int32 or
* greater than largest int32).
*
* Counterpart to Solidity's `int32` operator.
*
* Requirements:
*
* - input must fit into 32 bits
*
* _Available since v3.1._
*/
function toInt32(int256 value) internal pure returns (int32 downcasted) {
downcasted = int32(value);
require(downcasted == value, "SafeCast: value doesn't fit in 32 bits");
}
/**
* @dev Returns the downcasted int24 from int256, reverting on
* overflow (when the input is less than smallest int24 or
* greater than largest int24).
*
* Counterpart to Solidity's `int24` operator.
*
* Requirements:
*
* - input must fit into 24 bits
*
* _Available since v4.7._
*/
function toInt24(int256 value) internal pure returns (int24 downcasted) {
downcasted = int24(value);
require(downcasted == value, "SafeCast: value doesn't fit in 24 bits");
}
/**
* @dev Returns the downcasted int16 from int256, reverting on
* overflow (when the input is less than smallest int16 or
* greater than largest int16).
*
* Counterpart to Solidity's `int16` operator.
*
* Requirements:
*
* - input must fit into 16 bits
*
* _Available since v3.1._
*/
function toInt16(int256 value) internal pure returns (int16 downcasted) {
downcasted = int16(value);
require(downcasted == value, "SafeCast: value doesn't fit in 16 bits");
}
/**
* @dev Returns the downcasted int8 from int256, reverting on
* overflow (when the input is less than smallest int8 or
* greater than largest int8).
*
* Counterpart to Solidity's `int8` operator.
*
* Requirements:
*
* - input must fit into 8 bits
*
* _Available since v3.1._
*/
function toInt8(int256 value) internal pure returns (int8 downcasted) {
downcasted = int8(value);
require(downcasted == value, "SafeCast: value doesn't fit in 8 bits");
}
/**
* @dev Converts an unsigned uint256 into a signed int256.
*
* Requirements:
*
* - input must be less than or equal to maxInt256.
*
* _Available since v3.0._
*/
function toInt256(uint256 value) internal pure returns (int256) {
// Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
return int256(value);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
abstract contract VotingModule {
/*//////////////////////////////////////////////////////////////
IMMUTABLE STORAGE
//////////////////////////////////////////////////////////////*/
address immutable governor;
/*//////////////////////////////////////////////////////////////
ERRORS
//////////////////////////////////////////////////////////////*/
error NotGovernor();
error ExistingProposal();
error InvalidParams();
error AlreadyVoted();
/*//////////////////////////////////////////////////////////////
MODIFIERS
//////////////////////////////////////////////////////////////*/
function _onlyGovernor() internal view {
if (msg.sender != governor) revert NotGovernor();
}
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(address _governor) {
governor = _governor;
}
/*//////////////////////////////////////////////////////////////
WRITE FUNCTIONS
//////////////////////////////////////////////////////////////*/
function propose(uint256 proposalId, bytes memory proposalData, bytes32 descriptionHash) external virtual;
function _countVote(uint256 proposalId, address account, uint8 support, uint256 weight, bytes memory params)
external
virtual;
/*//////////////////////////////////////////////////////////////
VIEW FUNCTIONS
//////////////////////////////////////////////////////////////*/
function _formatExecuteParams(uint256 proposalId, bytes memory proposalData)
external
virtual
returns (address[] memory targets, uint256[] memory values, bytes[] memory calldatas);
function _voteSucceeded(uint256 /* proposalId */ ) external view virtual returns (bool) {
return true;
}
function COUNTING_MODE() external pure virtual returns (string memory);
function PROPOSAL_DATA_ENCODING() external pure virtual returns (string memory);
function VOTE_PARAMS_ENCODING() external pure virtual returns (string memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface IVotableSupplyOracle {
/**
* Emitted when the votable supply is updated with `_updateVotableSupply`.
*/
event VotableSupplyUpdated(uint256 prevVotableSupply, uint256 newVotableSupply);
/**
* Emitted when the votable supply is updated with `_updateVotableSupplyAt`.
*/
event VotableSupplyCheckpointUpdated(
uint256 checkpointBlockNumber, uint256 prevVotableSupply, uint256 newVotableSupply
);
function _updateVotableSupply(uint256 newVotableSupply) external;
function _updateVotableSupplyAt(uint256 index, uint256 newVotableSupply) external;
function votableSupply(uint256 blockNumber) external view returns (uint256);
function votableSupply() external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface IProposalTypesConfigurator {
/*//////////////////////////////////////////////////////////////
ERRORS
//////////////////////////////////////////////////////////////*/
error InvalidQuorum();
error InvalidApprovalThreshold();
error NotManagerOrTimelock();
error AlreadyInit();
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event ProposalTypeSet(
uint8 indexed proposalTypeId, uint16 quorum, uint16 approvalThreshold, string name, string description
);
/*//////////////////////////////////////////////////////////////
STRUCTS
//////////////////////////////////////////////////////////////*/
struct ProposalType {
uint16 quorum;
uint16 approvalThreshold;
string name;
string description;
address module;
}
/*//////////////////////////////////////////////////////////////
FUNCTIONS
//////////////////////////////////////////////////////////////*/
function initialize(address _governor, ProposalType[] calldata _proposalTypes) external;
function proposalTypes(uint8 proposalTypeId) external view returns (ProposalType memory);
function setProposalType(
uint8 proposalTypeId,
uint16 quorum,
uint16 approvalThreshold,
string memory name,
string memory description,
address module
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {IVotesUpgradeable} from "@openzeppelin/contracts-upgradeable/governance/utils/IVotesUpgradeable.sol";
interface IVotingToken is IVotesUpgradeable {
/// @dev Return the votable supply at a given block number.
function getPastVotableSupply(uint256 timepoint) external view returns (uint256);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.2) (governance/TimelockController.sol)
pragma solidity ^0.8.0;
import "../access/AccessControlUpgradeable.sol";
import "../token/ERC721/IERC721ReceiverUpgradeable.sol";
import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol";
import "../utils/AddressUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which acts as a timelocked controller. When set as the
* owner of an `Ownable` smart contract, it enforces a timelock on all
* `onlyOwner` maintenance operations. This gives time for users of the
* controlled contract to exit before a potentially dangerous maintenance
* operation is applied.
*
* By default, this contract is self administered, meaning administration tasks
* have to go through the timelock process. The proposer (resp executor) role
* is in charge of proposing (resp executing) operations. A common use case is
* to position this {TimelockController} as the owner of a smart contract, with
* a multisig or a DAO as the sole proposer.
*
* _Available since v3.3._
*/
contract TimelockControllerUpgradeable is Initializable, AccessControlUpgradeable, IERC721ReceiverUpgradeable, IERC1155ReceiverUpgradeable {
bytes32 public constant TIMELOCK_ADMIN_ROLE = keccak256("TIMELOCK_ADMIN_ROLE");
bytes32 public constant PROPOSER_ROLE = keccak256("PROPOSER_ROLE");
bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE");
bytes32 public constant CANCELLER_ROLE = keccak256("CANCELLER_ROLE");
uint256 internal constant _DONE_TIMESTAMP = uint256(1);
mapping(bytes32 => uint256) private _timestamps;
uint256 private _minDelay;
/**
* @dev Emitted when a call is scheduled as part of operation `id`.
*/
event CallScheduled(
bytes32 indexed id,
uint256 indexed index,
address target,
uint256 value,
bytes data,
bytes32 predecessor,
uint256 delay
);
/**
* @dev Emitted when a call is performed as part of operation `id`.
*/
event CallExecuted(bytes32 indexed id, uint256 indexed index, address target, uint256 value, bytes data);
/**
* @dev Emitted when operation `id` is cancelled.
*/
event Cancelled(bytes32 indexed id);
/**
* @dev Emitted when the minimum delay for future operations is modified.
*/
event MinDelayChange(uint256 oldDuration, uint256 newDuration);
/**
* @dev Initializes the contract with the following parameters:
*
* - `minDelay`: initial minimum delay for operations
* - `proposers`: accounts to be granted proposer and canceller roles
* - `executors`: accounts to be granted executor role
* - `admin`: optional account to be granted admin role; disable with zero address
*
* IMPORTANT: The optional admin can aid with initial configuration of roles after deployment
* without being subject to delay, but this role should be subsequently renounced in favor of
* administration through timelocked proposals. Previous versions of this contract would assign
* this admin to the deployer automatically and should be renounced as well.
*/
function __TimelockController_init(
uint256 minDelay,
address[] memory proposers,
address[] memory executors,
address admin
) internal onlyInitializing {
__TimelockController_init_unchained(minDelay, proposers, executors, admin);
}
function __TimelockController_init_unchained(
uint256 minDelay,
address[] memory proposers,
address[] memory executors,
address admin
) internal onlyInitializing {
_setRoleAdmin(TIMELOCK_ADMIN_ROLE, TIMELOCK_ADMIN_ROLE);
_setRoleAdmin(PROPOSER_ROLE, TIMELOCK_ADMIN_ROLE);
_setRoleAdmin(EXECUTOR_ROLE, TIMELOCK_ADMIN_ROLE);
_setRoleAdmin(CANCELLER_ROLE, TIMELOCK_ADMIN_ROLE);
// self administration
_setupRole(TIMELOCK_ADMIN_ROLE, address(this));
// optional admin
if (admin != address(0)) {
_setupRole(TIMELOCK_ADMIN_ROLE, admin);
}
// register proposers and cancellers
for (uint256 i = 0; i < proposers.length; ++i) {
_setupRole(PROPOSER_ROLE, proposers[i]);
_setupRole(CANCELLER_ROLE, proposers[i]);
}
// register executors
for (uint256 i = 0; i < executors.length; ++i) {
_setupRole(EXECUTOR_ROLE, executors[i]);
}
_minDelay = minDelay;
emit MinDelayChange(0, minDelay);
}
/**
* @dev Modifier to make a function callable only by a certain role. In
* addition to checking the sender's role, `address(0)` 's role is also
* considered. Granting a role to `address(0)` is equivalent to enabling
* this role for everyone.
*/
modifier onlyRoleOrOpenRole(bytes32 role) {
if (!hasRole(role, address(0))) {
_checkRole(role, _msgSender());
}
_;
}
/**
* @dev Contract might receive/hold ETH as part of the maintenance process.
*/
receive() external payable {}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165Upgradeable, AccessControlUpgradeable) returns (bool) {
return interfaceId == type(IERC1155ReceiverUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns whether an id correspond to a registered operation. This
* includes both Pending, Ready and Done operations.
*/
function isOperation(bytes32 id) public view virtual returns (bool registered) {
return getTimestamp(id) > 0;
}
/**
* @dev Returns whether an operation is pending or not.
*/
function isOperationPending(bytes32 id) public view virtual returns (bool pending) {
return getTimestamp(id) > _DONE_TIMESTAMP;
}
/**
* @dev Returns whether an operation is ready or not.
*/
function isOperationReady(bytes32 id) public view virtual returns (bool ready) {
uint256 timestamp = getTimestamp(id);
return timestamp > _DONE_TIMESTAMP && timestamp <= block.timestamp;
}
/**
* @dev Returns whether an operation is done or not.
*/
function isOperationDone(bytes32 id) public view virtual returns (bool done) {
return getTimestamp(id) == _DONE_TIMESTAMP;
}
/**
* @dev Returns the timestamp at with an operation becomes ready (0 for
* unset operations, 1 for done operations).
*/
function getTimestamp(bytes32 id) public view virtual returns (uint256 timestamp) {
return _timestamps[id];
}
/**
* @dev Returns the minimum delay for an operation to become valid.
*
* This value can be changed by executing an operation that calls `updateDelay`.
*/
function getMinDelay() public view virtual returns (uint256 duration) {
return _minDelay;
}
/**
* @dev Returns the identifier of an operation containing a single
* transaction.
*/
function hashOperation(
address target,
uint256 value,
bytes calldata data,
bytes32 predecessor,
bytes32 salt
) public pure virtual returns (bytes32 hash) {
return keccak256(abi.encode(target, value, data, predecessor, salt));
}
/**
* @dev Returns the identifier of an operation containing a batch of
* transactions.
*/
function hashOperationBatch(
address[] calldata targets,
uint256[] calldata values,
bytes[] calldata payloads,
bytes32 predecessor,
bytes32 salt
) public pure virtual returns (bytes32 hash) {
return keccak256(abi.encode(targets, values, payloads, predecessor, salt));
}
/**
* @dev Schedule an operation containing a single transaction.
*
* Emits a {CallScheduled} event.
*
* Requirements:
*
* - the caller must have the 'proposer' role.
*/
function schedule(
address target,
uint256 value,
bytes calldata data,
bytes32 predecessor,
bytes32 salt,
uint256 delay
) public virtual onlyRole(PROPOSER_ROLE) {
bytes32 id = hashOperation(target, value, data, predecessor, salt);
_schedule(id, delay);
emit CallScheduled(id, 0, target, value, data, predecessor, delay);
}
/**
* @dev Schedule an operation containing a batch of transactions.
*
* Emits one {CallScheduled} event per transaction in the batch.
*
* Requirements:
*
* - the caller must have the 'proposer' role.
*/
function scheduleBatch(
address[] calldata targets,
uint256[] calldata values,
bytes[] calldata payloads,
bytes32 predecessor,
bytes32 salt,
uint256 delay
) public virtual onlyRole(PROPOSER_ROLE) {
require(targets.length == values.length, "TimelockController: length mismatch");
require(targets.length == payloads.length, "TimelockController: length mismatch");
bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);
_schedule(id, delay);
for (uint256 i = 0; i < targets.length; ++i) {
emit CallScheduled(id, i, targets[i], values[i], payloads[i], predecessor, delay);
}
}
/**
* @dev Schedule an operation that is to becomes valid after a given delay.
*/
function _schedule(bytes32 id, uint256 delay) private {
require(!isOperation(id), "TimelockController: operation already scheduled");
require(delay >= getMinDelay(), "TimelockController: insufficient delay");
_timestamps[id] = block.timestamp + delay;
}
/**
* @dev Cancel an operation.
*
* Requirements:
*
* - the caller must have the 'canceller' role.
*/
function cancel(bytes32 id) public virtual onlyRole(CANCELLER_ROLE) {
require(isOperationPending(id), "TimelockController: operation cannot be cancelled");
delete _timestamps[id];
emit Cancelled(id);
}
/**
* @dev Execute an (ready) operation containing a single transaction.
*
* Emits a {CallExecuted} event.
*
* Requirements:
*
* - the caller must have the 'executor' role.
*/
// This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,
// thus any modifications to the operation during reentrancy should be caught.
// slither-disable-next-line reentrancy-eth
function execute(
address target,
uint256 value,
bytes calldata payload,
bytes32 predecessor,
bytes32 salt
) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {
bytes32 id = hashOperation(target, value, payload, predecessor, salt);
_beforeCall(id, predecessor);
_execute(target, value, payload);
emit CallExecuted(id, 0, target, value, payload);
_afterCall(id);
}
/**
* @dev Execute an (ready) operation containing a batch of transactions.
*
* Emits one {CallExecuted} event per transaction in the batch.
*
* Requirements:
*
* - the caller must have the 'executor' role.
*/
// This function can reenter, but it doesn't pose a risk because _afterCall checks that the proposal is pending,
// thus any modifications to the operation during reentrancy should be caught.
// slither-disable-next-line reentrancy-eth
function executeBatch(
address[] calldata targets,
uint256[] calldata values,
bytes[] calldata payloads,
bytes32 predecessor,
bytes32 salt
) public payable virtual onlyRoleOrOpenRole(EXECUTOR_ROLE) {
require(targets.length == values.length, "TimelockController: length mismatch");
require(targets.length == payloads.length, "TimelockController: length mismatch");
bytes32 id = hashOperationBatch(targets, values, payloads, predecessor, salt);
_beforeCall(id, predecessor);
for (uint256 i = 0; i < targets.length; ++i) {
address target = targets[i];
uint256 value = values[i];
bytes calldata payload = payloads[i];
_execute(target, value, payload);
emit CallExecuted(id, i, target, value, payload);
}
_afterCall(id);
}
/**
* @dev Execute an operation's call.
*/
function _execute(
address target,
uint256 value,
bytes calldata data
) internal virtual {
(bool success, ) = target.call{value: value}(data);
require(success, "TimelockController: underlying transaction reverted");
}
/**
* @dev Checks before execution of an operation's calls.
*/
function _beforeCall(bytes32 id, bytes32 predecessor) private view {
require(isOperationReady(id), "TimelockController: operation is not ready");
require(predecessor == bytes32(0) || isOperationDone(predecessor), "TimelockController: missing dependency");
}
/**
* @dev Checks after execution of an operation's calls.
*/
function _afterCall(bytes32 id) private {
require(isOperationReady(id), "TimelockController: operation is not ready");
_timestamps[id] = _DONE_TIMESTAMP;
}
/**
* @dev Changes the minimum timelock duration for future operations.
*
* Emits a {MinDelayChange} event.
*
* Requirements:
*
* - the caller must be the timelock itself. This can only be achieved by scheduling and later executing
* an operation where the timelock is the target and the data is the ABI-encoded call to this function.
*/
function updateDelay(uint256 newDelay) external virtual {
require(msg.sender == address(this), "TimelockController: caller must be timelock");
emit MinDelayChange(_minDelay, newDelay);
_minDelay = newDelay;
}
/**
* @dev See {IERC721Receiver-onERC721Received}.
*/
function onERC721Received(
address,
address,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC721Received.selector;
}
/**
* @dev See {IERC1155Receiver-onERC1155Received}.
*/
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
/**
* @dev See {IERC1155Receiver-onERC1155BatchReceived}.
*/
function onERC1155BatchReceived(
address,
address,
uint256[] memory,
uint256[] memory,
bytes memory
) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[48] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (governance/extensions/IGovernorTimelock.sol)
pragma solidity ^0.8.0;
import "../IGovernorUpgradeable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Extension of the {IGovernor} for timelock supporting modules.
*
* _Available since v4.3._
*/
abstract contract IGovernorTimelockUpgradeable is Initializable, IGovernorUpgradeable {
function __IGovernorTimelock_init() internal onlyInitializing {
}
function __IGovernorTimelock_init_unchained() internal onlyInitializing {
}
event ProposalQueued(uint256 proposalId, uint256 eta);
function timelock() public view virtual returns (address);
function proposalEta(uint256 proposalId) public view virtual returns (uint256);
function queue(
address[] memory targets,
uint256[] memory values,
bytes[] memory calldatas,
bytes32 descriptionHash
) public virtual returns (uint256 proposalId);
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721ReceiverUpgradeable {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165Upgradeable.sol";
/**
* @dev _Available since v3.1._
*/
interface IERC1155ReceiverUpgradeable is IERC165Upgradeable {
/**
* @dev Handles the receipt of a single ERC1155 token type. This function is
* called at the end of a `safeTransferFrom` after the balance has been updated.
*
* NOTE: To accept the transfer, this must return
* `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
* (i.e. 0xf23a6e61, or its own function selector).
*
* @param operator The address which initiated the transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param id The ID of the token being transferred
* @param value The amount of tokens being transferred
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
*/
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
) external returns (bytes4);
/**
* @dev Handles the receipt of a multiple ERC1155 token types. This function
* is called at the end of a `safeBatchTransferFrom` after the balances have
* been updated.
*
* NOTE: To accept the transfer(s), this must return
* `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
* (i.e. 0xbc197c81, or its own function selector).
*
* @param operator The address which initiated the batch transfer (i.e. msg.sender)
* @param from The address which previously owned the token
* @param ids An array containing ids of each token being transferred (order and length must match values array)
* @param values An array containing amounts of each token being transferred (order and length must match ids array)
* @param data Additional data with no specified format
* @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
*/
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
) external returns (bytes4);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "../StringsUpgradeable.sol";
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSAUpgradeable {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV // Deprecated in v4.8
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
/// @solidity memory-safe-assembly
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", StringsUpgradeable.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/EIP712.sol)
pragma solidity ^0.8.0;
import "./ECDSAUpgradeable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
*
* The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
* they need in their contracts using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* _Available since v3.4._
*
* @custom:storage-size 52
*/
abstract contract EIP712Upgradeable is Initializable {
/* solhint-disable var-name-mixedcase */
bytes32 private _HASHED_NAME;
bytes32 private _HASHED_VERSION;
bytes32 private constant _TYPE_HASH = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
/* solhint-enable var-name-mixedcase */
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade].
*/
function __EIP712_init(string memory name, string memory version) internal onlyInitializing {
__EIP712_init_unchained(name, version);
}
function __EIP712_init_unchained(string memory name, string memory version) internal onlyInitializing {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
}
/**
* @dev Returns the domain separator for the current chain.
*/
function _domainSeparatorV4() internal view returns (bytes32) {
return _buildDomainSeparator(_TYPE_HASH, _EIP712NameHash(), _EIP712VersionHash());
}
function _buildDomainSeparator(
bytes32 typeHash,
bytes32 nameHash,
bytes32 versionHash
) private view returns (bytes32) {
return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
}
/**
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
* function returns the hash of the fully encoded EIP712 message for this domain.
*
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
*
* ```solidity
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
* keccak256("Mail(address to,string contents)"),
* mailTo,
* keccak256(bytes(mailContents))
* )));
* address signer = ECDSA.recover(digest, signature);
* ```
*/
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return ECDSAUpgradeable.toTypedDataHash(_domainSeparatorV4(), structHash);
}
/**
* @dev The hash of the name parameter for the EIP712 domain.
*
* NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
* are a concern.
*/
function _EIP712NameHash() internal virtual view returns (bytes32) {
return _HASHED_NAME;
}
/**
* @dev The hash of the version parameter for the EIP712 domain.
*
* NOTE: This function reads from storage by default, but can be redefined to return a constant value if gas costs
* are a concern.
*/
function _EIP712VersionHash() internal virtual view returns (bytes32) {
return _HASHED_VERSION;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165Upgradeable.sol";
import "../../proxy/utils/Initializable.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {
function __ERC165_init() internal onlyInitializing {
}
function __ERC165_init_unchained() internal onlyInitializing {
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165Upgradeable).interfaceId;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/structs/DoubleEndedQueue.sol)
pragma solidity ^0.8.4;
import "../math/SafeCastUpgradeable.sol";
/**
* @dev A sequence of items with the ability to efficiently push and pop items (i.e. insert and remove) on both ends of
* the sequence (called front and back). Among other access patterns, it can be used to implement efficient LIFO and
* FIFO queues. Storage use is optimized, and all operations are O(1) constant time. This includes {clear}, given that
* the existing queue contents are left in storage.
*
* The struct is called `Bytes32Deque`. Other types can be cast to and from `bytes32`. This data structure can only be
* used in storage, and not in memory.
* ```
* DoubleEndedQueue.Bytes32Deque queue;
* ```
*
* _Available since v4.6._
*/
library DoubleEndedQueueUpgradeable {
/**
* @dev An operation (e.g. {front}) couldn't be completed due to the queue being empty.
*/
error Empty();
/**
* @dev An operation (e.g. {at}) couldn't be completed due to an index being out of bounds.
*/
error OutOfBounds();
/**
* @dev Indices are signed integers because the queue can grow in any direction. They are 128 bits so begin and end
* are packed in a single storage slot for efficient access. Since the items are added one at a time we can safely
* assume that these 128-bit indices will not overflow, and use unchecked arithmetic.
*
* Struct members have an underscore prefix indicating that they are "private" and should not be read or written to
* directly. Use the functions provided below instead. Modifying the struct manually may violate assumptions and
* lead to unexpected behavior.
*
* Indices are in the range [begin, end) which means the first item is at data[begin] and the last item is at
* data[end - 1].
*/
struct Bytes32Deque {
int128 _begin;
int128 _end;
mapping(int128 => bytes32) _data;
}
/**
* @dev Inserts an item at the end of the queue.
*/
function pushBack(Bytes32Deque storage deque, bytes32 value) internal {
int128 backIndex = deque._end;
deque._data[backIndex] = value;
unchecked {
deque._end = backIndex + 1;
}
}
/**
* @dev Removes the item at the end of the queue and returns it.
*
* Reverts with `Empty` if the queue is empty.
*/
function popBack(Bytes32Deque storage deque) internal returns (bytes32 value) {
if (empty(deque)) revert Empty();
int128 backIndex;
unchecked {
backIndex = deque._end - 1;
}
value = deque._data[backIndex];
delete deque._data[backIndex];
deque._end = backIndex;
}
/**
* @dev Inserts an item at the beginning of the queue.
*/
function pushFront(Bytes32Deque storage deque, bytes32 value) internal {
int128 frontIndex;
unchecked {
frontIndex = deque._begin - 1;
}
deque._data[frontIndex] = value;
deque._begin = frontIndex;
}
/**
* @dev Removes the item at the beginning of the queue and returns it.
*
* Reverts with `Empty` if the queue is empty.
*/
function popFront(Bytes32Deque storage deque) internal returns (bytes32 value) {
if (empty(deque)) revert Empty();
int128 frontIndex = deque._begin;
value = deque._data[frontIndex];
delete deque._data[frontIndex];
unchecked {
deque._begin = frontIndex + 1;
}
}
/**
* @dev Returns the item at the beginning of the queue.
*
* Reverts with `Empty` if the queue is empty.
*/
function front(Bytes32Deque storage deque) internal view returns (bytes32 value) {
if (empty(deque)) revert Empty();
int128 frontIndex = deque._begin;
return deque._data[frontIndex];
}
/**
* @dev Returns the item at the end of the queue.
*
* Reverts with `Empty` if the queue is empty.
*/
function back(Bytes32Deque storage deque) internal view returns (bytes32 value) {
if (empty(deque)) revert Empty();
int128 backIndex;
unchecked {
backIndex = deque._end - 1;
}
return deque._data[backIndex];
}
/**
* @dev Return the item at a position in the queue given by `index`, with the first item at 0 and last item at
* `length(deque) - 1`.
*
* Reverts with `OutOfBounds` if the index is out of bounds.
*/
function at(Bytes32Deque storage deque, uint256 index) internal view returns (bytes32 value) {
// int256(deque._begin) is a safe upcast
int128 idx = SafeCastUpgradeable.toInt128(int256(deque._begin) + SafeCastUpgradeable.toInt256(index));
if (idx >= deque._end) revert OutOfBounds();
return deque._data[idx];
}
/**
* @dev Resets the queue back to being empty.
*
* NOTE: The current items are left behind in storage. This does not affect the functioning of the queue, but misses
* out on potential gas refunds.
*/
function clear(Bytes32Deque storage deque) internal {
deque._begin = 0;
deque._end = 0;
}
/**
* @dev Returns the number of items in the queue.
*/
function length(Bytes32Deque storage deque) internal view returns (uint256) {
// The interface preserves the invariant that begin <= end so we assume this will not overflow.
// We also assume there are at most int256.max items in the queue.
unchecked {
return uint256(int256(deque._end) - int256(deque._begin));
}
}
/**
* @dev Returns true if the queue is empty.
*/
function empty(Bytes32Deque storage deque) internal view returns (bool) {
return deque._end <= deque._begin;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.1) (utils/Checkpoints.sol)
// This file was procedurally generated from scripts/generate/templates/Checkpoints.js.
pragma solidity ^0.8.0;
import "./math/MathUpgradeable.sol";
import "./math/SafeCastUpgradeable.sol";
/**
* @dev This library defines the `History` struct, for checkpointing values as they change at different points in
* time, and later looking up past values by block number. See {Votes} as an example.
*
* To create a history of checkpoints define a variable type `Checkpoints.History` in your contract, and store a new
* checkpoint for the current transaction block using the {push} function.
*
* _Available since v4.5._
*/
library CheckpointsUpgradeable {
struct History {
Checkpoint[] _checkpoints;
}
struct Checkpoint {
uint32 _blockNumber;
uint224 _value;
}
/**
* @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one
* before it is returned, or zero otherwise. Because the number returned corresponds to that at the end of the
* block, the requested block number must be in the past, excluding the current block.
*/
function getAtBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {
require(blockNumber < block.number, "Checkpoints: block not yet mined");
uint32 key = SafeCastUpgradeable.toUint32(blockNumber);
uint256 len = self._checkpoints.length;
uint256 pos = _upperBinaryLookup(self._checkpoints, key, 0, len);
return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value;
}
/**
* @dev Returns the value at a given block number. If a checkpoint is not available at that block, the closest one
* before it is returned, or zero otherwise. Similar to {upperLookup} but optimized for the case when the searched
* checkpoint is probably "recent", defined as being among the last sqrt(N) checkpoints where N is the number of
* checkpoints.
*/
function getAtProbablyRecentBlock(History storage self, uint256 blockNumber) internal view returns (uint256) {
require(blockNumber < block.number, "Checkpoints: block not yet mined");
uint32 key = SafeCastUpgradeable.toUint32(blockNumber);
uint256 len = self._checkpoints.length;
uint256 low = 0;
uint256 high = len;
if (len > 5) {
uint256 mid = len - MathUpgradeable.sqrt(len);
if (key < _unsafeAccess(self._checkpoints, mid)._blockNumber) {
high = mid;
} else {
low = mid + 1;
}
}
uint256 pos = _upperBinaryLookup(self._checkpoints, key, low, high);
return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value;
}
/**
* @dev Pushes a value onto a History so that it is stored as the checkpoint for the current block.
*
* Returns previous value and new value.
*/
function push(History storage self, uint256 value) internal returns (uint256, uint256) {
return _insert(self._checkpoints, SafeCastUpgradeable.toUint32(block.number), SafeCastUpgradeable.toUint224(value));
}
/**
* @dev Pushes a value onto a History, by updating the latest value using binary operation `op`. The new value will
* be set to `op(latest, delta)`.
*
* Returns previous value and new value.
*/
function push(
History storage self,
function(uint256, uint256) view returns (uint256) op,
uint256 delta
) internal returns (uint256, uint256) {
return push(self, op(latest(self), delta));
}
/**
* @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints.
*/
function latest(History storage self) internal view returns (uint224) {
uint256 pos = self._checkpoints.length;
return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value;
}
/**
* @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value
* in the most recent checkpoint.
*/
function latestCheckpoint(History storage self)
internal
view
returns (
bool exists,
uint32 _blockNumber,
uint224 _value
)
{
uint256 pos = self._checkpoints.length;
if (pos == 0) {
return (false, 0, 0);
} else {
Checkpoint memory ckpt = _unsafeAccess(self._checkpoints, pos - 1);
return (true, ckpt._blockNumber, ckpt._value);
}
}
/**
* @dev Returns the number of checkpoint.
*/
function length(History storage self) internal view returns (uint256) {
return self._checkpoints.length;
}
/**
* @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint,
* or by updating the last one.
*/
function _insert(
Checkpoint[] storage self,
uint32 key,
uint224 value
) private returns (uint224, uint224) {
uint256 pos = self.length;
if (pos > 0) {
// Copying to memory is important here.
Checkpoint memory last = _unsafeAccess(self, pos - 1);
// Checkpoints keys must be increasing.
require(last._blockNumber <= key, "Checkpoint: invalid key");
// Update or push new checkpoint
if (last._blockNumber == key) {
_unsafeAccess(self, pos - 1)._value = value;
} else {
self.push(Checkpoint({_blockNumber: key, _value: value}));
}
return (last._value, value);
} else {
self.push(Checkpoint({_blockNumber: key, _value: value}));
return (0, value);
}
}
/**
* @dev Return the index of the oldest checkpoint whose key is greater than the search key, or `high` if there is none.
* `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`.
*
* WARNING: `high` should not be greater than the array's length.
*/
function _upperBinaryLookup(
Checkpoint[] storage self,
uint32 key,
uint256 low,
uint256 high
) private view returns (uint256) {
while (low < high) {
uint256 mid = MathUpgradeable.average(low, high);
if (_unsafeAccess(self, mid)._blockNumber > key) {
high = mid;
} else {
low = mid + 1;
}
}
return high;
}
/**
* @dev Return the index of the oldest checkpoint whose key is greater or equal than the search key, or `high` if there is none.
* `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`.
*
* WARNING: `high` should not be greater than the array's length.
*/
function _lowerBinaryLookup(
Checkpoint[] storage self,
uint32 key,
uint256 low,
uint256 high
) private view returns (uint256) {
while (low < high) {
uint256 mid = MathUpgradeable.average(low, high);
if (_unsafeAccess(self, mid)._blockNumber < key) {
low = mid + 1;
} else {
high = mid;
}
}
return high;
}
/**
* @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.
*/
function _unsafeAccess(Checkpoint[] storage self, uint256 pos) private pure returns (Checkpoint storage result) {
assembly {
mstore(0, self.slot)
result.slot := add(keccak256(0, 0x20), pos)
}
}
struct Trace224 {
Checkpoint224[] _checkpoints;
}
struct Checkpoint224 {
uint32 _key;
uint224 _value;
}
/**
* @dev Pushes a (`key`, `value`) pair into a Trace224 so that it is stored as the checkpoint.
*
* Returns previous value and new value.
*/
function push(
Trace224 storage self,
uint32 key,
uint224 value
) internal returns (uint224, uint224) {
return _insert(self._checkpoints, key, value);
}
/**
* @dev Returns the value in the oldest checkpoint with key greater or equal than the search key, or zero if there is none.
*/
function lowerLookup(Trace224 storage self, uint32 key) internal view returns (uint224) {
uint256 len = self._checkpoints.length;
uint256 pos = _lowerBinaryLookup(self._checkpoints, key, 0, len);
return pos == len ? 0 : _unsafeAccess(self._checkpoints, pos)._value;
}
/**
* @dev Returns the value in the most recent checkpoint with key lower or equal than the search key.
*/
function upperLookup(Trace224 storage self, uint32 key) internal view returns (uint224) {
uint256 len = self._checkpoints.length;
uint256 pos = _upperBinaryLookup(self._checkpoints, key, 0, len);
return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value;
}
/**
* @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints.
*/
function latest(Trace224 storage self) internal view returns (uint224) {
uint256 pos = self._checkpoints.length;
return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value;
}
/**
* @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value
* in the most recent checkpoint.
*/
function latestCheckpoint(Trace224 storage self)
internal
view
returns (
bool exists,
uint32 _key,
uint224 _value
)
{
uint256 pos = self._checkpoints.length;
if (pos == 0) {
return (false, 0, 0);
} else {
Checkpoint224 memory ckpt = _unsafeAccess(self._checkpoints, pos - 1);
return (true, ckpt._key, ckpt._value);
}
}
/**
* @dev Returns the number of checkpoint.
*/
function length(Trace224 storage self) internal view returns (uint256) {
return self._checkpoints.length;
}
/**
* @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint,
* or by updating the last one.
*/
function _insert(
Checkpoint224[] storage self,
uint32 key,
uint224 value
) private returns (uint224, uint224) {
uint256 pos = self.length;
if (pos > 0) {
// Copying to memory is important here.
Checkpoint224 memory last = _unsafeAccess(self, pos - 1);
// Checkpoints keys must be increasing.
require(last._key <= key, "Checkpoint: invalid key");
// Update or push new checkpoint
if (last._key == key) {
_unsafeAccess(self, pos - 1)._value = value;
} else {
self.push(Checkpoint224({_key: key, _value: value}));
}
return (last._value, value);
} else {
self.push(Checkpoint224({_key: key, _value: value}));
return (0, value);
}
}
/**
* @dev Return the index of the oldest checkpoint whose key is greater than the search key, or `high` if there is none.
* `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`.
*
* WARNING: `high` should not be greater than the array's length.
*/
function _upperBinaryLookup(
Checkpoint224[] storage self,
uint32 key,
uint256 low,
uint256 high
) private view returns (uint256) {
while (low < high) {
uint256 mid = MathUpgradeable.average(low, high);
if (_unsafeAccess(self, mid)._key > key) {
high = mid;
} else {
low = mid + 1;
}
}
return high;
}
/**
* @dev Return the index of the oldest checkpoint whose key is greater or equal than the search key, or `high` if there is none.
* `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`.
*
* WARNING: `high` should not be greater than the array's length.
*/
function _lowerBinaryLookup(
Checkpoint224[] storage self,
uint32 key,
uint256 low,
uint256 high
) private view returns (uint256) {
while (low < high) {
uint256 mid = MathUpgradeable.average(low, high);
if (_unsafeAccess(self, mid)._key < key) {
low = mid + 1;
} else {
high = mid;
}
}
return high;
}
/**
* @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.
*/
function _unsafeAccess(Checkpoint224[] storage self, uint256 pos)
private
pure
returns (Checkpoint224 storage result)
{
assembly {
mstore(0, self.slot)
result.slot := add(keccak256(0, 0x20), pos)
}
}
struct Trace160 {
Checkpoint160[] _checkpoints;
}
struct Checkpoint160 {
uint96 _key;
uint160 _value;
}
/**
* @dev Pushes a (`key`, `value`) pair into a Trace160 so that it is stored as the checkpoint.
*
* Returns previous value and new value.
*/
function push(
Trace160 storage self,
uint96 key,
uint160 value
) internal returns (uint160, uint160) {
return _insert(self._checkpoints, key, value);
}
/**
* @dev Returns the value in the oldest checkpoint with key greater or equal than the search key, or zero if there is none.
*/
function lowerLookup(Trace160 storage self, uint96 key) internal view returns (uint160) {
uint256 len = self._checkpoints.length;
uint256 pos = _lowerBinaryLookup(self._checkpoints, key, 0, len);
return pos == len ? 0 : _unsafeAccess(self._checkpoints, pos)._value;
}
/**
* @dev Returns the value in the most recent checkpoint with key lower or equal than the search key.
*/
function upperLookup(Trace160 storage self, uint96 key) internal view returns (uint160) {
uint256 len = self._checkpoints.length;
uint256 pos = _upperBinaryLookup(self._checkpoints, key, 0, len);
return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value;
}
/**
* @dev Returns the value in the most recent checkpoint, or zero if there are no checkpoints.
*/
function latest(Trace160 storage self) internal view returns (uint160) {
uint256 pos = self._checkpoints.length;
return pos == 0 ? 0 : _unsafeAccess(self._checkpoints, pos - 1)._value;
}
/**
* @dev Returns whether there is a checkpoint in the structure (i.e. it is not empty), and if so the key and value
* in the most recent checkpoint.
*/
function latestCheckpoint(Trace160 storage self)
internal
view
returns (
bool exists,
uint96 _key,
uint160 _value
)
{
uint256 pos = self._checkpoints.length;
if (pos == 0) {
return (false, 0, 0);
} else {
Checkpoint160 memory ckpt = _unsafeAccess(self._checkpoints, pos - 1);
return (true, ckpt._key, ckpt._value);
}
}
/**
* @dev Returns the number of checkpoint.
*/
function length(Trace160 storage self) internal view returns (uint256) {
return self._checkpoints.length;
}
/**
* @dev Pushes a (`key`, `value`) pair into an ordered list of checkpoints, either by inserting a new checkpoint,
* or by updating the last one.
*/
function _insert(
Checkpoint160[] storage self,
uint96 key,
uint160 value
) private returns (uint160, uint160) {
uint256 pos = self.length;
if (pos > 0) {
// Copying to memory is important here.
Checkpoint160 memory last = _unsafeAccess(self, pos - 1);
// Checkpoints keys must be increasing.
require(last._key <= key, "Checkpoint: invalid key");
// Update or push new checkpoint
if (last._key == key) {
_unsafeAccess(self, pos - 1)._value = value;
} else {
self.push(Checkpoint160({_key: key, _value: value}));
}
return (last._value, value);
} else {
self.push(Checkpoint160({_key: key, _value: value}));
return (0, value);
}
}
/**
* @dev Return the index of the oldest checkpoint whose key is greater than the search key, or `high` if there is none.
* `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`.
*
* WARNING: `high` should not be greater than the array's length.
*/
function _upperBinaryLookup(
Checkpoint160[] storage self,
uint96 key,
uint256 low,
uint256 high
) private view returns (uint256) {
while (low < high) {
uint256 mid = MathUpgradeable.average(low, high);
if (_unsafeAccess(self, mid)._key > key) {
high = mid;
} else {
low = mid + 1;
}
}
return high;
}
/**
* @dev Return the index of the oldest checkpoint whose key is greater or equal than the search key, or `high` if there is none.
* `low` and `high` define a section where to do the search, with inclusive `low` and exclusive `high`.
*
* WARNING: `high` should not be greater than the array's length.
*/
function _lowerBinaryLookup(
Checkpoint160[] storage self,
uint96 key,
uint256 low,
uint256 high
) private view returns (uint256) {
while (low < high) {
uint256 mid = MathUpgradeable.average(low, high);
if (_unsafeAccess(self, mid)._key < key) {
low = mid + 1;
} else {
high = mid;
}
}
return high;
}
/**
* @dev Access an element of the array without performing bounds check. The position is assumed to be within bounds.
*/
function _unsafeAccess(Checkpoint160[] storage self, uint256 pos)
private
pure
returns (Checkpoint160 storage result)
{
assembly {
mstore(0, self.slot)
result.slot := add(keccak256(0, 0x20), pos)
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (governance/utils/IVotes.sol)
pragma solidity ^0.8.0;
/**
* @dev Common interface for {ERC20Votes}, {ERC721Votes}, and other {Votes}-enabled contracts.
*
* _Available since v4.5._
*/
interface IVotesUpgradeable {
/**
* @dev Emitted when an account changes their delegate.
*/
event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);
/**
* @dev Emitted when a token transfer or delegate change results in changes to a delegate's number of votes.
*/
event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);
/**
* @dev Returns the current amount of votes that `account` has.
*/
function getVotes(address account) external view returns (uint256);
/**
* @dev Returns the amount of votes that `account` had at the end of a past block (`blockNumber`).
*/
function getPastVotes(address account, uint256 blockNumber) external view returns (uint256);
/**
* @dev Returns the total supply of votes available at the end of a past block (`blockNumber`).
*
* NOTE: This value is the sum of all available votes, which is not necessarily the sum of all delegated votes.
* Votes that have not been delegated are still part of total supply, even though they would not participate in a
* vote.
*/
function getPastTotalSupply(uint256 blockNumber) external view returns (uint256);
/**
* @dev Returns the delegate that `account` has chosen.
*/
function delegates(address account) external view returns (address);
/**
* @dev Delegates votes from the sender to `delegatee`.
*/
function delegate(address delegatee) external;
/**
* @dev Delegates votes from signer to `delegatee`.
*/
function delegateBySig(
address delegatee,
uint256 nonce,
uint256 expiry,
uint8 v,
bytes32 r,
bytes32 s
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControlUpgradeable.sol";
import "../utils/ContextUpgradeable.sol";
import "../utils/StringsUpgradeable.sol";
import "../utils/introspection/ERC165Upgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {
function __AccessControl_init() internal onlyInitializing {
}
function __AccessControl_init_unchained() internal onlyInitializing {
}
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
StringsUpgradeable.toHexString(account),
" is missing role ",
StringsUpgradeable.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* May emit a {RoleGranted} event.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
/**
* @dev This empty reserved space is put in place to allow future versions to add new
* variables without shifting down storage in the inheritance chain.
* See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
*/
uint256[49] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165Upgradeable {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/MathUpgradeable.sol";
/**
* @dev String operations.
*/
library StringsUpgradeable {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = MathUpgradeable.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, MathUpgradeable.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library MathUpgradeable {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator
) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1);
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(
uint256 x,
uint256 y,
uint256 denominator,
Rounding rounding
) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10**64) {
value /= 10**64;
result += 64;
}
if (value >= 10**32) {
value /= 10**32;
result += 32;
}
if (value >= 10**16) {
value /= 10**16;
result += 16;
}
if (value >= 10**8) {
value /= 10**8;
result += 8;
}
if (value >= 10**4) {
value /= 10**4;
result += 4;
}
if (value >= 10**2) {
value /= 10**2;
result += 2;
}
if (value >= 10**1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControlUpgradeable {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}{
"remappings": [
"ds-test/=lib/forge-std/lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@solady/=lib/solady/src/",
"upgrade-scripts/=lib/upgrade-scripts/src/",
"UDS/=lib/upgrade-scripts/lib/UDS/src/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts/",
"solady/=lib/solady/src/",
"solmate/=lib/solady/lib/solmate/src/"
],
"optimizer": {
"enabled": true,
"runs": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Empty","type":"error"},{"inputs":[],"name":"InvalidEmptyProposal","type":"error"},{"inputs":[],"name":"InvalidProposalExists","type":"error"},{"inputs":[],"name":"InvalidProposalId","type":"error"},{"inputs":[],"name":"InvalidProposalLength","type":"error"},{"inputs":[{"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"InvalidProposalType","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"InvalidRelayTarget","type":"error"},{"inputs":[],"name":"InvalidVoteType","type":"error"},{"inputs":[],"name":"InvalidVotesBelowThreshold","type":"error"},{"inputs":[],"name":"NotAlligator","type":"error"},{"inputs":[],"name":"NotManagerOrTimelock","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldManager","type":"address"},{"indexed":true,"internalType":"address","name":"newManager","type":"address"}],"name":"ManagerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"proposer","type":"address"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"proposer","type":"address"},{"indexed":true,"internalType":"address","name":"votingModule","type":"address"},{"indexed":false,"internalType":"bytes","name":"proposalData","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint64","name":"deadline","type":"uint64"}],"name":"ProposalDeadlineUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldProposalThreshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newProposalThreshold","type":"uint256"}],"name":"ProposalThresholdSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"ProposalTypeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldTimelock","type":"address"},{"indexed":false,"internalType":"address","name":"newTimelock","type":"address"}],"name":"TimelockChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"support","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"VoteCast","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"support","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"weight","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"},{"indexed":false,"internalType":"bytes","name":"params","type":"bytes"}],"name":"VoteCastWithParams","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldVotingDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newVotingDelay","type":"uint256"}],"name":"VotingDelaySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldVotingPeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newVotingPeriod","type":"uint256"}],"name":"VotingPeriodSet","type":"event"},{"inputs":[],"name":"BALLOT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COUNTING_MODE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"EXTENDED_BALLOT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DIVISOR","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSAL_TYPES_CONFIGURATOR","outputs":[{"internalType":"contract IProposalTypesConfigurator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"VOTABLE_SUPPLY_ORACLE","outputs":[{"internalType":"contract IVotableSupplyOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"alligator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"approvedModules","outputs":[{"internalType":"bool","name":"approved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"cancel","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract VotingModule","name":"module","type":"address"},{"internalType":"bytes","name":"proposalData","type":"bytes"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"cancelWithModule","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"}],"name":"castVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"castVoteBySig","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"string","name":"reason","type":"string"},{"internalType":"uint256","name":"votes","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"castVoteFromAlligator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"string","name":"reason","type":"string"}],"name":"castVoteWithReason","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"string","name":"reason","type":"string"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"castVoteWithReasonAndParams","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"support","type":"uint8"},{"internalType":"string","name":"reason","type":"string"},{"internalType":"bytes","name":"params","type":"bytes"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"castVoteWithReasonAndParamsBySig","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"editProposalType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"execute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract VotingModule","name":"module","type":"address"},{"internalType":"bytes","name":"proposalData","type":"bytes"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"executeWithModule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"getVotesWithParams","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"hasVoted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"hashProposal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bytes","name":"proposalData","type":"bytes"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"hashProposalWithModule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"votes","type":"uint256"},{"internalType":"uint256","name":"accountVotes","type":"uint256"}],"name":"increaseWeightCast","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVotingToken","name":"_votingToken","type":"address"},{"internalType":"contract IVotableSupplyOracle","name":"_votableSupplyOracle","type":"address"},{"internalType":"address","name":"_manager","type":"address"},{"internalType":"address","name":"_alligator","type":"address"},{"internalType":"contract TimelockControllerUpgradeable","name":"_timelockAddress","type":"address"},{"internalType":"contract IProposalTypesConfigurator","name":"_proposalTypesConfigurator","type":"address"},{"components":[{"internalType":"uint16","name":"quorum","type":"uint16"},{"internalType":"uint16","name":"approvalThreshold","type":"uint16"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"address","name":"module","type":"address"}],"internalType":"struct IProposalTypesConfigurator.ProposalType[]","name":"_proposalTypes","type":"tuple[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"proposalDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"proposalEta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"proposalSnapshot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"proposalVotes","outputs":[{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"abstainVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"propose","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract VotingModule","name":"module","type":"address"},{"internalType":"bytes","name":"proposalData","type":"bytes"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint8","name":"proposalType","type":"uint8"}],"name":"proposeWithModule","outputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"queue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract VotingModule","name":"module","type":"address"},{"internalType":"bytes","name":"proposalData","type":"bytes"},{"internalType":"bytes32","name":"descriptionHash","type":"bytes32"}],"name":"queueWithModule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"quorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_alligator","type":"address"},{"internalType":"address","name":"_votableSupplyOracle","type":"address"},{"internalType":"address","name":"_proposalTypesConfigurator","type":"address"},{"internalType":"contract TimelockControllerUpgradeable","name":"_timelockAddress","type":"address"}],"name":"reinitialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"relay","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newManager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setModuleApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"uint64","name":"deadline","type":"uint64"}],"name":"setProposalDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newProposalThreshold","type":"uint256"}],"name":"setProposalThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVotingDelay","type":"uint256"}],"name":"setVotingDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVotingPeriod","type":"uint256"}],"name":"setVotingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum IGovernorUpgradeable.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IVotingToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract TimelockControllerUpgradeable","name":"newTimelock","type":"address"}],"name":"updateTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"votableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"account","type":"address"}],"name":"weightCast","outputs":[{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052348015600f57600080fd5b506016601a565b60d8565b600054610100900460ff161560855760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116101560d6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b615f0a806100e76000396000f3fe6080604052600436106103bc5760003560e01c80639c82ec3c116101f2578063cae6b6571161010d578063eb9019d4116100a0578063f89f6d921161006f578063f89f6d9214610c33578063f8ce560a14610c53578063fc0c546a14610c73578063ffa1ad7414610c9457600080fd5b8063eb9019d414610ba7578063ece40cc114610bc7578063f23a6e6114610be7578063f7903e9f14610c1357600080fd5b8063d978ffba116100dc578063d978ffba14610af2578063dd4e2ba514610b3e578063deaaa7cc14610b53578063ea0217cf14610b8757600080fd5b8063cae6b65714610a73578063d0ebdbe714610a93578063d33219b414610ab3578063d958bc1d14610ad257600080fd5b8063b9f5ee9a11610185578063c28bc2fa11610154578063c28bc2fa146109ef578063c59057e414610a02578063c762703e14610a22578063c792b5aa14610a4257600080fd5b8063b9f5ee9a1461096d578063bc0dd6f314610982578063bc197c81146109a3578063c01f9e37146109cf57600080fd5b8063ab58fb8e116101c1578063ab58fb8e14610905578063b375916114610925578063b3e4324214610938578063b58131b01461095857600080fd5b80639c82ec3c14610884578063a2c465d9146108a4578063a890c910146108c4578063a8b4aaf7146108e457600080fd5b8063452115d6116102e25780635f398a14116102755780637b3c71d3116102445780637b3c71d3146108045780637d5e81e2146108245780639a79018e146108445780639a802a6d1461086457600080fd5b80635f398a141461078457806370b0f660146107a457806378e243fe146107c45780637ac54f39146107e457600080fd5b8063544ffc9c116102b1578063544ffc9c146106c4578063548d463b1461071957806354fd4d501461073a578063567813881461076457600080fd5b8063452115d614610609578063481c6a75146106295780634870dd9a146106625780634b0813ff1461068b57600080fd5b80632656227d1161035a5780633932abb1116103295780633932abb1146105865780633bccf4fd1461059c5780633e4f49e6146105bc57806343859632146105e957600080fd5b80632656227d146104ff5780632d63f693146105125780632e9ba283146105325780632fe3e2611461055257600080fd5b806306fdde031161039657806306fdde0314610464578063078a13b114610486578063150b7a02146104a6578063160cbed7146104df57600080fd5b806301ffc9a7146103ef57806302a251a314610424578063034201811461044457600080fd5b366103ea57306103d56101cc546001600160a01b031690565b6001600160a01b0316146103e857600080fd5b005b600080fd5b3480156103fb57600080fd5b5061040f61040a366004614448565b610ca8565b60405190151581526020015b60405180910390f35b34801561043057600080fd5b50610195545b60405190815260200161041b565b34801561045057600080fd5b5061043661045f3660046145be565b610cd3565b34801561047057600080fd5b50610479610dcb565b60405161041b91906146b8565b34801561049257600080fd5b506103e86104a13660046146e0565b610e5d565b3480156104b257600080fd5b506104c66104c136600461473c565b610f4c565b6040516001600160e01b0319909116815260200161041b565b3480156104eb57600080fd5b506104366104fa366004614911565b610f5d565b61043661050d366004614911565b611161565b34801561051e57600080fd5b5061043661052d3660046149aa565b611261565b34801561053e57600080fd5b506103e861054d3660046149c3565b611298565b34801561055e57600080fd5b506104367fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561059257600080fd5b5061019454610436565b3480156105a857600080fd5b506104366105b7366004614a00565b61135c565b3480156105c857600080fd5b506105dc6105d73660046149aa565b6113d2565b60405161041b9190614a64565b3480156105f557600080fd5b5061040f610604366004614a8c565b611569565b34801561061557600080fd5b50610436610624366004614911565b6115c6565b34801561063557600080fd5b506101c65461064a906001600160a01b031681565b6040516001600160a01b03909116815260200161041b565b34801561066e57600080fd5b5061067861271081565b60405161ffff909116815260200161041b565b34801561069757600080fd5b506104366106a6366004614a8c565b6101c860209081526000928352604080842090915290825290205481565b3480156106d057600080fd5b506106fe6106df3660046149aa565b600090815260fd60205260409020805460018201546002909201549092565b6040805193845260208401929092529082015260600161041b565b34801561072557600080fd5b506101c95461064a906001600160a01b031681565b34801561074657600080fd5b506040805180820190915260018152603160f81b6020820152610479565b34801561077057600080fd5b5061043661077f366004614abc565b6115df565b34801561079057600080fd5b5061043661079f366004614ae8565b611600565b3480156107b057600080fd5b506103e86107bf3660046149aa565b61164a565b3480156107d057600080fd5b506103e86107df366004614b6f565b6116a2565b3480156107f057600080fd5b506103e86107ff366004614c61565b611867565b34801561081057600080fd5b5061043661081f366004614c8f565b6118df565b34801561083057600080fd5b5061043661083f366004614ce8565b611931565b34801561085057600080fd5b5061043661085f366004614d8c565b61193d565b34801561087057600080fd5b5061043661087f366004614e59565b611ca7565b34801561089057600080fd5b5061043661089f366004614eb1565b611cb4565b3480156108b057600080fd5b506103e86108bf366004614f0a565b611f3b565b3480156108d057600080fd5b506103e86108df366004614fae565b6121bf565b3480156108f057600080fd5b506101cb5461064a906001600160a01b031681565b34801561091157600080fd5b506104366109203660046149aa565b6122d1565b610436610933366004614eb1565b61236d565b34801561094457600080fd5b50610436610953366004614fcb565b6124f5565b34801561096457600080fd5b50610436612906565b34801561097957600080fd5b50610436612917565b34801561098e57600080fd5b506101ca5461064a906001600160a01b031681565b3480156109af57600080fd5b506104c66109be366004615055565b63bc197c8160e01b95945050505050565b3480156109db57600080fd5b506104366109ea3660046149aa565b612986565b6103e86109fd3660046150f3565b6129b5565b348015610a0e57600080fd5b50610436610a1d366004614911565b612b33565b348015610a2e57600080fd5b50610436610a3d3660046149aa565b612b6d565b348015610a4e57600080fd5b5061040f610a5d366004614fae565b6101c76020526000908152604090205460ff1681565b348015610a7f57600080fd5b50610436610a8e366004614eb1565b612bdc565b348015610a9f57600080fd5b506103e8610aae366004614fae565b612c15565b348015610abf57600080fd5b506101cc546001600160a01b031661064a565b348015610ade57600080fd5b50610436610aed366004614eb1565b612cbf565b348015610afe57600080fd5b50610b2c610b0d3660046149aa565b600090815260cc6020526040902060020154600160b01b900460ff1690565b60405160ff909116815260200161041b565b348015610b4a57600080fd5b50610479612cd7565b348015610b5f57600080fd5b506104367f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610b9357600080fd5b506103e8610ba23660046149aa565b612cf7565b348015610bb357600080fd5b50610436610bc2366004615136565b612d4b565b348015610bd357600080fd5b506103e8610be23660046149aa565b612d6c565b348015610bf357600080fd5b506104c6610c02366004615162565b63f23a6e6160e01b95945050505050565b348015610c1f57600080fd5b506103e8610c2e3660046151be565b612dc0565b348015610c3f57600080fd5b506103e8610c4e366004614abc565b612e6c565b348015610c5f57600080fd5b50610436610c6e3660046149aa565b61308b565b348015610c7f57600080fd5b5061012f5461064a906001600160a01b031681565b348015610ca057600080fd5b506004610436565b60006001600160e01b03198216636e665ced60e01b1480610ccd5750610ccd826131c8565b92915050565b600080610d77610d6f7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610d0f9291906151ef565b60405180910390208b80519060200120604051602001610d54959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120613233565b868686613281565b9050610dbd8a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92506132a9915050565b9a9950505050505050505050565b606060cb8054610dda906151ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610e06906151ff565b8015610e535780601f10610e2857610100808354040283529160200191610e53565b820191906000526020600020905b815481529060010190602001808311610e3657829003601f168201915b5050505050905090565b6004600054610100900460ff16158015610e7e575060005460ff8083169116105b610ea35760405162461bcd60e51b8152600401610e9a90615239565b60405180910390fd5b600080546101c980546001600160a01b038981166001600160a01b0319928316179092556101ca80548984169083161790556101cb8054888416908316179055436101ce556101cc80549287169290911691909117905561ffff191660ff83169081176101001761ff0019169091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b630a85bd0160e11b5b949350505050565b600080610f6c86868686612b33565b90506004610f79826113d2565b6007811115610f8a57610f8a614a4e565b14610fa75760405162461bcd60e51b8152600401610e9a90615287565b6101cc546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa158015610ff2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101691906152c8565b6101cc5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790611051908a908a908a906000908b906004016153b4565b602060405180830381865afa15801561106e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109291906152c8565b60008381526101cd6020526040808220929092556101cc5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb0916110df918b918b918b91908b908990600401615402565b600060405180830381600087803b1580156110f957600080fd5b505af115801561110d573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda289282824261113f9190615470565b6040805192835260208301919091520160405180910390a15095945050505050565b60008061117086868686612b33565b9050600561117d826113d2565b600781111561118e5761118e614a4e565b146111db5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f74207175657565640000006044820152606401610e9a565b600081815260cc602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906112299083815260200190565b60405180910390a161123e818787878761345d565b61124b8187878787613502565b6112588187878787613577565b95945050505050565b600081815260cc602090815260408083208151928301909152546001600160401b0316908190525b6001600160401b031692915050565b6101c9546001600160a01b0316336001600160a01b0316146112cd5760405163dcd3516f60e01b815260040160405180910390fd5b60008481526101c8602090815260408083206001600160a01b0387168452909152812080548392859291611302908490615470565b92505081905511156113565760405162461bcd60e51b815260206004820152601f60248201527f476f7665726e6f723a20746f74616c20776569676874206578636565646564006044820152606401610e9a565b50505050565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff8516606082015260009081906113aa90610d6f90608001610d54565b90506113c7878288604051806020016040528060008152506135bb565b979650505050505050565b6000806113de836135de565b905060048160078111156113f4576113f4614a4e565b146113ff5792915050565b6101ce541580159061143b57506101ce54600084815260cc6020908152604091829020825191820190925290546001600160401b031690819052105b156114495750600792915050565b60008381526101cd602052604090205480611465575092915050565b6101cc54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa1580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190615483565b156114e2575060079392505050565b6101cc54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e90602401602060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115509190615483565b1561155f575060059392505050565b5060029392505050565b60008281526101c8602090815260408083206001600160a01b03851684529091528120541515806115bf5750600083815260fd602090815260408083206001600160a01b038616845260030190915290205460ff165b9392505050565b60006115d485858585612b33565b9050610f55816136de565b600080339050610f55848285604051806020016040528060008152506135bb565b6000803390506113c787828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92506132a9915050565b6101c65433906001600160a01b0316811480159061167757506101cc546001600160a01b03828116911614155b156116955760405163d37050f360e01b815260040160405180910390fd5b61169e8261394f565b5050565b600054610100900460ff16158080156116c25750600054600160ff909116105b806116dc5750303b1580156116dc575060005460ff166001145b6116f85760405162461bcd60e51b8152600401610e9a90615239565b6000805460ff19166001179055801561171b576000805461ff0019166101001790555b611744604051806040016040528060088152602001674f7074696d69736d60c01b815250613992565b61174c6139ec565b61175589613a15565b6117656119af61b3cb6000613a45565b6101cb80546001600160a01b038087166001600160a01b031992831681179093556101ca80548c83169084161790556101c680548b83169084161790556101c980548a83169084161790556101cc805491891691909216179055604051634e8423db60e01b8152634e8423db906117e49030908790879060040161551e565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b50505050801561185c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6101c65433906001600160a01b0316811480159061189457506101cc546001600160a01b03828116911614155b156118b25760405163d37050f360e01b815260040160405180910390fd5b506001600160a01b039190911660009081526101c760205260409020805460ff1916911515919091179055565b60008033905061192786828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506135bb92505050565b9695505050505050565b60006112588585858560005b6101c65460009033906001600160a01b0316811480159061196d57506101cc546001600160a01b03828116911614155b1561198b5760405163d37050f360e01b815260040160405180910390fd5b85518751146119ad57604051633465db5d60e11b815260040160405180910390fd5b84518751146119cf57604051633465db5d60e11b815260040160405180910390fd5b86516000036119f15760405163d377eca560e01b815260040160405180910390fd5b6101cb5460405163f48aef3360e01b815260ff851660048201526001600160a01b039091169063f48aef3390602401600060405180830381865afa158015611a3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a65919081019061568b565b60400151511580611af657506101cb5460405163f48aef3360e01b815260ff851660048201526000916001600160a01b03169063f48aef3390602401600060405180830381865afa158015611abe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ae6919081019061568b565b608001516001600160a01b031614155b15611b19576040516337d0292760e01b815260ff84166004820152602401610e9a565b611b2c8787878780519060200120612b33565b600081815260cc6020908152604091829020825191820190925281546001600160401b0316908190529193509015611b7757604051637031547960e11b815260040160405180910390fd5b6000611b8b611b866101945490565b613a77565b611b9443613a77565b611b9e919061575c565b90506000611baf611b866101955490565b611bb9908361575c565b9050611bc58383613ae3565b611bd26001840182613ae3565b60028301805460ff60b01b1916600160b01b60ff891602179055600383018054336001600160a01b031990911681179091558a5186907fc8df7ff219f3c0358e14500814d8b62b443a4bebf3a596baa60b9295b1cf1bde908d908d906001600160401b03811115611c4557611c456144d0565b604051908082528060200260200182016040528015611c7857816020015b6060815260200190600190039081611c635790505b508d88888f8f604051611c9298979695949392919061577b565b60405180910390a35050505095945050505050565b6000610f55848484613b01565b600080611cc2858585612bdc565b90506000806000876001600160a01b0316634e2b2bb385896040518363ffffffff1660e01b8152600401611cf7929190615868565b6000604051808303816000875af1158015611d16573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d3e9190810190615975565b919450925090506004611d50856113d2565b6007811115611d6157611d61614a4e565b14611d7e5760405162461bcd60e51b8152600401610e9a90615287565b6101cc546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded91906152c8565b6101cc5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790611e28908790879087906000908e906004016153b4565b602060405180830381865afa158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6991906152c8565b60008681526101cd6020526040808220929092556101cc5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb091611eb691889188918891908e908990600401615402565b600060405180830381600087803b158015611ed057600080fd5b505af1158015611ee4573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892858242611f169190615470565b6040805192835260208301919091520160405180910390a15092979650505050505050565b6101c9546001600160a01b0316336001600160a01b031614611f705760405163dcd3516f60e01b815260040160405180910390fd5b6001611f7b886113d2565b6007811115611f8c57611f8c614a4e565b14611fa95760405162461bcd60e51b8152600401610e9a90615a60565b600087815260fd602090815260408083206001600160a01b038a168452600381019092529091205460ff16612059576001600160a01b03871660009081526003820160209081526040808320805460ff191660011790558a835260cc825291829020825191820190925290546001600160401b0316815261204c90889061202e905190565b6001600160401b031660405180602001604052806000815250613b01565b6120569085615470565b93505b60ff861661208057838160000160008282546120759190615470565b909155506120d99050565b60001960ff8716016120a057838160010160008282546120759190615470565b60011960ff8716016120c057838160020160008282546120759190615470565b604051638eed55d160e01b815260040160405180910390fd5b600088815260cc60205260409020600201546201000090046001600160a01b03168015612169576040516313d72aeb60e21b81526001600160a01b03821690634f5cabac90612136908c908c908c908b908b908b90600401615aa3565b600060405180830381600087803b15801561215057600080fd5b505af1158015612164573d6000803e3d6000fd5b505050505b876001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128a89888a89896040516121ac96959493929190615ae6565b60405180910390a2505050505050505050565b6101cc546001600160a01b031633146122155760405162461bcd60e51b8152602060048201526018602482015277476f7665726e6f723a206f6e6c79476f7665726e616e636560401b6044820152606401610e9a565b306122296101cc546001600160a01b031690565b6001600160a01b03161461226657600080366040516122499291906151ef565b604051809103902090505b8061225f60cd613b78565b0361225457505b6101cc54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a16101cc80546001600160a01b0319166001600160a01b0392909216919091179055565b6101cc5460008281526101cd602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c443590602401602060405180830381865afa158015612330573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235491906152c8565b90508060011461236457806115bf565b60009392505050565b60008061237b858585612bdc565b90506000612388826113d2565b9050600581600781111561239e5761239e614a4e565b146123eb5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f74207175657565640000006044820152606401610e9a565b600082815260cc602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906124399084815260200190565b60405180910390a16000806000886001600160a01b0316634e2b2bb3868a6040518363ffffffff1660e01b8152600401612474929190615868565b6000604051808303816000875af1158015612493573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124bb9190810190615975565b9250925092506124ce858484848b61345d565b6124db858484848b613502565b6124e8858484848b613577565b5092979650505050505050565b6101c65460009033906001600160a01b0316811480159061252557506101cc546001600160a01b03828116911614155b156125435760405163d37050f360e01b815260040160405180910390fd5b6101c65433906001600160a01b0316811461258e57612560612906565b61256f82610bc2600143615b21565b101561258e5760405163d9cd32f360e01b815260040160405180910390fd5b6001600160a01b03871660009081526101c7602052604090205460ff166125f75760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a206d6f64756c65206e6f7420617070726f7665640000006044820152606401610e9a565b6101cb5460405163f48aef3360e01b815260ff861660048201526001600160a01b039091169063f48aef3390602401600060405180830381865afa158015612643573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261266b919081019061568b565b604001515115806126fd57506101cb5460405163f48aef3360e01b815260ff861660048201526001600160a01b0389811692169063f48aef3390602401600060405180830381865afa1580156126c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126ed919081019061568b565b608001516001600160a01b031614155b15612720576040516337d0292760e01b815260ff85166004820152602401610e9a565b84516020860120612732888883612bdc565b600081815260cc6020908152604091829020825191820190925281546001600160401b031690819052919550901561277d57604051637031547960e11b815260040160405180910390fd5b600061278c611b866101945490565b61279543613a77565b61279f919061575c565b905060006127b0611b866101955490565b6127ba908361575c565b90506127c68383613ae3565b6127d36001840182613ae3565b8a8360020160026101000a8154816001600160a01b0302191690836001600160a01b03160217905550878360020160166101000a81548160ff021916908360ff160217905550848360030160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a6001600160a01b03166310b255bb888c876040518463ffffffff1660e01b815260040161287293929190615b34565b600060405180830381600087803b15801561288c57600080fd5b505af11580156128a0573d6000803e3d6000fd5b505050508a6001600160a01b0316856001600160a01b0316887f505ee268ba7fa7dab901965f6c2eae1ca9a1199856dd0d4147302feb4000d82f8d86868f8f6040516128f0959493929190615b5d565b60405180910390a4505050505050949350505050565b60006129126101965490565b905090565b6101ca5460408051635cfaf74d60e11b815290516000926001600160a01b03169163b9f5ee9a9160048083019260209291908290030181865afa158015612962573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291291906152c8565b600081815260cc602090815260408083208151928301909152600101546001600160401b031690819052611289565b6101cc546001600160a01b03163314612a0b5760405162461bcd60e51b8152602060048201526018602482015277476f7665726e6f723a206f6e6c79476f7665726e616e636560401b6044820152606401610e9a565b30612a1f6101cc546001600160a01b031690565b6001600160a01b031614612a5c5760008036604051612a3f9291906151ef565b604051809103902090505b80612a5560cd613b78565b03612a4a57505b6001600160a01b03841660009081526101c7602052604090205460ff1615612aa25760405163e22c3de160e01b81526001600160a01b0385166004820152602401610e9a565b600080856001600160a01b0316858585604051612ac09291906151ef565b60006040518083038185875af1925050503d8060008114612afd576040519150601f19603f3d011682016040523d82523d6000602084013e612b02565b606091505b5091509150612b2a8282604051806060016040528060288152602001615e7660289139613bf7565b50505050505050565b600084848484604051602001612b4c9493929190615bb6565b60408051601f19818403018152919052805160209091012095945050505050565b6101ca546040516363b1381f60e11b8152600481018390526000916001600160a01b03169063c762703e90602401602060405180830381865afa158015612bb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd91906152c8565b600030848484604051602001612bf59493929190615c01565b60408051601f198184030181529190528051602090910120949350505050565b6101c65433906001600160a01b03168114801590612c4257506101cc546001600160a01b03828116911614155b15612c605760405163d37050f360e01b815260040160405180910390fd5b6101c6546040516001600160a01b038085169216907fc64707e618a83637fc41ad1e3aa4242bd5fdd353f3d60bc0faf40db0d7d8607890600090a3506101c680546001600160a01b0319166001600160a01b0392909216919091179055565b6000612ccc848484612bdc565b90506115bf816136de565b6060604051806060016040528060378152602001615e9e60379139905090565b6101c65433906001600160a01b03168114801590612d2457506101cc546001600160a01b03828116911614155b15612d425760405163d37050f360e01b815260040160405180910390fd5b61169e82613c10565b60006115bf8383612d6760408051602081019091526000815290565b613b01565b6101c65433906001600160a01b03168114801590612d9957506101cc546001600160a01b03828116911614155b15612db75760405163d37050f360e01b815260040160405180910390fd5b61169e82613cb3565b6101c65433906001600160a01b03168114801590612ded57506101cc546001600160a01b03828116911614155b15612e0b5760405163d37050f360e01b815260040160405180910390fd5b600083815260cc60205260409020612e269060010183613ae3565b604080518481526001600160401b03841660208201527fa970323612abc91ce4b6fd8869dc11458f53fea39343e04625af3f2dc999b05d910160405180910390a1505050565b6101c65433906001600160a01b03168114801590612e9957506101cc546001600160a01b03828116911614155b15612eb75760405163d37050f360e01b815260040160405180910390fd5b612ec083611261565b600003612ee057604051630992f7ad60e01b815260040160405180910390fd5b6101cb5460405163f48aef3360e01b815260ff841660048201526001600160a01b039091169063f48aef3390602401600060405180830381865afa158015612f2c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f54919081019061568b565b604001515115806130005750600083815260cc602052604090819020600201546101cb54915163f48aef3360e01b815260ff85166004820152620100009091046001600160a01b0390811692169063f48aef3390602401600060405180830381865afa158015612fc8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ff0919081019061568b565b608001516001600160a01b031614155b15613023576040516337d0292760e01b815260ff83166004820152602401610e9a565b600083815260cc6020908152604091829020600201805460ff60b01b1916600160b01b60ff871690810291909117909155915191825284917f246d525ff8e335b248f75b3d1a095f4e8d1a2a65998704e5957f37b05e3eca00910160405180910390a2505050565b60008061309783611261565b905060006130a482612b6d565b90508060000361311f5761012f54604051632394e7a360e21b8152600481018490526001600160a01b0390911690638e539e8c90602401602060405180830381865afa1580156130f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311c91906152c8565b90505b6101cb54600085815260cc60205260409081902060020154905163f48aef3360e01b8152600160b01b90910460ff166004820152612710916001600160a01b03169063f48aef3390602401600060405180830381865afa158015613187573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131af919081019061568b565b516131be9061ffff1683615c3e565b610f559190615c55565b60006001600160e01b0319821663bf26d89760e01b14806131f957506001600160e01b031982166379dd796f60e01b145b8061321457506001600160e01b03198216630271189760e51b145b80610ccd57506301ffc9a760e01b6001600160e01b0319831614610ccd565b6000610ccd613240613cf6565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061329287878787613d71565b9150915061329f81613e35565b5095945050505050565b600060016132b6876113d2565b60078111156132c7576132c7614a4e565b146132e45760405162461bcd60e51b8152600401610e9a90615a60565b600086815260cc6020908152604091829020825191820190925290546001600160401b03169081905261331890869061202e565b90506133278686868486613f7f565b600086815260cc60205260409020600201546201000090046001600160a01b031680156133b5576040516313d72aeb60e21b81526001600160a01b03821690634f5cabac90613382908a908a908a9088908a90600401615c77565b600060405180830381600087803b15801561339c57600080fd5b505af11580156133b0573d6000803e3d6000fd5b505050505b825160000361340a57856001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4888785886040516133fd9493929190615cad565b60405180910390a261329f565b856001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb8712888785888860405161344b959493929190615cd5565b60405180910390a25095945050505050565b306134716101cc546001600160a01b031690565b6001600160a01b0316146134fb5760005b84518110156134f957306001600160a01b03168582815181106134a7576134a7615d0f565b60200260200101516001600160a01b0316036134f1576134f18382815181106134d2576134d2615d0f565b60200260200101518051906020012060cd6140f990919063ffffffff16565b600101613482565b505b5050505050565b6101cc5460405163e38335e560e01b81526001600160a01b039091169063e38335e590349061353e9088908890889060009089906004016153b4565b6000604051808303818588803b15801561355757600080fd5b505af115801561356b573d6000803e3d6000fd5b50505050505050505050565b3061358b6101cc546001600160a01b031690565b6001600160a01b0316146134fb5760cd54600f81810b600160801b909204900b13156134fb57600060cd556134fb565b6000611258858585856135d960408051602081019091526000815290565b6132a9565b600081815260cc60205260408120600281015460ff16156136025750600792915050565b6002810154610100900460ff161561361d5750600292915050565b600061362884611261565b90508060000361367a5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c2069640000006044820152606401610e9a565b43811061368b575060009392505050565b600061369685612986565b90504381106136aa57506001949350505050565b6136b385614135565b80156136c357506136c38561418e565b156136d357506004949350505050565b506003949350505050565b6101c65433906001600160a01b031681148061370857506101cc546001600160a01b038281169116145b8061372f5750600082815260cc60205260409020600301546001600160a01b038281169116145b6137ab5760405162461bcd60e51b815260206004820152604160248201527f476f7665726e6f723a206f6e6c79206d616e616765722c20676f7665726e6f7260448201527f2074696d656c6f636b2c206f722070726f706f7365722063616e2063616e63656064820152601b60fa1b608482015260a401610e9a565b60006137b6836113d2565b905060028160078111156137cc576137cc614a4e565b141580156137ec575060068160078111156137e9576137e9614a4e565b14155b801561380a5750600781600781111561380757613807614a4e565b14155b6138565760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f74206163746976650000006044820152606401610e9a565b600083815260cc602052604090819020600201805461ff001916610100179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906138a69085815260200190565b60405180910390a160008381526101cd60205260409020541561394a576101cc5460008481526101cd60205260409081902054905163c4d252f560e01b81526001600160a01b039092169163c4d252f5916139079160040190815260200190565b600060405180830381600087803b15801561392157600080fd5b505af1158015613935573d6000803e3d6000fd5b50505060008481526101cd6020526040812055505b505050565b6101945460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a161019455565b600054610100900460ff166139b95760405162461bcd60e51b8152600401610e9a90615d25565b6139e0816139db6040805180820190915260018152603160f81b602082015290565b61431e565b6139e98161435f565b50565b600054610100900460ff16613a135760405162461bcd60e51b8152600401610e9a90615d25565b565b600054610100900460ff16613a3c5760405162461bcd60e51b8152600401610e9a90615d25565b6139e981614392565b600054610100900460ff16613a6c5760405162461bcd60e51b8152600401610e9a90615d25565b61394a8383836143dc565b60006001600160401b03821115613adf5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608401610e9a565b5090565b815467ffffffffffffffff19166001600160401b0391909116179055565b61012f54604051630748d63560e31b81526001600160a01b038581166004830152602482018590526000921690633a46b1a890604401602060405180830381865afa158015613b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5591906152c8565b6000613b938254600f81810b600160801b909204900b131590565b15613bb157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b60608315613c065750816115bf565b6115bf838361441e565b60008111613c705760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b6064820152608401610e9a565b6101955460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a161019555565b6101965460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a161019655565b60006129127f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613d2560655490565b6066546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613da85750600090506003613e2c565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613dfc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613e2557600060019250925050613e2c565b9150600090505b94509492505050565b6000816004811115613e4957613e49614a4e565b03613e515750565b6001816004811115613e6557613e65614a4e565b03613eb25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610e9a565b6002816004811115613ec657613ec6614a4e565b03613f135760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610e9a565b6003816004811115613f2757613f27614a4e565b036139e95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610e9a565b600085815260fd602090815260408083206001600160a01b0388168452600381019092529091205460ff16156140075760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c726561604482015266191e4818d85cdd60ca1b6064820152608401610e9a565b6001600160a01b03851660009081526003820160205260409020805460ff1916600117905560ff841661405357828160000160008282546140489190615470565b909155506134f99050565b60001960ff85160161407357828160010160008282546140489190615470565b60011960ff85160161409357828160020160008282546140489190615470565b60405162461bcd60e51b815260206004820152603560248201527f476f7665726e6f72566f74696e6753696d706c653a20696e76616c69642076616044820152746c756520666f7220656e756d20566f74655479706560581b6064820152608401610e9a565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b60008060008061415e85600090815260fd60205260409020805460018201546002909201549092565b91945092509050806141708385615470565b61417a9190615470565b6141838661308b565b111595945050505050565b600081815260cc6020526040812060028101546201000090046001600160a01b0316801561422d5760405163a54bd3eb60e01b8152600481018590526001600160a01b0382169063a54bd3eb90602401602060405180830381865afa1580156141fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421f9190615483565b61422d575060009392505050565b6101cb54600283015460405163f48aef3360e01b8152600160b01b90910460ff1660048201526000916001600160a01b03169063f48aef3390602401600060405180830381865afa158015614286573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142ae919081019061568b565b6020015161ffff169050806000036142cb57506001949350505050565b600085815260fd6020526040812060018101548154919290916142ee9083615470565b9050801561431357838161430461271085615c3e565b61430e9190615c55565b101596505b505050505050919050565b600054610100900460ff166143455760405162461bcd60e51b8152600401610e9a90615d25565b815160209283012081519190920120606591909155606655565b600054610100900460ff166143865760405162461bcd60e51b8152600401610e9a90615d25565b60cb61169e8282615db7565b600054610100900460ff166143b95760405162461bcd60e51b8152600401610e9a90615d25565b61012f80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166144035760405162461bcd60e51b8152600401610e9a90615d25565b61440c8361394f565b61441582613c10565b61394a81613cb3565b81511561442e5781518083602001fd5b8060405162461bcd60e51b8152600401610e9a91906146b8565b60006020828403121561445a57600080fd5b81356001600160e01b0319811681146115bf57600080fd5b803560ff8116811461448357600080fd5b919050565b60008083601f84011261449a57600080fd5b5081356001600160401b038111156144b157600080fd5b6020830191508360208285010111156144c957600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715614508576145086144d0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614536576145366144d0565b604052919050565b60006001600160401b03821115614557576145576144d0565b50601f01601f191660200190565b600082601f83011261457657600080fd5b813560208301600061458f61458a8461453e565b61450e565b90508281528583830111156145a357600080fd5b82826020830137600092810160200192909252509392505050565b60008060008060008060008060e0898b0312156145da57600080fd5b883597506145ea60208a01614472565b965060408901356001600160401b0381111561460557600080fd5b6146118b828c01614488565b90975095505060608901356001600160401b0381111561463057600080fd5b61463c8b828c01614565565b94505061464b60808a01614472565b979a969950949793969295929450505060a08201359160c0013590565b60005b8381101561468357818101518382015260200161466b565b50506000910152565b600081518084526146a4816020860160208601614668565b601f01601f19169290920160200192915050565b6020815260006115bf602083018461468c565b6001600160a01b03811681146139e957600080fd5b600080600080608085870312156146f657600080fd5b8435614701816146cb565b93506020850135614711816146cb565b92506040850135614721816146cb565b91506060850135614731816146cb565b939692955090935050565b6000806000806080858703121561475257600080fd5b843561475d816146cb565b9350602085013561476d816146cb565b92506040850135915060608501356001600160401b0381111561478f57600080fd5b61479b87828801614565565b91505092959194509250565b60006001600160401b038211156147c0576147c06144d0565b5060051b60200190565b600082601f8301126147db57600080fd5b81356147e961458a826147a7565b8082825260208201915060208360051b86010192508583111561480b57600080fd5b602085015b8381101561329f578035614823816146cb565b835260209283019201614810565b600082601f83011261484257600080fd5b813561485061458a826147a7565b8082825260208201915060208360051b86010192508583111561487257600080fd5b602085015b8381101561329f578035835260209283019201614877565b600082601f8301126148a057600080fd5b81356148ae61458a826147a7565b8082825260208201915060208360051b8601019250858311156148d057600080fd5b602085015b8381101561329f5780356001600160401b038111156148f357600080fd5b614902886020838a0101614565565b845250602092830192016148d5565b6000806000806080858703121561492757600080fd5b84356001600160401b0381111561493d57600080fd5b614949878288016147ca565b94505060208501356001600160401b0381111561496557600080fd5b61497187828801614831565b93505060408501356001600160401b0381111561498d57600080fd5b6149998782880161488f565b949793965093946060013593505050565b6000602082840312156149bc57600080fd5b5035919050565b600080600080608085870312156149d957600080fd5b8435935060208501356149eb816146cb565b93969395505050506040820135916060013590565b600080600080600060a08688031215614a1857600080fd5b85359450614a2860208701614472565b9350614a3660408701614472565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b6020810160088310614a8657634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215614a9f57600080fd5b823591506020830135614ab1816146cb565b809150509250929050565b60008060408385031215614acf57600080fd5b82359150614adf60208401614472565b90509250929050565b600080600080600060808688031215614b0057600080fd5b85359450614b1060208701614472565b935060408601356001600160401b03811115614b2b57600080fd5b614b3788828901614488565b90945092505060608601356001600160401b03811115614b5657600080fd5b614b6288828901614565565b9150509295509295909350565b60008060008060008060008060e0898b031215614b8b57600080fd5b8835614b96816146cb565b97506020890135614ba6816146cb565b96506040890135614bb6816146cb565b95506060890135614bc6816146cb565b94506080890135614bd6816146cb565b935060a0890135614be6816146cb565b925060c08901356001600160401b03811115614c0157600080fd5b8901601f81018b13614c1257600080fd5b80356001600160401b03811115614c2857600080fd5b8b60208260051b8401011115614c3d57600080fd5b989b979a50959850939692959194602001935050565b80151581146139e957600080fd5b60008060408385031215614c7457600080fd5b8235614c7f816146cb565b91506020830135614ab181614c53565b60008060008060608587031215614ca557600080fd5b84359350614cb560208601614472565b925060408501356001600160401b03811115614cd057600080fd5b614cdc87828801614488565b95989497509550505050565b60008060008060808587031215614cfe57600080fd5b84356001600160401b03811115614d1457600080fd5b614d20878288016147ca565b94505060208501356001600160401b03811115614d3c57600080fd5b614d4887828801614831565b93505060408501356001600160401b03811115614d6457600080fd5b614d708782880161488f565b92505060608501356001600160401b0381111561478f57600080fd5b600080600080600060a08688031215614da457600080fd5b85356001600160401b03811115614dba57600080fd5b614dc6888289016147ca565b95505060208601356001600160401b03811115614de257600080fd5b614dee88828901614831565b94505060408601356001600160401b03811115614e0a57600080fd5b614e168882890161488f565b93505060608601356001600160401b03811115614e3257600080fd5b614e3e88828901614565565b925050614e4d60808701614472565b90509295509295909350565b600080600060608486031215614e6e57600080fd5b8335614e79816146cb565b92506020840135915060408401356001600160401b03811115614e9b57600080fd5b614ea786828701614565565b9150509250925092565b600080600060608486031215614ec657600080fd5b8335614ed1816146cb565b925060208401356001600160401b03811115614eec57600080fd5b614ef886828701614565565b93969395505050506040919091013590565b600080600080600080600060c0888a031215614f2557600080fd5b873596506020880135614f37816146cb565b9550614f4560408901614472565b945060608801356001600160401b03811115614f6057600080fd5b614f6c8a828b01614565565b9450506080880135925060a08801356001600160401b03811115614f8f57600080fd5b614f9b8a828b01614488565b989b979a50959850939692959293505050565b600060208284031215614fc057600080fd5b81356115bf816146cb565b60008060008060808587031215614fe157600080fd5b8435614fec816146cb565b935060208501356001600160401b0381111561500757600080fd5b61501387828801614565565b93505060408501356001600160401b0381111561502f57600080fd5b61503b87828801614565565b92505061504a60608601614472565b905092959194509250565b600080600080600060a0868803121561506d57600080fd5b8535615078816146cb565b94506020860135615088816146cb565b935060408601356001600160401b038111156150a357600080fd5b6150af88828901614831565b93505060608601356001600160401b038111156150cb57600080fd5b6150d788828901614831565b92505060808601356001600160401b03811115614b5657600080fd5b6000806000806060858703121561510957600080fd5b8435615114816146cb565b93506020850135925060408501356001600160401b03811115614cd057600080fd5b6000806040838503121561514957600080fd5b8235615154816146cb565b946020939093013593505050565b600080600080600060a0868803121561517a57600080fd5b8535615185816146cb565b94506020860135615195816146cb565b9350604086013592506060860135915060808601356001600160401b03811115614b5657600080fd5b600080604083850312156151d157600080fd5b8235915060208301356001600160401b0381168114614ab157600080fd5b8183823760009101908152919050565b600181811c9082168061521357607f821691505b60208210810361523357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b6000602082840312156152da57600080fd5b5051919050565b600081518084526020840193506020830160005b8281101561531c5781516001600160a01b03168652602095860195909101906001016152f5565b5093949350505050565b600081518084526020840193506020830160005b8281101561531c57815186526020958601959091019060010161533a565b600082825180855260208501945060208160051b8301016020850160005b838110156153a857601f1985840301885261539283835161468c565b6020988901989093509190910190600101615376565b50909695505050505050565b60a0815260006153c760a08301886152e1565b82810360208401526153d98188615326565b905082810360408401526153ed8187615358565b60608401959095525050608001529392505050565b60c08152600061541560c08301896152e1565b82810360208401526154278189615326565b9050828103604084015261543b8188615358565b60608401969096525050608081019290925260a0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccd57610ccd61545a565b60006020828403121561549557600080fd5b81516115bf81614c53565b61ffff811681146139e957600080fd5b6000808335601e198436030181126154c757600080fd5b83016020810192503590506001600160401b038111156154e657600080fd5b8036038213156144c957600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0384168152604060208201819052810182905260006060600584901b830181019083018583609e1936839003015b8782101561562257868503605f19018452823581811261557257600080fd5b8901803561557f816154a0565b61ffff1686526020810135615593816154a0565b61ffff1660208701526155a960408201826154b0565b60a060408901526155be60a0890182846154f5565b9150506155ce60608301836154b0565b88830360608a01526155e18382846154f5565b92505050608082013591506155f5826146cb565b6001600160a01b039190911660809690960195909552602093840193929092019160019190910190615553565b509298975050505050505050565b600061563e61458a8461453e565b905082815283838301111561565257600080fd5b6115bf836020830184614668565b600082601f83011261567157600080fd5b6115bf83835160208501615630565b8051614483816146cb565b60006020828403121561569d57600080fd5b81516001600160401b038111156156b357600080fd5b820160a081850312156156c557600080fd5b6156cd6144e6565b81516156d8816154a0565b815260208201516156e8816154a0565b602082015260408201516001600160401b0381111561570657600080fd5b61571286828501615660565b60408301525060608201516001600160401b0381111561573157600080fd5b61573d86828501615660565b60608301525061574f60808301615680565b6080820152949350505050565b6001600160401b038181168382160190811115610ccd57610ccd61545a565b6101008152600061579061010083018b6152e1565b82810360208401526157a2818b615326565b9050828103604084015280895180835260208301915060208160051b84010160208c0160005b838110156157fa57601f198684030185526157e483835161468c565b60209586019590935091909101906001016157c8565b5050858103606087015261580e818c615358565b935050505061582860808401886001600160401b03169052565b6001600160401b03861660a084015282810360c0840152615849818661468c565b91505061585b60e083018460ff169052565b9998505050505050505050565b828152604060208201526000610f55604083018461468c565b600082601f83011261589257600080fd5b81516158a061458a826147a7565b8082825260208201915060208360051b8601019250858311156158c257600080fd5b602085015b8381101561329f5780518352602092830192016158c7565b600082601f8301126158f057600080fd5b81516158fe61458a826147a7565b8082825260208201915060208360051b86010192508583111561592057600080fd5b602085015b8381101561329f5780516001600160401b0381111561594357600080fd5b8601603f8101881361595457600080fd5b61596688602083015160408401615630565b84525060209283019201615925565b60008060006060848603121561598a57600080fd5b83516001600160401b038111156159a057600080fd5b8401601f810186136159b157600080fd5b80516159bf61458a826147a7565b8082825260208201915060208360051b8501019250888311156159e157600080fd5b6020840193505b82841015615a0c5783516159fb816146cb565b8252602093840193909101906159e8565b8096505050505060208401516001600160401b03811115615a2c57600080fd5b615a3886828701615881565b92505060408401516001600160401b03811115615a5457600080fd5b614ea7868287016158df565b60208082526023908201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460408201526269766560e81b606082015260800190565b86815260018060a01b038616602082015260ff8516604082015283606082015260a060808201526000615ada60a0830184866154f5565b98975050505050505050565b86815260ff8616602082015284604082015260a060608201526000615b0e60a083018661468c565b828103608084015261585b8185876154f5565b81810381811115610ccd57610ccd61545a565b838152606060208201526000615b4d606083018561468c565b9050826040830152949350505050565b60a081526000615b7060a083018861468c565b6001600160401b03871660208401526001600160401b03861660408401528281036060840152615ba0818661468c565b91505060ff831660808301529695505050505050565b608081526000615bc960808301876152e1565b8281036020840152615bdb8187615326565b90508281036040840152615bef8186615358565b91505082606083015295945050505050565b6001600160a01b03858116825284166020820152608060408201819052600090615c2d9083018561468c565b905082606083015295945050505050565b8082028115828204841417610ccd57610ccd61545a565b600082615c7257634e487b7160e01b600052601260045260246000fd5b500490565b85815260018060a01b038516602082015260ff8416604082015282606082015260a0608082015260006113c760a083018461468c565b84815260ff84166020820152826040820152608060608201526000611927608083018461468c565b85815260ff8516602082015283604082015260a060608201526000615cfd60a083018561468c565b8281036080840152615ada818561468c565b634e487b7160e01b600052603260045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b601f82111561394a57806000526020600020601f840160051c81016020851015615d975750805b601f840160051c820191505b818110156134fb5760008155600101615da3565b81516001600160401b03811115615dd057615dd06144d0565b615de481615dde84546151ff565b84615d70565b6020601f821160018114615e185760008315615e005750848201515b600019600385901b1c1916600184901b1784556134fb565b600084815260208120601f198516915b82811015615e485787850151825560209485019460019092019101615e28565b5084821015615e665786840151600019600387901b60f8161c191681555b50505050600190811b0190555056fe476f7665726e6f723a2072656c617920726576657274656420776974686f7574206d657373616765737570706f72743d627261766f2671756f72756d3d616761696e73742c666f722c6162737461696e26706172616d733d6d6f64756c6573a264697066735822122055f568ce0b3d54aa2d048100bc9f76ceeea47e2ba43f3e8e00b5dfb8b13388e264736f6c634300081c0033
Deployed Bytecode
0x6080604052600436106103bc5760003560e01c80639c82ec3c116101f2578063cae6b6571161010d578063eb9019d4116100a0578063f89f6d921161006f578063f89f6d9214610c33578063f8ce560a14610c53578063fc0c546a14610c73578063ffa1ad7414610c9457600080fd5b8063eb9019d414610ba7578063ece40cc114610bc7578063f23a6e6114610be7578063f7903e9f14610c1357600080fd5b8063d978ffba116100dc578063d978ffba14610af2578063dd4e2ba514610b3e578063deaaa7cc14610b53578063ea0217cf14610b8757600080fd5b8063cae6b65714610a73578063d0ebdbe714610a93578063d33219b414610ab3578063d958bc1d14610ad257600080fd5b8063b9f5ee9a11610185578063c28bc2fa11610154578063c28bc2fa146109ef578063c59057e414610a02578063c762703e14610a22578063c792b5aa14610a4257600080fd5b8063b9f5ee9a1461096d578063bc0dd6f314610982578063bc197c81146109a3578063c01f9e37146109cf57600080fd5b8063ab58fb8e116101c1578063ab58fb8e14610905578063b375916114610925578063b3e4324214610938578063b58131b01461095857600080fd5b80639c82ec3c14610884578063a2c465d9146108a4578063a890c910146108c4578063a8b4aaf7146108e457600080fd5b8063452115d6116102e25780635f398a14116102755780637b3c71d3116102445780637b3c71d3146108045780637d5e81e2146108245780639a79018e146108445780639a802a6d1461086457600080fd5b80635f398a141461078457806370b0f660146107a457806378e243fe146107c45780637ac54f39146107e457600080fd5b8063544ffc9c116102b1578063544ffc9c146106c4578063548d463b1461071957806354fd4d501461073a578063567813881461076457600080fd5b8063452115d614610609578063481c6a75146106295780634870dd9a146106625780634b0813ff1461068b57600080fd5b80632656227d1161035a5780633932abb1116103295780633932abb1146105865780633bccf4fd1461059c5780633e4f49e6146105bc57806343859632146105e957600080fd5b80632656227d146104ff5780632d63f693146105125780632e9ba283146105325780632fe3e2611461055257600080fd5b806306fdde031161039657806306fdde0314610464578063078a13b114610486578063150b7a02146104a6578063160cbed7146104df57600080fd5b806301ffc9a7146103ef57806302a251a314610424578063034201811461044457600080fd5b366103ea57306103d56101cc546001600160a01b031690565b6001600160a01b0316146103e857600080fd5b005b600080fd5b3480156103fb57600080fd5b5061040f61040a366004614448565b610ca8565b60405190151581526020015b60405180910390f35b34801561043057600080fd5b50610195545b60405190815260200161041b565b34801561045057600080fd5b5061043661045f3660046145be565b610cd3565b34801561047057600080fd5b50610479610dcb565b60405161041b91906146b8565b34801561049257600080fd5b506103e86104a13660046146e0565b610e5d565b3480156104b257600080fd5b506104c66104c136600461473c565b610f4c565b6040516001600160e01b0319909116815260200161041b565b3480156104eb57600080fd5b506104366104fa366004614911565b610f5d565b61043661050d366004614911565b611161565b34801561051e57600080fd5b5061043661052d3660046149aa565b611261565b34801561053e57600080fd5b506103e861054d3660046149c3565b611298565b34801561055e57600080fd5b506104367fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af8881565b34801561059257600080fd5b5061019454610436565b3480156105a857600080fd5b506104366105b7366004614a00565b61135c565b3480156105c857600080fd5b506105dc6105d73660046149aa565b6113d2565b60405161041b9190614a64565b3480156105f557600080fd5b5061040f610604366004614a8c565b611569565b34801561061557600080fd5b50610436610624366004614911565b6115c6565b34801561063557600080fd5b506101c65461064a906001600160a01b031681565b6040516001600160a01b03909116815260200161041b565b34801561066e57600080fd5b5061067861271081565b60405161ffff909116815260200161041b565b34801561069757600080fd5b506104366106a6366004614a8c565b6101c860209081526000928352604080842090915290825290205481565b3480156106d057600080fd5b506106fe6106df3660046149aa565b600090815260fd60205260409020805460018201546002909201549092565b6040805193845260208401929092529082015260600161041b565b34801561072557600080fd5b506101c95461064a906001600160a01b031681565b34801561074657600080fd5b506040805180820190915260018152603160f81b6020820152610479565b34801561077057600080fd5b5061043661077f366004614abc565b6115df565b34801561079057600080fd5b5061043661079f366004614ae8565b611600565b3480156107b057600080fd5b506103e86107bf3660046149aa565b61164a565b3480156107d057600080fd5b506103e86107df366004614b6f565b6116a2565b3480156107f057600080fd5b506103e86107ff366004614c61565b611867565b34801561081057600080fd5b5061043661081f366004614c8f565b6118df565b34801561083057600080fd5b5061043661083f366004614ce8565b611931565b34801561085057600080fd5b5061043661085f366004614d8c565b61193d565b34801561087057600080fd5b5061043661087f366004614e59565b611ca7565b34801561089057600080fd5b5061043661089f366004614eb1565b611cb4565b3480156108b057600080fd5b506103e86108bf366004614f0a565b611f3b565b3480156108d057600080fd5b506103e86108df366004614fae565b6121bf565b3480156108f057600080fd5b506101cb5461064a906001600160a01b031681565b34801561091157600080fd5b506104366109203660046149aa565b6122d1565b610436610933366004614eb1565b61236d565b34801561094457600080fd5b50610436610953366004614fcb565b6124f5565b34801561096457600080fd5b50610436612906565b34801561097957600080fd5b50610436612917565b34801561098e57600080fd5b506101ca5461064a906001600160a01b031681565b3480156109af57600080fd5b506104c66109be366004615055565b63bc197c8160e01b95945050505050565b3480156109db57600080fd5b506104366109ea3660046149aa565b612986565b6103e86109fd3660046150f3565b6129b5565b348015610a0e57600080fd5b50610436610a1d366004614911565b612b33565b348015610a2e57600080fd5b50610436610a3d3660046149aa565b612b6d565b348015610a4e57600080fd5b5061040f610a5d366004614fae565b6101c76020526000908152604090205460ff1681565b348015610a7f57600080fd5b50610436610a8e366004614eb1565b612bdc565b348015610a9f57600080fd5b506103e8610aae366004614fae565b612c15565b348015610abf57600080fd5b506101cc546001600160a01b031661064a565b348015610ade57600080fd5b50610436610aed366004614eb1565b612cbf565b348015610afe57600080fd5b50610b2c610b0d3660046149aa565b600090815260cc6020526040902060020154600160b01b900460ff1690565b60405160ff909116815260200161041b565b348015610b4a57600080fd5b50610479612cd7565b348015610b5f57600080fd5b506104367f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f81565b348015610b9357600080fd5b506103e8610ba23660046149aa565b612cf7565b348015610bb357600080fd5b50610436610bc2366004615136565b612d4b565b348015610bd357600080fd5b506103e8610be23660046149aa565b612d6c565b348015610bf357600080fd5b506104c6610c02366004615162565b63f23a6e6160e01b95945050505050565b348015610c1f57600080fd5b506103e8610c2e3660046151be565b612dc0565b348015610c3f57600080fd5b506103e8610c4e366004614abc565b612e6c565b348015610c5f57600080fd5b50610436610c6e3660046149aa565b61308b565b348015610c7f57600080fd5b5061012f5461064a906001600160a01b031681565b348015610ca057600080fd5b506004610436565b60006001600160e01b03198216636e665ced60e01b1480610ccd5750610ccd826131c8565b92915050565b600080610d77610d6f7fb3b3f3b703cd84ce352197dcff232b1b5d3cfb2025ce47cf04742d0651f1af888c8c8c8c604051610d0f9291906151ef565b60405180910390208b80519060200120604051602001610d54959493929190948552602085019390935260ff9190911660408401526060830152608082015260a00190565b60405160208183030381529060405280519060200120613233565b868686613281565b9050610dbd8a828b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92506132a9915050565b9a9950505050505050505050565b606060cb8054610dda906151ff565b80601f0160208091040260200160405190810160405280929190818152602001828054610e06906151ff565b8015610e535780601f10610e2857610100808354040283529160200191610e53565b820191906000526020600020905b815481529060010190602001808311610e3657829003601f168201915b5050505050905090565b6004600054610100900460ff16158015610e7e575060005460ff8083169116105b610ea35760405162461bcd60e51b8152600401610e9a90615239565b60405180910390fd5b600080546101c980546001600160a01b038981166001600160a01b0319928316179092556101ca80548984169083161790556101cb8054888416908316179055436101ce556101cc80549287169290911691909117905561ffff191660ff83169081176101001761ff0019169091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b630a85bd0160e11b5b949350505050565b600080610f6c86868686612b33565b90506004610f79826113d2565b6007811115610f8a57610f8a614a4e565b14610fa75760405162461bcd60e51b8152600401610e9a90615287565b6101cc546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa158015610ff2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101691906152c8565b6101cc5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790611051908a908a908a906000908b906004016153b4565b602060405180830381865afa15801561106e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109291906152c8565b60008381526101cd6020526040808220929092556101cc5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb0916110df918b918b918b91908b908990600401615402565b600060405180830381600087803b1580156110f957600080fd5b505af115801561110d573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda289282824261113f9190615470565b6040805192835260208301919091520160405180910390a15095945050505050565b60008061117086868686612b33565b9050600561117d826113d2565b600781111561118e5761118e614a4e565b146111db5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f74207175657565640000006044820152606401610e9a565b600081815260cc602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906112299083815260200190565b60405180910390a161123e818787878761345d565b61124b8187878787613502565b6112588187878787613577565b95945050505050565b600081815260cc602090815260408083208151928301909152546001600160401b0316908190525b6001600160401b031692915050565b6101c9546001600160a01b0316336001600160a01b0316146112cd5760405163dcd3516f60e01b815260040160405180910390fd5b60008481526101c8602090815260408083206001600160a01b0387168452909152812080548392859291611302908490615470565b92505081905511156113565760405162461bcd60e51b815260206004820152601f60248201527f476f7665726e6f723a20746f74616c20776569676874206578636565646564006044820152606401610e9a565b50505050565b604080517f150214d74d59b7d1e90c73fc22ef3d991dd0a76b046543d4d80ab92d2a50328f602082015290810186905260ff8516606082015260009081906113aa90610d6f90608001610d54565b90506113c7878288604051806020016040528060008152506135bb565b979650505050505050565b6000806113de836135de565b905060048160078111156113f4576113f4614a4e565b146113ff5792915050565b6101ce541580159061143b57506101ce54600084815260cc6020908152604091829020825191820190925290546001600160401b031690819052105b156114495750600792915050565b60008381526101cd602052604090205480611465575092915050565b6101cc54604051632ab0f52960e01b8152600481018390526001600160a01b0390911690632ab0f52990602401602060405180830381865afa1580156114af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d39190615483565b156114e2575060079392505050565b6101cc54604051632c258a9f60e11b8152600481018390526001600160a01b039091169063584b153e90602401602060405180830381865afa15801561152c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115509190615483565b1561155f575060059392505050565b5060029392505050565b60008281526101c8602090815260408083206001600160a01b03851684529091528120541515806115bf5750600083815260fd602090815260408083206001600160a01b038616845260030190915290205460ff165b9392505050565b60006115d485858585612b33565b9050610f55816136de565b600080339050610f55848285604051806020016040528060008152506135bb565b6000803390506113c787828888888080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508a92506132a9915050565b6101c65433906001600160a01b0316811480159061167757506101cc546001600160a01b03828116911614155b156116955760405163d37050f360e01b815260040160405180910390fd5b61169e8261394f565b5050565b600054610100900460ff16158080156116c25750600054600160ff909116105b806116dc5750303b1580156116dc575060005460ff166001145b6116f85760405162461bcd60e51b8152600401610e9a90615239565b6000805460ff19166001179055801561171b576000805461ff0019166101001790555b611744604051806040016040528060088152602001674f7074696d69736d60c01b815250613992565b61174c6139ec565b61175589613a15565b6117656119af61b3cb6000613a45565b6101cb80546001600160a01b038087166001600160a01b031992831681179093556101ca80548c83169084161790556101c680548b83169084161790556101c980548a83169084161790556101cc805491891691909216179055604051634e8423db60e01b8152634e8423db906117e49030908790879060040161551e565b600060405180830381600087803b1580156117fe57600080fd5b505af1158015611812573d6000803e3d6000fd5b50505050801561185c576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050505050565b6101c65433906001600160a01b0316811480159061189457506101cc546001600160a01b03828116911614155b156118b25760405163d37050f360e01b815260040160405180910390fd5b506001600160a01b039190911660009081526101c760205260409020805460ff1916911515919091179055565b60008033905061192786828787878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506135bb92505050565b9695505050505050565b60006112588585858560005b6101c65460009033906001600160a01b0316811480159061196d57506101cc546001600160a01b03828116911614155b1561198b5760405163d37050f360e01b815260040160405180910390fd5b85518751146119ad57604051633465db5d60e11b815260040160405180910390fd5b84518751146119cf57604051633465db5d60e11b815260040160405180910390fd5b86516000036119f15760405163d377eca560e01b815260040160405180910390fd5b6101cb5460405163f48aef3360e01b815260ff851660048201526001600160a01b039091169063f48aef3390602401600060405180830381865afa158015611a3d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a65919081019061568b565b60400151511580611af657506101cb5460405163f48aef3360e01b815260ff851660048201526000916001600160a01b03169063f48aef3390602401600060405180830381865afa158015611abe573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ae6919081019061568b565b608001516001600160a01b031614155b15611b19576040516337d0292760e01b815260ff84166004820152602401610e9a565b611b2c8787878780519060200120612b33565b600081815260cc6020908152604091829020825191820190925281546001600160401b0316908190529193509015611b7757604051637031547960e11b815260040160405180910390fd5b6000611b8b611b866101945490565b613a77565b611b9443613a77565b611b9e919061575c565b90506000611baf611b866101955490565b611bb9908361575c565b9050611bc58383613ae3565b611bd26001840182613ae3565b60028301805460ff60b01b1916600160b01b60ff891602179055600383018054336001600160a01b031990911681179091558a5186907fc8df7ff219f3c0358e14500814d8b62b443a4bebf3a596baa60b9295b1cf1bde908d908d906001600160401b03811115611c4557611c456144d0565b604051908082528060200260200182016040528015611c7857816020015b6060815260200190600190039081611c635790505b508d88888f8f604051611c9298979695949392919061577b565b60405180910390a35050505095945050505050565b6000610f55848484613b01565b600080611cc2858585612bdc565b90506000806000876001600160a01b0316634e2b2bb385896040518363ffffffff1660e01b8152600401611cf7929190615868565b6000604051808303816000875af1158015611d16573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d3e9190810190615975565b919450925090506004611d50856113d2565b6007811115611d6157611d61614a4e565b14611d7e5760405162461bcd60e51b8152600401610e9a90615287565b6101cc546040805163793d064960e11b815290516000926001600160a01b03169163f27a0c929160048083019260209291908290030181865afa158015611dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ded91906152c8565b6101cc5460405163b1c5f42760e01b81529192506001600160a01b03169063b1c5f42790611e28908790879087906000908e906004016153b4565b602060405180830381865afa158015611e45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6991906152c8565b60008681526101cd6020526040808220929092556101cc5491516308f2a0bb60e41b81526001600160a01b0390921691638f2a0bb091611eb691889188918891908e908990600401615402565b600060405180830381600087803b158015611ed057600080fd5b505af1158015611ee4573d6000803e3d6000fd5b505050507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892858242611f169190615470565b6040805192835260208301919091520160405180910390a15092979650505050505050565b6101c9546001600160a01b0316336001600160a01b031614611f705760405163dcd3516f60e01b815260040160405180910390fd5b6001611f7b886113d2565b6007811115611f8c57611f8c614a4e565b14611fa95760405162461bcd60e51b8152600401610e9a90615a60565b600087815260fd602090815260408083206001600160a01b038a168452600381019092529091205460ff16612059576001600160a01b03871660009081526003820160209081526040808320805460ff191660011790558a835260cc825291829020825191820190925290546001600160401b0316815261204c90889061202e905190565b6001600160401b031660405180602001604052806000815250613b01565b6120569085615470565b93505b60ff861661208057838160000160008282546120759190615470565b909155506120d99050565b60001960ff8716016120a057838160010160008282546120759190615470565b60011960ff8716016120c057838160020160008282546120759190615470565b604051638eed55d160e01b815260040160405180910390fd5b600088815260cc60205260409020600201546201000090046001600160a01b03168015612169576040516313d72aeb60e21b81526001600160a01b03821690634f5cabac90612136908c908c908c908b908b908b90600401615aa3565b600060405180830381600087803b15801561215057600080fd5b505af1158015612164573d6000803e3d6000fd5b505050505b876001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb87128a89888a89896040516121ac96959493929190615ae6565b60405180910390a2505050505050505050565b6101cc546001600160a01b031633146122155760405162461bcd60e51b8152602060048201526018602482015277476f7665726e6f723a206f6e6c79476f7665726e616e636560401b6044820152606401610e9a565b306122296101cc546001600160a01b031690565b6001600160a01b03161461226657600080366040516122499291906151ef565b604051809103902090505b8061225f60cd613b78565b0361225457505b6101cc54604080516001600160a01b03928316815291831660208301527f08f74ea46ef7894f65eabfb5e6e695de773a000b47c529ab559178069b226401910160405180910390a16101cc80546001600160a01b0319166001600160a01b0392909216919091179055565b6101cc5460008281526101cd602052604080822054905163d45c443560e01b81526004810191909152909182916001600160a01b039091169063d45c443590602401602060405180830381865afa158015612330573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235491906152c8565b90508060011461236457806115bf565b60009392505050565b60008061237b858585612bdc565b90506000612388826113d2565b9050600581600781111561239e5761239e614a4e565b146123eb5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f74207175657565640000006044820152606401610e9a565b600082815260cc602052604090819020600201805460ff19166001179055517f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f906124399084815260200190565b60405180910390a16000806000886001600160a01b0316634e2b2bb3868a6040518363ffffffff1660e01b8152600401612474929190615868565b6000604051808303816000875af1158015612493573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124bb9190810190615975565b9250925092506124ce858484848b61345d565b6124db858484848b613502565b6124e8858484848b613577565b5092979650505050505050565b6101c65460009033906001600160a01b0316811480159061252557506101cc546001600160a01b03828116911614155b156125435760405163d37050f360e01b815260040160405180910390fd5b6101c65433906001600160a01b0316811461258e57612560612906565b61256f82610bc2600143615b21565b101561258e5760405163d9cd32f360e01b815260040160405180910390fd5b6001600160a01b03871660009081526101c7602052604090205460ff166125f75760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a206d6f64756c65206e6f7420617070726f7665640000006044820152606401610e9a565b6101cb5460405163f48aef3360e01b815260ff861660048201526001600160a01b039091169063f48aef3390602401600060405180830381865afa158015612643573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261266b919081019061568b565b604001515115806126fd57506101cb5460405163f48aef3360e01b815260ff861660048201526001600160a01b0389811692169063f48aef3390602401600060405180830381865afa1580156126c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126ed919081019061568b565b608001516001600160a01b031614155b15612720576040516337d0292760e01b815260ff85166004820152602401610e9a565b84516020860120612732888883612bdc565b600081815260cc6020908152604091829020825191820190925281546001600160401b031690819052919550901561277d57604051637031547960e11b815260040160405180910390fd5b600061278c611b866101945490565b61279543613a77565b61279f919061575c565b905060006127b0611b866101955490565b6127ba908361575c565b90506127c68383613ae3565b6127d36001840182613ae3565b8a8360020160026101000a8154816001600160a01b0302191690836001600160a01b03160217905550878360020160166101000a81548160ff021916908360ff160217905550848360030160006101000a8154816001600160a01b0302191690836001600160a01b031602179055508a6001600160a01b03166310b255bb888c876040518463ffffffff1660e01b815260040161287293929190615b34565b600060405180830381600087803b15801561288c57600080fd5b505af11580156128a0573d6000803e3d6000fd5b505050508a6001600160a01b0316856001600160a01b0316887f505ee268ba7fa7dab901965f6c2eae1ca9a1199856dd0d4147302feb4000d82f8d86868f8f6040516128f0959493929190615b5d565b60405180910390a4505050505050949350505050565b60006129126101965490565b905090565b6101ca5460408051635cfaf74d60e11b815290516000926001600160a01b03169163b9f5ee9a9160048083019260209291908290030181865afa158015612962573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291291906152c8565b600081815260cc602090815260408083208151928301909152600101546001600160401b031690819052611289565b6101cc546001600160a01b03163314612a0b5760405162461bcd60e51b8152602060048201526018602482015277476f7665726e6f723a206f6e6c79476f7665726e616e636560401b6044820152606401610e9a565b30612a1f6101cc546001600160a01b031690565b6001600160a01b031614612a5c5760008036604051612a3f9291906151ef565b604051809103902090505b80612a5560cd613b78565b03612a4a57505b6001600160a01b03841660009081526101c7602052604090205460ff1615612aa25760405163e22c3de160e01b81526001600160a01b0385166004820152602401610e9a565b600080856001600160a01b0316858585604051612ac09291906151ef565b60006040518083038185875af1925050503d8060008114612afd576040519150601f19603f3d011682016040523d82523d6000602084013e612b02565b606091505b5091509150612b2a8282604051806060016040528060288152602001615e7660289139613bf7565b50505050505050565b600084848484604051602001612b4c9493929190615bb6565b60408051601f19818403018152919052805160209091012095945050505050565b6101ca546040516363b1381f60e11b8152600481018390526000916001600160a01b03169063c762703e90602401602060405180830381865afa158015612bb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd91906152c8565b600030848484604051602001612bf59493929190615c01565b60408051601f198184030181529190528051602090910120949350505050565b6101c65433906001600160a01b03168114801590612c4257506101cc546001600160a01b03828116911614155b15612c605760405163d37050f360e01b815260040160405180910390fd5b6101c6546040516001600160a01b038085169216907fc64707e618a83637fc41ad1e3aa4242bd5fdd353f3d60bc0faf40db0d7d8607890600090a3506101c680546001600160a01b0319166001600160a01b0392909216919091179055565b6000612ccc848484612bdc565b90506115bf816136de565b6060604051806060016040528060378152602001615e9e60379139905090565b6101c65433906001600160a01b03168114801590612d2457506101cc546001600160a01b03828116911614155b15612d425760405163d37050f360e01b815260040160405180910390fd5b61169e82613c10565b60006115bf8383612d6760408051602081019091526000815290565b613b01565b6101c65433906001600160a01b03168114801590612d9957506101cc546001600160a01b03828116911614155b15612db75760405163d37050f360e01b815260040160405180910390fd5b61169e82613cb3565b6101c65433906001600160a01b03168114801590612ded57506101cc546001600160a01b03828116911614155b15612e0b5760405163d37050f360e01b815260040160405180910390fd5b600083815260cc60205260409020612e269060010183613ae3565b604080518481526001600160401b03841660208201527fa970323612abc91ce4b6fd8869dc11458f53fea39343e04625af3f2dc999b05d910160405180910390a1505050565b6101c65433906001600160a01b03168114801590612e9957506101cc546001600160a01b03828116911614155b15612eb75760405163d37050f360e01b815260040160405180910390fd5b612ec083611261565b600003612ee057604051630992f7ad60e01b815260040160405180910390fd5b6101cb5460405163f48aef3360e01b815260ff841660048201526001600160a01b039091169063f48aef3390602401600060405180830381865afa158015612f2c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f54919081019061568b565b604001515115806130005750600083815260cc602052604090819020600201546101cb54915163f48aef3360e01b815260ff85166004820152620100009091046001600160a01b0390811692169063f48aef3390602401600060405180830381865afa158015612fc8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ff0919081019061568b565b608001516001600160a01b031614155b15613023576040516337d0292760e01b815260ff83166004820152602401610e9a565b600083815260cc6020908152604091829020600201805460ff60b01b1916600160b01b60ff871690810291909117909155915191825284917f246d525ff8e335b248f75b3d1a095f4e8d1a2a65998704e5957f37b05e3eca00910160405180910390a2505050565b60008061309783611261565b905060006130a482612b6d565b90508060000361311f5761012f54604051632394e7a360e21b8152600481018490526001600160a01b0390911690638e539e8c90602401602060405180830381865afa1580156130f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061311c91906152c8565b90505b6101cb54600085815260cc60205260409081902060020154905163f48aef3360e01b8152600160b01b90910460ff166004820152612710916001600160a01b03169063f48aef3390602401600060405180830381865afa158015613187573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526131af919081019061568b565b516131be9061ffff1683615c3e565b610f559190615c55565b60006001600160e01b0319821663bf26d89760e01b14806131f957506001600160e01b031982166379dd796f60e01b145b8061321457506001600160e01b03198216630271189760e51b145b80610ccd57506301ffc9a760e01b6001600160e01b0319831614610ccd565b6000610ccd613240613cf6565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b600080600061329287878787613d71565b9150915061329f81613e35565b5095945050505050565b600060016132b6876113d2565b60078111156132c7576132c7614a4e565b146132e45760405162461bcd60e51b8152600401610e9a90615a60565b600086815260cc6020908152604091829020825191820190925290546001600160401b03169081905261331890869061202e565b90506133278686868486613f7f565b600086815260cc60205260409020600201546201000090046001600160a01b031680156133b5576040516313d72aeb60e21b81526001600160a01b03821690634f5cabac90613382908a908a908a9088908a90600401615c77565b600060405180830381600087803b15801561339c57600080fd5b505af11580156133b0573d6000803e3d6000fd5b505050505b825160000361340a57856001600160a01b03167fb8e138887d0aa13bab447e82de9d5c1777041ecd21ca36ba824ff1e6c07ddda4888785886040516133fd9493929190615cad565b60405180910390a261329f565b856001600160a01b03167fe2babfbac5889a709b63bb7f598b324e08bc5a4fb9ec647fb3cbc9ec07eb8712888785888860405161344b959493929190615cd5565b60405180910390a25095945050505050565b306134716101cc546001600160a01b031690565b6001600160a01b0316146134fb5760005b84518110156134f957306001600160a01b03168582815181106134a7576134a7615d0f565b60200260200101516001600160a01b0316036134f1576134f18382815181106134d2576134d2615d0f565b60200260200101518051906020012060cd6140f990919063ffffffff16565b600101613482565b505b5050505050565b6101cc5460405163e38335e560e01b81526001600160a01b039091169063e38335e590349061353e9088908890889060009089906004016153b4565b6000604051808303818588803b15801561355757600080fd5b505af115801561356b573d6000803e3d6000fd5b50505050505050505050565b3061358b6101cc546001600160a01b031690565b6001600160a01b0316146134fb5760cd54600f81810b600160801b909204900b13156134fb57600060cd556134fb565b6000611258858585856135d960408051602081019091526000815290565b6132a9565b600081815260cc60205260408120600281015460ff16156136025750600792915050565b6002810154610100900460ff161561361d5750600292915050565b600061362884611261565b90508060000361367a5760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a20756e6b6e6f776e2070726f706f73616c2069640000006044820152606401610e9a565b43811061368b575060009392505050565b600061369685612986565b90504381106136aa57506001949350505050565b6136b385614135565b80156136c357506136c38561418e565b156136d357506004949350505050565b506003949350505050565b6101c65433906001600160a01b031681148061370857506101cc546001600160a01b038281169116145b8061372f5750600082815260cc60205260409020600301546001600160a01b038281169116145b6137ab5760405162461bcd60e51b815260206004820152604160248201527f476f7665726e6f723a206f6e6c79206d616e616765722c20676f7665726e6f7260448201527f2074696d656c6f636b2c206f722070726f706f7365722063616e2063616e63656064820152601b60fa1b608482015260a401610e9a565b60006137b6836113d2565b905060028160078111156137cc576137cc614a4e565b141580156137ec575060068160078111156137e9576137e9614a4e565b14155b801561380a5750600781600781111561380757613807614a4e565b14155b6138565760405162461bcd60e51b815260206004820152601d60248201527f476f7665726e6f723a2070726f706f73616c206e6f74206163746976650000006044820152606401610e9a565b600083815260cc602052604090819020600201805461ff001916610100179055517f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c906138a69085815260200190565b60405180910390a160008381526101cd60205260409020541561394a576101cc5460008481526101cd60205260409081902054905163c4d252f560e01b81526001600160a01b039092169163c4d252f5916139079160040190815260200190565b600060405180830381600087803b15801561392157600080fd5b505af1158015613935573d6000803e3d6000fd5b50505060008481526101cd6020526040812055505b505050565b6101945460408051918252602082018390527fc565b045403dc03c2eea82b81a0465edad9e2e7fc4d97e11421c209da93d7a93910160405180910390a161019455565b600054610100900460ff166139b95760405162461bcd60e51b8152600401610e9a90615d25565b6139e0816139db6040805180820190915260018152603160f81b602082015290565b61431e565b6139e98161435f565b50565b600054610100900460ff16613a135760405162461bcd60e51b8152600401610e9a90615d25565b565b600054610100900460ff16613a3c5760405162461bcd60e51b8152600401610e9a90615d25565b6139e981614392565b600054610100900460ff16613a6c5760405162461bcd60e51b8152600401610e9a90615d25565b61394a8383836143dc565b60006001600160401b03821115613adf5760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608401610e9a565b5090565b815467ffffffffffffffff19166001600160401b0391909116179055565b61012f54604051630748d63560e31b81526001600160a01b038581166004830152602482018590526000921690633a46b1a890604401602060405180830381865afa158015613b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5591906152c8565b6000613b938254600f81810b600160801b909204900b131590565b15613bb157604051631ed9509560e11b815260040160405180910390fd5b508054600f0b6000818152600180840160205260408220805492905583546fffffffffffffffffffffffffffffffff191692016001600160801b03169190911790915590565b60608315613c065750816115bf565b6115bf838361441e565b60008111613c705760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f7253657474696e67733a20766f74696e6720706572696f6420604482015266746f6f206c6f7760c81b6064820152608401610e9a565b6101955460408051918252602082018390527f7e3f7f0708a84de9203036abaa450dccc85ad5ff52f78c170f3edb55cf5e8828910160405180910390a161019555565b6101965460408051918252602082018390527fccb45da8d5717e6c4544694297c4ba5cf151d455c9bb0ed4fc7a38411bc05461910160405180910390a161019655565b60006129127f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f613d2560655490565b6066546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115613da85750600090506003613e2c565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613dfc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116613e2557600060019250925050613e2c565b9150600090505b94509492505050565b6000816004811115613e4957613e49614a4e565b03613e515750565b6001816004811115613e6557613e65614a4e565b03613eb25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610e9a565b6002816004811115613ec657613ec6614a4e565b03613f135760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610e9a565b6003816004811115613f2757613f27614a4e565b036139e95760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610e9a565b600085815260fd602090815260408083206001600160a01b0388168452600381019092529091205460ff16156140075760405162461bcd60e51b815260206004820152602760248201527f476f7665726e6f72566f74696e6753696d706c653a20766f746520616c726561604482015266191e4818d85cdd60ca1b6064820152608401610e9a565b6001600160a01b03851660009081526003820160205260409020805460ff1916600117905560ff841661405357828160000160008282546140489190615470565b909155506134f99050565b60001960ff85160161407357828160010160008282546140489190615470565b60011960ff85160161409357828160020160008282546140489190615470565b60405162461bcd60e51b815260206004820152603560248201527f476f7665726e6f72566f74696e6753696d706c653a20696e76616c69642076616044820152746c756520666f7220656e756d20566f74655479706560581b6064820152608401610e9a565b8154600160801b90819004600f0b6000818152600180860160205260409091209390935583546001600160801b03908116939091011602179055565b60008060008061415e85600090815260fd60205260409020805460018201546002909201549092565b91945092509050806141708385615470565b61417a9190615470565b6141838661308b565b111595945050505050565b600081815260cc6020526040812060028101546201000090046001600160a01b0316801561422d5760405163a54bd3eb60e01b8152600481018590526001600160a01b0382169063a54bd3eb90602401602060405180830381865afa1580156141fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061421f9190615483565b61422d575060009392505050565b6101cb54600283015460405163f48aef3360e01b8152600160b01b90910460ff1660048201526000916001600160a01b03169063f48aef3390602401600060405180830381865afa158015614286573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526142ae919081019061568b565b6020015161ffff169050806000036142cb57506001949350505050565b600085815260fd6020526040812060018101548154919290916142ee9083615470565b9050801561431357838161430461271085615c3e565b61430e9190615c55565b101596505b505050505050919050565b600054610100900460ff166143455760405162461bcd60e51b8152600401610e9a90615d25565b815160209283012081519190920120606591909155606655565b600054610100900460ff166143865760405162461bcd60e51b8152600401610e9a90615d25565b60cb61169e8282615db7565b600054610100900460ff166143b95760405162461bcd60e51b8152600401610e9a90615d25565b61012f80546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff166144035760405162461bcd60e51b8152600401610e9a90615d25565b61440c8361394f565b61441582613c10565b61394a81613cb3565b81511561442e5781518083602001fd5b8060405162461bcd60e51b8152600401610e9a91906146b8565b60006020828403121561445a57600080fd5b81356001600160e01b0319811681146115bf57600080fd5b803560ff8116811461448357600080fd5b919050565b60008083601f84011261449a57600080fd5b5081356001600160401b038111156144b157600080fd5b6020830191508360208285010111156144c957600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b0381118282101715614508576145086144d0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614536576145366144d0565b604052919050565b60006001600160401b03821115614557576145576144d0565b50601f01601f191660200190565b600082601f83011261457657600080fd5b813560208301600061458f61458a8461453e565b61450e565b90508281528583830111156145a357600080fd5b82826020830137600092810160200192909252509392505050565b60008060008060008060008060e0898b0312156145da57600080fd5b883597506145ea60208a01614472565b965060408901356001600160401b0381111561460557600080fd5b6146118b828c01614488565b90975095505060608901356001600160401b0381111561463057600080fd5b61463c8b828c01614565565b94505061464b60808a01614472565b979a969950949793969295929450505060a08201359160c0013590565b60005b8381101561468357818101518382015260200161466b565b50506000910152565b600081518084526146a4816020860160208601614668565b601f01601f19169290920160200192915050565b6020815260006115bf602083018461468c565b6001600160a01b03811681146139e957600080fd5b600080600080608085870312156146f657600080fd5b8435614701816146cb565b93506020850135614711816146cb565b92506040850135614721816146cb565b91506060850135614731816146cb565b939692955090935050565b6000806000806080858703121561475257600080fd5b843561475d816146cb565b9350602085013561476d816146cb565b92506040850135915060608501356001600160401b0381111561478f57600080fd5b61479b87828801614565565b91505092959194509250565b60006001600160401b038211156147c0576147c06144d0565b5060051b60200190565b600082601f8301126147db57600080fd5b81356147e961458a826147a7565b8082825260208201915060208360051b86010192508583111561480b57600080fd5b602085015b8381101561329f578035614823816146cb565b835260209283019201614810565b600082601f83011261484257600080fd5b813561485061458a826147a7565b8082825260208201915060208360051b86010192508583111561487257600080fd5b602085015b8381101561329f578035835260209283019201614877565b600082601f8301126148a057600080fd5b81356148ae61458a826147a7565b8082825260208201915060208360051b8601019250858311156148d057600080fd5b602085015b8381101561329f5780356001600160401b038111156148f357600080fd5b614902886020838a0101614565565b845250602092830192016148d5565b6000806000806080858703121561492757600080fd5b84356001600160401b0381111561493d57600080fd5b614949878288016147ca565b94505060208501356001600160401b0381111561496557600080fd5b61497187828801614831565b93505060408501356001600160401b0381111561498d57600080fd5b6149998782880161488f565b949793965093946060013593505050565b6000602082840312156149bc57600080fd5b5035919050565b600080600080608085870312156149d957600080fd5b8435935060208501356149eb816146cb565b93969395505050506040820135916060013590565b600080600080600060a08688031215614a1857600080fd5b85359450614a2860208701614472565b9350614a3660408701614472565b94979396509394606081013594506080013592915050565b634e487b7160e01b600052602160045260246000fd5b6020810160088310614a8657634e487b7160e01b600052602160045260246000fd5b91905290565b60008060408385031215614a9f57600080fd5b823591506020830135614ab1816146cb565b809150509250929050565b60008060408385031215614acf57600080fd5b82359150614adf60208401614472565b90509250929050565b600080600080600060808688031215614b0057600080fd5b85359450614b1060208701614472565b935060408601356001600160401b03811115614b2b57600080fd5b614b3788828901614488565b90945092505060608601356001600160401b03811115614b5657600080fd5b614b6288828901614565565b9150509295509295909350565b60008060008060008060008060e0898b031215614b8b57600080fd5b8835614b96816146cb565b97506020890135614ba6816146cb565b96506040890135614bb6816146cb565b95506060890135614bc6816146cb565b94506080890135614bd6816146cb565b935060a0890135614be6816146cb565b925060c08901356001600160401b03811115614c0157600080fd5b8901601f81018b13614c1257600080fd5b80356001600160401b03811115614c2857600080fd5b8b60208260051b8401011115614c3d57600080fd5b989b979a50959850939692959194602001935050565b80151581146139e957600080fd5b60008060408385031215614c7457600080fd5b8235614c7f816146cb565b91506020830135614ab181614c53565b60008060008060608587031215614ca557600080fd5b84359350614cb560208601614472565b925060408501356001600160401b03811115614cd057600080fd5b614cdc87828801614488565b95989497509550505050565b60008060008060808587031215614cfe57600080fd5b84356001600160401b03811115614d1457600080fd5b614d20878288016147ca565b94505060208501356001600160401b03811115614d3c57600080fd5b614d4887828801614831565b93505060408501356001600160401b03811115614d6457600080fd5b614d708782880161488f565b92505060608501356001600160401b0381111561478f57600080fd5b600080600080600060a08688031215614da457600080fd5b85356001600160401b03811115614dba57600080fd5b614dc6888289016147ca565b95505060208601356001600160401b03811115614de257600080fd5b614dee88828901614831565b94505060408601356001600160401b03811115614e0a57600080fd5b614e168882890161488f565b93505060608601356001600160401b03811115614e3257600080fd5b614e3e88828901614565565b925050614e4d60808701614472565b90509295509295909350565b600080600060608486031215614e6e57600080fd5b8335614e79816146cb565b92506020840135915060408401356001600160401b03811115614e9b57600080fd5b614ea786828701614565565b9150509250925092565b600080600060608486031215614ec657600080fd5b8335614ed1816146cb565b925060208401356001600160401b03811115614eec57600080fd5b614ef886828701614565565b93969395505050506040919091013590565b600080600080600080600060c0888a031215614f2557600080fd5b873596506020880135614f37816146cb565b9550614f4560408901614472565b945060608801356001600160401b03811115614f6057600080fd5b614f6c8a828b01614565565b9450506080880135925060a08801356001600160401b03811115614f8f57600080fd5b614f9b8a828b01614488565b989b979a50959850939692959293505050565b600060208284031215614fc057600080fd5b81356115bf816146cb565b60008060008060808587031215614fe157600080fd5b8435614fec816146cb565b935060208501356001600160401b0381111561500757600080fd5b61501387828801614565565b93505060408501356001600160401b0381111561502f57600080fd5b61503b87828801614565565b92505061504a60608601614472565b905092959194509250565b600080600080600060a0868803121561506d57600080fd5b8535615078816146cb565b94506020860135615088816146cb565b935060408601356001600160401b038111156150a357600080fd5b6150af88828901614831565b93505060608601356001600160401b038111156150cb57600080fd5b6150d788828901614831565b92505060808601356001600160401b03811115614b5657600080fd5b6000806000806060858703121561510957600080fd5b8435615114816146cb565b93506020850135925060408501356001600160401b03811115614cd057600080fd5b6000806040838503121561514957600080fd5b8235615154816146cb565b946020939093013593505050565b600080600080600060a0868803121561517a57600080fd5b8535615185816146cb565b94506020860135615195816146cb565b9350604086013592506060860135915060808601356001600160401b03811115614b5657600080fd5b600080604083850312156151d157600080fd5b8235915060208301356001600160401b0381168114614ab157600080fd5b8183823760009101908152919050565b600181811c9082168061521357607f821691505b60208210810361523357634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f476f7665726e6f723a2070726f706f73616c206e6f74207375636365737366756040820152601b60fa1b606082015260800190565b6000602082840312156152da57600080fd5b5051919050565b600081518084526020840193506020830160005b8281101561531c5781516001600160a01b03168652602095860195909101906001016152f5565b5093949350505050565b600081518084526020840193506020830160005b8281101561531c57815186526020958601959091019060010161533a565b600082825180855260208501945060208160051b8301016020850160005b838110156153a857601f1985840301885261539283835161468c565b6020988901989093509190910190600101615376565b50909695505050505050565b60a0815260006153c760a08301886152e1565b82810360208401526153d98188615326565b905082810360408401526153ed8187615358565b60608401959095525050608001529392505050565b60c08152600061541560c08301896152e1565b82810360208401526154278189615326565b9050828103604084015261543b8188615358565b60608401969096525050608081019290925260a0909101529392505050565b634e487b7160e01b600052601160045260246000fd5b80820180821115610ccd57610ccd61545a565b60006020828403121561549557600080fd5b81516115bf81614c53565b61ffff811681146139e957600080fd5b6000808335601e198436030181126154c757600080fd5b83016020810192503590506001600160401b038111156154e657600080fd5b8036038213156144c957600080fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b6001600160a01b0384168152604060208201819052810182905260006060600584901b830181019083018583609e1936839003015b8782101561562257868503605f19018452823581811261557257600080fd5b8901803561557f816154a0565b61ffff1686526020810135615593816154a0565b61ffff1660208701526155a960408201826154b0565b60a060408901526155be60a0890182846154f5565b9150506155ce60608301836154b0565b88830360608a01526155e18382846154f5565b92505050608082013591506155f5826146cb565b6001600160a01b039190911660809690960195909552602093840193929092019160019190910190615553565b509298975050505050505050565b600061563e61458a8461453e565b905082815283838301111561565257600080fd5b6115bf836020830184614668565b600082601f83011261567157600080fd5b6115bf83835160208501615630565b8051614483816146cb565b60006020828403121561569d57600080fd5b81516001600160401b038111156156b357600080fd5b820160a081850312156156c557600080fd5b6156cd6144e6565b81516156d8816154a0565b815260208201516156e8816154a0565b602082015260408201516001600160401b0381111561570657600080fd5b61571286828501615660565b60408301525060608201516001600160401b0381111561573157600080fd5b61573d86828501615660565b60608301525061574f60808301615680565b6080820152949350505050565b6001600160401b038181168382160190811115610ccd57610ccd61545a565b6101008152600061579061010083018b6152e1565b82810360208401526157a2818b615326565b9050828103604084015280895180835260208301915060208160051b84010160208c0160005b838110156157fa57601f198684030185526157e483835161468c565b60209586019590935091909101906001016157c8565b5050858103606087015261580e818c615358565b935050505061582860808401886001600160401b03169052565b6001600160401b03861660a084015282810360c0840152615849818661468c565b91505061585b60e083018460ff169052565b9998505050505050505050565b828152604060208201526000610f55604083018461468c565b600082601f83011261589257600080fd5b81516158a061458a826147a7565b8082825260208201915060208360051b8601019250858311156158c257600080fd5b602085015b8381101561329f5780518352602092830192016158c7565b600082601f8301126158f057600080fd5b81516158fe61458a826147a7565b8082825260208201915060208360051b86010192508583111561592057600080fd5b602085015b8381101561329f5780516001600160401b0381111561594357600080fd5b8601603f8101881361595457600080fd5b61596688602083015160408401615630565b84525060209283019201615925565b60008060006060848603121561598a57600080fd5b83516001600160401b038111156159a057600080fd5b8401601f810186136159b157600080fd5b80516159bf61458a826147a7565b8082825260208201915060208360051b8501019250888311156159e157600080fd5b6020840193505b82841015615a0c5783516159fb816146cb565b8252602093840193909101906159e8565b8096505050505060208401516001600160401b03811115615a2c57600080fd5b615a3886828701615881565b92505060408401516001600160401b03811115615a5457600080fd5b614ea7868287016158df565b60208082526023908201527f476f7665726e6f723a20766f7465206e6f742063757272656e746c792061637460408201526269766560e81b606082015260800190565b86815260018060a01b038616602082015260ff8516604082015283606082015260a060808201526000615ada60a0830184866154f5565b98975050505050505050565b86815260ff8616602082015284604082015260a060608201526000615b0e60a083018661468c565b828103608084015261585b8185876154f5565b81810381811115610ccd57610ccd61545a565b838152606060208201526000615b4d606083018561468c565b9050826040830152949350505050565b60a081526000615b7060a083018861468c565b6001600160401b03871660208401526001600160401b03861660408401528281036060840152615ba0818661468c565b91505060ff831660808301529695505050505050565b608081526000615bc960808301876152e1565b8281036020840152615bdb8187615326565b90508281036040840152615bef8186615358565b91505082606083015295945050505050565b6001600160a01b03858116825284166020820152608060408201819052600090615c2d9083018561468c565b905082606083015295945050505050565b8082028115828204841417610ccd57610ccd61545a565b600082615c7257634e487b7160e01b600052601260045260246000fd5b500490565b85815260018060a01b038516602082015260ff8416604082015282606082015260a0608082015260006113c760a083018461468c565b84815260ff84166020820152826040820152608060608201526000611927608083018461468c565b85815260ff8516602082015283604082015260a060608201526000615cfd60a083018561468c565b8281036080840152615ada818561468c565b634e487b7160e01b600052603260045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b601f82111561394a57806000526020600020601f840160051c81016020851015615d975750805b601f840160051c820191505b818110156134fb5760008155600101615da3565b81516001600160401b03811115615dd057615dd06144d0565b615de481615dde84546151ff565b84615d70565b6020601f821160018114615e185760008315615e005750848201515b600019600385901b1c1916600184901b1784556134fb565b600084815260208120601f198516915b82811015615e485787850151825560209485019460019092019101615e28565b5084821015615e665786840151600019600387901b60f8161c191681555b50505050600190811b0190555056fe476f7665726e6f723a2072656c617920726576657274656420776974686f7574206d657373616765737570706f72743d627261766f2671756f72756d3d616761696e73742c666f722c6162737461696e26706172616d733d6d6f64756c6573a264697066735822122055f568ce0b3d54aa2d048100bc9f76ceeea47e2ba43f3e8e00b5dfb8b13388e264736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.