Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GovernanceProxy
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "Address.sol"; import "SimpleAccessControl.sol"; import "IGovernanceProxy.sol"; contract GovernanceProxy is IGovernanceProxy, SimpleAccessControl { using Address for address; bytes32 public constant GOVERNANCE_ROLE = "GOVERNANCE"; bytes32 public constant VETO_ROLE = "VETO"; uint256 internal constant _MAX_DELAY = 14 days; uint64 public nextChangeId; /// @notice mapping from function selector to delay in seconds /// NOTE: For simplicity, delays are only based on selectors and not on the /// contract address, which means that if two functions in different /// contracts have the exact same name and arguments, they will share the same delay mapping(bytes4 => uint64) public override delays; /// @dev array of pending changes to execute /// We perform linear searches through this using the change ID, so in theory /// this could run out of gas. However, in practice, the number of pending /// changes should never become large enough for this to become an issue Change[] internal pendingChanges; /// @dev this is an array of all changes that have ended, regardless of their status /// this is only used to make it easier to query but should not be used from within /// any contract as the length is completely unbounded Change[] internal endedChanges; constructor(address governance, address veto) { _grantRole(GOVERNANCE_ROLE, governance); _grantRole(VETO_ROLE, veto); } /// @return change the pending change with the given id if found /// this reverts if the change is not found function getPendingChange(uint64 changeId) external view returns (Change memory change) { (change, ) = _findPendingChange(changeId); } /// @return all the pending changes /// this should typically be quite small so no need for pagination function getPendingChanges() external view returns (Change[] memory) { return pendingChanges; } /// @return total number of ended changes function getEndedChangesCount() external view returns (uint256) { return endedChanges.length; } /// @return all the ended changes /// this can become large so `getEndedChanges(uint256 offset, uint256 n)` /// is the preferred way to query function getEndedChanges() external view returns (Change[] memory) { return endedChanges; } /// @return `n` ended changes starting from offset /// This is useful is you want to paginate through the changes /// note that the changes are in chronological order of execution/cancelation /// which means that it might be useful to start paginatign from the end of the array function getEndedChanges(uint256 offset, uint256 n) external view returns (Change[] memory) { Change[] memory paginated = new Change[](n); for (uint256 i; i < n; i++) { paginated[i] = endedChanges[offset + i]; } return paginated; } /// @notice Requests a list of function calls to be executed as a change /// @dev If the change requires no delay, it will be executed immediately /// @param calls the calls to be executed /// this should be fully encoded including the selectors and the abi-encoded arguments /// Changes can only be requested by governance function requestChange(Call[] calldata calls) external onlyRole(GOVERNANCE_ROLE) { // Calculating the maximum delay for all calls uint64 maxDelay; for (uint256 i; i < calls.length; i++) { uint64 delay = _computeDelay(calls[i].data); if (delay > maxDelay) maxDelay = delay; } (Change storage change, uint256 index) = _requestChange(maxDelay, calls); // If the change requires no delay, execute it immediately if (maxDelay == 0) { _executeChange(change, index); } } /// @notice Executes a change /// The deadline of the change must be past /// Anyone can execute a pending change but in practice, this will be called by governance too function executeChange(uint64 id) external { (Change storage change, uint256 index) = _findPendingChange(id); _executeChange(change, index); } /// @notice Cancels a pending change /// Both governance and users having veto power can cancel a pending change function cancelChange(uint64 id) external { require( hasRole(GOVERNANCE_ROLE, msg.sender) || hasRole(VETO_ROLE, msg.sender), "not authorized" ); (Change storage change, uint256 index) = _findPendingChange(id); emit ChangeCanceled(id); _endChange(change, index, Status.Canceled); } // the following functions should be called through `executeChange` function updateDelay(bytes4 selector, uint64 delay) external override { require(msg.sender == address(this), "not authorized"); require(delay <= _MAX_DELAY, "delay too high"); delays[selector] = delay; emit DelayUpdated(selector, delay); } function grantRole(bytes32 role, address account) external override { require(msg.sender == address(this), "not authorized"); require(role == GOVERNANCE_ROLE || role == VETO_ROLE, "invalid role"); _grantRole(role, account); } function revokeRole(bytes32 role, address account) external override { require(msg.sender == address(this), "not authorized"); require( role != GOVERNANCE_ROLE || getRoleMemberCount(role) > 1, "need at least one governor" ); _revokeRole(role, account); } // internal helpers function _requestChange( uint64 delay, Call[] calldata calls ) internal returns (Change storage change, uint256 index) { uint64 id = nextChangeId++; change = pendingChanges.push(); change.id = id; change.requestedAt = uint64(block.timestamp); change.endedAt = 0; change.delay = delay; change.status = Status.Pending; for (uint256 i; i < calls.length; i++) { change.calls.push(calls[i]); } index = pendingChanges.length - 1; emit ChangeRequested(calls, delay, id); } function _executeChange(Change storage change, uint256 index) internal { require( change.requestedAt + change.delay <= block.timestamp, "deadline has not been reached" ); require(change.status == Status.Pending, "change not pending"); change.status = Status.Executing; for (uint256 i; i < change.calls.length; i++) { change.calls[i].target.functionCall(change.calls[i].data); } _endChange(change, index, Status.Executed); emit ChangeExecuted(change.id); } function _endChange(Change storage change, uint256 index, Status status) internal { change.status = status; change.endedAt = uint64(block.timestamp); endedChanges.push(change); _removePendingChange(index); } function _removePendingChange(uint256 index) internal { pendingChanges[index] = pendingChanges[pendingChanges.length - 1]; pendingChanges.pop(); } function _findPendingChange(uint64 id) internal view returns (Change storage, uint256 index) { for (uint256 i; i < pendingChanges.length; i++) { if (pendingChanges[i].id == id) { return (pendingChanges[i], i); } } revert("change not found"); } function _computeDelay(bytes calldata data) internal view returns (uint64) { bytes4 selector = bytes4(data[:4]); // special case for `updateDelay`, we want to set the delay // as the delay for the current function for which the delay // will be changed, rather than a generic delay for `updateDelay` itself // for all the other functions, we use their actual delay if (selector == GovernanceProxy.updateDelay.selector) { bytes memory callData = data[4:]; (selector, ) = abi.decode(callData, (bytes4, uint256)); } return delays[selector]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "EnumerableSet.sol"; import "ISimpleAccessControl.sol"; contract SimpleAccessControl is ISimpleAccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) internal roles; modifier onlyRole(bytes32 role) { require(hasRole(role, msg.sender), "not authorized"); _; } function _grantRole(bytes32 role, address account) internal { roles[role].add(account); emit RoleGranted(role, account); } function _revokeRole(bytes32 role, address account) internal { roles[role].remove(account); emit RoleRevoked(role, account); } function hasRole(bytes32 role, address account) public view override returns (bool) { return roles[role].contains(account); } function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return roles[role].length(); } function accountsWithRole(bytes32 role) external view override returns (address[] memory) { return roles[role].values(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; interface ISimpleAccessControl { event RoleGranted(bytes32 indexed role, address indexed account); event RoleRevoked(bytes32 indexed role, address indexed account); function accountsWithRole(bytes32 role) external view returns (address[] memory); function hasRole(bytes32 role, address account) external view returns (bool); function getRoleMemberCount(bytes32 role) external view returns (uint256); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity 0.8.17; import "ISimpleAccessControl.sol"; interface IGovernanceProxy is ISimpleAccessControl { /// @notice emitted when a change is requested by governance event ChangeRequested(Call[] calls, uint64 delay, uint64 changeId); /// @notice emitted when a change is executed /// this can be in the same block as `ChangeRequested` if there is no /// delay for the given function event ChangeExecuted(uint64 indexed changeId); /// @notice emitted when a change is canceled event ChangeCanceled(uint64 indexed changeId); /// @notice emitted when a function's delay is updated event DelayUpdated(bytes4 indexed selector, uint64 delay); /// @notice status of a change enum Status { Pending, Canceled, Executed, Executing } /// @notice this represents a function call as part of a Change /// The target is the contract to execute the function on /// The data is the function signature and the abi-encoded arguments struct Call { address target; bytes data; } /// @notice this represents a change to execute a set of function calls /// The ID is an unique auto-incrementing id that will be generated for each change /// The status is one of pending, canceled or executed and is pending when the change is created /// The requestedAt is the timestamp when the change was requested /// The delay is the delay in seconds before the change can be executed /// The endedAt is the timestamp when the change was executed or canceled /// The calls are the function calls to execute as part of the change struct Change { Status status; uint64 id; uint64 requestedAt; uint64 delay; uint64 endedAt; Call[] calls; } function delays(bytes4 selector) external view returns (uint64); function getPendingChange(uint64 changeId) external view returns (Change memory change); function getPendingChanges() external view returns (Change[] memory); function getEndedChangesCount() external view returns (uint256); function getEndedChanges() external view returns (Change[] memory); function getEndedChanges(uint256 offset, uint256 n) external view returns (Change[] memory); function requestChange(Call[] calldata calls) external; function executeChange(uint64 id) external; function cancelChange(uint64 id) external; function updateDelay(bytes4 selector, uint64 delay) external; function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; }
{ "evmVersion": "london", "optimizer": { "enabled": true, "runs": 200 }, "libraries": { "GovernanceProxy.sol": {} }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"governance","type":"address"},{"internalType":"address","name":"veto","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"changeId","type":"uint64"}],"name":"ChangeCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint64","name":"changeId","type":"uint64"}],"name":"ChangeExecuted","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"indexed":false,"internalType":"struct IGovernanceProxy.Call[]","name":"calls","type":"tuple[]"},{"indexed":false,"internalType":"uint64","name":"delay","type":"uint64"},{"indexed":false,"internalType":"uint64","name":"changeId","type":"uint64"}],"name":"ChangeRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes4","name":"selector","type":"bytes4"},{"indexed":false,"internalType":"uint64","name":"delay","type":"uint64"}],"name":"DelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"GOVERNANCE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VETO_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"accountsWithRole","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"id","type":"uint64"}],"name":"cancelChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"delays","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"id","type":"uint64"}],"name":"executeChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"n","type":"uint256"}],"name":"getEndedChanges","outputs":[{"components":[{"internalType":"enum IGovernanceProxy.Status","name":"status","type":"uint8"},{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"requestedAt","type":"uint64"},{"internalType":"uint64","name":"delay","type":"uint64"},{"internalType":"uint64","name":"endedAt","type":"uint64"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IGovernanceProxy.Call[]","name":"calls","type":"tuple[]"}],"internalType":"struct IGovernanceProxy.Change[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEndedChanges","outputs":[{"components":[{"internalType":"enum IGovernanceProxy.Status","name":"status","type":"uint8"},{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"requestedAt","type":"uint64"},{"internalType":"uint64","name":"delay","type":"uint64"},{"internalType":"uint64","name":"endedAt","type":"uint64"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IGovernanceProxy.Call[]","name":"calls","type":"tuple[]"}],"internalType":"struct IGovernanceProxy.Change[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEndedChangesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"changeId","type":"uint64"}],"name":"getPendingChange","outputs":[{"components":[{"internalType":"enum IGovernanceProxy.Status","name":"status","type":"uint8"},{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"requestedAt","type":"uint64"},{"internalType":"uint64","name":"delay","type":"uint64"},{"internalType":"uint64","name":"endedAt","type":"uint64"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IGovernanceProxy.Call[]","name":"calls","type":"tuple[]"}],"internalType":"struct IGovernanceProxy.Change","name":"change","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingChanges","outputs":[{"components":[{"internalType":"enum IGovernanceProxy.Status","name":"status","type":"uint8"},{"internalType":"uint64","name":"id","type":"uint64"},{"internalType":"uint64","name":"requestedAt","type":"uint64"},{"internalType":"uint64","name":"delay","type":"uint64"},{"internalType":"uint64","name":"endedAt","type":"uint64"},{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IGovernanceProxy.Call[]","name":"calls","type":"tuple[]"}],"internalType":"struct IGovernanceProxy.Change[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextChangeId","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct IGovernanceProxy.Call[]","name":"calls","type":"tuple[]"}],"name":"requestChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"uint64","name":"delay","type":"uint64"}],"name":"updateDelay","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620027f8380380620027f8833981016040819052620000349162000157565b6200004d69474f5645524e414e434560b01b8362000068565b62000060635645544f60e01b8262000068565b50506200018f565b6000828152602081815260409091206200008d91839062000ec0620000c8821b17901c565b506040516001600160a01b0382169083907f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f390600090a35050565b6000620000df836001600160a01b038416620000e8565b90505b92915050565b60008181526001830160205260408120546200013157508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620000e2565b506000620000e2565b80516001600160a01b03811681146200015257600080fd5b919050565b600080604083850312156200016b57600080fd5b62000176836200013a565b915062000186602084016200013a565b90509250929050565b612659806200019f6000396000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063d547741f116100a2578063ee5112a911610071578063ee5112a91461024e578063f36c8f5c14610256578063f3de7f4f1461026a578063fb507e8714610293578063fcb96a9f146102b357600080fd5b8063d547741f14610202578063d980e4b114610215578063da2d17fe14610228578063e4a99c471461023b57600080fd5b8063634f8ed6116100e9578063634f8ed61461017357806391d1485414610193578063a147109b146101b6578063a825a680146101c4578063ca15c873146101ef57600080fd5b80630954ae961461011b5780630c2cdbd7146101395780630f26f5d21461014b5780632f2ff15d14610160575b600080fd5b6101236102c6565b6040516101309190611e25565b60405180910390f35b6004545b604051908152602001610130565b61015e610159366004611e87565b6104a8565b005b61015e61016e366004611f10565b610596565b610186610181366004611f40565b61061f565b6040516101309190611f59565b6101a66101a1366004611f10565b61063f565b6040519015158152602001610130565b61013d635645544f60e01b81565b6001546101d7906001600160401b031681565b6040516001600160401b039091168152602001610130565b61013d6101fd366004611f40565b61065e565b61015e610210366004611f10565b610675565b61015e610223366004611fc2565b61070e565b61015e610236366004611ff3565b6107ae565b610123610249366004612028565b610888565b610123610b04565b61013d69474f5645524e414e434560b01b81565b6101d761027836600461204a565b6002602052600090815260409020546001600160401b031681565b6102a66102a1366004611fc2565b610cdd565b6040516101309190612067565b61015e6102c1366004611fc2565b610ea6565b60606003805480602002602001604051908101604052809291908181526020016000905b8282101561049f57838290600052602060002090600302016040518060c00160405290816000820160009054906101000a900460ff16600381111561033157610331611cd0565b600381111561034257610342611cd0565b815281546001600160401b0361010082048116602080850191909152600160481b83048216604080860191909152600160881b909304821660608501526001850154909116608084015260028401805483518184028101840190945280845260a090940193909160009084015b82821015610488576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260018101805492939192918401916103f79061207a565b80601f01602080910402602001604051908101604052809291908181526020018280546104239061207a565b80156104705780601f1061044557610100808354040283529160200191610470565b820191906000526020600020905b81548152906001019060200180831161045357829003601f168201915b505050505081525050815260200190600101906103af565b5050505081525050815260200190600101906102ea565b50505050905090565b69474f5645524e414e434560b01b6104c0813361063f565b6104e55760405162461bcd60e51b81526004016104dc906120b4565b60405180910390fd5b6000805b8381101561056057600061052d868684818110610508576105086120dc565b905060200281019061051a91906120f2565b610528906020810190612112565b610ed5565b9050826001600160401b0316816001600160401b0316111561054d578092505b508061055881612175565b9150506104e9565b5060008061056f838787610f92565b91509150826001600160401b031660000361058e5761058e8282611167565b505050505050565b3330146105b55760405162461bcd60e51b81526004016104dc906120b4565b69474f5645524e414e434560b01b8214806105d65750635645544f60e01b82145b6106115760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420726f6c6560a01b60448201526064016104dc565b61061b828261139f565b5050565b6000818152602081905260409020606090610639906113f2565b92915050565b600082815260208190526040812061065790836113ff565b9392505050565b600081815260208190526040812061063990611421565b3330146106945760405162461bcd60e51b81526004016104dc906120b4565b69474f5645524e414e434560b01b821415806106b8575060016106b68361065e565b115b6107045760405162461bcd60e51b815260206004820152601a60248201527f6e656564206174206c65617374206f6e6520676f7665726e6f7200000000000060448201526064016104dc565b61061b828261142b565b61072569474f5645524e414e434560b01b3361063f565b8061073c575061073c635645544f60e01b3361063f565b6107585760405162461bcd60e51b81526004016104dc906120b4565b6000806107648361147e565b60405191935091506001600160401b038416907f4bb934cf1c626b3439a169ba2f7710e204c468538fc3a2f54942fd8ee60046af90600090a26107a982826001611549565b505050565b3330146107cd5760405162461bcd60e51b81526004016104dc906120b4565b62127500816001600160401b0316111561081a5760405162461bcd60e51b815260206004820152600e60248201526d0c8cad8c2f240e8dede40d0d2ced60931b60448201526064016104dc565b6001600160e01b03198216600081815260026020908152604091829020805467ffffffffffffffff19166001600160401b03861690811790915591519182527f0816c272a68b4bff071bf7f969473d64b07dcee749dc4b37a85be0ea27f05efd910160405180910390a25050565b60606000826001600160401b038111156108a4576108a461218e565b60405190808252806020026020018201604052801561090657816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083019190915260a082015282526000199092019101816108c25790505b50905060005b83811015610afc57600461092082876121a4565b81548110610930576109306120dc565b90600052602060002090600302016040518060c00160405290816000820160009054906101000a900460ff16600381111561096d5761096d611cd0565b600381111561097e5761097e611cd0565b815281546001600160401b0361010082048116602080850191909152600160481b83048216604080860191909152600160881b909304821660608501526001850154909116608084015260028401805483518184028101840190945280845260a090940193909160009084015b82821015610ac4576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001810180549293919291840191610a339061207a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f9061207a565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b505050505081525050815260200190600101906109eb565b5050505081525050828281518110610ade57610ade6120dc565b60200260200101819052508080610af490612175565b91505061090c565b509392505050565b60606004805480602002602001604051908101604052809291908181526020016000905b8282101561049f57838290600052602060002090600302016040518060c00160405290816000820160009054906101000a900460ff166003811115610b6f57610b6f611cd0565b6003811115610b8057610b80611cd0565b815281546001600160401b0361010082048116602080850191909152600160481b83048216604080860191909152600160881b909304821660608501526001850154909116608084015260028401805483518184028101840190945280845260a090940193909160009084015b82821015610cc6576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001810180549293919291840191610c359061207a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c619061207a565b8015610cae5780601f10610c8357610100808354040283529160200191610cae565b820191906000526020600020905b815481529060010190602001808311610c9157829003601f168201915b50505050508152505081526020019060010190610bed565b505050508152505081526020019060010190610b28565b6040805160c0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810191909152610d1a8261147e565b6040805160c0810190915282548390829060ff166003811115610d3f57610d3f611cd0565b6003811115610d5057610d50611cd0565b815281546001600160401b0361010082048116602080850191909152600160481b83048216604080860191909152600160881b909304821660608501526001850154909116608084015260028401805483518184028101840190945280845260a090940193909160009084015b82821015610e96576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001810180549293919291840191610e059061207a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e319061207a565b8015610e7e5780601f10610e5357610100808354040283529160200191610e7e565b820191906000526020600020905b815481529060010190602001808311610e6157829003601f168201915b50505050508152505081526020019060010190610dbd565b5050509152509095945050505050565b600080610eb28361147e565b915091506107a98282611167565b6000610657836001600160a01b0384166116a9565b600080610ee560048285876121b7565b610eee916121e1565b90506312e9740160e11b6001600160e01b0319821601610f69576000610f1784600481886121b7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350610f649284016020908101925084019050612211565b509150505b6001600160e01b0319166000908152600260205260409020546001600160401b03169392505050565b60018054600091829182916001600160401b039091169082610fb38361223f565b825461010092830a6001600160401b038181021990921692821602919091179092556003805460018101825560008281527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9190920290810180547fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c909201805467ffffffffffffffff19169055610100600160881b031990911685851690930267ffffffffffffffff60481b191692909217600160481b428516021778ffffffffffffffff00000000000000000000000000000000ff1916600160881b938b169390930260ff191692909217815594509091505b8481101561110f57836002018686838181106110c6576110c66120dc565b90506020028101906110d891906120f2565b8154600181018355600092835260209092209091600202016110fa82826122ab565b5050808061110790612175565b9150506110a8565b5060035461111f906001906123c6565b91507fea6e341f82fb9f110709efb8c6306f361297efe562f52a900dd723067675762a8585888460405161115694939291906123d9565b60405180910390a150935093915050565b8154429061118e906001600160401b03600160881b8204811691600160481b9004166124e8565b6001600160401b031611156111e55760405162461bcd60e51b815260206004820152601d60248201527f646561646c696e6520686173206e6f74206265656e207265616368656400000060448201526064016104dc565b6000825460ff1660038111156111fd576111fd611cd0565b1461123f5760405162461bcd60e51b81526020600482015260126024820152716368616e6765206e6f742070656e64696e6760701b60448201526064016104dc565b815460ff1916600317825560005b600283015481101561135357611340836002018281548110611271576112716120dc565b9060005260206000209060020201600101805461128d9061207a565b80601f01602080910402602001604051908101604052809291908181526020018280546112b99061207a565b80156113065780601f106112db57610100808354040283529160200191611306565b820191906000526020600020905b8154815290600101906020018083116112e957829003601f168201915b5050505050846002018381548110611320576113206120dc565b60009182526020909120600290910201546001600160a01b0316906116f8565b508061134b81612175565b91505061124d565b5061136082826002611549565b81546040516101009091046001600160401b0316907f4093c58d6d95b5dc15bbca26257f9d4618824328023882d9cf600066a1f4bf3490600090a25050565b60008281526020819052604090206113b79082610ec0565b506040516001600160a01b0382169083907f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f390600090a35050565b606060006106578361173c565b6001600160a01b03811660009081526001830160205260408120541515610657565b6000610639825490565b60008281526020819052604090206114439082611798565b506040516001600160a01b0382169083907f155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a5290600090a35050565b60008060005b60035481101561150d57836001600160401b0316600382815481106114ab576114ab6120dc565b600091825260209091206003909102015461010090046001600160401b0316036114fb57600381815481106114e2576114e26120dc565b9060005260206000209060030201819250925050915091565b8061150581612175565b915050611484565b5060405162461bcd60e51b815260206004820152601060248201526f18da185b99d9481b9bdd08199bdd5b9960821b60448201526064016104dc565b82548190849060ff1916600183600381111561156757611567611cd0565b02179055506001838101805467ffffffffffffffff1916426001600160401b031617905560048054808301825560009190915284547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b60039283020180548794919360ff90931692849260ff19909216919084908111156115ea576115ea611cd0565b0217905550815481546001600160401b0361010092839004811690920268ffffffffffffffff00198216811784558454600160481b9081900484160267ffffffffffffffff60481b19909116610100600160881b031990921691909117178083558354600160881b9081900483160267ffffffffffffffff60881b19909116178255600180840154908301805467ffffffffffffffff1916919092161790556002808301805461169d9284019190611baf565b5050506107a9826117ad565b60008181526001830160205260408120546116f057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610639565b506000610639565b6060610657838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061193a565b60608160000180548060200260200160405190810160405280929190818152602001828054801561178c57602002820191906000526020600020905b815481526020019060010190808311611778575b50505050509050919050565b6000610657836001600160a01b038416611a17565b600380546117bd906001906123c6565b815481106117cd576117cd6120dc565b9060005260206000209060030201600382815481106117ee576117ee6120dc565b60009182526020909120825460039283029091018054909260ff90921691839160ff191690600190849081111561182757611827611cd0565b0217905550815481546001600160401b0361010092839004811690920268ffffffffffffffff00198216811784558454600160481b9081900484160267ffffffffffffffff60481b19909116610100600160881b031990921691909117178083558354600160881b9081900483160267ffffffffffffffff60881b19909116178255600180840154908301805467ffffffffffffffff191691909216179055600280830180546118da9284019190611baf565b5090505060038054806118ef576118ef612508565b60008281526020812060036000199093019283020180546001600160c81b031916815560018101805467ffffffffffffffff19169055906119336002830182611c34565b5050905550565b60608247101561199b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104dc565b600080866001600160a01b031685876040516119b7919061251e565b60006040518083038185875af1925050503d80600081146119f4576040519150601f19603f3d011682016040523d82523d6000602084013e6119f9565b606091505b5091509150611a0a87838387611b11565b925050505b949350505050565b60008181526001830160205260408120548015611b00576000611a3b6001836123c6565b8554909150600090611a4f906001906123c6565b9050818114611ab4576000866000018281548110611a6f57611a6f6120dc565b9060005260206000200154905080876000018481548110611a9257611a926120dc565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611ac557611ac5612508565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610639565b6000915050610639565b5092915050565b60608315611b80578251600003611b79576001600160a01b0385163b611b795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104dc565b5081611a0f565b611a0f8383815115611b955781518083602001fd5b8060405162461bcd60e51b81526004016104dc9190612530565b828054828255906000526020600020906002028101928215611c245760005260206000209160020282015b82811115611c2457825482546001600160a01b0319166001600160a01b039091161782558282600180820190611c1290840182612543565b50505091600201919060020190611bda565b50611c30929150611c58565b5090565b5080546000825560020290600052602060002090810190611c559190611c58565b50565b80821115611c305780546001600160a01b03191681556000611c7d6001830182611c86565b50600201611c58565b508054611c929061207a565b6000825580601f10611ca2575050565b601f016020900490600052602060002090810190611c5591905b80821115611c305760008155600101611cbc565b634e487b7160e01b600052602160045260246000fd5b60005b83811015611d01578181015183820152602001611ce9565b50506000910152565b60008151808452611d22816020860160208601611ce6565b601f01601f19169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015611d9e57858303601f19018952815180516001600160a01b031684528401516040858501819052611d8a81860183611d0a565b9a86019a9450505090830190600101611d53565b5090979650505050505050565b6000815160048110611dcd57634e487b7160e01b600052602160045260246000fd5b8084525060208201516001600160401b038082166020860152806040850151166040860152806060850151166060860152806080850151166080860152505060a082015160c060a0850152611a0f60c0850182611d36565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e7a57603f19888603018452611e68858351611dab565b94509285019290850190600101611e4c565b5092979650505050505050565b60008060208385031215611e9a57600080fd5b82356001600160401b0380821115611eb157600080fd5b818501915085601f830112611ec557600080fd5b813581811115611ed457600080fd5b8660208260051b8501011115611ee957600080fd5b60209290920196919550909350505050565b6001600160a01b0381168114611c5557600080fd5b60008060408385031215611f2357600080fd5b823591506020830135611f3581611efb565b809150509250929050565b600060208284031215611f5257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015611f9a5783516001600160a01b031683529284019291840191600101611f75565b50909695505050505050565b80356001600160401b0381168114611fbd57600080fd5b919050565b600060208284031215611fd457600080fd5b61065782611fa6565b6001600160e01b031981168114611c5557600080fd5b6000806040838503121561200657600080fd5b823561201181611fdd565b915061201f60208401611fa6565b90509250929050565b6000806040838503121561203b57600080fd5b50508035926020909101359150565b60006020828403121561205c57600080fd5b813561065781611fdd565b6020815260006106576020830184611dab565b600181811c9082168061208e57607f821691505b6020821081036120ae57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235603e1983360301811261210857600080fd5b9190910192915050565b6000808335601e1984360301811261212957600080fd5b8301803591506001600160401b0382111561214357600080fd5b60200191503681900382131561215857600080fd5b9250929050565b634e487b7160e01b600052601160045260246000fd5b6000600182016121875761218761215f565b5060010190565b634e487b7160e01b600052604160045260246000fd5b808201808211156106395761063961215f565b600080858511156121c757600080fd5b838611156121d457600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156122095780818660040360031b1b83161692505b505092915050565b6000806040838503121561222457600080fd5b825161222f81611fdd565b6020939093015192949293505050565b60006001600160401b0380831681810361225b5761225b61215f565b6001019392505050565b601f8211156107a957600081815260208120601f850160051c8101602086101561228c5750805b601f850160051c820191505b8181101561058e57828155600101612298565b81356122b681611efb565b81546001600160a01b0319166001600160a01b0391909116178155600181810160208481013536869003601e190181126122ef57600080fd5b850180356001600160401b0381111561230757600080fd5b803603838301131561231857600080fd5b61232c81612326865461207a565b86612265565b6000601f821160018114612362576000831561234a57508382018501355b600019600385901b1c1916600184901b1786556123bb565b600086815260209020601f19841690835b8281101561239257868501880135825593870193908901908701612373565b50848210156123b15760001960f88660031b161c198785880101351681555b50508683881b0186555b505050505050505050565b818103818111156106395761063961215f565b60608082528181018590526000906080600587901b8401810190840188845b898110156124b557868403607f190183528135368c9003603e1901811261241e57600080fd5b8b016040813561242d81611efb565b6001600160a01b0316865260208281013536849003601e1901811261245157600080fd5b9092018281019290356001600160401b0381111561246e57600080fd5b80360384131561247d57600080fd5b8282890152808389015280848a8a013760008882018a0152601f01601f191690960187019594850194939093019250506001016123f8565b5050506001600160401b038616602085015291506124d09050565b6001600160401b038316604083015295945050505050565b6001600160401b03818116838216019080821115611b0a57611b0a61215f565b634e487b7160e01b600052603160045260246000fd5b60008251612108818460208701611ce6565b6020815260006106576020830184611d0a565b81810361254e575050565b612558825461207a565b6001600160401b0381111561256f5761256f61218e565b6125838161257d845461207a565b84612265565b6000601f8211600181146125b7576000831561259f5750848201545b600019600385901b1c1916600184901b17845561261c565b600085815260209020601f19841690600086815260209020845b838110156125f157828601548255600195860195909101906020016125d1565b508583101561260f5781850154600019600388901b60f8161c191681555b50505060018360011b0184555b505050505056fea264697066735822122067db76eec3fc9190291706d01aebff755210be034a97a46cbf685cf5f92d7f6d64736f6c63430008110033000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea0000000000000000000000005a2e9f203da3e6dd9d0c5f6366df4df98a54bc0c
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063d547741f116100a2578063ee5112a911610071578063ee5112a91461024e578063f36c8f5c14610256578063f3de7f4f1461026a578063fb507e8714610293578063fcb96a9f146102b357600080fd5b8063d547741f14610202578063d980e4b114610215578063da2d17fe14610228578063e4a99c471461023b57600080fd5b8063634f8ed6116100e9578063634f8ed61461017357806391d1485414610193578063a147109b146101b6578063a825a680146101c4578063ca15c873146101ef57600080fd5b80630954ae961461011b5780630c2cdbd7146101395780630f26f5d21461014b5780632f2ff15d14610160575b600080fd5b6101236102c6565b6040516101309190611e25565b60405180910390f35b6004545b604051908152602001610130565b61015e610159366004611e87565b6104a8565b005b61015e61016e366004611f10565b610596565b610186610181366004611f40565b61061f565b6040516101309190611f59565b6101a66101a1366004611f10565b61063f565b6040519015158152602001610130565b61013d635645544f60e01b81565b6001546101d7906001600160401b031681565b6040516001600160401b039091168152602001610130565b61013d6101fd366004611f40565b61065e565b61015e610210366004611f10565b610675565b61015e610223366004611fc2565b61070e565b61015e610236366004611ff3565b6107ae565b610123610249366004612028565b610888565b610123610b04565b61013d69474f5645524e414e434560b01b81565b6101d761027836600461204a565b6002602052600090815260409020546001600160401b031681565b6102a66102a1366004611fc2565b610cdd565b6040516101309190612067565b61015e6102c1366004611fc2565b610ea6565b60606003805480602002602001604051908101604052809291908181526020016000905b8282101561049f57838290600052602060002090600302016040518060c00160405290816000820160009054906101000a900460ff16600381111561033157610331611cd0565b600381111561034257610342611cd0565b815281546001600160401b0361010082048116602080850191909152600160481b83048216604080860191909152600160881b909304821660608501526001850154909116608084015260028401805483518184028101840190945280845260a090940193909160009084015b82821015610488576000848152602090819020604080518082019091526002850290910180546001600160a01b0316825260018101805492939192918401916103f79061207a565b80601f01602080910402602001604051908101604052809291908181526020018280546104239061207a565b80156104705780601f1061044557610100808354040283529160200191610470565b820191906000526020600020905b81548152906001019060200180831161045357829003601f168201915b505050505081525050815260200190600101906103af565b5050505081525050815260200190600101906102ea565b50505050905090565b69474f5645524e414e434560b01b6104c0813361063f565b6104e55760405162461bcd60e51b81526004016104dc906120b4565b60405180910390fd5b6000805b8381101561056057600061052d868684818110610508576105086120dc565b905060200281019061051a91906120f2565b610528906020810190612112565b610ed5565b9050826001600160401b0316816001600160401b0316111561054d578092505b508061055881612175565b9150506104e9565b5060008061056f838787610f92565b91509150826001600160401b031660000361058e5761058e8282611167565b505050505050565b3330146105b55760405162461bcd60e51b81526004016104dc906120b4565b69474f5645524e414e434560b01b8214806105d65750635645544f60e01b82145b6106115760405162461bcd60e51b815260206004820152600c60248201526b696e76616c696420726f6c6560a01b60448201526064016104dc565b61061b828261139f565b5050565b6000818152602081905260409020606090610639906113f2565b92915050565b600082815260208190526040812061065790836113ff565b9392505050565b600081815260208190526040812061063990611421565b3330146106945760405162461bcd60e51b81526004016104dc906120b4565b69474f5645524e414e434560b01b821415806106b8575060016106b68361065e565b115b6107045760405162461bcd60e51b815260206004820152601a60248201527f6e656564206174206c65617374206f6e6520676f7665726e6f7200000000000060448201526064016104dc565b61061b828261142b565b61072569474f5645524e414e434560b01b3361063f565b8061073c575061073c635645544f60e01b3361063f565b6107585760405162461bcd60e51b81526004016104dc906120b4565b6000806107648361147e565b60405191935091506001600160401b038416907f4bb934cf1c626b3439a169ba2f7710e204c468538fc3a2f54942fd8ee60046af90600090a26107a982826001611549565b505050565b3330146107cd5760405162461bcd60e51b81526004016104dc906120b4565b62127500816001600160401b0316111561081a5760405162461bcd60e51b815260206004820152600e60248201526d0c8cad8c2f240e8dede40d0d2ced60931b60448201526064016104dc565b6001600160e01b03198216600081815260026020908152604091829020805467ffffffffffffffff19166001600160401b03861690811790915591519182527f0816c272a68b4bff071bf7f969473d64b07dcee749dc4b37a85be0ea27f05efd910160405180910390a25050565b60606000826001600160401b038111156108a4576108a461218e565b60405190808252806020026020018201604052801561090657816020015b6040805160c081018252600080825260208083018290529282018190526060808301829052608083019190915260a082015282526000199092019101816108c25790505b50905060005b83811015610afc57600461092082876121a4565b81548110610930576109306120dc565b90600052602060002090600302016040518060c00160405290816000820160009054906101000a900460ff16600381111561096d5761096d611cd0565b600381111561097e5761097e611cd0565b815281546001600160401b0361010082048116602080850191909152600160481b83048216604080860191909152600160881b909304821660608501526001850154909116608084015260028401805483518184028101840190945280845260a090940193909160009084015b82821015610ac4576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001810180549293919291840191610a339061207a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f9061207a565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b505050505081525050815260200190600101906109eb565b5050505081525050828281518110610ade57610ade6120dc565b60200260200101819052508080610af490612175565b91505061090c565b509392505050565b60606004805480602002602001604051908101604052809291908181526020016000905b8282101561049f57838290600052602060002090600302016040518060c00160405290816000820160009054906101000a900460ff166003811115610b6f57610b6f611cd0565b6003811115610b8057610b80611cd0565b815281546001600160401b0361010082048116602080850191909152600160481b83048216604080860191909152600160881b909304821660608501526001850154909116608084015260028401805483518184028101840190945280845260a090940193909160009084015b82821015610cc6576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001810180549293919291840191610c359061207a565b80601f0160208091040260200160405190810160405280929190818152602001828054610c619061207a565b8015610cae5780601f10610c8357610100808354040283529160200191610cae565b820191906000526020600020905b815481529060010190602001808311610c9157829003601f168201915b50505050508152505081526020019060010190610bed565b505050508152505081526020019060010190610b28565b6040805160c0810182526000808252602082018190529181018290526060808201839052608082019290925260a0810191909152610d1a8261147e565b6040805160c0810190915282548390829060ff166003811115610d3f57610d3f611cd0565b6003811115610d5057610d50611cd0565b815281546001600160401b0361010082048116602080850191909152600160481b83048216604080860191909152600160881b909304821660608501526001850154909116608084015260028401805483518184028101840190945280845260a090940193909160009084015b82821015610e96576000848152602090819020604080518082019091526002850290910180546001600160a01b031682526001810180549293919291840191610e059061207a565b80601f0160208091040260200160405190810160405280929190818152602001828054610e319061207a565b8015610e7e5780601f10610e5357610100808354040283529160200191610e7e565b820191906000526020600020905b815481529060010190602001808311610e6157829003601f168201915b50505050508152505081526020019060010190610dbd565b5050509152509095945050505050565b600080610eb28361147e565b915091506107a98282611167565b6000610657836001600160a01b0384166116a9565b600080610ee560048285876121b7565b610eee916121e1565b90506312e9740160e11b6001600160e01b0319821601610f69576000610f1784600481886121b7565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250508251929350610f649284016020908101925084019050612211565b509150505b6001600160e01b0319166000908152600260205260409020546001600160401b03169392505050565b60018054600091829182916001600160401b039091169082610fb38361223f565b825461010092830a6001600160401b038181021990921692821602919091179092556003805460018101825560008281527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b9190920290810180547fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85c909201805467ffffffffffffffff19169055610100600160881b031990911685851690930267ffffffffffffffff60481b191692909217600160481b428516021778ffffffffffffffff00000000000000000000000000000000ff1916600160881b938b169390930260ff191692909217815594509091505b8481101561110f57836002018686838181106110c6576110c66120dc565b90506020028101906110d891906120f2565b8154600181018355600092835260209092209091600202016110fa82826122ab565b5050808061110790612175565b9150506110a8565b5060035461111f906001906123c6565b91507fea6e341f82fb9f110709efb8c6306f361297efe562f52a900dd723067675762a8585888460405161115694939291906123d9565b60405180910390a150935093915050565b8154429061118e906001600160401b03600160881b8204811691600160481b9004166124e8565b6001600160401b031611156111e55760405162461bcd60e51b815260206004820152601d60248201527f646561646c696e6520686173206e6f74206265656e207265616368656400000060448201526064016104dc565b6000825460ff1660038111156111fd576111fd611cd0565b1461123f5760405162461bcd60e51b81526020600482015260126024820152716368616e6765206e6f742070656e64696e6760701b60448201526064016104dc565b815460ff1916600317825560005b600283015481101561135357611340836002018281548110611271576112716120dc565b9060005260206000209060020201600101805461128d9061207a565b80601f01602080910402602001604051908101604052809291908181526020018280546112b99061207a565b80156113065780601f106112db57610100808354040283529160200191611306565b820191906000526020600020905b8154815290600101906020018083116112e957829003601f168201915b5050505050846002018381548110611320576113206120dc565b60009182526020909120600290910201546001600160a01b0316906116f8565b508061134b81612175565b91505061124d565b5061136082826002611549565b81546040516101009091046001600160401b0316907f4093c58d6d95b5dc15bbca26257f9d4618824328023882d9cf600066a1f4bf3490600090a25050565b60008281526020819052604090206113b79082610ec0565b506040516001600160a01b0382169083907f2ae6a113c0ed5b78a53413ffbb7679881f11145ccfba4fb92e863dfcd5a1d2f390600090a35050565b606060006106578361173c565b6001600160a01b03811660009081526001830160205260408120541515610657565b6000610639825490565b60008281526020819052604090206114439082611798565b506040516001600160a01b0382169083907f155aaafb6329a2098580462df33ec4b7441b19729b9601c5fc17ae1cf99a8a5290600090a35050565b60008060005b60035481101561150d57836001600160401b0316600382815481106114ab576114ab6120dc565b600091825260209091206003909102015461010090046001600160401b0316036114fb57600381815481106114e2576114e26120dc565b9060005260206000209060030201819250925050915091565b8061150581612175565b915050611484565b5060405162461bcd60e51b815260206004820152601060248201526f18da185b99d9481b9bdd08199bdd5b9960821b60448201526064016104dc565b82548190849060ff1916600183600381111561156757611567611cd0565b02179055506001838101805467ffffffffffffffff1916426001600160401b031617905560048054808301825560009190915284547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b60039283020180548794919360ff90931692849260ff19909216919084908111156115ea576115ea611cd0565b0217905550815481546001600160401b0361010092839004811690920268ffffffffffffffff00198216811784558454600160481b9081900484160267ffffffffffffffff60481b19909116610100600160881b031990921691909117178083558354600160881b9081900483160267ffffffffffffffff60881b19909116178255600180840154908301805467ffffffffffffffff1916919092161790556002808301805461169d9284019190611baf565b5050506107a9826117ad565b60008181526001830160205260408120546116f057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610639565b506000610639565b6060610657838360006040518060400160405280601e81526020017f416464726573733a206c6f772d6c6576656c2063616c6c206661696c6564000081525061193a565b60608160000180548060200260200160405190810160405280929190818152602001828054801561178c57602002820191906000526020600020905b815481526020019060010190808311611778575b50505050509050919050565b6000610657836001600160a01b038416611a17565b600380546117bd906001906123c6565b815481106117cd576117cd6120dc565b9060005260206000209060030201600382815481106117ee576117ee6120dc565b60009182526020909120825460039283029091018054909260ff90921691839160ff191690600190849081111561182757611827611cd0565b0217905550815481546001600160401b0361010092839004811690920268ffffffffffffffff00198216811784558454600160481b9081900484160267ffffffffffffffff60481b19909116610100600160881b031990921691909117178083558354600160881b9081900483160267ffffffffffffffff60881b19909116178255600180840154908301805467ffffffffffffffff191691909216179055600280830180546118da9284019190611baf565b5090505060038054806118ef576118ef612508565b60008281526020812060036000199093019283020180546001600160c81b031916815560018101805467ffffffffffffffff19169055906119336002830182611c34565b5050905550565b60608247101561199b5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016104dc565b600080866001600160a01b031685876040516119b7919061251e565b60006040518083038185875af1925050503d80600081146119f4576040519150601f19603f3d011682016040523d82523d6000602084013e6119f9565b606091505b5091509150611a0a87838387611b11565b925050505b949350505050565b60008181526001830160205260408120548015611b00576000611a3b6001836123c6565b8554909150600090611a4f906001906123c6565b9050818114611ab4576000866000018281548110611a6f57611a6f6120dc565b9060005260206000200154905080876000018481548110611a9257611a926120dc565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611ac557611ac5612508565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610639565b6000915050610639565b5092915050565b60608315611b80578251600003611b79576001600160a01b0385163b611b795760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104dc565b5081611a0f565b611a0f8383815115611b955781518083602001fd5b8060405162461bcd60e51b81526004016104dc9190612530565b828054828255906000526020600020906002028101928215611c245760005260206000209160020282015b82811115611c2457825482546001600160a01b0319166001600160a01b039091161782558282600180820190611c1290840182612543565b50505091600201919060020190611bda565b50611c30929150611c58565b5090565b5080546000825560020290600052602060002090810190611c559190611c58565b50565b80821115611c305780546001600160a01b03191681556000611c7d6001830182611c86565b50600201611c58565b508054611c929061207a565b6000825580601f10611ca2575050565b601f016020900490600052602060002090810190611c5591905b80821115611c305760008155600101611cbc565b634e487b7160e01b600052602160045260246000fd5b60005b83811015611d01578181015183820152602001611ce9565b50506000910152565b60008151808452611d22816020860160208601611ce6565b601f01601f19169290920160200192915050565b600082825180855260208086019550808260051b84010181860160005b84811015611d9e57858303601f19018952815180516001600160a01b031684528401516040858501819052611d8a81860183611d0a565b9a86019a9450505090830190600101611d53565b5090979650505050505050565b6000815160048110611dcd57634e487b7160e01b600052602160045260246000fd5b8084525060208201516001600160401b038082166020860152806040850151166040860152806060850151166060860152806080850151166080860152505060a082015160c060a0850152611a0f60c0850182611d36565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611e7a57603f19888603018452611e68858351611dab565b94509285019290850190600101611e4c565b5092979650505050505050565b60008060208385031215611e9a57600080fd5b82356001600160401b0380821115611eb157600080fd5b818501915085601f830112611ec557600080fd5b813581811115611ed457600080fd5b8660208260051b8501011115611ee957600080fd5b60209290920196919550909350505050565b6001600160a01b0381168114611c5557600080fd5b60008060408385031215611f2357600080fd5b823591506020830135611f3581611efb565b809150509250929050565b600060208284031215611f5257600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015611f9a5783516001600160a01b031683529284019291840191600101611f75565b50909695505050505050565b80356001600160401b0381168114611fbd57600080fd5b919050565b600060208284031215611fd457600080fd5b61065782611fa6565b6001600160e01b031981168114611c5557600080fd5b6000806040838503121561200657600080fd5b823561201181611fdd565b915061201f60208401611fa6565b90509250929050565b6000806040838503121561203b57600080fd5b50508035926020909101359150565b60006020828403121561205c57600080fd5b813561065781611fdd565b6020815260006106576020830184611dab565b600181811c9082168061208e57607f821691505b6020821081036120ae57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600e908201526d1b9bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008235603e1983360301811261210857600080fd5b9190910192915050565b6000808335601e1984360301811261212957600080fd5b8301803591506001600160401b0382111561214357600080fd5b60200191503681900382131561215857600080fd5b9250929050565b634e487b7160e01b600052601160045260246000fd5b6000600182016121875761218761215f565b5060010190565b634e487b7160e01b600052604160045260246000fd5b808201808211156106395761063961215f565b600080858511156121c757600080fd5b838611156121d457600080fd5b5050820193919092039150565b6001600160e01b031981358181169160048510156122095780818660040360031b1b83161692505b505092915050565b6000806040838503121561222457600080fd5b825161222f81611fdd565b6020939093015192949293505050565b60006001600160401b0380831681810361225b5761225b61215f565b6001019392505050565b601f8211156107a957600081815260208120601f850160051c8101602086101561228c5750805b601f850160051c820191505b8181101561058e57828155600101612298565b81356122b681611efb565b81546001600160a01b0319166001600160a01b0391909116178155600181810160208481013536869003601e190181126122ef57600080fd5b850180356001600160401b0381111561230757600080fd5b803603838301131561231857600080fd5b61232c81612326865461207a565b86612265565b6000601f821160018114612362576000831561234a57508382018501355b600019600385901b1c1916600184901b1786556123bb565b600086815260209020601f19841690835b8281101561239257868501880135825593870193908901908701612373565b50848210156123b15760001960f88660031b161c198785880101351681555b50508683881b0186555b505050505050505050565b818103818111156106395761063961215f565b60608082528181018590526000906080600587901b8401810190840188845b898110156124b557868403607f190183528135368c9003603e1901811261241e57600080fd5b8b016040813561242d81611efb565b6001600160a01b0316865260208281013536849003601e1901811261245157600080fd5b9092018281019290356001600160401b0381111561246e57600080fd5b80360384131561247d57600080fd5b8282890152808389015280848a8a013760008882018a0152601f01601f191690960187019594850194939093019250506001016123f8565b5050506001600160401b038616602085015291506124d09050565b6001600160401b038316604083015295945050505050565b6001600160401b03818116838216019080821115611b0a57611b0a61215f565b634e487b7160e01b600052603160045260246000fd5b60008251612108818460208701611ce6565b6020815260006106576020830184611d0a565b81810361254e575050565b612558825461207a565b6001600160401b0381111561256f5761256f61218e565b6125838161257d845461207a565b84612265565b6000601f8211600181146125b7576000831561259f5750848201545b600019600385901b1c1916600184901b17845561261c565b600085815260209020601f19841690600086815260209020845b838110156125f157828601548255600195860195909101906020016125d1565b508583101561260f5781850154600019600388901b60f8161c191681555b50505060018360011b0184555b505050505056fea264697066735822122067db76eec3fc9190291706d01aebff755210be034a97a46cbf685cf5f92d7f6d64736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea0000000000000000000000005a2e9f203da3e6dd9d0c5f6366df4df98a54bc0c
-----Decoded View---------------
Arg [0] : governance (address): 0xB27DC5f8286f063F11491c8f349053cB37718bea
Arg [1] : veto (address): 0x5a2E9f203dA3e6DD9D0C5F6366df4Df98a54bC0C
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b27dc5f8286f063f11491c8f349053cb37718bea
Arg [1] : 0000000000000000000000005a2e9f203da3e6dd9d0c5f6366df4df98a54bc0c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.