Overview
ETH Balance
0.02731039882865928 ETH
Eth Value
$91.49 (@ $3,350.08/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
18454069 | 425 days ago | 0.00055545 ETH | ||||
18361521 | 438 days ago | 5 ETH | ||||
18361521 | 438 days ago | 5 ETH | ||||
18359513 | 439 days ago | 0.00052419 ETH | ||||
18347892 | 440 days ago | 0.00052792 ETH | ||||
18250201 | 454 days ago | 0.00054367 ETH | ||||
18152249 | 468 days ago | 0.0005505 ETH | ||||
18128236 | 471 days ago | 0.00059535 ETH | ||||
18125541 | 471 days ago | 0.2 ETH | ||||
18125541 | 471 days ago | 0.14 ETH | ||||
18125541 | 471 days ago | 0.15 ETH | ||||
18125541 | 471 days ago | 0.18 ETH | ||||
18125541 | 471 days ago | 0.11 ETH | ||||
18125541 | 471 days ago | 0.5 ETH | ||||
18125541 | 471 days ago | 0.07 ETH | ||||
18125541 | 471 days ago | 1.35 ETH | ||||
18125541 | 471 days ago | 2.7 ETH | ||||
18061037 | 481 days ago | 0.00055107 ETH | ||||
17970353 | 493 days ago | Contract Creation | 0 ETH | |||
17955271 | 495 days ago | 0.00055504 ETH | ||||
17920653 | 500 days ago | 0.00064343 ETH | ||||
17827826 | 513 days ago | Contract Creation | 0 ETH | |||
17811481 | 515 days ago | 0.00056135 ETH | ||||
17804378 | 516 days ago | 0.00058839 ETH | ||||
17722734 | 528 days ago | 0.00062433 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Executor
Compiler Version
v0.7.5+commit.eb77ed08
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-10 */ // SPDX-License-Identifier: agpl-3.0 pragma solidity 0.7.5; pragma abicoder v2; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when 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. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } interface IGovernanceStrategy { /** * @dev Returns the Proposition Power of a user at a specific block number. * @param user Address of the user. * @param blockNumber Blocknumber at which to fetch Proposition Power * @return Power number **/ function getPropositionPowerAt(address user, uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of Outstanding Proposition Tokens * @param blockNumber Blocknumber at which to evaluate * @return total supply at blockNumber **/ function getTotalPropositionSupplyAt(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the total supply of Outstanding Voting Tokens * @param blockNumber Blocknumber at which to evaluate * @return total supply at blockNumber **/ function getTotalVotingSupplyAt(uint256 blockNumber) external view returns (uint256); /** * @dev Returns the Vote Power of a user at a specific block number. * @param user Address of the user. * @param blockNumber Blocknumber at which to fetch Vote Power * @return Vote number **/ function getVotingPowerAt(address user, uint256 blockNumber) external view returns (uint256); } interface IAaveGovernanceV2 { enum ProposalState {Pending, Canceled, Active, Failed, Succeeded, Queued, Expired, Executed} struct Vote { bool support; uint248 votingPower; } struct Proposal { uint256 id; address creator; IExecutorWithTimelock executor; address[] targets; uint256[] values; string[] signatures; bytes[] calldatas; bool[] withDelegatecalls; uint256 startBlock; uint256 endBlock; uint256 executionTime; uint256 forVotes; uint256 againstVotes; bool executed; bool canceled; address strategy; bytes32 ipfsHash; mapping(address => Vote) votes; } struct ProposalWithoutVotes { uint256 id; address creator; IExecutorWithTimelock executor; address[] targets; uint256[] values; string[] signatures; bytes[] calldatas; bool[] withDelegatecalls; uint256 startBlock; uint256 endBlock; uint256 executionTime; uint256 forVotes; uint256 againstVotes; bool executed; bool canceled; address strategy; bytes32 ipfsHash; } /** * @dev emitted when a new proposal is created * @param id Id of the proposal * @param creator address of the creator * @param executor The ExecutorWithTimelock contract that will execute the proposal * @param targets list of contracts called by proposal's associated transactions * @param values list of value in wei for each propoposal's associated transaction * @param signatures list of function signatures (can be empty) to be used when created the callData * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments * @param withDelegatecalls boolean, true = transaction delegatecalls the taget, else calls the target * @param startBlock block number when vote starts * @param endBlock block number when vote ends * @param strategy address of the governanceStrategy contract * @param ipfsHash IPFS hash of the proposal **/ event ProposalCreated( uint256 id, address indexed creator, IExecutorWithTimelock indexed executor, address[] targets, uint256[] values, string[] signatures, bytes[] calldatas, bool[] withDelegatecalls, uint256 startBlock, uint256 endBlock, address strategy, bytes32 ipfsHash ); /** * @dev emitted when a proposal is canceled * @param id Id of the proposal **/ event ProposalCanceled(uint256 id); /** * @dev emitted when a proposal is queued * @param id Id of the proposal * @param executionTime time when proposal underlying transactions can be executed * @param initiatorQueueing address of the initiator of the queuing transaction **/ event ProposalQueued(uint256 id, uint256 executionTime, address indexed initiatorQueueing); /** * @dev emitted when a proposal is executed * @param id Id of the proposal * @param initiatorExecution address of the initiator of the execution transaction **/ event ProposalExecuted(uint256 id, address indexed initiatorExecution); /** * @dev emitted when a vote is registered * @param id Id of the proposal * @param voter address of the voter * @param support boolean, true = vote for, false = vote against * @param votingPower Power of the voter/vote **/ event VoteEmitted(uint256 id, address indexed voter, bool support, uint256 votingPower); event GovernanceStrategyChanged(address indexed newStrategy, address indexed initiatorChange); event VotingDelayChanged(uint256 newVotingDelay, address indexed initiatorChange); event ExecutorAuthorized(address executor); event ExecutorUnauthorized(address executor); /** * @dev Creates a Proposal (needs Proposition Power of creator > Threshold) * @param executor The ExecutorWithTimelock contract that will execute the proposal * @param targets list of contracts called by proposal's associated transactions * @param values list of value in wei for each propoposal's associated transaction * @param signatures list of function signatures (can be empty) to be used when created the callData * @param calldatas list of calldatas: if associated signature empty, calldata ready, else calldata is arguments * @param withDelegatecalls if true, transaction delegatecalls the taget, else calls the target * @param ipfsHash IPFS hash of the proposal **/ function create( IExecutorWithTimelock executor, address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, bool[] memory withDelegatecalls, bytes32 ipfsHash ) external returns (uint256); /** * @dev Cancels a Proposal, * either at anytime by guardian * or when proposal is Pending/Active and threshold no longer reached * @param proposalId id of the proposal **/ function cancel(uint256 proposalId) external; /** * @dev Queue the proposal (If Proposal Succeeded) * @param proposalId id of the proposal to queue **/ function queue(uint256 proposalId) external; /** * @dev Execute the proposal (If Proposal Queued) * @param proposalId id of the proposal to execute **/ function execute(uint256 proposalId) external payable; /** * @dev Function allowing msg.sender to vote for/against a proposal * @param proposalId id of the proposal * @param support boolean, true = vote for, false = vote against **/ function submitVote(uint256 proposalId, bool support) external; /** * @dev Function to register the vote of user that has voted offchain via signature * @param proposalId id of the proposal * @param support boolean, true = vote for, false = vote against * @param v v part of the voter signature * @param r r part of the voter signature * @param s s part of the voter signature **/ function submitVoteBySignature( uint256 proposalId, bool support, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Set new GovernanceStrategy * Note: owner should be a timelocked executor, so needs to make a proposal * @param governanceStrategy new Address of the GovernanceStrategy contract **/ function setGovernanceStrategy(address governanceStrategy) external; /** * @dev Set new Voting Delay (delay before a newly created proposal can be voted on) * Note: owner should be a timelocked executor, so needs to make a proposal * @param votingDelay new voting delay in seconds **/ function setVotingDelay(uint256 votingDelay) external; /** * @dev Add new addresses to the list of authorized executors * @param executors list of new addresses to be authorized executors **/ function authorizeExecutors(address[] memory executors) external; /** * @dev Remove addresses to the list of authorized executors * @param executors list of addresses to be removed as authorized executors **/ function unauthorizeExecutors(address[] memory executors) external; /** * @dev Let the guardian abdicate from its priviledged rights **/ function __abdicate() external; /** * @dev Getter of the current GovernanceStrategy address * @return The address of the current GovernanceStrategy contracts **/ function getGovernanceStrategy() external view returns (address); /** * @dev Getter of the current Voting Delay (delay before a created proposal can be voted on) * Different from the voting duration * @return The voting delay in seconds **/ function getVotingDelay() external view returns (uint256); /** * @dev Returns whether an address is an authorized executor * @param executor address to evaluate as authorized executor * @return true if authorized **/ function isExecutorAuthorized(address executor) external view returns (bool); /** * @dev Getter the address of the guardian, that can mainly cancel proposals * @return The address of the guardian **/ function getGuardian() external view returns (address); /** * @dev Getter of the proposal count (the current number of proposals ever created) * @return the proposal count **/ function getProposalsCount() external view returns (uint256); /** * @dev Getter of a proposal by id * @param proposalId id of the proposal to get * @return the proposal as ProposalWithoutVotes memory object **/ function getProposalById(uint256 proposalId) external view returns (ProposalWithoutVotes memory); /** * @dev Getter of the Vote of a voter about a proposal * Note: Vote is a struct: ({bool support, uint248 votingPower}) * @param proposalId id of the proposal * @param voter address of the voter * @return The associated Vote memory object **/ function getVoteOnProposal(uint256 proposalId, address voter) external view returns (Vote memory); /** * @dev Get the current state of a proposal * @param proposalId id of the proposal * @return The current state if the proposal **/ function getProposalState(uint256 proposalId) external view returns (ProposalState); } interface IExecutorWithTimelock { /** * @dev emitted when a new pending admin is set * @param newPendingAdmin address of the new pending admin **/ event NewPendingAdmin(address newPendingAdmin); /** * @dev emitted when a new admin is set * @param newAdmin address of the new admin **/ event NewAdmin(address newAdmin); /** * @dev emitted when a new delay (between queueing and execution) is set * @param delay new delay **/ event NewDelay(uint256 delay); /** * @dev emitted when a new (trans)action is Queued. * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ event QueuedAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall ); /** * @dev emitted when an action is Cancelled * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ event CancelledAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall ); /** * @dev emitted when an action is Cancelled * @param actionHash hash of the action * @param target address of the targeted contract * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target * @param resultData the actual callData used on the target **/ event ExecutedAction( bytes32 actionHash, address indexed target, uint256 value, string signature, bytes data, uint256 executionTime, bool withDelegatecall, bytes resultData ); /** * @dev Getter of the current admin address (should be governance) * @return The address of the current admin **/ function getAdmin() external view returns (address); /** * @dev Getter of the current pending admin address * @return The address of the pending admin **/ function getPendingAdmin() external view returns (address); /** * @dev Getter of the delay between queuing and execution * @return The delay in seconds **/ function getDelay() external view returns (uint256); /** * @dev Returns whether an action (via actionHash) is queued * @param actionHash hash of the action to be checked * keccak256(abi.encode(target, value, signature, data, executionTime, withDelegatecall)) * @return true if underlying action of actionHash is queued **/ function isActionQueued(bytes32 actionHash) external view returns (bool); /** * @dev Checks whether a proposal is over its grace period * @param governance Governance contract * @param proposalId Id of the proposal against which to test * @return true of proposal is over grace period **/ function isProposalOverGracePeriod(IAaveGovernanceV2 governance, uint256 proposalId) external view returns (bool); /** * @dev Getter of grace period constant * @return grace period in seconds **/ function GRACE_PERIOD() external view returns (uint256); /** * @dev Getter of minimum delay constant * @return minimum delay in seconds **/ function MINIMUM_DELAY() external view returns (uint256); /** * @dev Getter of maximum delay constant * @return maximum delay in seconds **/ function MAXIMUM_DELAY() external view returns (uint256); /** * @dev Function, called by Governance, that queue a transaction, returns action hash * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function queueTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external returns (bytes32); /** * @dev Function, called by Governance, that cancels a transaction, returns the callData executed * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function executeTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external payable returns (bytes memory); /** * @dev Function, called by Governance, that cancels a transaction, returns action hash * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target **/ function cancelTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) external returns (bytes32); } /** * @title Time Locked Executor Contract, inherited by Aave Governance Executors * @dev Contract that can queue, execute, cancel transactions voted by Governance * Queued transactions can be executed after a delay and until * Grace period is not over. * @author Aave **/ contract ExecutorWithTimelock is IExecutorWithTimelock { using SafeMath for uint256; uint256 public immutable override GRACE_PERIOD; uint256 public immutable override MINIMUM_DELAY; uint256 public immutable override MAXIMUM_DELAY; address private _admin; address private _pendingAdmin; uint256 private _delay; mapping(bytes32 => bool) private _queuedTransactions; /** * @dev Constructor * @param admin admin address, that can call the main functions, (Governance) * @param delay minimum time between queueing and execution of proposal * @param gracePeriod time after `delay` while a proposal can be executed * @param minimumDelay lower threshold of `delay`, in seconds * @param maximumDelay upper threhold of `delay`, in seconds **/ constructor( address admin, uint256 delay, uint256 gracePeriod, uint256 minimumDelay, uint256 maximumDelay ) { require(delay >= minimumDelay, 'DELAY_SHORTER_THAN_MINIMUM'); require(delay <= maximumDelay, 'DELAY_LONGER_THAN_MAXIMUM'); _delay = delay; _admin = admin; GRACE_PERIOD = gracePeriod; MINIMUM_DELAY = minimumDelay; MAXIMUM_DELAY = maximumDelay; emit NewDelay(delay); emit NewAdmin(admin); } modifier onlyAdmin() { require(msg.sender == _admin, 'ONLY_BY_ADMIN'); _; } modifier onlyTimelock() { require(msg.sender == address(this), 'ONLY_BY_THIS_TIMELOCK'); _; } modifier onlyPendingAdmin() { require(msg.sender == _pendingAdmin, 'ONLY_BY_PENDING_ADMIN'); _; } /** * @dev Set the delay * @param delay delay between queue and execution of proposal **/ function setDelay(uint256 delay) public onlyTimelock { _validateDelay(delay); _delay = delay; emit NewDelay(delay); } /** * @dev Function enabling pending admin to become admin **/ function acceptAdmin() public onlyPendingAdmin { _admin = msg.sender; _pendingAdmin = address(0); emit NewAdmin(msg.sender); } /** * @dev Setting a new pending admin (that can then become admin) * Can only be called by this executor (i.e via proposal) * @param newPendingAdmin address of the new admin **/ function setPendingAdmin(address newPendingAdmin) public onlyTimelock { _pendingAdmin = newPendingAdmin; emit NewPendingAdmin(newPendingAdmin); } /** * @dev Function, called by Governance, that queue a transaction, returns action hash * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target * @return the action Hash **/ function queueTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) public override onlyAdmin returns (bytes32) { require(executionTime >= block.timestamp.add(_delay), 'EXECUTION_TIME_UNDERESTIMATED'); bytes32 actionHash = keccak256( abi.encode(target, value, signature, data, executionTime, withDelegatecall) ); _queuedTransactions[actionHash] = true; emit QueuedAction(actionHash, target, value, signature, data, executionTime, withDelegatecall); return actionHash; } /** * @dev Function, called by Governance, that cancels a transaction, returns action hash * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target * @return the action Hash of the canceled tx **/ function cancelTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) public override onlyAdmin returns (bytes32) { bytes32 actionHash = keccak256( abi.encode(target, value, signature, data, executionTime, withDelegatecall) ); _queuedTransactions[actionHash] = false; emit CancelledAction( actionHash, target, value, signature, data, executionTime, withDelegatecall ); return actionHash; } /** * @dev Function, called by Governance, that cancels a transaction, returns the callData executed * @param target smart contract target * @param value wei value of the transaction * @param signature function signature of the transaction * @param data function arguments of the transaction or callData if signature empty * @param executionTime time at which to execute the transaction * @param withDelegatecall boolean, true = transaction delegatecalls the target, else calls the target * @return the callData executed as memory bytes **/ function executeTransaction( address target, uint256 value, string memory signature, bytes memory data, uint256 executionTime, bool withDelegatecall ) public payable override onlyAdmin returns (bytes memory) { bytes32 actionHash = keccak256( abi.encode(target, value, signature, data, executionTime, withDelegatecall) ); require(_queuedTransactions[actionHash], 'ACTION_NOT_QUEUED'); require(block.timestamp >= executionTime, 'TIMELOCK_NOT_FINISHED'); require(block.timestamp <= executionTime.add(GRACE_PERIOD), 'GRACE_PERIOD_FINISHED'); _queuedTransactions[actionHash] = false; bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } bool success; bytes memory resultData; if (withDelegatecall) { require(msg.value >= value, 'NOT_ENOUGH_MSG_VALUE'); // solium-disable-next-line security/no-call-value (success, resultData) = target.delegatecall(callData); } else { // solium-disable-next-line security/no-call-value (success, resultData) = target.call{value: value}(callData); } require(success, 'FAILED_ACTION_EXECUTION'); emit ExecutedAction( actionHash, target, value, signature, data, executionTime, withDelegatecall, resultData ); return resultData; } /** * @dev Getter of the current admin address (should be governance) * @return The address of the current admin **/ function getAdmin() external view override returns (address) { return _admin; } /** * @dev Getter of the current pending admin address * @return The address of the pending admin **/ function getPendingAdmin() external view override returns (address) { return _pendingAdmin; } /** * @dev Getter of the delay between queuing and execution * @return The delay in seconds **/ function getDelay() external view override returns (uint256) { return _delay; } /** * @dev Returns whether an action (via actionHash) is queued * @param actionHash hash of the action to be checked * keccak256(abi.encode(target, value, signature, data, executionTime, withDelegatecall)) * @return true if underlying action of actionHash is queued **/ function isActionQueued(bytes32 actionHash) external view override returns (bool) { return _queuedTransactions[actionHash]; } /** * @dev Checks whether a proposal is over its grace period * @param governance Governance contract * @param proposalId Id of the proposal against which to test * @return true of proposal is over grace period **/ function isProposalOverGracePeriod(IAaveGovernanceV2 governance, uint256 proposalId) external view override returns (bool) { IAaveGovernanceV2.ProposalWithoutVotes memory proposal = governance.getProposalById(proposalId); return (block.timestamp > proposal.executionTime.add(GRACE_PERIOD)); } function _validateDelay(uint256 delay) internal view { require(delay >= MINIMUM_DELAY, 'DELAY_SHORTER_THAN_MINIMUM'); require(delay <= MAXIMUM_DELAY, 'DELAY_LONGER_THAN_MAXIMUM'); } receive() external payable {} } interface IProposalValidator { /** * @dev Called to validate a proposal (e.g when creating new proposal in Governance) * @param governance Governance Contract * @param user Address of the proposal creator * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1). * @return boolean, true if can be created **/ function validateCreatorOfProposal( IAaveGovernanceV2 governance, address user, uint256 blockNumber ) external view returns (bool); /** * @dev Called to validate the cancellation of a proposal * @param governance Governance Contract * @param user Address of the proposal creator * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1). * @return boolean, true if can be cancelled **/ function validateProposalCancellation( IAaveGovernanceV2 governance, address user, uint256 blockNumber ) external view returns (bool); /** * @dev Returns whether a user has enough Proposition Power to make a proposal. * @param governance Governance Contract * @param user Address of the user to be challenged. * @param blockNumber Block Number against which to make the challenge. * @return true if user has enough power **/ function isPropositionPowerEnough( IAaveGovernanceV2 governance, address user, uint256 blockNumber ) external view returns (bool); /** * @dev Returns the minimum Proposition Power needed to create a proposition. * @param governance Governance Contract * @param blockNumber Blocknumber at which to evaluate * @return minimum Proposition Power needed **/ function getMinimumPropositionPowerNeeded(IAaveGovernanceV2 governance, uint256 blockNumber) external view returns (uint256); /** * @dev Returns whether a proposal passed or not * @param governance Governance Contract * @param proposalId Id of the proposal to set * @return true if proposal passed **/ function isProposalPassed(IAaveGovernanceV2 governance, uint256 proposalId) external view returns (bool); /** * @dev Check whether a proposal has reached quorum, ie has enough FOR-voting-power * Here quorum is not to understand as number of votes reached, but number of for-votes reached * @param governance Governance Contract * @param proposalId Id of the proposal to verify * @return voting power needed for a proposal to pass **/ function isQuorumValid(IAaveGovernanceV2 governance, uint256 proposalId) external view returns (bool); /** * @dev Check whether a proposal has enough extra FOR-votes than AGAINST-votes * FOR VOTES - AGAINST VOTES > VOTE_DIFFERENTIAL * voting supply * @param governance Governance Contract * @param proposalId Id of the proposal to verify * @return true if enough For-Votes **/ function isVoteDifferentialValid(IAaveGovernanceV2 governance, uint256 proposalId) external view returns (bool); /** * @dev Calculates the minimum amount of Voting Power needed for a proposal to Pass * @param votingSupply Total number of oustanding voting tokens * @return voting power needed for a proposal to pass **/ function getMinimumVotingPowerNeeded(uint256 votingSupply) external view returns (uint256); /** * @dev Get proposition threshold constant value * @return the proposition threshold value (100 <=> 1%) **/ function PROPOSITION_THRESHOLD() external view returns (uint256); /** * @dev Get voting duration constant value * @return the voting duration value in seconds **/ function VOTING_DURATION() external view returns (uint256); /** * @dev Get the vote differential threshold constant value * to compare with % of for votes/total supply - % of against votes/total supply * @return the vote differential threshold value (100 <=> 1%) **/ function VOTE_DIFFERENTIAL() external view returns (uint256); /** * @dev Get quorum threshold constant value * to compare with % of for votes/total supply * @return the quorum threshold value (100 <=> 1%) **/ function MINIMUM_QUORUM() external view returns (uint256); /** * @dev precision helper: 100% = 10000 * @return one hundred percents with our chosen precision **/ function ONE_HUNDRED_WITH_PRECISION() external view returns (uint256); } /** * @title Proposal Validator Contract, inherited by Aave Governance Executors * @dev Validates/Invalidations propositions state modifications. * Proposition Power functions: Validates proposition creations/ cancellation * Voting Power functions: Validates success of propositions. * @author Aave **/ contract ProposalValidator is IProposalValidator { using SafeMath for uint256; uint256 public immutable override PROPOSITION_THRESHOLD; uint256 public immutable override VOTING_DURATION; uint256 public immutable override VOTE_DIFFERENTIAL; uint256 public immutable override MINIMUM_QUORUM; uint256 public constant override ONE_HUNDRED_WITH_PRECISION = 10000; // Equivalent to 100%, but scaled for precision /** * @dev Constructor * @param propositionThreshold minimum percentage of supply needed to submit a proposal * - In ONE_HUNDRED_WITH_PRECISION units * @param votingDuration duration in blocks of the voting period * @param voteDifferential percentage of supply that `for` votes need to be over `against` * in order for the proposal to pass * - In ONE_HUNDRED_WITH_PRECISION units * @param minimumQuorum minimum percentage of the supply in FOR-voting-power need for a proposal to pass * - In ONE_HUNDRED_WITH_PRECISION units **/ constructor( uint256 propositionThreshold, uint256 votingDuration, uint256 voteDifferential, uint256 minimumQuorum ) { PROPOSITION_THRESHOLD = propositionThreshold; VOTING_DURATION = votingDuration; VOTE_DIFFERENTIAL = voteDifferential; MINIMUM_QUORUM = minimumQuorum; } /** * @dev Called to validate a proposal (e.g when creating new proposal in Governance) * @param governance Governance Contract * @param user Address of the proposal creator * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1). * @return boolean, true if can be created **/ function validateCreatorOfProposal( IAaveGovernanceV2 governance, address user, uint256 blockNumber ) external view override returns (bool) { return isPropositionPowerEnough(governance, user, blockNumber); } /** * @dev Called to validate the cancellation of a proposal * Needs to creator to have lost proposition power threashold * @param governance Governance Contract * @param user Address of the proposal creator * @param blockNumber Block Number against which to make the test (e.g proposal creation block -1). * @return boolean, true if can be cancelled **/ function validateProposalCancellation( IAaveGovernanceV2 governance, address user, uint256 blockNumber ) external view override returns (bool) { return !isPropositionPowerEnough(governance, user, blockNumber); } /** * @dev Returns whether a user has enough Proposition Power to make a proposal. * @param governance Governance Contract * @param user Address of the user to be challenged. * @param blockNumber Block Number against which to make the challenge. * @return true if user has enough power **/ function isPropositionPowerEnough( IAaveGovernanceV2 governance, address user, uint256 blockNumber ) public view override returns (bool) { IGovernanceStrategy currentGovernanceStrategy = IGovernanceStrategy( governance.getGovernanceStrategy() ); return currentGovernanceStrategy.getPropositionPowerAt(user, blockNumber) >= getMinimumPropositionPowerNeeded(governance, blockNumber); } /** * @dev Returns the minimum Proposition Power needed to create a proposition. * @param governance Governance Contract * @param blockNumber Blocknumber at which to evaluate * @return minimum Proposition Power needed **/ function getMinimumPropositionPowerNeeded(IAaveGovernanceV2 governance, uint256 blockNumber) public view override returns (uint256) { IGovernanceStrategy currentGovernanceStrategy = IGovernanceStrategy( governance.getGovernanceStrategy() ); return currentGovernanceStrategy .getTotalPropositionSupplyAt(blockNumber) .mul(PROPOSITION_THRESHOLD) .div(ONE_HUNDRED_WITH_PRECISION); } /** * @dev Returns whether a proposal passed or not * @param governance Governance Contract * @param proposalId Id of the proposal to set * @return true if proposal passed **/ function isProposalPassed(IAaveGovernanceV2 governance, uint256 proposalId) external view override returns (bool) { return (isQuorumValid(governance, proposalId) && isVoteDifferentialValid(governance, proposalId)); } /** * @dev Calculates the minimum amount of Voting Power needed for a proposal to Pass * @param votingSupply Total number of oustanding voting tokens * @return voting power needed for a proposal to pass **/ function getMinimumVotingPowerNeeded(uint256 votingSupply) public view override returns (uint256) { return votingSupply.mul(MINIMUM_QUORUM).div(ONE_HUNDRED_WITH_PRECISION); } /** * @dev Check whether a proposal has reached quorum, ie has enough FOR-voting-power * Here quorum is not to understand as number of votes reached, but number of for-votes reached * @param governance Governance Contract * @param proposalId Id of the proposal to verify * @return voting power needed for a proposal to pass **/ function isQuorumValid(IAaveGovernanceV2 governance, uint256 proposalId) public view override returns (bool) { IAaveGovernanceV2.ProposalWithoutVotes memory proposal = governance.getProposalById(proposalId); uint256 votingSupply = IGovernanceStrategy(proposal.strategy).getTotalVotingSupplyAt( proposal.startBlock ); return proposal.forVotes >= getMinimumVotingPowerNeeded(votingSupply); } /** * @dev Check whether a proposal has enough extra FOR-votes than AGAINST-votes * FOR VOTES - AGAINST VOTES > VOTE_DIFFERENTIAL * voting supply * @param governance Governance Contract * @param proposalId Id of the proposal to verify * @return true if enough For-Votes **/ function isVoteDifferentialValid(IAaveGovernanceV2 governance, uint256 proposalId) public view override returns (bool) { IAaveGovernanceV2.ProposalWithoutVotes memory proposal = governance.getProposalById(proposalId); uint256 votingSupply = IGovernanceStrategy(proposal.strategy).getTotalVotingSupplyAt( proposal.startBlock ); return (proposal.forVotes.mul(ONE_HUNDRED_WITH_PRECISION).div(votingSupply) > proposal.againstVotes.mul(ONE_HUNDRED_WITH_PRECISION).div(votingSupply).add( VOTE_DIFFERENTIAL )); } } /** * @title Time Locked, Validator, Executor Contract * @dev Contract * - Validate Proposal creations/ cancellation * - Validate Vote Quorum and Vote success on proposal * - Queue, Execute, Cancel, successful proposals' transactions. * @author Aave **/ contract Executor is ExecutorWithTimelock, ProposalValidator { constructor( address admin, uint256 delay, uint256 gracePeriod, uint256 minimumDelay, uint256 maximumDelay, uint256 propositionThreshold, uint256 voteDuration, uint256 voteDifferential, uint256 minimumQuorum ) ExecutorWithTimelock(admin, delay, gracePeriod, minimumDelay, maximumDelay) ProposalValidator(propositionThreshold, voteDuration, voteDifferential, minimumQuorum) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint256","name":"delay","type":"uint256"},{"internalType":"uint256","name":"gracePeriod","type":"uint256"},{"internalType":"uint256","name":"minimumDelay","type":"uint256"},{"internalType":"uint256","name":"maximumDelay","type":"uint256"},{"internalType":"uint256","name":"propositionThreshold","type":"uint256"},{"internalType":"uint256","name":"voteDuration","type":"uint256"},{"internalType":"uint256","name":"voteDifferential","type":"uint256"},{"internalType":"uint256","name":"minimumQuorum","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"actionHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"executionTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withDelegatecall","type":"bool"}],"name":"CancelledAction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"actionHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"executionTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withDelegatecall","type":"bool"},{"indexed":false,"internalType":"bytes","name":"resultData","type":"bytes"}],"name":"ExecutedAction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"NewDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"NewPendingAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"actionHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"executionTime","type":"uint256"},{"indexed":false,"internalType":"bool","name":"withDelegatecall","type":"bool"}],"name":"QueuedAction","type":"event"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_QUORUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE_HUNDRED_WITH_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSITION_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTE_DIFFERENTIAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VOTING_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"bool","name":"withDelegatecall","type":"bool"}],"name":"cancelTransaction","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"bool","name":"withDelegatecall","type":"bool"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getMinimumPropositionPowerNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"votingSupply","type":"uint256"}],"name":"getMinimumVotingPowerNeeded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"actionHash","type":"bytes32"}],"name":"isActionQueued","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"},{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"isProposalOverGracePeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"},{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"isProposalPassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"isPropositionPowerEnough","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"},{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"isQuorumValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"},{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"isVoteDifferentialValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"bool","name":"withDelegatecall","type":"bool"}],"name":"queueTransaction","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"setDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingAdmin","type":"address"}],"name":"setPendingAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"validateCreatorOfProposal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAaveGovernanceV2","name":"governance","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"validateProposalCancellation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101606040523480156200001257600080fd5b506040516200213238038062002132833981016040819052620000359162000159565b838383838c8c8c8c8c818410156200006a5760405162461bcd60e51b81526004016200006190620001ed565b60405180910390fd5b808411156200008d5760405162461bcd60e51b8152600401620000619062000224565b6002849055600080546001600160a01b0319166001600160a01b038716179055608083905260a082905260c08190526040517f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c90620000ee9086906200025b565b60405180910390a17f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c85604051620001279190620001d9565b60405180910390a150505060e09590955250610100929092526101205261014052506200026498505050505050505050565b60008060008060008060008060006101208a8c03121562000178578485fd5b89516001600160a01b03811681146200018f578586fd5b8099505060208a0151975060408a0151965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b6001600160a01b0391909116815260200190565b6020808252601a908201527f44454c41595f53484f525445525f5448414e5f4d494e494d554d000000000000604082015260600190565b60208082526019908201527f44454c41595f4c4f4e4745525f5448414e5f4d4158494d554d00000000000000604082015260600190565b90815260200190565b60805160a05160c05160e051610100516101205161014051611e57620002db60003980610ea65280610fbd5250806108fa5280610d2d525080610d5152508061106252806111cc52508061096d52806112d1525080610eca5280611291525080610a465280610f06528061119c5250611e576000f3fe6080604052600436106101a05760003560e01c8063a438d208116100ec578063d04681561161008a578063e50f840011610064578063e50f840014610445578063f48cb13414610465578063f670a5f914610485578063fd58afd4146104a5576101a7565b8063d0468156146103f0578063d0d9029814610405578063e177246e14610425576101a7565b8063b1b43ae5116100c6578063b1b43ae514610391578063b1fc8796146103a6578063c1a287e2146103c6578063cebc9a82146103db576101a7565b8063a438d20814610347578063ace432091461035c578063b159beac1461037c576101a7565b806366121042116101595780637d645fab116101335780637d645fab146102dd5780638902ab65146102f25780638d8fe2e3146103125780639125fb5814610332576101a7565b8063661210421461027b5780636e9960c31461029b5780637aa50080146102bd576101a7565b806306fbb3ab146101ac5780630e18b681146101e25780631d73fd6d146101f95780631dc40b511461021b57806331a7bc411461023b5780634dd18bf51461025b576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101cc6101c736600461174d565b6104ba565b6040516101d99190611a33565b60405180910390f35b3480156101ee57600080fd5b506101f76104e0565b005b34801561020557600080fd5b5061020e61056a565b6040516101d99190611a3e565b34801561022757600080fd5b5061020e61023636600461165b565b610570565b34801561024757600080fd5b506101cc61025636600461170d565b61063c565b34801561026757600080fd5b506101f7610276366004611623565b610652565b34801561028757600080fd5b506101cc61029636600461170d565b6106c7565b3480156102a757600080fd5b506102b06107d0565b6040516101d991906119b2565b3480156102c957600080fd5b506101cc6102d836600461174d565b6107df565b3480156102e957600080fd5b5061020e61096b565b61030561030036600461165b565b61098f565b6040516101d99190611ac7565b34801561031e57600080fd5b5061020e61032d36600461165b565b610c42565b34801561033e57600080fd5b5061020e610d2b565b34801561035357600080fd5b5061020e610d4f565b34801561036857600080fd5b506101cc61037736600461174d565b610d73565b34801561038857600080fd5b5061020e610ea4565b34801561039d57600080fd5b5061020e610ec8565b3480156103b257600080fd5b506101cc6103c13660046116f5565b610eec565b3480156103d257600080fd5b5061020e610f04565b3480156103e757600080fd5b5061020e610f28565b3480156103fc57600080fd5b506102b0610f2e565b34801561041157600080fd5b506101cc61042036600461170d565b610f3d565b34801561043157600080fd5b506101f76104403660046116f5565b610f52565b34801561045157600080fd5b5061020e6104603660046116f5565b610faf565b34801561047157600080fd5b5061020e61048036600461174d565b610fe1565b34801561049157600080fd5b506101cc6104a036600461174d565b611103565b3480156104b157600080fd5b5061020e6111ca565b60006104c68383610d73565b80156104d757506104d783836107df565b90505b92915050565b6001546001600160a01b031633146105135760405162461bcd60e51b815260040161050a90611ada565b60405180910390fd5b60008054336001600160a01b031991821681179092556001805490911690556040517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91610560916119b2565b60405180910390a1565b61271081565b600080546001600160a01b0316331461059b5760405162461bcd60e51b815260040161050a90611c1e565b60008787878787876040516020016105b8969594939291906119df565b60408051601f19818403018152828252805160209182012060008181526003909252919020805460ff1916905591506001600160a01b038916907f87c481aa909c37502caa37394ab791c26b68fa4fa5ae56de104de36444ae9069906106299084908b908b908b908b908b90611a47565b60405180910390a2979650505050505050565b60006106498484846106c7565b15949350505050565b3330146106715760405162461bcd60e51b815260040161050a90611d3b565b600180546001600160a01b0319166001600160a01b0383161790556040517f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a756906106bc9083906119b2565b60405180910390a150565b600080846001600160a01b03166306be3e8e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561070357600080fd5b505afa158015610717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073b919061163f565b90506107478584610fe1565b604051631420edcb60e31b81526001600160a01b0383169063a1076e589061077590889088906004016119c6565b60206040518083038186803b15801561078d57600080fd5b505afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611921565b101595945050505050565b6000546001600160a01b031690565b60006107e9611349565b604051633656de2160e01b81526001600160a01b03851690633656de2190610815908690600401611a3e565b60006040518083038186803b15801561082d57600080fd5b505afa158015610841573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108699190810190611778565b90506000816101e001516001600160a01b0316637a71f9d78361010001516040518263ffffffff1660e01b81526004016108a39190611a3e565b60206040518083038186803b1580156108bb57600080fd5b505afa1580156108cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f39190611921565b90506109437f000000000000000000000000000000000000000000000000000000000000000061093d836109376127108761018001516111ee90919063ffffffff16565b90611228565b9061126a565b610961826109376127108661016001516111ee90919063ffffffff16565b1195945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546060906001600160a01b031633146109bc5760405162461bcd60e51b815260040161050a90611c1e565b60008787878787876040516020016109d9969594939291906119df565b60408051601f1981840301815291815281516020928301206000818152600390935291205490915060ff16610a205760405162461bcd60e51b815260040161050a90611c74565b83421015610a405760405162461bcd60e51b815260040161050a90611b40565b610a6a847f000000000000000000000000000000000000000000000000000000000000000061126a565b421115610a895760405162461bcd60e51b815260040161050a90611c45565b6000818152600360205260409020805460ff191690558551606090610aaf575084610adb565b868051906020012086604051602001610ac9929190611965565b60405160208183030381529060405290505b600060608515610b685789341015610b055760405162461bcd60e51b815260040161050a90611d0d565b8a6001600160a01b031683604051610b1d9190611996565b600060405180830381855af49150503d8060008114610b58576040519150601f19603f3d011682016040523d82523d6000602084013e610b5d565b606091505b509092509050610bca565b8a6001600160a01b03168a84604051610b819190611996565b60006040518083038185875af1925050503d8060008114610bbe576040519150601f19603f3d011682016040523d82523d6000602084013e610bc3565b606091505b5090925090505b81610be75760405162461bcd60e51b815260040161050a90611c9f565b8a6001600160a01b03167f97825080b472fa91fe888b62ec128814d60dec546a2dafb955e50923f4a1b7e7858c8c8c8c8c88604051610c2c9796959493929190611a66565b60405180910390a29a9950505050505050505050565b600080546001600160a01b03163314610c6d5760405162461bcd60e51b815260040161050a90611c1e565b600254610c7b90429061126a565b831015610c9a5760405162461bcd60e51b815260040161050a90611b6f565b6000878787878787604051602001610cb7969594939291906119df565b60408051601f19818403018152828252805160209182012060008181526003909252919020805460ff1916600117905591506001600160a01b038916907f2191aed4c4733c76e08a9e7e1da0b8d87fa98753f22df49231ddc66e0f05f022906106299084908b908b908b908b908b90611a47565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610d7d611349565b604051633656de2160e01b81526001600160a01b03851690633656de2190610da9908690600401611a3e565b60006040518083038186803b158015610dc157600080fd5b505afa158015610dd5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dfd9190810190611778565b90506000816101e001516001600160a01b0316637a71f9d78361010001516040518263ffffffff1660e01b8152600401610e379190611a3e565b60206040518083038186803b158015610e4f57600080fd5b505afa158015610e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e879190611921565b9050610e9281610faf565b82610160015110159250505092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008181526003602052604090205460ff165b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025490565b6001546001600160a01b031690565b6000610f4a8484846106c7565b949350505050565b333014610f715760405162461bcd60e51b815260040161050a90611d3b565b610f7a8161128f565b60028190556040517f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c906106bc908390611a3e565b60006104da612710610937847f00000000000000000000000000000000000000000000000000000000000000006111ee565b600080836001600160a01b03166306be3e8e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561101d57600080fd5b505afa158015611031573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611055919061163f565b9050610f4a6127106109377f0000000000000000000000000000000000000000000000000000000000000000846001600160a01b031663f6b50203886040518263ffffffff1660e01b81526004016110ad9190611a3e565b60206040518083038186803b1580156110c557600080fd5b505afa1580156110d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fd9190611921565b906111ee565b600061110d611349565b604051633656de2160e01b81526001600160a01b03851690633656de2190611139908690600401611a3e565b60006040518083038186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261118d9190810190611778565b6101408101519091506111c0907f000000000000000000000000000000000000000000000000000000000000000061126a565b4211949350505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000826111fd575060006104da565b8282028284828161120a57fe5b04146104d75760405162461bcd60e51b815260040161050a90611ba6565b60006104d783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611312565b6000828201838110156104d75760405162461bcd60e51b815260040161050a90611b09565b7f00000000000000000000000000000000000000000000000000000000000000008110156112cf5760405162461bcd60e51b815260040161050a90611be7565b7f000000000000000000000000000000000000000000000000000000000000000081111561130f5760405162461bcd60e51b815260040161050a90611cd6565b50565b600081836113335760405162461bcd60e51b815260040161050a9190611ac7565b50600083858161133f57fe5b0495945050505050565b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160006001600160a01b03168152602001600080191681525090565b8051610eff81611dfe565b600082601f83011261140a578081fd5b815161141d61141882611d8e565b611d6a565b81815291506020808301908481018184028601820187101561143e57600080fd5b60005b8481101561146657815161145481611dfe565b84529282019290820190600101611441565b505050505092915050565b600082601f830112611481578081fd5b815161148f61141882611d8e565b8181529150602080830190848101818402860182018710156114b057600080fd5b60005b848110156114665781516114c681611e13565b845292820192908201906001016114b3565b600082601f8301126114e8578081fd5b81516114f661141882611d8e565b818152915060208083019084810160005b84811015611466578151870188603f82011261152257600080fd5b8381015161153261141882611dac565b81815260408b8184860101111561154857600080fd5b61155783888401838701611dce565b50865250509282019290820190600101611507565b600082601f83011261157c578081fd5b815161158a61141882611d8e565b8181529150602080830190848101818402860182018710156115ab57600080fd5b60005b84811015611466578151845292820192908201906001016115ae565b8051610eff81611e13565b600082601f8301126115e5578081fd5b81356115f361141882611dac565b915080825283602082850101111561160a57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611634578081fd5b81356104d781611dfe565b600060208284031215611650578081fd5b81516104d781611dfe565b60008060008060008060c08789031215611673578182fd5b863561167e81611dfe565b955060208701359450604087013567ffffffffffffffff808211156116a1578384fd5b6116ad8a838b016115d5565b955060608901359150808211156116c2578384fd5b506116cf89828a016115d5565b9350506080870135915060a08701356116e781611e13565b809150509295509295509295565b600060208284031215611706578081fd5b5035919050565b600080600060608486031215611721578081fd5b833561172c81611dfe565b9250602084013561173c81611dfe565b929592945050506040919091013590565b6000806040838503121561175f578182fd5b823561176a81611dfe565b946020939093013593505050565b600060208284031215611789578081fd5b815167ffffffffffffffff808211156117a0578283fd5b81840191506102208083870312156117b6578384fd5b6117bf81611d6a565b9050825181526117d1602084016113ef565b60208201526117e2604084016113ef565b60408201526060830151828111156117f8578485fd5b611804878286016113fa565b60608301525060808301518281111561181b578485fd5b6118278782860161156c565b60808301525060a08301518281111561183e578485fd5b61184a878286016114d8565b60a08301525060c083015182811115611861578485fd5b61186d878286016114d8565b60c08301525060e083015182811115611884578485fd5b61189087828601611471565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018080840151908201526101a091506118dd8284016115ca565b828201526101c091506118f18284016115ca565b828201526101e091506119058284016113ef565b9181019190915261020091820151918101919091529392505050565b600060208284031215611932578081fd5b5051919050565b60008151808452611951816020860160208601611dce565b601f01601f19169290920160200192915050565b6001600160e01b0319831681528151600090611988816004850160208701611dce565b919091016004019392505050565b600082516119a8818460208701611dce565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038816825286602083015260c06040830152611a0660c0830187611939565b8281036060840152611a188187611939565b6080840195909552505090151560a090910152949350505050565b901515815260200190565b90815260200190565b600087825286602083015260c06040830152611a0660c0830187611939565b600088825287602083015260e06040830152611a8560e0830188611939565b8281036060840152611a978188611939565b905085608084015284151560a084015282810360c0840152611ab98185611939565b9a9950505050505050505050565b6000602082526104d76020830184611939565b60208082526015908201527427a7262cafa12cafa822a72224a723afa0a226a4a760591b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b602080825260159082015274151253515313d0d2d7d393d517d192539254d21151605a1b604082015260600190565b6020808252601d908201527f455845435554494f4e5f54494d455f554e444552455354494d41544544000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601a908201527f44454c41595f53484f525445525f5448414e5f4d494e494d554d000000000000604082015260600190565b6020808252600d908201526c27a7262cafa12cafa0a226a4a760991b604082015260600190565b60208082526015908201527411d49050d157d411549253d117d192539254d21151605a1b604082015260600190565b6020808252601190820152701050d51253d397d393d517d45551555151607a1b604082015260600190565b60208082526017908201527f4641494c45445f414354494f4e5f455845435554494f4e000000000000000000604082015260600190565b60208082526019908201527f44454c41595f4c4f4e4745525f5448414e5f4d4158494d554d00000000000000604082015260600190565b6020808252601490820152734e4f545f454e4f5547485f4d53475f56414c554560601b604082015260600190565b6020808252601590820152744f4e4c595f42595f544849535f54494d454c4f434b60581b604082015260600190565b60405181810167ffffffffffffffff81118282101715611d8657fe5b604052919050565b600067ffffffffffffffff821115611da257fe5b5060209081020190565b600067ffffffffffffffff821115611dc057fe5b50601f01601f191660200190565b60005b83811015611de9578181015183820152602001611dd1565b83811115611df8576000848401525b50505050565b6001600160a01b038116811461130f57600080fd5b801515811461130f57600080fdfea26469706673582212207d7b66ba28d046d4d656e4df247be53975f44c25e262124502e75f572416437964736f6c63430007050033000000000000000000000000ec568fffba86c094cf06b22134b23074dfe2252c00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000069780000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000c8
Deployed Bytecode
0x6080604052600436106101a05760003560e01c8063a438d208116100ec578063d04681561161008a578063e50f840011610064578063e50f840014610445578063f48cb13414610465578063f670a5f914610485578063fd58afd4146104a5576101a7565b8063d0468156146103f0578063d0d9029814610405578063e177246e14610425576101a7565b8063b1b43ae5116100c6578063b1b43ae514610391578063b1fc8796146103a6578063c1a287e2146103c6578063cebc9a82146103db576101a7565b8063a438d20814610347578063ace432091461035c578063b159beac1461037c576101a7565b806366121042116101595780637d645fab116101335780637d645fab146102dd5780638902ab65146102f25780638d8fe2e3146103125780639125fb5814610332576101a7565b8063661210421461027b5780636e9960c31461029b5780637aa50080146102bd576101a7565b806306fbb3ab146101ac5780630e18b681146101e25780631d73fd6d146101f95780631dc40b511461021b57806331a7bc411461023b5780634dd18bf51461025b576101a7565b366101a757005b600080fd5b3480156101b857600080fd5b506101cc6101c736600461174d565b6104ba565b6040516101d99190611a33565b60405180910390f35b3480156101ee57600080fd5b506101f76104e0565b005b34801561020557600080fd5b5061020e61056a565b6040516101d99190611a3e565b34801561022757600080fd5b5061020e61023636600461165b565b610570565b34801561024757600080fd5b506101cc61025636600461170d565b61063c565b34801561026757600080fd5b506101f7610276366004611623565b610652565b34801561028757600080fd5b506101cc61029636600461170d565b6106c7565b3480156102a757600080fd5b506102b06107d0565b6040516101d991906119b2565b3480156102c957600080fd5b506101cc6102d836600461174d565b6107df565b3480156102e957600080fd5b5061020e61096b565b61030561030036600461165b565b61098f565b6040516101d99190611ac7565b34801561031e57600080fd5b5061020e61032d36600461165b565b610c42565b34801561033e57600080fd5b5061020e610d2b565b34801561035357600080fd5b5061020e610d4f565b34801561036857600080fd5b506101cc61037736600461174d565b610d73565b34801561038857600080fd5b5061020e610ea4565b34801561039d57600080fd5b5061020e610ec8565b3480156103b257600080fd5b506101cc6103c13660046116f5565b610eec565b3480156103d257600080fd5b5061020e610f04565b3480156103e757600080fd5b5061020e610f28565b3480156103fc57600080fd5b506102b0610f2e565b34801561041157600080fd5b506101cc61042036600461170d565b610f3d565b34801561043157600080fd5b506101f76104403660046116f5565b610f52565b34801561045157600080fd5b5061020e6104603660046116f5565b610faf565b34801561047157600080fd5b5061020e61048036600461174d565b610fe1565b34801561049157600080fd5b506101cc6104a036600461174d565b611103565b3480156104b157600080fd5b5061020e6111ca565b60006104c68383610d73565b80156104d757506104d783836107df565b90505b92915050565b6001546001600160a01b031633146105135760405162461bcd60e51b815260040161050a90611ada565b60405180910390fd5b60008054336001600160a01b031991821681179092556001805490911690556040517f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91610560916119b2565b60405180910390a1565b61271081565b600080546001600160a01b0316331461059b5760405162461bcd60e51b815260040161050a90611c1e565b60008787878787876040516020016105b8969594939291906119df565b60408051601f19818403018152828252805160209182012060008181526003909252919020805460ff1916905591506001600160a01b038916907f87c481aa909c37502caa37394ab791c26b68fa4fa5ae56de104de36444ae9069906106299084908b908b908b908b908b90611a47565b60405180910390a2979650505050505050565b60006106498484846106c7565b15949350505050565b3330146106715760405162461bcd60e51b815260040161050a90611d3b565b600180546001600160a01b0319166001600160a01b0383161790556040517f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a756906106bc9083906119b2565b60405180910390a150565b600080846001600160a01b03166306be3e8e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561070357600080fd5b505afa158015610717573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073b919061163f565b90506107478584610fe1565b604051631420edcb60e31b81526001600160a01b0383169063a1076e589061077590889088906004016119c6565b60206040518083038186803b15801561078d57600080fd5b505afa1580156107a1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c59190611921565b101595945050505050565b6000546001600160a01b031690565b60006107e9611349565b604051633656de2160e01b81526001600160a01b03851690633656de2190610815908690600401611a3e565b60006040518083038186803b15801561082d57600080fd5b505afa158015610841573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108699190810190611778565b90506000816101e001516001600160a01b0316637a71f9d78361010001516040518263ffffffff1660e01b81526004016108a39190611a3e565b60206040518083038186803b1580156108bb57600080fd5b505afa1580156108cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f39190611921565b90506109437f000000000000000000000000000000000000000000000000000000000000003261093d836109376127108761018001516111ee90919063ffffffff16565b90611228565b9061126a565b610961826109376127108661016001516111ee90919063ffffffff16565b1195945050505050565b7f00000000000000000000000000000000000000000000000000000000000d2f0081565b6000546060906001600160a01b031633146109bc5760405162461bcd60e51b815260040161050a90611c1e565b60008787878787876040516020016109d9969594939291906119df565b60408051601f1981840301815291815281516020928301206000818152600390935291205490915060ff16610a205760405162461bcd60e51b815260040161050a90611c74565b83421015610a405760405162461bcd60e51b815260040161050a90611b40565b610a6a847f000000000000000000000000000000000000000000000000000000000006978061126a565b421115610a895760405162461bcd60e51b815260040161050a90611c45565b6000818152600360205260409020805460ff191690558551606090610aaf575084610adb565b868051906020012086604051602001610ac9929190611965565b60405160208183030381529060405290505b600060608515610b685789341015610b055760405162461bcd60e51b815260040161050a90611d0d565b8a6001600160a01b031683604051610b1d9190611996565b600060405180830381855af49150503d8060008114610b58576040519150601f19603f3d011682016040523d82523d6000602084013e610b5d565b606091505b509092509050610bca565b8a6001600160a01b03168a84604051610b819190611996565b60006040518083038185875af1925050503d8060008114610bbe576040519150601f19603f3d011682016040523d82523d6000602084013e610bc3565b606091505b5090925090505b81610be75760405162461bcd60e51b815260040161050a90611c9f565b8a6001600160a01b03167f97825080b472fa91fe888b62ec128814d60dec546a2dafb955e50923f4a1b7e7858c8c8c8c8c88604051610c2c9796959493929190611a66565b60405180910390a29a9950505050505050505050565b600080546001600160a01b03163314610c6d5760405162461bcd60e51b815260040161050a90611c1e565b600254610c7b90429061126a565b831015610c9a5760405162461bcd60e51b815260040161050a90611b6f565b6000878787878787604051602001610cb7969594939291906119df565b60408051601f19818403018152828252805160209182012060008181526003909252919020805460ff1916600117905591506001600160a01b038916907f2191aed4c4733c76e08a9e7e1da0b8d87fa98753f22df49231ddc66e0f05f022906106299084908b908b908b908b908b90611a47565b7f000000000000000000000000000000000000000000000000000000000000003281565b7f0000000000000000000000000000000000000000000000000000000000004b0081565b6000610d7d611349565b604051633656de2160e01b81526001600160a01b03851690633656de2190610da9908690600401611a3e565b60006040518083038186803b158015610dc157600080fd5b505afa158015610dd5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dfd9190810190611778565b90506000816101e001516001600160a01b0316637a71f9d78361010001516040518263ffffffff1660e01b8152600401610e379190611a3e565b60206040518083038186803b158015610e4f57600080fd5b505afa158015610e63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e879190611921565b9050610e9281610faf565b82610160015110159250505092915050565b7f00000000000000000000000000000000000000000000000000000000000000c881565b7f000000000000000000000000000000000000000000000000000000000001518081565b60008181526003602052604090205460ff165b919050565b7f000000000000000000000000000000000000000000000000000000000006978081565b60025490565b6001546001600160a01b031690565b6000610f4a8484846106c7565b949350505050565b333014610f715760405162461bcd60e51b815260040161050a90611d3b565b610f7a8161128f565b60028190556040517f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c906106bc908390611a3e565b60006104da612710610937847f00000000000000000000000000000000000000000000000000000000000000c86111ee565b600080836001600160a01b03166306be3e8e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561101d57600080fd5b505afa158015611031573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611055919061163f565b9050610f4a6127106109377f0000000000000000000000000000000000000000000000000000000000000032846001600160a01b031663f6b50203886040518263ffffffff1660e01b81526004016110ad9190611a3e565b60206040518083038186803b1580156110c557600080fd5b505afa1580156110d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fd9190611921565b906111ee565b600061110d611349565b604051633656de2160e01b81526001600160a01b03851690633656de2190611139908690600401611a3e565b60006040518083038186803b15801561115157600080fd5b505afa158015611165573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261118d9190810190611778565b6101408101519091506111c0907f000000000000000000000000000000000000000000000000000000000006978061126a565b4211949350505050565b7f000000000000000000000000000000000000000000000000000000000000003281565b6000826111fd575060006104da565b8282028284828161120a57fe5b04146104d75760405162461bcd60e51b815260040161050a90611ba6565b60006104d783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611312565b6000828201838110156104d75760405162461bcd60e51b815260040161050a90611b09565b7f00000000000000000000000000000000000000000000000000000000000151808110156112cf5760405162461bcd60e51b815260040161050a90611be7565b7f00000000000000000000000000000000000000000000000000000000000d2f0081111561130f5760405162461bcd60e51b815260040161050a90611cd6565b50565b600081836113335760405162461bcd60e51b815260040161050a9190611ac7565b50600083858161133f57fe5b0495945050505050565b6040518061022001604052806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016060815260200160608152602001606081526020016060815260200160608152602001600081526020016000815260200160008152602001600081526020016000815260200160001515815260200160001515815260200160006001600160a01b03168152602001600080191681525090565b8051610eff81611dfe565b600082601f83011261140a578081fd5b815161141d61141882611d8e565b611d6a565b81815291506020808301908481018184028601820187101561143e57600080fd5b60005b8481101561146657815161145481611dfe565b84529282019290820190600101611441565b505050505092915050565b600082601f830112611481578081fd5b815161148f61141882611d8e565b8181529150602080830190848101818402860182018710156114b057600080fd5b60005b848110156114665781516114c681611e13565b845292820192908201906001016114b3565b600082601f8301126114e8578081fd5b81516114f661141882611d8e565b818152915060208083019084810160005b84811015611466578151870188603f82011261152257600080fd5b8381015161153261141882611dac565b81815260408b8184860101111561154857600080fd5b61155783888401838701611dce565b50865250509282019290820190600101611507565b600082601f83011261157c578081fd5b815161158a61141882611d8e565b8181529150602080830190848101818402860182018710156115ab57600080fd5b60005b84811015611466578151845292820192908201906001016115ae565b8051610eff81611e13565b600082601f8301126115e5578081fd5b81356115f361141882611dac565b915080825283602082850101111561160a57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611634578081fd5b81356104d781611dfe565b600060208284031215611650578081fd5b81516104d781611dfe565b60008060008060008060c08789031215611673578182fd5b863561167e81611dfe565b955060208701359450604087013567ffffffffffffffff808211156116a1578384fd5b6116ad8a838b016115d5565b955060608901359150808211156116c2578384fd5b506116cf89828a016115d5565b9350506080870135915060a08701356116e781611e13565b809150509295509295509295565b600060208284031215611706578081fd5b5035919050565b600080600060608486031215611721578081fd5b833561172c81611dfe565b9250602084013561173c81611dfe565b929592945050506040919091013590565b6000806040838503121561175f578182fd5b823561176a81611dfe565b946020939093013593505050565b600060208284031215611789578081fd5b815167ffffffffffffffff808211156117a0578283fd5b81840191506102208083870312156117b6578384fd5b6117bf81611d6a565b9050825181526117d1602084016113ef565b60208201526117e2604084016113ef565b60408201526060830151828111156117f8578485fd5b611804878286016113fa565b60608301525060808301518281111561181b578485fd5b6118278782860161156c565b60808301525060a08301518281111561183e578485fd5b61184a878286016114d8565b60a08301525060c083015182811115611861578485fd5b61186d878286016114d8565b60c08301525060e083015182811115611884578485fd5b61189087828601611471565b60e083015250610100838101519082015261012080840151908201526101408084015190820152610160808401519082015261018080840151908201526101a091506118dd8284016115ca565b828201526101c091506118f18284016115ca565b828201526101e091506119058284016113ef565b9181019190915261020091820151918101919091529392505050565b600060208284031215611932578081fd5b5051919050565b60008151808452611951816020860160208601611dce565b601f01601f19169290920160200192915050565b6001600160e01b0319831681528151600090611988816004850160208701611dce565b919091016004019392505050565b600082516119a8818460208701611dce565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038816825286602083015260c06040830152611a0660c0830187611939565b8281036060840152611a188187611939565b6080840195909552505090151560a090910152949350505050565b901515815260200190565b90815260200190565b600087825286602083015260c06040830152611a0660c0830187611939565b600088825287602083015260e06040830152611a8560e0830188611939565b8281036060840152611a978188611939565b905085608084015284151560a084015282810360c0840152611ab98185611939565b9a9950505050505050505050565b6000602082526104d76020830184611939565b60208082526015908201527427a7262cafa12cafa822a72224a723afa0a226a4a760591b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b602080825260159082015274151253515313d0d2d7d393d517d192539254d21151605a1b604082015260600190565b6020808252601d908201527f455845435554494f4e5f54494d455f554e444552455354494d41544544000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252601a908201527f44454c41595f53484f525445525f5448414e5f4d494e494d554d000000000000604082015260600190565b6020808252600d908201526c27a7262cafa12cafa0a226a4a760991b604082015260600190565b60208082526015908201527411d49050d157d411549253d117d192539254d21151605a1b604082015260600190565b6020808252601190820152701050d51253d397d393d517d45551555151607a1b604082015260600190565b60208082526017908201527f4641494c45445f414354494f4e5f455845435554494f4e000000000000000000604082015260600190565b60208082526019908201527f44454c41595f4c4f4e4745525f5448414e5f4d4158494d554d00000000000000604082015260600190565b6020808252601490820152734e4f545f454e4f5547485f4d53475f56414c554560601b604082015260600190565b6020808252601590820152744f4e4c595f42595f544849535f54494d454c4f434b60581b604082015260600190565b60405181810167ffffffffffffffff81118282101715611d8657fe5b604052919050565b600067ffffffffffffffff821115611da257fe5b5060209081020190565b600067ffffffffffffffff821115611dc057fe5b50601f01601f191660200190565b60005b83811015611de9578181015183820152602001611dd1565b83811115611df8576000848401525b50505050565b6001600160a01b038116811461130f57600080fd5b801515811461130f57600080fdfea26469706673582212207d7b66ba28d046d4d656e4df247be53975f44c25e262124502e75f572416437964736f6c63430007050033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ec568fffba86c094cf06b22134b23074dfe2252c00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000069780000000000000000000000000000000000000000000000000000000000001518000000000000000000000000000000000000000000000000000000000000d2f0000000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000004b00000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000c8
-----Decoded View---------------
Arg [0] : admin (address): 0xEC568fffba86c094cf06b22134B23074DFE2252c
Arg [1] : delay (uint256): 86400
Arg [2] : gracePeriod (uint256): 432000
Arg [3] : minimumDelay (uint256): 86400
Arg [4] : maximumDelay (uint256): 864000
Arg [5] : propositionThreshold (uint256): 50
Arg [6] : voteDuration (uint256): 19200
Arg [7] : voteDifferential (uint256): 50
Arg [8] : minimumQuorum (uint256): 200
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000ec568fffba86c094cf06b22134b23074dfe2252c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [2] : 0000000000000000000000000000000000000000000000000000000000069780
Arg [3] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [4] : 00000000000000000000000000000000000000000000000000000000000d2f00
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [6] : 0000000000000000000000000000000000000000000000000000000000004b00
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [8] : 00000000000000000000000000000000000000000000000000000000000000c8
Deployed Bytecode Sourcemap
43312:505:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40650:254;;;;;;;;;;-1:-1:-1;40650:254:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24731:146;;;;;;;;;;;;;:::i;:::-;;36745:67;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26993:593::-;;;;;;;;;;-1:-1:-1;26993:593:0;;;;;:::i;:::-;;:::i;38733:237::-;;;;;;;;;;-1:-1:-1;38733:237:0;;;;;:::i;:::-;;:::i;25081:160::-;;;;;;;;;;-1:-1:-1;25081:160:0;;;;;:::i;:::-;;:::i;39293:440::-;;;;;;;;;;-1:-1:-1;39293:440:0;;;;;:::i;:::-;;:::i;29827:87::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;42453:583::-;;;;;;;;;;-1:-1:-1;42453:583:0;;;;;:::i;:::-;;:::i;22999:47::-;;;;;;;;;;;;;:::i;28172:1517::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25793:627::-;;;;;;;;;;-1:-1:-1;25793:627:0;;;;;:::i;:::-;;:::i;36636:51::-;;;;;;;;;;;;;:::i;36582:49::-;;;;;;;;;;;;;:::i;41702:444::-;;;;;;;;;;-1:-1:-1;41702:444:0;;;;;:::i;:::-;;:::i;36692:48::-;;;;;;;;;;;;;:::i;22947:47::-;;;;;;;;;;;;;:::i;30641:133::-;;;;;;;;;;-1:-1:-1;30641:133:0;;;;;:::i;:::-;;:::i;22896:46::-;;;;;;;;;;;;;:::i;30255:87::-;;;;;;;;;;;;;:::i;30037:101::-;;;;;;;;;;;;;:::i;38108:233::-;;;;;;;;;;-1:-1:-1;38108:233:0;;;;;:::i;:::-;;:::i;24514:137::-;;;;;;;;;;-1:-1:-1;24514:137:0;;;;;:::i;:::-;;:::i;41136:205::-;;;;;;;;;;-1:-1:-1;41136:205:0;;;;;:::i;:::-;;:::i;39984:461::-;;;;;;;;;;-1:-1:-1;39984:461:0;;;;;:::i;:::-;;:::i;31018:330::-;;;;;;;;;;-1:-1:-1;31018:330:0;;;;;:::i;:::-;;:::i;36522:55::-;;;;;;;;;;;;;:::i;40650:254::-;40778:4;40802:37;40816:10;40828;40802:13;:37::i;:::-;:95;;;;;40850:47;40874:10;40886;40850:23;:47::i;:::-;40794:104;;40650:254;;;;;:::o;24731:146::-;24350:13;;-1:-1:-1;;;;;24350:13:0;24336:10;:27;24328:61;;;;-1:-1:-1;;;24328:61:0;;;;;;;:::i;:::-;;;;;;;;;24785:6:::1;:19:::0;;24794:10:::1;-1:-1:-1::0;;;;;;24785:19:0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;24811:26:0;;;;::::1;::::0;;24851:20:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;24731:146::o:0;36745:67::-;36807:5;36745:67;:::o;26993:593::-;27211:7;24137:6;;-1:-1:-1;;;;;24137:6:0;24123:10;:20;24115:46;;;;-1:-1:-1;;;24115:46:0;;;;;;;:::i;:::-;27227:18:::1;27277:6;27285:5;27292:9;27303:4;27309:13;27324:16;27266:75;;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;27266:75:0;;::::1;::::0;;;;;;27248:100;;27266:75:::1;27248:100:::0;;::::1;::::0;27389:5:::1;27355:31:::0;;;:19:::1;:31:::0;;;;;;:39;;-1:-1:-1;;27355:39:0::1;::::0;;27248:100;-1:-1:-1;;;;;;27408:148:0;::::1;::::0;::::1;::::0;::::1;::::0;27248:100;;27466:5;;27480:9;;27498:4;;27511:13;;27533:16;;27408:148:::1;:::i;:::-;;;;;;;;27570:10:::0;26993:593;-1:-1:-1;;;;;;;26993:593:0:o;38733:237::-;38888:4;38909:55;38934:10;38946:4;38952:11;38909:24;:55::i;:::-;38908:56;;38733:237;-1:-1:-1;;;;38733:237:0:o;25081:160::-;24220:10;24242:4;24220:27;24212:61;;;;-1:-1:-1;;;24212:61:0;;;;;;;:::i;:::-;25158:13:::1;:31:::0;;-1:-1:-1;;;;;;25158:31:0::1;-1:-1:-1::0;;;;;25158:31:0;::::1;;::::0;;25203:32:::1;::::0;::::1;::::0;::::1;::::0;25158:31;;25203:32:::1;:::i;:::-;;;;;;;;25081:160:::0;:::o;39293:440::-;39442:4;39455:45;39531:10;-1:-1:-1;;;;;39531:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39455:117;;39670:57;39703:10;39715:11;39670:32;:57::i;:::-;39593:66;;-1:-1:-1;;;39593:66:0;;-1:-1:-1;;;;;39593:47:0;;;;;:66;;39641:4;;39647:11;;39593:66;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:134;;;39293:440;-1:-1:-1;;;;;39293:440:0:o;29827:87::-;29879:7;29902:6;-1:-1:-1;;;;;29902:6:0;29827:87;:::o;42453:583::-;42586:4;42602:54;;:::i;:::-;42659:38;;-1:-1:-1;;;42659:38:0;;-1:-1:-1;;;;;42659:26:0;;;;;:38;;42686:10;;42659:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;42659:38:0;;;;;;;;;;;;:::i;:::-;42602:95;;42704:20;42747:8;:17;;;-1:-1:-1;;;;;42727:61:0;;42797:8;:19;;;42727:96;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42704:119;;42917:112;43003:17;42917:71;42975:12;42917:53;36807:5;42917:8;:21;;;:25;;:53;;;;:::i;:::-;:57;;:71::i;:::-;:75;;:112::i;:::-;42840:67;42894:12;42840:49;36807:5;42840:8;:17;;;:21;;:49;;;;:::i;:67::-;:189;;42453:583;-1:-1:-1;;;;;42453:583:0:o;22999:47::-;;;:::o;28172:1517::-;24137:6;;28399:12;;-1:-1:-1;;;;;24137:6:0;24123:10;:20;24115:46;;;;-1:-1:-1;;;24115:46:0;;;;;;;:::i;:::-;28420:18:::1;28470:6;28478:5;28485:9;28496:4;28502:13;28517:16;28459:75;;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;28459:75:0;;::::1;::::0;;;;;;28441:100;;28459:75:::1;28441:100:::0;;::::1;::::0;28556:31:::1;::::0;;;:19:::1;:31:::0;;;;;;28441:100;;-1:-1:-1;28556:31:0::1;;28548:61;;;;-1:-1:-1::0;;;28548:61:0::1;;;;;;;:::i;:::-;28643:13;28624:15;:32;;28616:66;;;;-1:-1:-1::0;;;28616:66:0::1;;;;;;;:::i;:::-;28716:31;:13:::0;28734:12:::1;28716:17;:31::i;:::-;28697:15;:50;;28689:84;;;;-1:-1:-1::0;;;28689:84:0::1;;;;;;;:::i;:::-;28816:5;28782:31:::0;;;:19:::1;:31;::::0;;;;:39;;-1:-1:-1;;28782:39:0::1;::::0;;28864:23;;28830:21:::1;::::0;28860:159:::1;;-1:-1:-1::0;28914:4:0;28860:159:::1;;;28992:9;28976:27;;;;;;29006:4;28952:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28941:70;;28860:159;29027:12;29046:23;29080:16;29076:350;;;29128:5;29115:9;:18;;29107:51;;;;-1:-1:-1::0;;;29107:51:0::1;;;;;;;:::i;:::-;29249:6;-1:-1:-1::0;;;;;29249:19:0::1;29269:8;29249:29;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;29225:53:0;;-1:-1:-1;29225:53:0;-1:-1:-1;29076:350:0::1;;;29383:6;-1:-1:-1::0;;;;;29383:11:0::1;29402:5;29409:8;29383:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;29359:59:0;;-1:-1:-1;29359:59:0;-1:-1:-1;29076:350:0::1;29442:7;29434:43;;;;-1:-1:-1::0;;;29434:43:0::1;;;;;;;:::i;:::-;29533:6;-1:-1:-1::0;;;;;29491:166:0::1;;29514:10;29548:5;29562:9;29580:4;29593:13;29615:16;29640:10;29491:166;;;;;;;;;;;;:::i;:::-;;;;;;;;29673:10:::0;28172:1517;-1:-1:-1;;;;;;;;;;28172:1517:0:o;25793:627::-;26010:7;24137:6;;-1:-1:-1;;;;;24137:6:0;24123:10;:20;24115:46;;;;-1:-1:-1;;;24115:46:0;;;;;;;:::i;:::-;26071:6:::1;::::0;26051:27:::1;::::0;:15:::1;::::0;:19:::1;:27::i;:::-;26034:13;:44;;26026:86;;;;-1:-1:-1::0;;;26026:86:0::1;;;;;;;:::i;:::-;26121:18;26171:6;26179:5;26186:9;26197:4;26203:13;26218:16;26160:75;;;;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;26160:75:0;;::::1;::::0;;;;;;26142:100;;26160:75:::1;26142:100:::0;;::::1;::::0;26249:31:::1;::::0;;;:19:::1;:31:::0;;;;;;:38;;-1:-1:-1;;26249:38:0::1;26283:4;26249:38;::::0;;26142:100;-1:-1:-1;;;;;;26301:89:0;::::1;::::0;::::1;::::0;::::1;::::0;26142:100;;26334:5;;26341:9;;26352:4;;26358:13;;26373:16;;26301:89:::1;:::i;36636:51::-:0;;;:::o;36582:49::-;;;:::o;41702:444::-;41825:4;41841:54;;:::i;:::-;41898:38;;-1:-1:-1;;;41898:38:0;;-1:-1:-1;;;;;41898:26:0;;;;;:38;;41925:10;;41898:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;41898:38:0;;;;;;;;;;;;:::i;:::-;41841:95;;41943:20;41986:8;:17;;;-1:-1:-1;;;;;41966:61:0;;42036:8;:19;;;41966:96;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41943:119;;42099:41;42127:12;42099:27;:41::i;:::-;42078:8;:17;;;:62;;42071:69;;;;41702:444;;;;:::o;36692:48::-;;;:::o;22947:47::-;;;:::o;30641:133::-;30717:4;30737:31;;;:19;:31;;;;;;;;30641:133;;;;:::o;22896:46::-;;;:::o;30255:87::-;30330:6;;30255:87;:::o;30037:101::-;30119:13;;-1:-1:-1;;;;;30119:13:0;30037:101;:::o;38108:233::-;38260:4;38280:55;38305:10;38317:4;38323:11;38280:24;:55::i;:::-;38273:62;38108:233;-1:-1:-1;;;;38108:233:0:o;24514:137::-;24220:10;24242:4;24220:27;24212:61;;;;-1:-1:-1;;;24212:61:0;;;;;;;:::i;:::-;24574:21:::1;24589:5;24574:14;:21::i;:::-;24602:6;:14:::0;;;24630:15:::1;::::0;::::1;::::0;::::1;::::0;24611:5;;24630:15:::1;:::i;41136:205::-:0;41245:7;41271:64;36807:5;41271:32;:12;41288:14;41271:16;:32::i;39984:461::-;40127:7;40146:45;40222:10;-1:-1:-1;;;;;40222:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40146:117;;40284:155;36807:5;40284:113;40375:21;40284:25;-1:-1:-1;;;;;40284:63:0;;40348:11;40284:76;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:90;;:113::i;31018:330::-;31155:4;31171:54;;:::i;:::-;31228:38;;-1:-1:-1;;;31228:38:0;;-1:-1:-1;;;;;31228:26:0;;;;;:38;;31255:10;;31228:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31228:38:0;;;;;;;;;;;;:::i;:::-;31301:22;;;;31171:95;;-1:-1:-1;31301:40:0;;31328:12;31301:26;:40::i;:::-;31283:15;:58;;31018:330;-1:-1:-1;;;;31018:330:0:o;36522:55::-;;;:::o;2153:431::-;2211:7;2440:6;2436:37;;-1:-1:-1;2464:1:0;2457:8;;2436:37;2493:5;;;2497:1;2493;:5;:1;2513:5;;;;;:10;2505:56;;;;-1:-1:-1;;;2505:56:0;;;;;;;:::i;3028:126::-;3086:7;3109:39;3113:1;3116;3109:39;;;;;;;;;;;;;;;;;:3;:39::i;897:167::-;955:7;983:5;;;1003:6;;;;995:46;;;;-1:-1:-1;;;995:46:0;;;;;;;:::i;31354:194::-;31431:13;31422:5;:22;;31414:61;;;;-1:-1:-1;;;31414:61:0;;;;;;;:::i;:::-;31499:13;31490:5;:22;;31482:60;;;;-1:-1:-1;;;31482:60:0;;;;;;;:::i;:::-;31354:194;:::o;3618:343::-;3724:7;3818:12;3811:5;3803:28;;;;-1:-1:-1;;;3803:28:0;;;;;;;;:::i;:::-;;3838:9;3854:1;3850;:5;;;;;;;3618:343;-1:-1:-1;;;;;3618:343:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:142:1:-;95:13;;117:33;95:13;117:33;:::i;161:766::-;;285:3;278:4;270:6;266:17;262:27;252:2;;307:5;300;293:20;252:2;344:6;338:13;369:69;384:53;430:6;384:53;:::i;:::-;369:69;:::i;:::-;472:21;;;360:78;-1:-1:-1;512:4:1;532:14;;;;566:15;;;612;;;600:28;;596:37;;593:46;-1:-1:-1;590:2:1;;;652:1;649;642:12;590:2;674:1;684:237;698:6;695:1;692:13;684:237;;;766:3;760:10;783:33;810:5;783:33;:::i;:::-;829:18;;867:12;;;;899;;;;720:1;713:9;684:237;;;688:3;;;;;242:685;;;;:::o;932:760::-;;1053:3;1046:4;1038:6;1034:17;1030:27;1020:2;;1075:5;1068;1061:20;1020:2;1112:6;1106:13;1137:69;1152:53;1198:6;1152:53;:::i;1137:69::-;1240:21;;;1128:78;-1:-1:-1;1280:4:1;1300:14;;;;1334:15;;;1380;;;1368:28;;1364:37;;1361:46;-1:-1:-1;1358:2:1;;;1420:1;1417;1410:12;1358:2;1442:1;1452:234;1466:6;1463:1;1460:13;1452:234;;;1534:3;1528:10;1551:30;1575:5;1551:30;:::i;:::-;1594:18;;1632:12;;;;1664;;;;1488:1;1481:9;1452:234;;1697:1053;;1819:3;1812:4;1804:6;1800:17;1796:27;1786:2;;1841:5;1834;1827:20;1786:2;1878:6;1872:13;1903:69;1918:53;1964:6;1918:53;:::i;1903:69::-;2006:21;;;1894:78;-1:-1:-1;2046:4:1;2066:14;;;;2100:15;;;2133:1;2143:601;2157:6;2154:1;2151:13;2143:601;;;2234:3;2228:10;2220:6;2216:23;2279:3;2274:2;2270;2266:11;2262:21;2252:2;;2297:1;2294;2287:12;2252:2;2344;2340;2336:11;2330:18;2376:55;2391:39;2421:8;2391:39;:::i;2376:55::-;2460:8;2451:7;2444:25;2492:2;2541:3;2536:2;2525:8;2521:2;2517:17;2513:26;2510:35;2507:2;;;2558:1;2555;2548:12;2507:2;2575:62;2628:8;2623:2;2614:7;2610:16;2605:2;2601;2597:11;2575:62;:::i;:::-;-1:-1:-1;2650:20:1;;-1:-1:-1;;2690:12:1;;;;2722;;;;2179:1;2172:9;2143:601;;2755:689;;2879:3;2872:4;2864:6;2860:17;2856:27;2846:2;;2901:5;2894;2887:20;2846:2;2938:6;2932:13;2963:69;2978:53;3024:6;2978:53;:::i;2963:69::-;3066:21;;;2954:78;-1:-1:-1;3106:4:1;3126:14;;;;3160:15;;;3206;;;3194:28;;3190:37;;3187:46;-1:-1:-1;3184:2:1;;;3246:1;3243;3236:12;3184:2;3268:1;3278:160;3292:6;3289:1;3286:13;3278:160;;;3353:10;;3341:23;;3384:12;;;;3416;;;;3314:1;3307:9;3278:160;;3449:136;3527:13;;3549:30;3527:13;3549:30;:::i;3590:460::-;;3687:3;3680:4;3672:6;3668:17;3664:27;3654:2;;3709:5;3702;3695:20;3654:2;3753:6;3740:20;3778:53;3793:37;3823:6;3793:37;:::i;3778:53::-;3769:62;;3854:6;3847:5;3840:21;3908:3;3901:4;3892:6;3884;3880:19;3876:30;3873:39;3870:2;;;3925:1;3922;3915:12;3870:2;3988:6;3981:4;3973:6;3969:17;3962:4;3955:5;3951:16;3938:57;4042:1;4015:18;;;4035:4;4011:29;4004:40;4019:5;3644:406;-1:-1:-1;;3644:406:1:o;4055:259::-;;4167:2;4155:9;4146:7;4142:23;4138:32;4135:2;;;4188:6;4180;4173:22;4135:2;4232:9;4219:23;4251:33;4278:5;4251:33;:::i;4319:263::-;;4442:2;4430:9;4421:7;4417:23;4413:32;4410:2;;;4463:6;4455;4448:22;4410:2;4500:9;4494:16;4519:33;4546:5;4519:33;:::i;4587:987::-;;;;;;;4800:3;4788:9;4779:7;4775:23;4771:33;4768:2;;;4822:6;4814;4807:22;4768:2;4866:9;4853:23;4885:33;4912:5;4885:33;:::i;:::-;4937:5;-1:-1:-1;4989:2:1;4974:18;;4961:32;;-1:-1:-1;5044:2:1;5029:18;;5016:32;5067:18;5097:14;;;5094:2;;;5129:6;5121;5114:22;5094:2;5157:51;5200:7;5191:6;5180:9;5176:22;5157:51;:::i;:::-;5147:61;;5261:2;5250:9;5246:18;5233:32;5217:48;;5290:2;5280:8;5277:16;5274:2;;;5311:6;5303;5296:22;5274:2;;5339:53;5384:7;5373:8;5362:9;5358:24;5339:53;:::i;:::-;5329:63;;;5439:3;5428:9;5424:19;5411:33;5401:43;;5496:3;5485:9;5481:19;5468:33;5510:32;5534:7;5510:32;:::i;:::-;5561:7;5551:17;;;4758:816;;;;;;;;:::o;5579:190::-;;5691:2;5679:9;5670:7;5666:23;5662:32;5659:2;;;5712:6;5704;5697:22;5659:2;-1:-1:-1;5740:23:1;;5649:120;-1:-1:-1;5649:120:1:o;5774:495::-;;;;5945:2;5933:9;5924:7;5920:23;5916:32;5913:2;;;5966:6;5958;5951:22;5913:2;6010:9;5997:23;6029:33;6056:5;6029:33;:::i;:::-;6081:5;-1:-1:-1;6138:2:1;6123:18;;6110:32;6151:35;6110:32;6151:35;:::i;:::-;5903:366;;6205:7;;-1:-1:-1;;;6259:2:1;6244:18;;;;6231:32;;5903:366::o;6274:352::-;;;6428:2;6416:9;6407:7;6403:23;6399:32;6396:2;;;6449:6;6441;6434:22;6396:2;6493:9;6480:23;6512:33;6539:5;6512:33;:::i;:::-;6564:5;6616:2;6601:18;;;;6588:32;;-1:-1:-1;;;6386:240:1:o;6631:2465::-;;6791:2;6779:9;6770:7;6766:23;6762:32;6759:2;;;6812:6;6804;6797:22;6759:2;6850:9;6844:16;6879:18;6920:2;6912:6;6909:14;6906:2;;;6941:6;6933;6926:22;6906:2;6984:6;6973:9;6969:22;6959:32;;7010:6;7050:2;7045;7036:7;7032:16;7028:25;7025:2;;;7071:6;7063;7056:22;7025:2;7102:18;7117:2;7102:18;:::i;:::-;7089:31;;7149:2;7143:9;7136:5;7129:24;7185:44;7225:2;7221;7217:11;7185:44;:::i;:::-;7180:2;7173:5;7169:14;7162:68;7262:44;7302:2;7298;7294:11;7262:44;:::i;:::-;7257:2;7250:5;7246:14;7239:68;7346:2;7342;7338:11;7332:18;7375:2;7365:8;7362:16;7359:2;;;7396:6;7388;7381:22;7359:2;7437:73;7502:7;7491:8;7487:2;7483:17;7437:73;:::i;:::-;7432:2;7425:5;7421:14;7414:97;;7550:3;7546:2;7542:12;7536:19;7580:2;7570:8;7567:16;7564:2;;;7601:6;7593;7586:22;7564:2;7643:73;7708:7;7697:8;7693:2;7689:17;7643:73;:::i;:::-;7637:3;7630:5;7626:15;7619:98;;7756:3;7752:2;7748:12;7742:19;7786:2;7776:8;7773:16;7770:2;;;7807:6;7799;7792:22;7770:2;7849:71;7912:7;7901:8;7897:2;7893:17;7849:71;:::i;:::-;7843:3;7836:5;7832:15;7825:96;;7960:3;7956:2;7952:12;7946:19;7990:2;7980:8;7977:16;7974:2;;;8011:6;8003;7996:22;7974:2;8053:71;8116:7;8105:8;8101:2;8097:17;8053:71;:::i;:::-;8047:3;8040:5;8036:15;8029:96;;8164:3;8160:2;8156:12;8150:19;8194:2;8184:8;8181:16;8178:2;;;8215:6;8207;8200:22;8178:2;8257:70;8319:7;8308:8;8304:2;8300:17;8257:70;:::i;:::-;8251:3;8240:15;;8233:95;-1:-1:-1;8347:3:1;8388:11;;;8382:18;8366:14;;;8359:42;8420:3;8461:11;;;8455:18;8439:14;;;8432:42;8493:3;8534:11;;;8528:18;8512:14;;;8505:42;8566:3;8607:11;;;8601:18;8585:14;;;8578:42;8639:3;8680:11;;;8674:18;8658:14;;;8651:42;8712:3;;-1:-1:-1;8747:41:1;8776:11;;;8747:41;:::i;:::-;8742:2;8735:5;8731:14;8724:65;8809:3;8798:14;;8845:42;8882:3;8878:2;8874:12;8845:42;:::i;:::-;8839:3;8832:5;8828:15;8821:67;8908:3;8897:14;;8944:45;8984:3;8980:2;8976:12;8944:45;:::i;:::-;8927:15;;;8920:70;;;;9010:3;9052:12;;;9046:19;9029:15;;;9022:44;;;;8931:5;6749:2347;-1:-1:-1;;;6749:2347:1:o;9296:194::-;;9419:2;9407:9;9398:7;9394:23;9390:32;9387:2;;;9440:6;9432;9425:22;9387:2;-1:-1:-1;9468:16:1;;9377:113;-1:-1:-1;9377:113:1:o;9495:259::-;;9576:5;9570:12;9603:6;9598:3;9591:19;9619:63;9675:6;9668:4;9663:3;9659:14;9652:4;9645:5;9641:16;9619:63;:::i;:::-;9736:2;9715:15;-1:-1:-1;;9711:29:1;9702:39;;;;9743:4;9698:50;;9546:208;-1:-1:-1;;9546:208:1:o;9759:371::-;-1:-1:-1;;;;;;9944:33:1;;9932:46;;10001:13;;9759:371;;10023:61;10001:13;10073:1;10064:11;;10057:4;10045:17;;10023:61;:::i;:::-;10104:16;;;;10122:1;10100:24;;9922:208;-1:-1:-1;;;9922:208:1:o;10135:274::-;;10302:6;10296:13;10318:53;10364:6;10359:3;10352:4;10344:6;10340:17;10318:53;:::i;:::-;10387:16;;;;;10272:137;-1:-1:-1;;10272:137:1:o;10414:203::-;-1:-1:-1;;;;;10578:32:1;;;;10560:51;;10548:2;10533:18;;10515:102::o;10838:274::-;-1:-1:-1;;;;;11030:32:1;;;;11012:51;;11094:2;11079:18;;11072:34;11000:2;10985:18;;10967:145::o;11117:707::-;;11447:1;11443;11438:3;11434:11;11430:19;11422:6;11418:32;11407:9;11400:51;11487:6;11482:2;11471:9;11467:18;11460:34;11530:3;11525:2;11514:9;11510:18;11503:31;11557:47;11599:3;11588:9;11584:19;11576:6;11557:47;:::i;:::-;11652:9;11644:6;11640:22;11635:2;11624:9;11620:18;11613:50;11680:34;11707:6;11699;11680:34;:::i;:::-;11745:3;11730:19;;11723:35;;;;-1:-1:-1;;11802:14:1;;11795:22;11789:3;11774:19;;;11767:51;11672:42;11390:434;-1:-1:-1;;;;11390:434:1:o;11829:187::-;11994:14;;11987:22;11969:41;;11957:2;11942:18;;11924:92::o;12021:177::-;12167:25;;;12155:2;12140:18;;12122:76::o;12203:681::-;;12504:6;12493:9;12486:25;12547:6;12542:2;12531:9;12527:18;12520:34;12590:3;12585:2;12574:9;12570:18;12563:31;12617:47;12659:3;12648:9;12644:19;12636:6;12617:47;:::i;12889:844::-;;13236:6;13225:9;13218:25;13279:6;13274:2;13263:9;13259:18;13252:34;13322:3;13317:2;13306:9;13302:18;13295:31;13349:47;13391:3;13380:9;13376:19;13368:6;13349:47;:::i;:::-;13444:9;13436:6;13432:22;13427:2;13416:9;13412:18;13405:50;13478:34;13505:6;13497;13478:34;:::i;:::-;13464:48;;13549:6;13543:3;13532:9;13528:19;13521:35;13607:6;13600:14;13593:22;13587:3;13576:9;13572:19;13565:51;13665:9;13657:6;13653:22;13647:3;13636:9;13632:19;13625:51;13693:34;13720:6;13712;13693:34;:::i;:::-;13685:42;13208:525;-1:-1:-1;;;;;;;;;;13208:525:1:o;13738:219::-;;13885:2;13874:9;13867:21;13905:46;13947:2;13936:9;13932:18;13924:6;13905:46;:::i;14188:345::-;14390:2;14372:21;;;14429:2;14409:18;;;14402:30;-1:-1:-1;;;14463:2:1;14448:18;;14441:51;14524:2;14509:18;;14362:171::o;14538:351::-;14740:2;14722:21;;;14779:2;14759:18;;;14752:30;14818:29;14813:2;14798:18;;14791:57;14880:2;14865:18;;14712:177::o;14894:345::-;15096:2;15078:21;;;15135:2;15115:18;;;15108:30;-1:-1:-1;;;15169:2:1;15154:18;;15147:51;15230:2;15215:18;;15068:171::o;15244:353::-;15446:2;15428:21;;;15485:2;15465:18;;;15458:30;15524:31;15519:2;15504:18;;15497:59;15588:2;15573:18;;15418:179::o;15602:397::-;15804:2;15786:21;;;15843:2;15823:18;;;15816:30;15882:34;15877:2;15862:18;;15855:62;-1:-1:-1;;;15948:2:1;15933:18;;15926:31;15989:3;15974:19;;15776:223::o;16004:350::-;16206:2;16188:21;;;16245:2;16225:18;;;16218:30;16284:28;16279:2;16264:18;;16257:56;16345:2;16330:18;;16178:176::o;16359:337::-;16561:2;16543:21;;;16600:2;16580:18;;;16573:30;-1:-1:-1;;;16634:2:1;16619:18;;16612:43;16687:2;16672:18;;16533:163::o;16701:345::-;16903:2;16885:21;;;16942:2;16922:18;;;16915:30;-1:-1:-1;;;16976:2:1;16961:18;;16954:51;17037:2;17022:18;;16875:171::o;17051:341::-;17253:2;17235:21;;;17292:2;17272:18;;;17265:30;-1:-1:-1;;;17326:2:1;17311:18;;17304:47;17383:2;17368:18;;17225:167::o;17397:347::-;17599:2;17581:21;;;17638:2;17618:18;;;17611:30;17677:25;17672:2;17657:18;;17650:53;17735:2;17720:18;;17571:173::o;17749:349::-;17951:2;17933:21;;;17990:2;17970:18;;;17963:30;18029:27;18024:2;18009:18;;18002:55;18089:2;18074:18;;17923:175::o;18103:344::-;18305:2;18287:21;;;18344:2;18324:18;;;18317:30;-1:-1:-1;;;18378:2:1;18363:18;;18356:50;18438:2;18423:18;;18277:170::o;18452:345::-;18654:2;18636:21;;;18693:2;18673:18;;;18666:30;-1:-1:-1;;;18727:2:1;18712:18;;18705:51;18788:2;18773:18;;18626:171::o;18984:242::-;19054:2;19048:9;19084:17;;;19131:18;19116:34;;19152:22;;;19113:62;19110:2;;;19178:9;19110:2;19205;19198:22;19028:198;;-1:-1:-1;19028:198:1:o;19231:183::-;;19330:18;19322:6;19319:30;19316:2;;;19352:9;19316:2;-1:-1:-1;19403:4:1;19384:17;;;19380:28;;19306:108::o;19419:181::-;;19502:18;19494:6;19491:30;19488:2;;;19524:9;19488:2;-1:-1:-1;19583:2:1;19560:17;-1:-1:-1;;19556:31:1;19589:4;19552:42;;19478:122::o;19605:258::-;19677:1;19687:113;19701:6;19698:1;19695:13;19687:113;;;19777:11;;;19771:18;19758:11;;;19751:39;19723:2;19716:10;19687:113;;;19818:6;19815:1;19812:13;19809:2;;;19853:1;19844:6;19839:3;19835:16;19828:27;19809:2;;19658:205;;;:::o;19868:133::-;-1:-1:-1;;;;;19945:31:1;;19935:42;;19925:2;;19991:1;19988;19981:12;20006:120;20094:5;20087:13;20080:21;20073:5;20070:32;20060:2;;20116:1;20113;20106:12
Swarm Source
ipfs://7d7b66ba28d046d4d656e4df247be53975f44c25e262124502e75f5724164379
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
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.