MON Price: $0.021661 (+15.24%)

Contract

0x90f013E71457298a3C44923AE5957800D4B37974

Overview

MON Balance

Monad Chain LogoMonad Chain LogoMonad Chain Logo0 MON

MON Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

2 Internal Transactions found.

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
368528412025-11-20 15:33:0968 days ago1763652789
0x90f013E7...0D4B37974
 Contract Creation0 MON
368528412025-11-20 15:33:0968 days ago1763652789  Contract Creation0 MON
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Governor

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 1000 runs

Other Settings:
shanghai EvmVersion
// SPDX-License-Identifier: BUSL-1.1
// Gearbox Protocol. Generalized leverage for DeFi protocols
// (c) Gearbox Foundation, 2025.
pragma solidity ^0.8.23;

import {Ownable2Step} from "@openzeppelin/contracts/access/Ownable2Step.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import {IGovernor} from "../interfaces/IGovernor.sol";
import {ITimeLock} from "../interfaces/ITimeLock.sol";
import {AP_GOVERNOR} from "../libraries/ContractLiterals.sol";
import {TimeLock} from "./TimeLock.sol";

/// @title Governor
/// @notice Extends Uniswap's timelock contract with batch queueing/execution and reworked permissions model where,
///         instead of a single admin to perform all actions, there are multiple queue admins, a single veto admin,
///         and permissionless execution (which can optionally be restricted to non-contract accounts to prevent
///         unintended execution of governance proposals inside protocol functions)
contract Governor is Ownable2Step, IGovernor {
    using EnumerableSet for EnumerableSet.AddressSet;

    /// @notice Contract version
    uint256 public constant override version = 3_10;

    /// @notice Contract type
    bytes32 public constant override contractType = AP_GOVERNOR;

    /// @inheritdoc IGovernor
    address public immutable override timeLock;

    /// @dev Set of queue admins
    EnumerableSet.AddressSet internal _queueAdminsSet;

    /// @dev Set of execution admins
    EnumerableSet.AddressSet internal _executionAdminsSet;

    /// @inheritdoc IGovernor
    address public override vetoAdmin;

    /// @inheritdoc IGovernor
    bool public override isPermissionlessExecutionAllowed;

    /// @inheritdoc IGovernor
    mapping(uint256 => BatchInfo) public override batchInfo;

    /// @inheritdoc IGovernor
    mapping(bytes32 => BatchedTxInfo) public override batchedTxInfo;

    /// @dev Ensures that function can only be called by the timelock contract
    modifier timeLockOnly() {
        if (msg.sender != timeLock) revert CallerNotTimelockException();
        _;
    }

    /// @dev Ensures that function is called by one of queue admins
    modifier queueAdminOnly() {
        if (msg.sender != owner() && !_queueAdminsSet.contains(msg.sender)) revert CallerNotQueueAdminException();
        _;
    }

    /// @dev Ensures that function is called by one of execution admins, unless permissionless execution is allowed
    modifier executionAdminOnly() {
        if (!isPermissionlessExecutionAllowed && msg.sender != owner() && !_executionAdminsSet.contains(msg.sender)) {
            revert CallerNotExecutionAdminException();
        }
        _;
    }

    /// @dev Ensures that function is called by the veto admin
    modifier vetoAdminOnly() {
        if (msg.sender != vetoAdmin) revert CallerNotVetoAdminException();
        _;
    }

    /// @notice Constructs a new governor contract
    /// @param _owner Contract owner, automatically becomes the queue and execution admin
    /// @param _vetoAdmin Address to set as the veto admin, can't be `address(0)`
    /// @param _delay Delay of the timelock
    /// @param _allowPermissionlessExecution Whether to allow permissionless execution
    constructor(address _owner, address _vetoAdmin, uint256 _delay, bool _allowPermissionlessExecution) {
        timeLock = address(new TimeLock(address(this), _delay));

        _transferOwnership(_owner);
        _updateVetoAdmin(_vetoAdmin);

        if (_allowPermissionlessExecution) {
            isPermissionlessExecutionAllowed = true;
            emit AllowPermissionlessExecution();
        } else {
            emit ForbidPermissionlessExecution();
        }
    }

    /// @inheritdoc IGovernor
    function queueAdmins() external view override returns (address[] memory) {
        return _queueAdminsSet.values();
    }

    /// @inheritdoc IGovernor
    function executionAdmins() external view override returns (address[] memory) {
        return _executionAdminsSet.values();
    }

    // ------- //
    // ACTIONS //
    // ------- //

    /// @inheritdoc IGovernor
    function queueTransaction(
        address target,
        uint256 value,
        string calldata signature,
        bytes calldata data,
        uint256 eta
    ) external override queueAdminOnly returns (bytes32 txHash) {
        txHash = _getTxHash(target, value, signature, data, eta);
        if (ITimeLock(timeLock).queuedTransactions(txHash)) revert TransactionAlreadyQueuedException();

        BatchInfo memory info = batchInfo[block.number];
        if (info.initiator != address(0)) {
            if (msg.sender != info.initiator) revert CallerNotBatchInitiatorException();
            if (eta != info.eta) revert ETAMistmatchException();

            batchedTxInfo[txHash] = BatchedTxInfo({batchBlock: uint64(block.number), index: info.length});
            batchInfo[block.number].length = info.length + 1;
        }

        ITimeLock(timeLock).queueTransaction(target, value, signature, data, eta);
    }

    /// @inheritdoc IGovernor
    function startBatch(uint80 eta) external override queueAdminOnly {
        if (batchInfo[block.number].initiator != address(0)) revert BatchAlreadyStartedException();
        batchInfo[block.number] = BatchInfo({initiator: msg.sender, length: 0, eta: eta});
        emit QueueBatch(msg.sender, block.number);
    }

    /// @inheritdoc IGovernor
    function executeTransaction(
        address target,
        uint256 value,
        string calldata signature,
        bytes calldata data,
        uint256 eta
    ) external payable override executionAdminOnly returns (bytes memory) {
        return _transactionAction(target, value, signature, data, eta, TxAction.Execute);
    }

    /// @inheritdoc IGovernor
    function executeBatch(TxParams[] calldata txs) external payable override executionAdminOnly {
        uint256 batchBlock = _batchAction(txs, TxAction.Execute);
        emit ExecuteBatch(msg.sender, batchBlock);
    }

    /// @inheritdoc IGovernor
    function cancelTransaction(
        address target,
        uint256 value,
        string calldata signature,
        bytes calldata data,
        uint256 eta
    ) external override vetoAdminOnly {
        _transactionAction(target, value, signature, data, eta, TxAction.Cancel);
    }

    /// @inheritdoc IGovernor
    function cancelBatch(TxParams[] calldata txs) external override vetoAdminOnly {
        uint256 batchBlock = _batchAction(txs, TxAction.Cancel);
        emit CancelBatch(msg.sender, batchBlock);
    }

    // ------------- //
    // CONFIGURATION //
    // ------------- //

    /// @inheritdoc IGovernor
    function addQueueAdmin(address admin) external override timeLockOnly {
        if (admin == address(0)) revert AdminCantBeZeroAddressException();
        if (_queueAdminsSet.add(admin)) emit AddQueueAdmin(admin);
    }

    /// @inheritdoc IGovernor
    function removeQueueAdmin(address admin) external override timeLockOnly {
        if (_queueAdminsSet.remove(admin)) emit RemoveQueueAdmin(admin);
    }

    /// @inheritdoc IGovernor
    function addExecutionAdmin(address admin) external override timeLockOnly {
        if (admin == address(0)) revert AdminCantBeZeroAddressException();
        if (_executionAdminsSet.add(admin)) emit AddExecutionAdmin(admin);
    }

    /// @inheritdoc IGovernor
    function removeExecutionAdmin(address admin) external override timeLockOnly {
        if (_executionAdminsSet.remove(admin)) emit RemoveExecutionAdmin(admin);
    }

    /// @inheritdoc IGovernor
    function updateVetoAdmin(address admin) external override timeLockOnly {
        _updateVetoAdmin(admin);
    }

    /// @inheritdoc IGovernor
    function allowPermissionlessExecution() external override timeLockOnly {
        if (!isPermissionlessExecutionAllowed) {
            isPermissionlessExecutionAllowed = true;
            emit AllowPermissionlessExecution();
        }
    }

    /// @inheritdoc IGovernor
    function forbidPermissionlessExecution() external override timeLockOnly {
        if (isPermissionlessExecutionAllowed) {
            isPermissionlessExecutionAllowed = false;
            emit ForbidPermissionlessExecution();
        }
    }

    /// @dev Forbids renouncing ownership
    function renounceOwnership() public pure override {
        revert CannotRenounceOwnershipException();
    }

    // --------- //
    // INTERNALS //
    // --------- //

    /// @dev Executes or cancels a transaction, ensures that it is not part of any batch
    function _transactionAction(
        address target,
        uint256 value,
        string calldata signature,
        bytes calldata data,
        uint256 eta,
        TxAction action
    ) internal returns (bytes memory result) {
        bytes32 txHash = _getTxHash(target, value, signature, data, eta);
        if (batchedTxInfo[txHash].batchBlock != 0) revert CantPerformActionOutsideBatchException();
        return _performAction(target, value, signature, data, eta, action);
    }

    /// @dev Executes or cancels a batch of transactions, ensures that all transactions are processed in the correct order
    function _batchAction(TxParams[] calldata txs, TxAction action) internal returns (uint256 batchBlock) {
        uint256 len = txs.length;
        if (len == 0) revert IncorrectBatchException();

        batchBlock = batchedTxInfo[_getTxHash(txs[0])].batchBlock;
        if (batchBlock == 0) revert IncorrectBatchException();

        if (len != batchInfo[batchBlock].length) revert IncorrectBatchException();

        for (uint256 i; i < len; ++i) {
            TxParams calldata tx_ = txs[i];
            bytes32 txHash = _getTxHash(tx_);

            BatchedTxInfo memory info = batchedTxInfo[txHash];
            if (info.batchBlock != batchBlock || info.index != i) revert UnexpectedTransactionException(txHash);

            _performAction(tx_.target, tx_.value, tx_.signature, tx_.data, tx_.eta, action);
            delete batchedTxInfo[txHash];
        }

        delete batchInfo[batchBlock];
    }

    /// @dev Executes or cancels a transaction
    function _performAction(
        address target,
        uint256 value,
        string calldata signature,
        bytes calldata data,
        uint256 eta,
        TxAction action
    ) internal returns (bytes memory result) {
        if (action == TxAction.Execute) {
            result = ITimeLock(timeLock).executeTransaction{value: value}(target, value, signature, data, eta);
        } else {
            ITimeLock(timeLock).cancelTransaction(target, value, signature, data, eta);
        }
    }

    /// @dev `updateVetoAdmin` implementation
    function _updateVetoAdmin(address admin) internal {
        if (admin == address(0)) revert AdminCantBeZeroAddressException();
        if (vetoAdmin != admin) {
            vetoAdmin = admin;
            emit UpdateVetoAdmin(admin);
        }
    }

    /// @dev Computes transaction hash
    function _getTxHash(address target, uint256 value, string calldata signature, bytes calldata data, uint256 eta)
        internal
        pure
        returns (bytes32)
    {
        return keccak256(abi.encode(target, value, signature, data, eta));
    }

    /// @dev Computes transaction hash
    function _getTxHash(TxParams calldata tx_) internal pure returns (bytes32) {
        return _getTxHash(tx_.target, tx_.value, tx_.signature, tx_.data, tx_.eta);
    }
}

// SPDX-License-Identifier: BUSL-1.1
// Gearbox Protocol. Generalized leverage for DeFi protocols
// (c) Gearbox Foundation, 2025.
pragma solidity ^0.8.23;

import {ITimeLock} from "../interfaces/ITimeLock.sol";

contract TimeLock is ITimeLock {
    uint256 public constant override GRACE_PERIOD = 14 days;
    uint256 public constant override MINIMUM_DELAY = 1 days;
    uint256 public constant override MAXIMUM_DELAY = 30 days;

    address public immutable override admin;
    uint256 public override delay;

    mapping(bytes32 txHash => bool) public override queuedTransactions;

    modifier onlySelf() {
        if (msg.sender != address(this)) revert CallerIsNotSelfException(msg.sender);
        _;
    }

    modifier onlyAdmin() {
        if (msg.sender != admin) revert CallerIsNotAdminException(msg.sender);
        _;
    }

    constructor(address admin_, uint256 delay_) {
        if (delay_ < MINIMUM_DELAY || delay_ > MAXIMUM_DELAY) revert IncorrectDelayException();

        admin = admin_;
        delay = delay_;
    }

    receive() external payable {}

    function setDelay(uint256 newDelay) external override onlySelf {
        if (newDelay < MINIMUM_DELAY || newDelay > MAXIMUM_DELAY) revert IncorrectDelayException();
        delay = newDelay;

        emit NewDelay(newDelay);
    }

    function queueTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta)
        external
        onlyAdmin
        returns (bytes32)
    {
        if (eta < block.timestamp + delay) revert DelayNotSatisfiedException();

        bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
        queuedTransactions[txHash] = true;

        emit QueueTransaction(txHash, target, value, signature, data, eta);
        return txHash;
    }

    function cancelTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta)
        external
        onlyAdmin
    {
        bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
        if (!queuedTransactions[txHash]) return;
        queuedTransactions[txHash] = false;

        emit CancelTransaction(txHash, target, value, signature, data, eta);
    }

    function executeTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta)
        external
        payable
        onlyAdmin
        returns (bytes memory)
    {
        bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
        if (!queuedTransactions[txHash]) revert TransactionIsNotQueuedException(txHash);
        if (block.timestamp < eta) revert TimelockNotSurpassedException();
        if (block.timestamp > eta + GRACE_PERIOD) revert StaleTransactionException(txHash);

        queuedTransactions[txHash] = false;

        bytes memory callData;

        if (bytes(signature).length == 0) {
            callData = data;
        } else {
            callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
        }

        (bool success, bytes memory returnData) = target.call{value: value}(callData);
        if (!success) revert TransactionExecutionRevertedException(txHash);

        emit ExecuteTransaction(txHash, target, value, signature, data, eta);

        return returnData;
    }
}

// SPDX-License-Identifier: MIT
// Gearbox Protocol. Generalized leverage for DeFi protocols
// (c) Gearbox Foundation, 2025.
pragma solidity ^0.8.23;

import {IVersion} from "@gearbox-protocol/core-v3/contracts/interfaces/base/IVersion.sol";

/// @title Governor interface
interface IGovernor is IVersion {
    // ----- //
    // TYPES //
    // ----- //

    /// @notice Timelock contract transaction params packed in a struct
    /// @param target Target contract to call
    /// @param value Value to send in the call
    /// @param signature Signature of the target contract's function to call
    /// @param data ABI-encoded parameters to call the function with
    /// @param eta Transaction ETA (timestamp after which it can be executed)
    struct TxParams {
        address target;
        uint256 value;
        string signature;
        bytes data;
        uint256 eta;
    }

    /// @notice Batch information
    /// @param initiator Queue admin that initiated the batch
    /// @param length Number of transactions in the batch
    /// @param eta ETA of transactions in the batch
    struct BatchInfo {
        address initiator;
        uint16 length;
        uint80 eta;
    }

    /// @notice Batched transaction information
    /// @param batchBlock Block the batch was initiated in
    /// @param index Index of transaction within the batch
    struct BatchedTxInfo {
        uint64 batchBlock;
        uint16 index;
    }

    /// @notice Action that can be performed with a queued transaction
    enum TxAction {
        Execute,
        Cancel
    }

    // ------ //
    // EVENTS //
    // ------ //

    /// @notice Emitted when `caller` initiates a batch in `batchBlock`
    event QueueBatch(address indexed caller, uint256 indexed batchBlock);

    /// @notice Emitted when `caller` executes a batch initiated in `batchBlock`
    event ExecuteBatch(address indexed caller, uint256 indexed batchBlock);

    /// @notice Emitted when `caller` cancels a batch initiated in `batchBlock`
    event CancelBatch(address indexed caller, uint256 indexed batchBlock);

    /// @notice Emitted when `admin` is added to the list of queue admins
    event AddQueueAdmin(address indexed admin);

    /// @notice Emitted when `admin` is removed from the list of queue admins
    event RemoveQueueAdmin(address indexed admin);

    /// @notice Emitted when `admin` is added to the list of execution admins
    event AddExecutionAdmin(address indexed admin);

    /// @notice Emitted when `admin` is removed from the list of execution admins
    event RemoveExecutionAdmin(address indexed admin);

    /// @notice Emitted when `admin` is set as the new veto admin
    event UpdateVetoAdmin(address indexed admin);

    /// @notice Emitted when permissionless transaction/batch execution is allowed
    event AllowPermissionlessExecution();

    /// @notice Emitted when permissionless transaction/batch execution is forbidden
    event ForbidPermissionlessExecution();

    // ------ //
    // ERRORS //
    // ------ //

    /// @notice Thrown when an account that is not one of queue admins tries to queue a transaction or initiate a batch
    error CallerNotQueueAdminException();

    /// @notice Thrown when an account that is not one of execution admins tries to execute a transaction or a batch
    error CallerNotExecutionAdminException();

    /// @notice Thrown when an account that is not the timelock contract tries to configure the governor
    error CallerNotTimelockException();

    /// @notice Thrown when an account that is not the veto admin tries to cancel a transaction or a batch
    error CallerNotVetoAdminException();

    /// @notice Thrown when a queue admin tries to add transactions to the batch not initiated by themselves
    error CallerNotBatchInitiatorException();

    /// @notice Thrown when trying to renounce ownership
    error CannotRenounceOwnershipException();

    /// @notice Thrown when trying to queue a transaction that is already queued
    error TransactionAlreadyQueuedException();

    /// @notice Thrown when batched transaction's ETA differs from the batch ETA
    error ETAMistmatchException();

    /// @notice Thrown when trying to initiate a batch more than once in a block
    error BatchAlreadyStartedException();

    /// @notice Thrown when trying to execute or cancel a transaction individually while it's part of some batch
    error CantPerformActionOutsideBatchException();

    /// @notice Thrown when a passed list of transactions doesn't represent a valid queued batch
    error IncorrectBatchException();

    /// @notice Thrown when a passed list of transactions contains a transaction different from those in the queued batch
    error UnexpectedTransactionException(bytes32 txHash);

    /// @notice Thrown when trying to set zero address as a queue, execution or veto admin
    error AdminCantBeZeroAddressException();

    // ----- //
    // STATE //
    // ----- //

    /// @notice Returns an address of the timelock contract
    function timeLock() external view returns (address);

    /// @notice Returns an array of addresses of queue admins
    function queueAdmins() external view returns (address[] memory);

    /// @notice Returns an array of addresses of execution admins
    function executionAdmins() external view returns (address[] memory);

    /// @notice Returns an address of the veto admin
    function vetoAdmin() external view returns (address);

    /// @notice Whether permissionless transaction/batch execution is allowed
    function isPermissionlessExecutionAllowed() external view returns (bool);

    /// @notice Returns info for the batch initiated in `batchBlock`
    /// @dev `initiator == address(0)` means that there was no batch initiated in that block
    function batchInfo(uint256 batchBlock) external view returns (address initiator, uint16 length, uint80 eta);

    /// @notice Returns batch info for the transaction with given `txHash`
    /// @dev `batchBlock == 0` means that transaction is not part of any batch
    function batchedTxInfo(bytes32 txHash) external view returns (uint64 batchBlock, uint16 index);

    // ------- //
    // ACTIONS //
    // ------- //

    /// @notice Queues a transaction in the timelock. Ensures that it's not already queued. When no batch is initiated,
    ///         simply forwards the call to the timelock contract. Otherwise, appends the transaction to the batch after
    ///         checking that caller is the account that initiated the batch and ETAs of all transactions are the same.
    /// @dev See `TxParams` for params description
    /// @dev Can only be called by queue admins
    function queueTransaction(
        address target,
        uint256 value,
        string calldata signature,
        bytes calldata data,
        uint256 eta
    ) external returns (bytes32 txHash);

    /// @notice Initiates a batch of transactions. All the transactions that are queued after this call in the same block
    ///         will form a batch that can only be executed/cancelled as a whole. Typically, this will be the first call
    ///         in a multicall that queues a batch, followed by multiple `queueTransaction` calls.
    /// @param eta ETA of transactions in the batch
    /// @dev Can only be called by queue admins
    function startBatch(uint80 eta) external;

    /// @notice Executes a queued transaction. Ensures that it is not part of any batch and forwards the call to the
    ///         timelock contract.
    /// @dev See `TxParams` for params description
    /// @dev Can only be called by execution admins unless permissionless execution is allowed
    function executeTransaction(
        address target,
        uint256 value,
        string calldata signature,
        bytes calldata data,
        uint256 eta
    ) external payable returns (bytes memory result);

    /// @notice Executes a queued batch of transactions. Ensures that `txs` is the same ordered list of transactions as
    ///         the one that was queued, and forwards all calls to the timelock contract.
    /// @dev Can only be called by execution admins unless permissionless execution is allowed
    function executeBatch(TxParams[] calldata txs) external payable;

    /// @notice Cancels a queued transaction. Ensures that it is not part of any batch and forwards the call to the
    ///         timelock contract.
    /// @dev See `TxParams` for params description
    /// @dev Can only be called by the veto admin
    function cancelTransaction(
        address target,
        uint256 value,
        string calldata signature,
        bytes calldata data,
        uint256 eta
    ) external;

    /// @notice Cancels a queued batch of transactions. Ensures that `txs` is the same ordered list of transactions as
    ///         the one that was queued, and forwards all calls to the timelock contract.
    /// @dev Can only be called by the veto admin
    function cancelBatch(TxParams[] calldata txs) external;

    // ------------- //
    // CONFIGURATION //
    // ------------- //

    /// @notice Adds `admin` to the list of queue admins, ensures that it's not zero address
    /// @dev Can only be called by the timelock contract
    function addQueueAdmin(address admin) external;

    /// @notice Removes `admin` from the list of queue admins
    /// @dev Can only be called by the timelock contract
    function removeQueueAdmin(address admin) external;

    /// @notice Adds `admin` to the list of execution admins, ensures that it's not zero address
    /// @dev Can only be called by the timelock contract
    function addExecutionAdmin(address admin) external;

    /// @notice Removes `admin` from the list of execution admins
    /// @dev Can only be called by the timelock contract
    function removeExecutionAdmin(address admin) external;

    /// @notice Sets `admin` as the new veto admin, ensures that it's not zero address
    /// @dev Can only be called by the timelock contract
    /// @dev It's assumed that veto admin is a contract that has means to prevent it from blocking its' own update,
    ///      for example, it might be a multisig that can remove malicious signers
    function updateVetoAdmin(address admin) external;

    /// @notice Allows permissionless transactions/batches execution
    /// @dev Can only be called by the timelock contract
    function allowPermissionlessExecution() external;

    /// @notice Forbids permissionless transactions/batches execution
    /// @dev Can only be called by the timelock contract
    function forbidPermissionlessExecution() external;
}

// SPDX-License-Identifier: MIT
// Gearbox Protocol. Generalized leverage for DeFi protocols
// (c) Gearbox Foundation, 2025.
pragma solidity ^0.8.23;

/// @title Timelock interface
interface ITimeLock {
    // ------ //
    // EVENTS //
    // ------ //

    event NewDelay(uint256 indexed newDelay);

    event CancelTransaction(
        bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta
    );

    event ExecuteTransaction(
        bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta
    );

    event QueueTransaction(
        bytes32 indexed txHash, address indexed target, uint256 value, string signature, bytes data, uint256 eta
    );

    // ------ //
    // ERRORS //
    // ------ //

    error CallerIsNotAdminException(address caller);

    error CallerIsNotSelfException(address caller);

    error DelayNotSatisfiedException();

    error IncorrectDelayException();

    error StaleTransactionException(bytes32 txHash);

    error TimelockNotSurpassedException();

    error TransactionIsNotQueuedException(bytes32 txHash);

    error TransactionExecutionRevertedException(bytes32 txHash);

    // --------------- //
    // STATE VARIABLES //
    // --------------- //

    function GRACE_PERIOD() external view returns (uint256);

    function MINIMUM_DELAY() external view returns (uint256);

    function MAXIMUM_DELAY() external view returns (uint256);

    function admin() external view returns (address);

    function delay() external view returns (uint256);

    // ------------ //
    // TRANSACTIONS //
    // ------------ //

    function queuedTransactions(bytes32 txHash) external view returns (bool);

    function queueTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta)
        external
        returns (bytes32 txHash);

    function executeTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta)
        external
        payable
        returns (bytes memory result);

    function cancelTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta)
        external;

    // ------------- //
    // CONFIGURATION //
    // ------------- //

    function setDelay(uint256 newDelay) external;
}

File 5 of 10 : ContractLiterals.sol
// SPDX-License-Identifier: BUSL-1.1
// Gearbox Protocol. Generalized leverage for DeFi protocols
// (c) Gearbox Foundation, 2025.
pragma solidity ^0.8.23;

uint256 constant NO_VERSION_CONTROL = 0;

// Contract types and prefixes
bytes32 constant AP_ACCOUNT_FACTORY_DEFAULT = "ACCOUNT_FACTORY::DEFAULT";
bytes32 constant AP_ACL = "ACL";
bytes32 constant AP_ADDRESS_PROVIDER = "ADDRESS_PROVIDER";
bytes32 constant AP_BOT_LIST = "BOT_LIST";
bytes32 constant AP_BYTECODE_REPOSITORY = "BYTECODE_REPOSITORY";
bytes32 constant AP_CONTRACTS_REGISTER = "CONTRACTS_REGISTER";
bytes32 constant AP_CREDIT_CONFIGURATOR = "CREDIT_CONFIGURATOR";
bytes32 constant AP_CREDIT_FACADE = "CREDIT_FACADE";
bytes32 constant AP_CREDIT_FACTORY = "CREDIT_FACTORY";
bytes32 constant AP_CREDIT_MANAGER = "CREDIT_MANAGER";
bytes32 constant AP_CROSS_CHAIN_GOVERNANCE = "CROSS_CHAIN_GOVERNANCE";
bytes32 constant AP_CROSS_CHAIN_GOVERNANCE_PROXY = "CROSS_CHAIN_GOVERNANCE_PROXY";
bytes32 constant AP_CROSS_CHAIN_MULTISIG = "CROSS_CHAIN_MULTISIG";
bytes32 constant AP_GEAR_STAKING = "GEAR_STAKING";
bytes32 constant AP_GEAR_TOKEN = "GLOBAL::GEAR_TOKEN";
bytes32 constant AP_GOVERNOR = "GOVERNOR";
bytes32 constant AP_INSTANCE_MANAGER = "INSTANCE_MANAGER";
bytes32 constant AP_INSTANCE_MANAGER_PROXY = "INSTANCE_MANAGER_PROXY";
bytes32 constant AP_INTEREST_RATE_MODEL_DEFAULT = "IRM::DEFAULT";
bytes32 constant AP_INTEREST_RATE_MODEL_FACTORY = "INTEREST_RATE_MODEL_FACTORY";
bytes32 constant AP_INTEREST_RATE_MODEL_LINEAR = "IRM::LINEAR";
bytes32 constant AP_LOSS_POLICY_ALIASED = "LOSS_POLICY::ALIASED";
bytes32 constant AP_LOSS_POLICY_DEFAULT = "LOSS_POLICY::DEFAULT";
bytes32 constant AP_LOSS_POLICY_FACTORY = "LOSS_POLICY_FACTORY";
bytes32 constant AP_MARKET_CONFIGURATOR = "MARKET_CONFIGURATOR";
bytes32 constant AP_MARKET_CONFIGURATOR_FACTORY = "MARKET_CONFIGURATOR_FACTORY";
bytes32 constant AP_MARKET_CONFIGURATOR_LEGACY = "MARKET_CONFIGURATOR::LEGACY";
bytes32 constant AP_POOL = "POOL";
bytes32 constant AP_POOL_FACTORY = "POOL_FACTORY";
bytes32 constant AP_POOL_QUOTA_KEEPER = "POOL_QUOTA_KEEPER";
bytes32 constant AP_PRICE_FEED_STORE = "PRICE_FEED_STORE";
bytes32 constant AP_PRICE_ORACLE = "PRICE_ORACLE";
bytes32 constant AP_PRICE_ORACLE_FACTORY = "PRICE_ORACLE_FACTORY";
bytes32 constant AP_RATE_KEEPER_FACTORY = "RATE_KEEPER_FACTORY";
bytes32 constant AP_RATE_KEEPER_GAUGE = "RATE_KEEPER::GAUGE";
bytes32 constant AP_RATE_KEEPER_TUMBLER = "RATE_KEEPER::TUMBLER";
bytes32 constant AP_TREASURY = "TREASURY";
bytes32 constant AP_TREASURY_PROXY = "TREASURY_PROXY";
bytes32 constant AP_TREASURY_SPLITTER = "TREASURY_SPLITTER";
bytes32 constant AP_WETH_TOKEN = "WETH_TOKEN";
bytes32 constant AP_ZERO_PRICE_FEED = "PRICE_FEED::ZERO";

// Common domains
bytes32 constant DOMAIN_ACCOUNT_FACTORY = "ACCOUNT_FACTORY";
bytes32 constant DOMAIN_ADAPTER = "ADAPTER";
bytes32 constant DOMAIN_BOT = "BOT";
bytes32 constant DOMAIN_CREDIT_MANAGER = "CREDIT_MANAGER";
bytes32 constant DOMAIN_DEGEN_NFT = "DEGEN_NFT";
bytes32 constant DOMAIN_IRM = "IRM";
bytes32 constant DOMAIN_LOSS_POLICY = "LOSS_POLICY";
bytes32 constant DOMAIN_POOL = "POOL";
bytes32 constant DOMAIN_PRICE_FEED = "PRICE_FEED";
bytes32 constant DOMAIN_RATE_KEEPER = "RATE_KEEPER";
bytes32 constant DOMAIN_ZAPPER = "ZAPPER";

// Roles
bytes32 constant ROLE_EMERGENCY_LIQUIDATOR = "EMERGENCY_LIQUIDATOR";
bytes32 constant ROLE_PAUSABLE_ADMIN = "PAUSABLE_ADMIN";
bytes32 constant ROLE_UNPAUSABLE_ADMIN = "UNPAUSABLE_ADMIN";

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)

pragma solidity ^0.8.0;

import "./Ownable.sol";

/**
 * @dev Contract module which provides access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership} and {acceptOwnership}.
 *
 * This module is used through inheritance. It will make available all functions
 * from parent (Ownable).
 */
abstract contract Ownable2Step is Ownable {
    address private _pendingOwner;

    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Returns the address of the pending owner.
     */
    function pendingOwner() public view virtual returns (address) {
        return _pendingOwner;
    }

    /**
     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        _pendingOwner = newOwner;
        emit OwnershipTransferStarted(owner(), newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual override {
        delete _pendingOwner;
        super._transferOwnership(newOwner);
    }

    /**
     * @dev The new owner accepts the ownership transfer.
     */
    function acceptOwnership() public virtual {
        address sender = _msgSender();
        require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
        _transferOwnership(sender);
    }
}

// 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: MIT
// Gearbox Protocol. Generalized leverage for DeFi protocols
// (c) Gearbox Foundation, 2024.
pragma solidity ^0.8.17;

/// @title Version interface
/// @notice Defines contract version and type
interface IVersion {
    /// @notice Contract version
    function version() external view returns (uint256);

    /// @notice Contract type
    function contractType() external view returns (bytes32);
}

Settings
{
  "remappings": [
    "@1inch/=lib/@1inch/",
    "@gearbox-protocol/=lib/@gearbox-protocol/",
    "@openzeppelin/=lib/@openzeppelin/",
    "@redstone-finance/=node_modules/@redstone-finance/",
    "@solady/=lib/@solady/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/@openzeppelin/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin/=lib/@openzeppelin/contracts/"
  ],
  "optimizer": {
    "runs": 1000,
    "enabled": true
  },
  "metadata": {
    "bytecodeHash": "none",
    "useLiteralContent": true
  },
  "evmVersion": "shanghai",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_vetoAdmin","type":"address"},{"internalType":"uint256","name":"_delay","type":"uint256"},{"internalType":"bool","name":"_allowPermissionlessExecution","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AdminCantBeZeroAddressException","type":"error"},{"inputs":[],"name":"BatchAlreadyStartedException","type":"error"},{"inputs":[],"name":"CallerNotBatchInitiatorException","type":"error"},{"inputs":[],"name":"CallerNotExecutionAdminException","type":"error"},{"inputs":[],"name":"CallerNotQueueAdminException","type":"error"},{"inputs":[],"name":"CallerNotTimelockException","type":"error"},{"inputs":[],"name":"CallerNotVetoAdminException","type":"error"},{"inputs":[],"name":"CannotRenounceOwnershipException","type":"error"},{"inputs":[],"name":"CantPerformActionOutsideBatchException","type":"error"},{"inputs":[],"name":"ETAMistmatchException","type":"error"},{"inputs":[],"name":"IncorrectBatchException","type":"error"},{"inputs":[],"name":"TransactionAlreadyQueuedException","type":"error"},{"inputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"UnexpectedTransactionException","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"AddExecutionAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"AddQueueAdmin","type":"event"},{"anonymous":false,"inputs":[],"name":"AllowPermissionlessExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"batchBlock","type":"uint256"}],"name":"CancelBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"batchBlock","type":"uint256"}],"name":"ExecuteBatch","type":"event"},{"anonymous":false,"inputs":[],"name":"ForbidPermissionlessExecution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"uint256","name":"batchBlock","type":"uint256"}],"name":"QueueBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"RemoveExecutionAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"RemoveQueueAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"}],"name":"UpdateVetoAdmin","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"addExecutionAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"addQueueAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"allowPermissionlessExecution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"batchInfo","outputs":[{"internalType":"address","name":"initiator","type":"address"},{"internalType":"uint16","name":"length","type":"uint16"},{"internalType":"uint80","name":"eta","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"batchedTxInfo","outputs":[{"internalType":"uint64","name":"batchBlock","type":"uint64"},{"internalType":"uint16","name":"index","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"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":"eta","type":"uint256"}],"internalType":"struct IGovernor.TxParams[]","name":"txs","type":"tuple[]"}],"name":"cancelBatch","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":"eta","type":"uint256"}],"name":"cancelTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractType","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"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":"eta","type":"uint256"}],"internalType":"struct IGovernor.TxParams[]","name":"txs","type":"tuple[]"}],"name":"executeBatch","outputs":[],"stateMutability":"payable","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":"eta","type":"uint256"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"executionAdmins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forbidPermissionlessExecution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPermissionlessExecutionAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"queueAdmins","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"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":"eta","type":"uint256"}],"name":"queueTransaction","outputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"removeExecutionAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"removeQueueAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint80","name":"eta","type":"uint80"}],"name":"startBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"timeLock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"updateVetoAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vetoAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405234801562000010575f80fd5b5060405162002cb738038062002cb7833981016040819052620000339162000239565b6200003e336200011b565b30826040516200004e906200020f565b6001600160a01b0390921682526020820152604001604051809103905ff0801580156200007d573d5f803e3d5ffd5b506001600160a01b031660805262000095846200011b565b620000a08362000139565b8015620000e8576006805460ff60a01b1916600160a01b1790556040517fb685eb85668546ec83e13ea28713ea54fa4b650eec17dec38093c175d0751759905f90a162000111565b6040517fc0223cf20961cffb2cbec6f3436c3b37285eb1b51b99fee6328d48e7e4a52d4f905f90a15b505050506200028f565b600180546001600160a01b03191690556200013681620001c0565b50565b6001600160a01b0381166200016157604051633d1a3d3f60e21b815260040160405180910390fd5b6006546001600160a01b038281169116146200013657600680546001600160a01b0319166001600160a01b0383169081179091556040517fbf12139ff7104dab2c86fb3ded8e6381b5c4d828b15c3d572688966b267c5b21905f90a250565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610b61806200215683390190565b80516001600160a01b038116811462000234575f80fd5b919050565b5f805f80608085870312156200024d575f80fd5b62000258856200021d565b935062000268602086016200021d565b9250604085015191506060850151801515811462000284575f80fd5b939692955090935050565b608051611e61620002f55f395f81816104f9015281816106c50152818161093c01528181610b4c01528181610c0201528181610c9101528181610d7901528181610e2f01528181610ec2015281816110cb0152818161165b01526117180152611e615ff3fe6080604052600436106101a4575f3560e01c806388553c5f116100e7578063d085835a11610087578063dc517f3b11610062578063dc517f3b14610543578063e30c397814610562578063f18e19931461057f578063f2fde38b1461059e575f80fd5b8063d085835a146104e8578063d1f1a3301461051b578063d6504cfe1461052f575f80fd5b8063b2c6ee9e116100c2578063b2c6ee9e1461046f578063cb2ef6f714610482578063cd823ddf146104b5578063cfe19d55146104d4575f80fd5b806388553c5f146104155780638da5cb5b14610434578063b142344c14610450575f80fd5b8063591fcdfe116101525780637c37bb501161012d5780637c37bb50146103175780637ebd8f771461034e578063815bda471461036d57806385702a4f146103f6575f80fd5b8063591fcdfe146102ce578063715018a6146102ef57806379ba509714610303575f80fd5b80633a66f901116101825780633a66f9011461025c57806343143d911461028957806354fd4d50146102b9575f80fd5b80630825f38f146101a8578063155de651146101d15780631b2886d9146101f2575b5f80fd5b6101bb6101b6366004611a17565b6105bd565b6040516101c89190611ac5565b60405180910390f35b3480156101dc575f80fd5b506101e5610632565b6040516101c89190611af7565b3480156101fd575f80fd5b5061023961020c366004611b43565b60086020525f908152604090205467ffffffffffffffff81169068010000000000000000900461ffff1682565b6040805167ffffffffffffffff909316835261ffff9091166020830152016101c8565b348015610267575f80fd5b5061027b610276366004611a17565b610643565b6040519081526020016101c8565b348015610294575f80fd5b506006546102a990600160a01b900460ff1681565b60405190151581526020016101c8565b3480156102c4575f80fd5b5061027b61013681565b3480156102d9575f80fd5b506102ed6102e8366004611a17565b6109ca565b005b3480156102fa575f80fd5b506102ed610a10565b34801561030e575f80fd5b506102ed610a42565b348015610322575f80fd5b50600654610336906001600160a01b031681565b6040516001600160a01b0390911681526020016101c8565b348015610359575f80fd5b506102ed610368366004611b5a565b610ad5565b348015610378575f80fd5b506103c2610387366004611b43565b60076020525f90815260409020546001600160a01b03811690600160a01b810461ffff1690600160b01b900469ffffffffffffffffffff1683565b604080516001600160a01b03909416845261ffff909216602084015269ffffffffffffffffffff16908201526060016101c8565b348015610401575f80fd5b506102ed610410366004611bc9565b610b41565b348015610420575f80fd5b506102ed61042f366004611bc9565b610bf7565b34801561043f575f80fd5b505f546001600160a01b0316610336565b34801561045b575f80fd5b506102ed61046a366004611bc9565b610c86565b6102ed61047d366004611b5a565b610cd8565b34801561048d575f80fd5b5061027b7f474f5645524e4f5200000000000000000000000000000000000000000000000081565b3480156104c0575f80fd5b506102ed6104cf366004611bc9565b610d6e565b3480156104df575f80fd5b506102ed610e24565b3480156104f3575f80fd5b506103367f000000000000000000000000000000000000000000000000000000000000000081565b348015610526575f80fd5b506102ed610eb7565b34801561053a575f80fd5b506101e5610f4e565b34801561054e575f80fd5b506102ed61055d366004611be2565b610f5a565b34801561056d575f80fd5b506001546001600160a01b0316610336565b34801561058a575f80fd5b506102ed610599366004611bc9565b6110c0565b3480156105a9575f80fd5b506102ed6105b8366004611bc9565b61114f565b600654606090600160a01b900460ff161580156105e457505f546001600160a01b03163314155b80156105f857506105f66004336111cc565b155b1561061657604051631850c9ab60e11b815260040160405180910390fd5b610626888888888888885f6111f2565b98975050505050505050565b606061063e6004611274565b905090565b5f80546001600160a01b0316331480159061066657506106646002336111cc565b155b1561068457604051637f60cd7d60e11b815260040160405180910390fd5b61069388888888888888611287565b6040517ff2b06537000000000000000000000000000000000000000000000000000000008152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f2b0653790602401602060405180830381865afa158015610712573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107369190611c0b565b1561076d576040517f0190fe1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b435f90815260076020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820461ffff1693830193909352600160b01b900469ffffffffffffffffffff16928101929092521561090c5780516001600160a01b0316331461080a576040517fdcfc20a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806040015169ffffffffffffffffffff168314610853576040517f2bb4aa1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051808201825267ffffffffffffffff43811682526020848101805161ffff9081168386019081525f898152600890945295909220935184549551909216680100000000000000000269ffffffffffffffffffff199095169190921617929092179055516108c4906001611c3e565b435f908152600760205260409020805461ffff92909216600160a01b027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff9092169190911790555b6040517f3a66f9010000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690633a66f9019061097d908c908c908c908c908c908c908c90600401611c81565b6020604051808303815f875af1158015610999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bd9190611cd1565b5050979650505050505050565b6006546001600160a01b031633146109f55760405163349beb7760e01b815260040160405180910390fd5b610a068787878787878760016111f2565b5050505050505050565b6040517ffefc413200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015433906001600160a01b03168114610ac95760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e6572000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610ad2816112c8565b50565b6006546001600160a01b03163314610b005760405163349beb7760e01b815260040160405180910390fd5b5f610b0d838360016112ee565b604051909150819033907fe027bfb8033351cc8b0a4c11de2e713795a10bc1e2673d187ecb7b6f39046abe905f90a3505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b8a57604051634b1c3b1160e01b815260040160405180910390fd5b6001600160a01b038116610bb157604051633d1a3d3f60e21b815260040160405180910390fd5b610bbc6004826114fe565b15610ad2576040516001600160a01b038216907f3d4ca4e9803dd5efe63afc555fa3cabd81d1165bb75f46e3cc3c4a010e99d5ac905f90a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c4057604051634b1c3b1160e01b815260040160405180910390fd5b610c4b600482611512565b15610ad2576040516001600160a01b038216907f2dfe27ec14cd334fc8116d7c31e49f3ac4cfbccfd8373f3e7057e6cbdab86a35905f90a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ccf57604051634b1c3b1160e01b815260040160405180910390fd5b610ad281611526565b600654600160a01b900460ff16158015610cfc57505f546001600160a01b03163314155b8015610d105750610d0e6004336111cc565b155b15610d2e57604051631850c9ab60e11b815260040160405180910390fd5b5f610d3a83835f6112ee565b604051909150819033907fc035779d09f6829d1145ebb032474d2cb460128e8f96d8ebba5cb01ec2f62be3905f90a3505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610db757604051634b1c3b1160e01b815260040160405180910390fd5b6001600160a01b038116610dde57604051633d1a3d3f60e21b815260040160405180910390fd5b610de96002826114fe565b15610ad2576040516001600160a01b038216907f04f8d61adee47fdcb8dddae20324e28980c3c8b957a7a18d9ec53d871933bcf2905f90a250565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e6d57604051634b1c3b1160e01b815260040160405180910390fd5b600654600160a01b900460ff1615610eb5576006805460ff60a01b191690556040517fc0223cf20961cffb2cbec6f3436c3b37285eb1b51b99fee6328d48e7e4a52d4f905f90a15b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f0057604051634b1c3b1160e01b815260040160405180910390fd5b600654600160a01b900460ff16610eb5576006805460ff60a01b1916600160a01b1790556040517fb685eb85668546ec83e13ea28713ea54fa4b650eec17dec38093c175d0751759905f90a1565b606061063e6002611274565b5f546001600160a01b03163314801590610f7c5750610f7a6002336111cc565b155b15610f9a57604051637f60cd7d60e11b815260040160405180910390fd5b435f908152600760205260409020546001600160a01b031615610fe9576040517fba54e4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252338082525f602080840182815269ffffffffffffffffffff8781168688019081524380865260079094528785209651875493519151909216600160b01b0275ffffffffffffffffffffffffffffffffffffffffffff61ffff909216600160a01b027fffffffffffffffffffff000000000000000000000000000000000000000000009094166001600160a01b03909316929092179290921791909116179093559251919290917f6721e1cb193f0df8bbe8965ee5d24bfdd018debdd337950a173a7c7a0e57304e9190a350565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461110957604051634b1c3b1160e01b815260040160405180910390fd5b611114600282611512565b15610ad2576040516001600160a01b038216907ff2ce6d13426504ef94ffdf7e0a7180ff51585ea0b231cbeb199e7ed50c732171905f90a250565b6111576115b8565b600180546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff1990911681179091556111945f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001600160a01b0381165f90815260018301602052604081205415155b90505b92915050565b60605f6112048a8a8a8a8a8a8a611287565b5f8181526008602052604090205490915067ffffffffffffffff1615611256576040517fb2e9a47400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112668a8a8a8a8a8a8a8a611611565b9a9950505050505050505050565b60605f61128083611792565b9392505050565b5f878787878787876040516020016112a59796959493929190611c81565b604051602081830303815290604052805190602001209050979650505050505050565b6001805473ffffffffffffffffffffffffffffffffffffffff19169055610ad2816117eb565b5f82808203611310576040516317f726ff60e31b815260040160405180910390fd5b60085f61133f87875f81811061132857611328611ce8565b905060200281019061133a9190611cfc565b611847565b815260208101919091526040015f9081205467ffffffffffffffff16925082900361137d576040516317f726ff60e31b815260040160405180910390fd5b5f82815260076020526040902054600160a01b900461ffff1681146113b5576040516317f726ff60e31b815260040160405180910390fd5b5f5b818110156114e757368686838181106113d2576113d2611ce8565b90506020028101906113e49190611cfc565b90505f6113f082611847565b5f8181526008602090815260409182902082518084019093525467ffffffffffffffff81168084526801000000000000000090910461ffff1691830191909152919250908614158061144a575083816020015161ffff1614155b15611484576040517fc100625f00000000000000000000000000000000000000000000000000000000815260048101839052602401610ac0565b6114be6114946020850185611bc9565b60208501356114a66040870187611d1a565b6114b36060890189611d1a565b89608001358e611611565b50505f908152600860205260409020805469ffffffffffffffffffff19169055506001016113b7565b50505f818152600760205260408120559392505050565b5f6111e9836001600160a01b038416611881565b5f6111e9836001600160a01b0384166118cd565b6001600160a01b03811661154d57604051633d1a3d3f60e21b815260040160405180910390fd5b6006546001600160a01b03828116911614610ad2576006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fbf12139ff7104dab2c86fb3ded8e6381b5c4d828b15c3d572688966b267c5b21905f90a250565b5f546001600160a01b03163314610eb55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac0565b60605f82600181111561162657611626611d5d565b036116e8576040517f0825f38f0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630825f38f908a9061169e908d9083908d908d908d908d908d90600401611c81565b5f6040518083038185885af11580156116b9573d5f803e3d5ffd5b50505050506040513d5f823e601f3d908101601f191682016040526116e19190810190611d85565b9050610626565b6040517f591fcdfe0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063591fcdfe90611759908c908c908c908c908c908c908c90600401611c81565b5f604051808303815f87803b158015611770575f80fd5b505af1158015611782573d5f803e3d5ffd5b5050505098975050505050505050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156117df57602002820191905f5260205f20905b8154815260200190600101908083116117cb575b50505050509050919050565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6111ec6118586020840184611bc9565b602084013561186a6040860186611d1a565b6118776060880188611d1a565b8860800135611287565b5f8181526001830160205260408120546118c657508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556111ec565b505f6111ec565b5f81815260018301602052604081205480156119a7575f6118ef600183611e2d565b85549091505f9061190290600190611e2d565b9050818114611961575f865f01828154811061192057611920611ce8565b905f5260205f200154905080875f01848154811061194057611940611ce8565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061197257611972611e40565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506111ec565b5f9150506111ec565b5092915050565b80356001600160a01b03811681146119cd575f80fd5b919050565b5f8083601f8401126119e2575f80fd5b50813567ffffffffffffffff8111156119f9575f80fd5b602083019150836020828501011115611a10575f80fd5b9250929050565b5f805f805f805f60a0888a031215611a2d575f80fd5b611a36886119b7565b965060208801359550604088013567ffffffffffffffff80821115611a59575f80fd5b611a658b838c016119d2565b909750955060608a0135915080821115611a7d575f80fd5b50611a8a8a828b016119d2565b989b979a50959894979596608090950135949350505050565b5f5b83811015611abd578181015183820152602001611aa5565b50505f910152565b602081525f8251806020840152611ae3816040850160208701611aa3565b601f01601f19169190910160400192915050565b602080825282518282018190525f9190848201906040850190845b81811015611b375783516001600160a01b031683529284019291840191600101611b12565b50909695505050505050565b5f60208284031215611b53575f80fd5b5035919050565b5f8060208385031215611b6b575f80fd5b823567ffffffffffffffff80821115611b82575f80fd5b818501915085601f830112611b95575f80fd5b813581811115611ba3575f80fd5b8660208260051b8501011115611bb7575f80fd5b60209290920196919550909350505050565b5f60208284031215611bd9575f80fd5b6111e9826119b7565b5f60208284031215611bf2575f80fd5b813569ffffffffffffffffffff81168114611280575f80fd5b5f60208284031215611c1b575f80fd5b81518015158114611280575f80fd5b634e487b7160e01b5f52601160045260245ffd5b61ffff8181168382160190808211156119b0576119b0611c2a565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038816815286602082015260a060408201525f611ca960a083018789611c59565b8281036060840152611cbc818688611c59565b91505082608083015298975050505050505050565b5f60208284031215611ce1575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f8235609e19833603018112611d10575f80fd5b9190910192915050565b5f808335601e19843603018112611d2f575f80fd5b83018035915067ffffffffffffffff821115611d49575f80fd5b602001915036819003821315611a10575f80fd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611d95575f80fd5b815167ffffffffffffffff80821115611dac575f80fd5b818401915084601f830112611dbf575f80fd5b815181811115611dd157611dd1611d71565b604051601f8201601f19908116603f01168101908382118183101715611df957611df9611d71565b81604052828152876020848701011115611e11575f80fd5b611e22836020830160208801611aa3565b979650505050505050565b818103818111156111ec576111ec611c2a565b634e487b7160e01b5f52603160045260245ffdfea164736f6c6343000817000a60a060405234801561000f575f80fd5b50604051610b61380380610b6183398101604081905261002e91610074565b62015180811080610041575062278d0081115b1561005f5760405163bdf9b5f560e01b815260040160405180910390fd5b6001600160a01b039091166080525f556100ab565b5f8060408385031215610085575f80fd5b82516001600160a01b038116811461009b575f80fd5b6020939093015192949293505050565b608051610a896100d85f395f81816101f60152818161023d015281816104ce01526105fd0152610a895ff3fe6080604052600436106100b0575f3560e01c8063b1b43ae511610066578063e177246e1161004c578063e177246e14610188578063f2b06537146101a7578063f851a440146101e5575f80fd5b8063b1b43ae51461015c578063c1a287e214610172575f80fd5b8063591fcdfe11610096578063591fcdfe146101115780636a42b8f8146101325780637d645fab14610146575f80fd5b80630825f38f146100bb5780633a66f901146100e4575f80fd5b366100b757005b5f80fd5b6100ce6100c9366004610854565b610230565b6040516100db9190610944565b60405180910390f35b3480156100ef575f80fd5b506101036100fe366004610854565b6104c2565b6040519081526020016100db565b34801561011c575f80fd5b5061013061012b366004610854565b6105f2565b005b34801561013d575f80fd5b506101035f5481565b348015610151575f80fd5b5061010362278d0081565b348015610167575f80fd5b506101036201518081565b34801561017d575f80fd5b506101036212750081565b348015610193575f80fd5b506101306101a2366004610956565b6106f4565b3480156101b2575f80fd5b506101d56101c1366004610956565b60016020525f908152604090205460ff1681565b60405190151581526020016100db565b3480156101f0575f80fd5b506102187f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100db565b6060336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461028257604051630946186960e31b81523360048201526024015b60405180910390fd5b5f868686868660405160200161029c95949392919061096d565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff166102ff576040517fc952a44500000000000000000000000000000000000000000000000000000000815260048101829052602401610279565b82421015610339576040517f7720a89800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61034662127500846109b9565b421115610382576040517fd479ce4300000000000000000000000000000000000000000000000000000000815260048101829052602401610279565b5f818152600160205260408120805460ff191690558551606091036103a85750836103d4565b8580519060200120856040516020016103c29291906109de565b60405160208183030381529060405290505b5f80896001600160a01b031689846040516103ef9190610a25565b5f6040518083038185875af1925050503d805f8114610429576040519150601f19603f3d011682016040523d82523d5f602084013e61042e565b606091505b50915091508161046d576040517f948319ed00000000000000000000000000000000000000000000000000000000815260048101859052602401610279565b896001600160a01b0316847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b6040516104ad9493929190610a40565b60405180910390a39998505050505050505050565b5f336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461050e57604051630946186960e31b8152336004820152602401610279565b5f5461051a90426109b9565b821015610553576040517fc124b80700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f868686868660405160200161056d95949392919061096d565b60408051601f1981840301815282825280516020918201205f81815260019283905292909220805460ff1916909117905591506001600160a01b0388169082907f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f906105e0908a908a908a908a90610a40565b60405180910390a39695505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461063d57604051630946186960e31b8152336004820152602401610279565b5f858585858560405160200161065795949392919061096d565b60408051601f1981840301815291815281516020928301205f818152600190935291205490915060ff1661068b57506106ed565b5f8181526001602052604090819020805460ff19169055516001600160a01b0387169082907f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf87906106e3908990899089908990610a40565b60405180910390a3505b5050505050565b33301461072f576040517f93552b32000000000000000000000000000000000000000000000000000000008152336004820152602401610279565b62015180811080610742575062278d0081115b15610779576040517fbdf9b5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f81815560405182917f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c91a250565b634e487b7160e01b5f52604160045260245ffd5b5f67ffffffffffffffff808411156107d6576107d66107a8565b604051601f8501601f19908116603f011681019082821181831017156107fe576107fe6107a8565b81604052809350858152868686011115610816575f80fd5b858560208301375f602087830101525050509392505050565b5f82601f83011261083e575f80fd5b61084d838335602085016107bc565b9392505050565b5f805f805f60a08688031215610868575f80fd5b85356001600160a01b038116811461087e575f80fd5b945060208601359350604086013567ffffffffffffffff808211156108a1575f80fd5b818801915088601f8301126108b4575f80fd5b6108c3898335602085016107bc565b945060608801359150808211156108d8575f80fd5b506108e58882890161082f565b95989497509295608001359392505050565b5f5b838110156109115781810151838201526020016108f9565b50505f910152565b5f81518084526109308160208601602086016108f7565b601f01601f19169290920160200192915050565b602081525f61084d6020830184610919565b5f60208284031215610966575f80fd5b5035919050565b6001600160a01b038616815284602082015260a060408201525f61099460a0830186610919565b82810360608401526109a68186610919565b9150508260808301529695505050505050565b808201808211156109d857634e487b7160e01b5f52601160045260245ffd5b92915050565b7fffffffff00000000000000000000000000000000000000000000000000000000831681525f8251610a178160048501602087016108f7565b919091016004019392505050565b5f8251610a368184602087016108f7565b9190910192915050565b848152608060208201525f610a586080830186610919565b8281036040840152610a6a8186610919565b9150508260608301529594505050505056fea164736f6c6343000817000a0000000000000000000000006763fe48cc800f24c128ce651257c9f991081d1a0000000000000000000000006763fe48cc800f24c128ce651257c9f991081d1a00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101a4575f3560e01c806388553c5f116100e7578063d085835a11610087578063dc517f3b11610062578063dc517f3b14610543578063e30c397814610562578063f18e19931461057f578063f2fde38b1461059e575f80fd5b8063d085835a146104e8578063d1f1a3301461051b578063d6504cfe1461052f575f80fd5b8063b2c6ee9e116100c2578063b2c6ee9e1461046f578063cb2ef6f714610482578063cd823ddf146104b5578063cfe19d55146104d4575f80fd5b806388553c5f146104155780638da5cb5b14610434578063b142344c14610450575f80fd5b8063591fcdfe116101525780637c37bb501161012d5780637c37bb50146103175780637ebd8f771461034e578063815bda471461036d57806385702a4f146103f6575f80fd5b8063591fcdfe146102ce578063715018a6146102ef57806379ba509714610303575f80fd5b80633a66f901116101825780633a66f9011461025c57806343143d911461028957806354fd4d50146102b9575f80fd5b80630825f38f146101a8578063155de651146101d15780631b2886d9146101f2575b5f80fd5b6101bb6101b6366004611a17565b6105bd565b6040516101c89190611ac5565b60405180910390f35b3480156101dc575f80fd5b506101e5610632565b6040516101c89190611af7565b3480156101fd575f80fd5b5061023961020c366004611b43565b60086020525f908152604090205467ffffffffffffffff81169068010000000000000000900461ffff1682565b6040805167ffffffffffffffff909316835261ffff9091166020830152016101c8565b348015610267575f80fd5b5061027b610276366004611a17565b610643565b6040519081526020016101c8565b348015610294575f80fd5b506006546102a990600160a01b900460ff1681565b60405190151581526020016101c8565b3480156102c4575f80fd5b5061027b61013681565b3480156102d9575f80fd5b506102ed6102e8366004611a17565b6109ca565b005b3480156102fa575f80fd5b506102ed610a10565b34801561030e575f80fd5b506102ed610a42565b348015610322575f80fd5b50600654610336906001600160a01b031681565b6040516001600160a01b0390911681526020016101c8565b348015610359575f80fd5b506102ed610368366004611b5a565b610ad5565b348015610378575f80fd5b506103c2610387366004611b43565b60076020525f90815260409020546001600160a01b03811690600160a01b810461ffff1690600160b01b900469ffffffffffffffffffff1683565b604080516001600160a01b03909416845261ffff909216602084015269ffffffffffffffffffff16908201526060016101c8565b348015610401575f80fd5b506102ed610410366004611bc9565b610b41565b348015610420575f80fd5b506102ed61042f366004611bc9565b610bf7565b34801561043f575f80fd5b505f546001600160a01b0316610336565b34801561045b575f80fd5b506102ed61046a366004611bc9565b610c86565b6102ed61047d366004611b5a565b610cd8565b34801561048d575f80fd5b5061027b7f474f5645524e4f5200000000000000000000000000000000000000000000000081565b3480156104c0575f80fd5b506102ed6104cf366004611bc9565b610d6e565b3480156104df575f80fd5b506102ed610e24565b3480156104f3575f80fd5b506103367f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef581565b348015610526575f80fd5b506102ed610eb7565b34801561053a575f80fd5b506101e5610f4e565b34801561054e575f80fd5b506102ed61055d366004611be2565b610f5a565b34801561056d575f80fd5b506001546001600160a01b0316610336565b34801561058a575f80fd5b506102ed610599366004611bc9565b6110c0565b3480156105a9575f80fd5b506102ed6105b8366004611bc9565b61114f565b600654606090600160a01b900460ff161580156105e457505f546001600160a01b03163314155b80156105f857506105f66004336111cc565b155b1561061657604051631850c9ab60e11b815260040160405180910390fd5b610626888888888888885f6111f2565b98975050505050505050565b606061063e6004611274565b905090565b5f80546001600160a01b0316331480159061066657506106646002336111cc565b155b1561068457604051637f60cd7d60e11b815260040160405180910390fd5b61069388888888888888611287565b6040517ff2b06537000000000000000000000000000000000000000000000000000000008152600481018290529091507f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef56001600160a01b03169063f2b0653790602401602060405180830381865afa158015610712573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107369190611c0b565b1561076d576040517f0190fe1100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b435f90815260076020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820461ffff1693830193909352600160b01b900469ffffffffffffffffffff16928101929092521561090c5780516001600160a01b0316331461080a576040517fdcfc20a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806040015169ffffffffffffffffffff168314610853576040517f2bb4aa1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051808201825267ffffffffffffffff43811682526020848101805161ffff9081168386019081525f898152600890945295909220935184549551909216680100000000000000000269ffffffffffffffffffff199095169190921617929092179055516108c4906001611c3e565b435f908152600760205260409020805461ffff92909216600160a01b027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff9092169190911790555b6040517f3a66f9010000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef51690633a66f9019061097d908c908c908c908c908c908c908c90600401611c81565b6020604051808303815f875af1158015610999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bd9190611cd1565b5050979650505050505050565b6006546001600160a01b031633146109f55760405163349beb7760e01b815260040160405180910390fd5b610a068787878787878760016111f2565b5050505050505050565b6040517ffefc413200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60015433906001600160a01b03168114610ac95760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f74207468652060448201527f6e6577206f776e6572000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610ad2816112c8565b50565b6006546001600160a01b03163314610b005760405163349beb7760e01b815260040160405180910390fd5b5f610b0d838360016112ee565b604051909150819033907fe027bfb8033351cc8b0a4c11de2e713795a10bc1e2673d187ecb7b6f39046abe905f90a3505050565b336001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef51614610b8a57604051634b1c3b1160e01b815260040160405180910390fd5b6001600160a01b038116610bb157604051633d1a3d3f60e21b815260040160405180910390fd5b610bbc6004826114fe565b15610ad2576040516001600160a01b038216907f3d4ca4e9803dd5efe63afc555fa3cabd81d1165bb75f46e3cc3c4a010e99d5ac905f90a250565b336001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef51614610c4057604051634b1c3b1160e01b815260040160405180910390fd5b610c4b600482611512565b15610ad2576040516001600160a01b038216907f2dfe27ec14cd334fc8116d7c31e49f3ac4cfbccfd8373f3e7057e6cbdab86a35905f90a250565b336001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef51614610ccf57604051634b1c3b1160e01b815260040160405180910390fd5b610ad281611526565b600654600160a01b900460ff16158015610cfc57505f546001600160a01b03163314155b8015610d105750610d0e6004336111cc565b155b15610d2e57604051631850c9ab60e11b815260040160405180910390fd5b5f610d3a83835f6112ee565b604051909150819033907fc035779d09f6829d1145ebb032474d2cb460128e8f96d8ebba5cb01ec2f62be3905f90a3505050565b336001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef51614610db757604051634b1c3b1160e01b815260040160405180910390fd5b6001600160a01b038116610dde57604051633d1a3d3f60e21b815260040160405180910390fd5b610de96002826114fe565b15610ad2576040516001600160a01b038216907f04f8d61adee47fdcb8dddae20324e28980c3c8b957a7a18d9ec53d871933bcf2905f90a250565b336001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef51614610e6d57604051634b1c3b1160e01b815260040160405180910390fd5b600654600160a01b900460ff1615610eb5576006805460ff60a01b191690556040517fc0223cf20961cffb2cbec6f3436c3b37285eb1b51b99fee6328d48e7e4a52d4f905f90a15b565b336001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef51614610f0057604051634b1c3b1160e01b815260040160405180910390fd5b600654600160a01b900460ff16610eb5576006805460ff60a01b1916600160a01b1790556040517fb685eb85668546ec83e13ea28713ea54fa4b650eec17dec38093c175d0751759905f90a1565b606061063e6002611274565b5f546001600160a01b03163314801590610f7c5750610f7a6002336111cc565b155b15610f9a57604051637f60cd7d60e11b815260040160405180910390fd5b435f908152600760205260409020546001600160a01b031615610fe9576040517fba54e4e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051606081018252338082525f602080840182815269ffffffffffffffffffff8781168688019081524380865260079094528785209651875493519151909216600160b01b0275ffffffffffffffffffffffffffffffffffffffffffff61ffff909216600160a01b027fffffffffffffffffffff000000000000000000000000000000000000000000009094166001600160a01b03909316929092179290921791909116179093559251919290917f6721e1cb193f0df8bbe8965ee5d24bfdd018debdd337950a173a7c7a0e57304e9190a350565b336001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef5161461110957604051634b1c3b1160e01b815260040160405180910390fd5b611114600282611512565b15610ad2576040516001600160a01b038216907ff2ce6d13426504ef94ffdf7e0a7180ff51585ea0b231cbeb199e7ed50c732171905f90a250565b6111576115b8565b600180546001600160a01b03831673ffffffffffffffffffffffffffffffffffffffff1990911681179091556111945f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6001600160a01b0381165f90815260018301602052604081205415155b90505b92915050565b60605f6112048a8a8a8a8a8a8a611287565b5f8181526008602052604090205490915067ffffffffffffffff1615611256576040517fb2e9a47400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6112668a8a8a8a8a8a8a8a611611565b9a9950505050505050505050565b60605f61128083611792565b9392505050565b5f878787878787876040516020016112a59796959493929190611c81565b604051602081830303815290604052805190602001209050979650505050505050565b6001805473ffffffffffffffffffffffffffffffffffffffff19169055610ad2816117eb565b5f82808203611310576040516317f726ff60e31b815260040160405180910390fd5b60085f61133f87875f81811061132857611328611ce8565b905060200281019061133a9190611cfc565b611847565b815260208101919091526040015f9081205467ffffffffffffffff16925082900361137d576040516317f726ff60e31b815260040160405180910390fd5b5f82815260076020526040902054600160a01b900461ffff1681146113b5576040516317f726ff60e31b815260040160405180910390fd5b5f5b818110156114e757368686838181106113d2576113d2611ce8565b90506020028101906113e49190611cfc565b90505f6113f082611847565b5f8181526008602090815260409182902082518084019093525467ffffffffffffffff81168084526801000000000000000090910461ffff1691830191909152919250908614158061144a575083816020015161ffff1614155b15611484576040517fc100625f00000000000000000000000000000000000000000000000000000000815260048101839052602401610ac0565b6114be6114946020850185611bc9565b60208501356114a66040870187611d1a565b6114b36060890189611d1a565b89608001358e611611565b50505f908152600860205260409020805469ffffffffffffffffffff19169055506001016113b7565b50505f818152600760205260408120559392505050565b5f6111e9836001600160a01b038416611881565b5f6111e9836001600160a01b0384166118cd565b6001600160a01b03811661154d57604051633d1a3d3f60e21b815260040160405180910390fd5b6006546001600160a01b03828116911614610ad2576006805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081179091556040517fbf12139ff7104dab2c86fb3ded8e6381b5c4d828b15c3d572688966b267c5b21905f90a250565b5f546001600160a01b03163314610eb55760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610ac0565b60605f82600181111561162657611626611d5d565b036116e8576040517f0825f38f0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef51690630825f38f908a9061169e908d9083908d908d908d908d908d90600401611c81565b5f6040518083038185885af11580156116b9573d5f803e3d5ffd5b50505050506040513d5f823e601f3d908101601f191682016040526116e19190810190611d85565b9050610626565b6040517f591fcdfe0000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000067ef0ad74899dc1ff06456219829c2531d652ef5169063591fcdfe90611759908c908c908c908c908c908c908c90600401611c81565b5f604051808303815f87803b158015611770575f80fd5b505af1158015611782573d5f803e3d5ffd5b5050505098975050505050505050565b6060815f018054806020026020016040519081016040528092919081815260200182805480156117df57602002820191905f5260205f20905b8154815260200190600101908083116117cb575b50505050509050919050565b5f80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6111ec6118586020840184611bc9565b602084013561186a6040860186611d1a565b6118776060880188611d1a565b8860800135611287565b5f8181526001830160205260408120546118c657508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556111ec565b505f6111ec565b5f81815260018301602052604081205480156119a7575f6118ef600183611e2d565b85549091505f9061190290600190611e2d565b9050818114611961575f865f01828154811061192057611920611ce8565b905f5260205f200154905080875f01848154811061194057611940611ce8565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061197257611972611e40565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506111ec565b5f9150506111ec565b5092915050565b80356001600160a01b03811681146119cd575f80fd5b919050565b5f8083601f8401126119e2575f80fd5b50813567ffffffffffffffff8111156119f9575f80fd5b602083019150836020828501011115611a10575f80fd5b9250929050565b5f805f805f805f60a0888a031215611a2d575f80fd5b611a36886119b7565b965060208801359550604088013567ffffffffffffffff80821115611a59575f80fd5b611a658b838c016119d2565b909750955060608a0135915080821115611a7d575f80fd5b50611a8a8a828b016119d2565b989b979a50959894979596608090950135949350505050565b5f5b83811015611abd578181015183820152602001611aa5565b50505f910152565b602081525f8251806020840152611ae3816040850160208701611aa3565b601f01601f19169190910160400192915050565b602080825282518282018190525f9190848201906040850190845b81811015611b375783516001600160a01b031683529284019291840191600101611b12565b50909695505050505050565b5f60208284031215611b53575f80fd5b5035919050565b5f8060208385031215611b6b575f80fd5b823567ffffffffffffffff80821115611b82575f80fd5b818501915085601f830112611b95575f80fd5b813581811115611ba3575f80fd5b8660208260051b8501011115611bb7575f80fd5b60209290920196919550909350505050565b5f60208284031215611bd9575f80fd5b6111e9826119b7565b5f60208284031215611bf2575f80fd5b813569ffffffffffffffffffff81168114611280575f80fd5b5f60208284031215611c1b575f80fd5b81518015158114611280575f80fd5b634e487b7160e01b5f52601160045260245ffd5b61ffff8181168382160190808211156119b0576119b0611c2a565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b6001600160a01b038816815286602082015260a060408201525f611ca960a083018789611c59565b8281036060840152611cbc818688611c59565b91505082608083015298975050505050505050565b5f60208284031215611ce1575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f8235609e19833603018112611d10575f80fd5b9190910192915050565b5f808335601e19843603018112611d2f575f80fd5b83018035915067ffffffffffffffff821115611d49575f80fd5b602001915036819003821315611a10575f80fd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52604160045260245ffd5b5f60208284031215611d95575f80fd5b815167ffffffffffffffff80821115611dac575f80fd5b818401915084601f830112611dbf575f80fd5b815181811115611dd157611dd1611d71565b604051601f8201601f19908116603f01168101908382118183101715611df957611df9611d71565b81604052828152876020848701011115611e11575f80fd5b611e22836020830160208801611aa3565b979650505050505050565b818103818111156111ec576111ec611c2a565b634e487b7160e01b5f52603160045260245ffdfea164736f6c6343000817000a

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000006763fe48cc800f24c128ce651257c9f991081d1a0000000000000000000000006763fe48cc800f24c128ce651257c9f991081d1a00000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _owner (address): 0x6763fe48cC800F24C128ce651257c9f991081d1a
Arg [1] : _vetoAdmin (address): 0x6763fe48cC800F24C128ce651257c9f991081d1a
Arg [2] : _delay (uint256): 86400
Arg [3] : _allowPermissionlessExecution (bool): False

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000006763fe48cc800f24c128ce651257c9f991081d1a
Arg [1] : 0000000000000000000000006763fe48cc800f24c128ce651257c9f991081d1a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.