Source Code
Overview
MON Balance
MON Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 2 internal transactions
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 36852841 | 68 days ago | Contract Creation | 0 MON | |||
| 36852841 | 68 days ago | Contract Creation | 0 MON |
Loading...
Loading
Contract Name:
Governor
Compiler Version
v0.8.23+commit.f704f362
Optimization Enabled:
Yes with 1000 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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;
}// 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);
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
[ 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.