{"file_path":"contracts/periphery/SelectiveTimelock.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.28;\n\nimport \"@openzeppelin/contracts/access/Ownable2Step.sol\";\nimport \"@openzeppelin/contracts/utils/ReentrancyGuard.sol\";\nimport \"../interfaces/ISelectiveTimelock.sol\";\n\n/// @title SelectiveTimelock\n/// @notice GenericTimelock with the delay keyed by (target, selector) instead\n///         of one global value. Queues arbitrary (target, value, signature,\n///         data, eta) calls and executes them after that pair's delay. Pairs\n///         with a delay of 0 may also be executed immediately by the owner\n///         through `call`. Every forwarded call runs from this contract's\n///         context, so it is the owner-of-record of the target.\n///\n/// Intended wiring for USN:\n///   24h    : USN.setAdmin(address)            — the admin is the sole minter\n///   24h    : USN.transferOwnership(address)   — otherwise the owner could hand USN\n///   24h    : USN.renounceOwnership()            to a fresh owner and call setAdmin at once\n///   direct : everything else the owner can do on USN (pause, blacklist,\n///            whitelist, setRateLimiter, peers, enforced options, ...)\n///\n/// Delay guarantees an integrator should reason about:\n///   - Every delay is in [0, MAX_DELAY]. 0 means \"direct\".\n///   - Changing a pair's delay is the same two-step flow as GenericTimelock,\n///     with the pair's CURRENT delay applied to the change:\n///     scheduleDelayChange(target, selector, newDelay) records the request,\n///     executeDelayChange(target, selector) applies it once the current delay\n///     has elapsed. Reducing setAdmin from 24h to 0 thus takes 24h. Putting a\n///     new pair under a delay (current 0) is immediate.\n///   - Ownership rotation on this contract uses Ownable2Step (transfer +\n///     accept) but is NOT timelocked; the new owner inherits the same map.\n///     renounceOwnership is disabled.\ncontract SelectiveTimelock is Ownable2Step, ReentrancyGuard, ISelectiveTimelock {\n    // ============ Constants ============\n\n    /// @notice Maximum acceptable delay for any (target, selector).\n    uint256 public constant MAX_DELAY = 30 days;\n\n    /// @notice Window after `eta` during which an execution is still accepted.\n    ///         Past this, `execute` reverts `OperationExpired`. The queued\n    ///         flag remains set for the expired opHash but has no on-chain\n    ///         effect — that opHash can never execute (eta is in the past)\n    ///         and cannot be re-queued (same eta trips `EtaTooSoon`).\n    ///         To retry the operation, queue it again with a fresh `eta`;\n    ///         the new opHash is independent.\n    uint256 public constant GRACE_PERIOD = 14 days;\n\n    // ============ Storage ============\n\n    /// @notice (target, selector) => queue-to-execute delay. 0 = direct.\n    mapping(address => mapping(bytes4 => uint256)) public delay;\n\n    /// @notice (target, selector) => pending delay change (0 if none scheduled).\n    mapping(address => mapping(bytes4 => uint256)) public pendingDelay;\n\n    /// @notice (target, selector) => earliest timestamp at which the pending\n    ///         delay change may be executed. 0 iff no change is pending.\n    mapping(address => mapping(bytes4 => uint256)) public pendingDelayEta;\n\n    /// @notice opHash => queued flag. True once queued, false after execute/cancel.\n    mapping(bytes32 => bool) public queued;\n\n    // ============ Constructor ============\n\n    /// @param initialOwner Address that can queue / execute / cancel operations,\n    ///        run direct calls, and administer delays.\n    constructor(address initialOwner) Ownable(initialOwner) {}\n\n    /// @notice Disabled. An ownerless timelock would leave the target without\n    ///         any owner path; rotate with transferOwnership + acceptOwnership.\n    function renounceOwnership() public view override onlyOwner {\n        revert RenounceDisabled();\n    }\n\n    // ============ Delay management (self-timelocked, explicit two-step) ============\n\n    /// @notice Schedule a change to the delay of (target, selector). The change\n    ///         cannot be applied until the pair's CURRENT delay has elapsed since\n    ///         scheduling — so reducing a delay takes at least the current delay.\n    /// @param newDelay New delay in seconds. Must be in [0, MAX_DELAY].\n    /// @dev At most one delay change can be pending per pair. Use\n    ///      cancelDelayChange first to replace a pending one.\n    function scheduleDelayChange(\n        address target,\n        bytes4 selector,\n        uint256 newDelay\n    ) external onlyOwner {\n        if (target == address(0)) revert ZeroAddress();\n        if (newDelay > MAX_DELAY) revert DelayOutOfBounds(newDelay, 0, MAX_DELAY);\n        if (pendingDelayEta[target][selector] != 0) {\n            revert DelayChangeAlreadyPending(\n                target,\n                selector,\n                pendingDelay[target][selector],\n                pendingDelayEta[target][selector]\n            );\n        }\n        uint256 eta = block.timestamp + delay[target][selector];\n        pendingDelay[target][selector] = newDelay;\n        pendingDelayEta[target][selector] = eta;\n        emit DelayChangeScheduled(target, selector, newDelay, eta);\n    }\n\n    /// @notice Apply the pending delay change of (target, selector) once the\n    ///         pair's CURRENT delay has elapsed.\n    /// @dev Only affects operations queued AFTER this call; already-queued ops\n    ///      keep their original `eta`.\n    function executeDelayChange(address target, bytes4 selector) external onlyOwner {\n        uint256 eta = pendingDelayEta[target][selector];\n        if (eta == 0) revert NoPendingDelayChange(target, selector);\n        if (block.timestamp < eta) revert DelayChangeNotReady(eta, block.timestamp);\n\n        uint256 previousDelay = delay[target][selector];\n        uint256 newDelay = pendingDelay[target][selector];\n        delay[target][selector] = newDelay;\n        delete pendingDelay[target][selector];\n        delete pendingDelayEta[target][selector];\n        emit DelayUpdated(target, selector, previousDelay, newDelay);\n    }\n\n    /// @notice Cancel a pending delay change of (target, selector) before it is executed.\n    function cancelDelayChange(address target, bytes4 selector) external onlyOwner {\n        if (pendingDelayEta[target][selector] == 0) revert NoPendingDelayChange(target, selector);\n        uint256 cancelledDelay = pendingDelay[target][selector];\n        delete pendingDelay[target][selector];\n        delete pendingDelayEta[target][selector];\n        emit DelayChangeCancelled(target, selector, cancelledDelay);\n    }\n\n    // ============ Queue / Execute / Cancel ============\n\n    /// @notice Queue an operation for later execution.\n    /// @param target Contract to call.\n    /// @param value ETH to send with the call. `msg.value` at `execute` time must equal this.\n    /// @param signature Textual function signature (e.g. \"setFoo(uint256)\"). Pass empty\n    ///        string to treat `data` as raw calldata.\n    /// @param data ABI-encoded arguments (without the 4-byte selector) when `signature` is\n    ///        non-empty, else raw calldata.\n    /// @param eta Earliest timestamp at which the operation may execute. Must satisfy\n    ///        `eta >= block.timestamp + delay[target][selector]` at queue time.\n    /// @return opHash Unique identifier for this operation.\n    function queue(\n        address target,\n        uint256 value,\n        string calldata signature,\n        bytes calldata data,\n        uint256 eta\n    ) external onlyOwner returns (bytes32 opHash) {\n        uint256 minEta = block.timestamp + delay[target][_selector(signature, data)];\n        if (eta < minEta) revert EtaTooSoon(eta, minEta);\n\n        opHash = hashOperation(target, value, signature, data, eta);\n        if (queued[opHash]) revert OperationAlreadyQueued(opHash);\n        queued[opHash] = true;\n\n        emit OperationQueued(opHash, target, value, signature, data, eta);\n    }\n\n    /// @notice Cancel a queued operation. Callable at any time before execute.\n    ///         Also callable on an already-expired op, but this only clears\n    ///         a mapping entry that has no effect either way — the expired\n    ///         opHash can already never execute and can never be re-queued.\n    function cancel(\n        address target,\n        uint256 value,\n        string calldata signature,\n        bytes calldata data,\n        uint256 eta\n    ) external onlyOwner {\n        bytes32 opHash = hashOperation(target, value, signature, data, eta);\n        if (!queued[opHash]) revert OperationNotQueued(opHash);\n        delete queued[opHash];\n        emit OperationCancelled(opHash);\n    }\n\n    /// @notice Execute a queued operation once its `eta` has passed and before\n    ///         `eta + GRACE_PERIOD`.\n    /// @return returnData Raw return data from the underlying target call.\n    function execute(\n        address target,\n        uint256 value,\n        string calldata signature,\n        bytes calldata data,\n        uint256 eta\n    ) external payable onlyOwner nonReentrant returns (bytes memory returnData) {\n        bytes32 opHash = hashOperation(target, value, signature, data, eta);\n        if (!queued[opHash]) revert OperationNotQueued(opHash);\n        if (block.timestamp < eta) revert OperationNotReady(eta, block.timestamp);\n        uint256 gracePeriodEnd = eta + GRACE_PERIOD;\n        if (block.timestamp > gracePeriodEnd) {\n            revert OperationExpired(eta, gracePeriodEnd, block.timestamp);\n        }\n        if (msg.value != value) revert ValueMismatch(msg.value, value);\n\n        delete queued[opHash];\n\n        bytes memory callData = _buildCalldata(signature, data);\n        bool ok;\n        (ok, returnData) = target.call{value: value}(callData);\n        if (!ok) revert CallReverted(returnData);\n\n        emit OperationExecuted(opHash, target, value, signature, data, returnData);\n    }\n\n    // ============ Direct path (owner, zero-delay pairs only) ============\n\n    /// @notice Execute an operation immediately. Reverts `SelectorIsDelayed`\n    ///         when (target, selector) carries a delay — use `queue` then.\n    /// @param signature / data Same conventions as `queue`.\n    function call(\n        address target,\n        uint256 value,\n        string calldata signature,\n        bytes calldata data\n    ) external payable onlyOwner nonReentrant returns (bytes memory returnData) {\n        bytes4 selector = _selector(signature, data);\n        uint256 d = delay[target][selector];\n        if (d != 0) revert SelectorIsDelayed(target, selector, d);\n        if (msg.value != value) revert ValueMismatch(msg.value, value);\n\n        bytes memory callData = _buildCalldata(signature, data);\n        bool ok;\n        (ok, returnData) = target.call{value: value}(callData);\n        if (!ok) revert CallReverted(returnData);\n\n        emit DirectCall(target, value, signature, data, returnData);\n    }\n\n    // ============ Views ============\n\n    /// @notice Deterministic identifier for an operation. Two operations with\n    ///         identical params share the same hash and cannot be queued\n    ///         simultaneously.\n    function hashOperation(\n        address target,\n        uint256 value,\n        string calldata signature,\n        bytes calldata data,\n        uint256 eta\n    ) public pure returns (bytes32) {\n        return keccak256(abi.encode(target, value, signature, data, eta));\n    }\n\n    /// @notice Preview the exact bytes forwarded to `target` at execute time.\n    function buildCalldata(\n        string calldata signature,\n        bytes calldata data\n    ) external pure returns (bytes memory) {\n        return _buildCalldata(signature, data);\n    }\n\n    /// @notice Delay that applies to this (signature, data) on `target`. 0 = direct.\n    function delayFor(\n        address target,\n        string calldata signature,\n        bytes calldata data\n    ) external view returns (uint256) {\n        return delay[target][_selector(signature, data)];\n    }\n\n    // ============ Internal ============\n\n    function _buildCalldata(\n        string calldata signature,\n        bytes calldata data\n    ) internal pure returns (bytes memory) {\n        if (bytes(signature).length == 0) return data;\n        return bytes.concat(bytes4(keccak256(bytes(signature))), data);\n    }\n\n    /// @dev Selector the forwarded call will carry: from `signature` when given,\n    ///      else the first 4 bytes of raw `data`. Empty data (plain value\n    ///      transfer) maps to selector 0x00000000.\n    function _selector(\n        string calldata signature,\n        bytes calldata data\n    ) internal pure returns (bytes4) {\n        if (bytes(signature).length != 0) return bytes4(keccak256(bytes(signature)));\n        if (data.length == 0) return bytes4(0);\n        if (data.length < 4) revert BadCalldata();\n        return bytes4(data[:4]);\n    }\n\n    // Intentionally no receive/fallback: this contract does not spend from\n    // its own balance. All ETH for value>0 executions must be supplied via\n    // `msg.value` at `execute` / `call` time.\n}\n","deployed_bytecode":"0x60806040526004361061012a5760003560e01c8063715018a6116100ab5780639ba52b671161006f5780639ba52b6714610369578063b0f8b1421461037c578063c055bb5e1461038f578063c1a287e2146103c7578063e30c3978146103de578063f2fde38b146103fc57600080fd5b8063715018a6146102d857806379ba5097146102ed5780638b1ce603146103025780638da5cb5b1461032257806399c541381461034957600080fd5b806344652cc9116100f257806344652cc9146102205780634b9915a5146102585780634cdbfad6146102785780635f0b609f1461029857806369f34fb3146102b857600080fd5b8063107aa3901461012f578063228250c91461015157806326d79f16146101965780633ce7a8d3146101c35780634125ff9014610209575b600080fd5b34801561013b57600080fd5b5061014f61014a3660046110d6565b61041c565b005b34801561015d57600080fd5b5061018161016c366004611109565b60066020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101a257600080fd5b506101b66101b136600461116a565b61050a565b60405161018d9190611229565b3480156101cf57600080fd5b506101fb6101de3660046110d6565b600460209081526000928352604080842090915290825290205481565b60405190815260200161018d565b34801561021557600080fd5b506101fb62278d0081565b34801561022c57600080fd5b506101fb61023b3660046110d6565b600360209081526000928352604080842090915290825290205481565b34801561026457600080fd5b506101fb610273366004611243565b610523565b34801561028457600080fd5b5061014f610293366004611243565b61065d565b3480156102a457600080fd5b5061014f6102b33660046110d6565b6106f2565b3480156102c457600080fd5b5061014f6102d33660046112d9565b61081c565b3480156102e457600080fd5b5061014f6109ee565b3480156102f957600080fd5b5061014f610a0f565b34801561030e57600080fd5b506101fb61031d366004611243565b610a4a565b34801561032e57600080fd5b506000546001600160a01b03165b60405161018d9190611316565b34801561035557600080fd5b506101fb61036436600461132a565b610a8d565b6101b66103773660046113ae565b610ad7565b6101b661038a366004611243565b610c87565b34801561039b57600080fd5b506101fb6103aa3660046110d6565b600560209081526000928352604080842090915290825290205481565b3480156103d357600080fd5b506101fb6212750081565b3480156103ea57600080fd5b506001546001600160a01b031661033c565b34801561040857600080fd5b5061014f61041736600461143b565b610e74565b610424610ee5565b6001600160a01b03821660009081526005602090815260408083206001600160e01b031985168452909152812054900361047e5781816040516323c8216f60e21b8152600401610475929190611456565b60405180910390fd5b6001600160a01b03821660008181526004602090815260408083206001600160e01b031986168085529083528184208054908590558585526005845282852082865290935281842093909355519092907f9172b4138825330770784d04a8b0b15b770d7113ee46744d34cc18f7676aae66906104fd9085815260200190565b60405180910390a3505050565b606061051885858585610f14565b90505b949350505050565b600061052d610ee5565b6001600160a01b03881660009081526003602052604081208161055289898989610fa0565b6001600160e01b03191681526020810191909152604001600020546105779042611479565b9050808310156105a457604051638c2d242160e01b81526004810184905260248101829052604401610475565b6105b389898989898989610a4a565b60008181526006602052604090205490925060ff16156105e95760405163a3c4fc5760e01b815260048101839052602401610475565b60008281526006602052604090819020805460ff19166001179055516001600160a01b038a169083907f49d452dc398d4ca23f8d0dd42643c77bbefb70316922e67e42a4587d597c7bd990610649908c908c908c908c908c908c906114c9565b60405180910390a350979650505050505050565b610665610ee5565b600061067688888888888888610a4a565b60008181526006602052604090205490915060ff166106ab5760405163f80a117b60e01b815260048101829052602401610475565b600081815260066020526040808220805460ff191690555182917fcf0f63b97f3387253cbc0bde884f975df77e39184dc3280c2c81be495f58eef491a25050505050505050565b6106fa610ee5565b6001600160a01b03821660009081526005602090815260408083206001600160e01b0319851684529091528120549081900361074d5782826040516323c8216f60e21b8152600401610475929190611456565b804210156107775760405163ec4980f760e01b815260048101829052426024820152604401610475565b6001600160a01b03831660008181526003602090815260408083206001600160e01b0319871680855290835281842080548686526004855283862083875285528386208054928390558690558686526005855283862083875285528386209590955582518581529384018190529394909290917fc5804cf24a9f43c3e6e5c2d4ea3ad1b2a319965e6f1b2ecf257abc7bfd9a8e34910160405180910390a35050505050565b610824610ee5565b6001600160a01b03831661084b5760405163d92e233d60e01b815260040160405180910390fd5b62278d00811115610882576040516318b0f13b60e11b8152600481018290526000602482015262278d006044820152606401610475565b6001600160a01b03831660009081526005602090815260408083206001600160e01b0319861684529091529020541561092d576001600160a01b03831660008181526004602081815260408084206001600160e01b03198816808652908352818520548686526005845282862082875290935293819020549051637b5f264d60e11b815292830194909452602482019290925260448101919091526064810191909152608401610475565b6001600160a01b03831660009081526003602090815260408083206001600160e01b0319861684529091528120546109659042611479565b6001600160a01b03851660008181526004602090815260408083206001600160e01b0319891680855290835281842088905584845260058352818420818552835292819020859055805187815291820185905293945090927ff9dbeeb916b19bc175339008d81ea2ca8c0242322ec03269f4b023fdeb911b60910160405180910390a350505050565b6109f6610ee5565b604051638905116560e01b815260040160405180910390fd5b60015433906001600160a01b03168114610a3e578060405163118cdaa760e01b81526004016104759190611316565b610a4781611011565b50565b600087878787878787604051602001610a69979695949392919061150a565b6040516020818303038152906040528051906020012090505b979650505050505050565b6001600160a01b038516600090815260036020526040812081610ab287878787610fa0565b6001600160e01b03191681526020810191909152604001600020549695505050505050565b6060610ae1610ee5565b610ae961102a565b6000610af786868686610fa0565b6001600160a01b03891660009081526003602090815260408083206001600160e01b0319851684529091529020549091508015610b695760405163d8e1ed8d60e01b81526001600160a01b038a1660048201526001600160e01b03198316602482015260448101829052606401610475565b873414610b9257604051630626ade360e41b815234600482015260248101899052604401610475565b6000610ba088888888610f14565b905060008a6001600160a01b03168a83604051610bbd919061155a565b60006040518083038185875af1925050503d8060008114610bfa576040519150601f19603f3d011682016040523d82523d6000602084013e610bff565b606091505b509550905080610c2457846040516370de1b4b60e01b81526004016104759190611229565b8a6001600160a01b03167f22b25ade8a87ebf99c2560c4e7a51daa6db5a6175701dd906677a74459963b4e8b8b8b8b8b8b604051610c6796959493929190611576565b60405180910390a250505050610c7d6001600255565b9695505050505050565b6060610c91610ee5565b610c9961102a565b6000610caa89898989898989610a4a565b60008181526006602052604090205490915060ff16610cdf5760405163f80a117b60e01b815260048101829052602401610475565b82421015610d09576040516364d611b760e11b815260048101849052426024820152604401610475565b6000610d186212750085611479565b905080421115610d4b576040516368a21b3d60e11b81526004810185905260248101829052426044820152606401610475565b883414610d7457604051630626ade360e41b8152346004820152602481018a9052604401610475565b6000828152600660205260408120805460ff19169055610d9689898989610f14565b905060008b6001600160a01b03168b83604051610db3919061155a565b60006040518083038185875af1925050503d8060008114610df0576040519150601f19603f3d011682016040523d82523d6000602084013e610df5565b606091505b509550905080610e1a57846040516370de1b4b60e01b81526004016104759190611229565b8b6001600160a01b0316847ff8f34dc2df781c77b4cf78ff8df1df9fa976352e7bb7efad0378d719b1fb5dcb8d8d8d8d8d8c604051610e5e96959493929190611576565b60405180910390a350505050610a826001600255565b610e7c610ee5565b600180546001600160a01b0383166001600160a01b03199091168117909155610ead6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b03163314610f12573360405163118cdaa760e01b81526004016104759190611316565b565b60606000849003610f5e5782828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092935061051b92505050565b8484604051610f6e9291906115c4565b604051908190038120610f8791859085906020016115d4565b6040516020818303038152906040529050949350505050565b60008315610fc7578484604051610fb89291906115c4565b6040518091039020905061051b565b6000829003610fd85750600061051b565b6004821015610ffa5760405163068b856560e21b815260040160405180910390fd5b6110086004600084866115f8565b61051891611622565b600180546001600160a01b0319169055610a4781611052565b600280540361104c57604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b03811681146110b957600080fd5b919050565b80356001600160e01b0319811681146110b957600080fd5b600080604083850312156110e957600080fd5b6110f2836110a2565b9150611100602084016110be565b90509250929050565b60006020828403121561111b57600080fd5b5035919050565b60008083601f84011261113457600080fd5b5081356001600160401b0381111561114b57600080fd5b60208301915083602082850101111561116357600080fd5b9250929050565b6000806000806040858703121561118057600080fd5b84356001600160401b0381111561119657600080fd5b6111a287828801611122565b90955093505060208501356001600160401b038111156111c157600080fd5b6111cd87828801611122565b95989497509550505050565b60005b838110156111f45781810151838201526020016111dc565b50506000910152565b600081518084526112158160208601602086016111d9565b601f01601f19169290920160200192915050565b60208152600061123c60208301846111fd565b9392505050565b600080600080600080600060a0888a03121561125e57600080fd5b611267886110a2565b96506020880135955060408801356001600160401b0381111561128957600080fd5b6112958a828b01611122565b90965094505060608801356001600160401b038111156112b457600080fd5b6112c08a828b01611122565b989b979a50959894979596608090950135949350505050565b6000806000606084860312156112ee57600080fd5b6112f7846110a2565b9250611305602085016110be565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b60008060008060006060868803121561134257600080fd5b61134b866110a2565b945060208601356001600160401b0381111561136657600080fd5b61137288828901611122565b90955093505060408601356001600160401b0381111561139157600080fd5b61139d88828901611122565b969995985093965092949392505050565b600080600080600080608087890312156113c757600080fd5b6113d0876110a2565b95506020870135945060408701356001600160401b038111156113f257600080fd5b6113fe89828a01611122565b90955093505060608701356001600160401b0381111561141d57600080fd5b61142989828a01611122565b979a9699509497509295939492505050565b60006020828403121561144d57600080fd5b61123c826110a2565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b8082018082111561149a57634e487b7160e01b600052601160045260246000fd5b92915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8681526080602082015260006114e36080830187896114a0565b82810360408401526114f68186886114a0565b915050826060830152979650505050505050565b60018060a01b038816815286602082015260a06040820152600061153260a0830187896114a0565b82810360608401526115458186886114a0565b91505082608083015298975050505050505050565b6000825161156c8184602087016111d9565b9190910192915050565b8681526080602082015260006115906080830187896114a0565b82810360408401526115a38186886114a0565b905082810360608401526115b781856111fd565b9998505050505050505050565b8183823760009101908152919050565b6001600160e01b031984168152818360048301376000910160040190815292915050565b6000808585111561160857600080fd5b8386111561161557600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015611653576001600160e01b0319600485900360031b81901b82161691505b509291505056fea2646970667358221220738b9d07d0182672f921e80185e93fe1e1bac6d600cd400d50d156e76a837dca64736f6c634300081c0033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":100},"remappings":[]},"optimization_runs":100,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/full_match/1/0x064eEd122668fe5031068B7f42B82396A576997A/","decoded_constructor_args":[["0x173806021b18c4E60170e412DC88F991eB00D699",{"internalType":"address","name":"initialOwner","type":"address"}]],"compiler_version":"0.8.28+commit.7893614a","is_verified_via_verifier_alliance":false,"verified_at":"2026-10-20T23:41:56.627749Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561001057600080fd5b506040516117ae3803806117ae83398101604081905261002f916100df565b806001600160a01b03811661005e57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61006781610073565b5050600160025561010f565b600180546001600160a01b031916905561008c8161008f565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100f157600080fd5b81516001600160a01b038116811461010857600080fd5b9392505050565b6116908061011e6000396000f3fe60806040526004361061012a5760003560e01c8063715018a6116100ab5780639ba52b671161006f5780639ba52b6714610369578063b0f8b1421461037c578063c055bb5e1461038f578063c1a287e2146103c7578063e30c3978146103de578063f2fde38b146103fc57600080fd5b8063715018a6146102d857806379ba5097146102ed5780638b1ce603146103025780638da5cb5b1461032257806399c541381461034957600080fd5b806344652cc9116100f257806344652cc9146102205780634b9915a5146102585780634cdbfad6146102785780635f0b609f1461029857806369f34fb3146102b857600080fd5b8063107aa3901461012f578063228250c91461015157806326d79f16146101965780633ce7a8d3146101c35780634125ff9014610209575b600080fd5b34801561013b57600080fd5b5061014f61014a3660046110d6565b61041c565b005b34801561015d57600080fd5b5061018161016c366004611109565b60066020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101a257600080fd5b506101b66101b136600461116a565b61050a565b60405161018d9190611229565b3480156101cf57600080fd5b506101fb6101de3660046110d6565b600460209081526000928352604080842090915290825290205481565b60405190815260200161018d565b34801561021557600080fd5b506101fb62278d0081565b34801561022c57600080fd5b506101fb61023b3660046110d6565b600360209081526000928352604080842090915290825290205481565b34801561026457600080fd5b506101fb610273366004611243565b610523565b34801561028457600080fd5b5061014f610293366004611243565b61065d565b3480156102a457600080fd5b5061014f6102b33660046110d6565b6106f2565b3480156102c457600080fd5b5061014f6102d33660046112d9565b61081c565b3480156102e457600080fd5b5061014f6109ee565b3480156102f957600080fd5b5061014f610a0f565b34801561030e57600080fd5b506101fb61031d366004611243565b610a4a565b34801561032e57600080fd5b506000546001600160a01b03165b60405161018d9190611316565b34801561035557600080fd5b506101fb61036436600461132a565b610a8d565b6101b66103773660046113ae565b610ad7565b6101b661038a366004611243565b610c87565b34801561039b57600080fd5b506101fb6103aa3660046110d6565b600560209081526000928352604080842090915290825290205481565b3480156103d357600080fd5b506101fb6212750081565b3480156103ea57600080fd5b506001546001600160a01b031661033c565b34801561040857600080fd5b5061014f61041736600461143b565b610e74565b610424610ee5565b6001600160a01b03821660009081526005602090815260408083206001600160e01b031985168452909152812054900361047e5781816040516323c8216f60e21b8152600401610475929190611456565b60405180910390fd5b6001600160a01b03821660008181526004602090815260408083206001600160e01b031986168085529083528184208054908590558585526005845282852082865290935281842093909355519092907f9172b4138825330770784d04a8b0b15b770d7113ee46744d34cc18f7676aae66906104fd9085815260200190565b60405180910390a3505050565b606061051885858585610f14565b90505b949350505050565b600061052d610ee5565b6001600160a01b03881660009081526003602052604081208161055289898989610fa0565b6001600160e01b03191681526020810191909152604001600020546105779042611479565b9050808310156105a457604051638c2d242160e01b81526004810184905260248101829052604401610475565b6105b389898989898989610a4a565b60008181526006602052604090205490925060ff16156105e95760405163a3c4fc5760e01b815260048101839052602401610475565b60008281526006602052604090819020805460ff19166001179055516001600160a01b038a169083907f49d452dc398d4ca23f8d0dd42643c77bbefb70316922e67e42a4587d597c7bd990610649908c908c908c908c908c908c906114c9565b60405180910390a350979650505050505050565b610665610ee5565b600061067688888888888888610a4a565b60008181526006602052604090205490915060ff166106ab5760405163f80a117b60e01b815260048101829052602401610475565b600081815260066020526040808220805460ff191690555182917fcf0f63b97f3387253cbc0bde884f975df77e39184dc3280c2c81be495f58eef491a25050505050505050565b6106fa610ee5565b6001600160a01b03821660009081526005602090815260408083206001600160e01b0319851684529091528120549081900361074d5782826040516323c8216f60e21b8152600401610475929190611456565b804210156107775760405163ec4980f760e01b815260048101829052426024820152604401610475565b6001600160a01b03831660008181526003602090815260408083206001600160e01b0319871680855290835281842080548686526004855283862083875285528386208054928390558690558686526005855283862083875285528386209590955582518581529384018190529394909290917fc5804cf24a9f43c3e6e5c2d4ea3ad1b2a319965e6f1b2ecf257abc7bfd9a8e34910160405180910390a35050505050565b610824610ee5565b6001600160a01b03831661084b5760405163d92e233d60e01b815260040160405180910390fd5b62278d00811115610882576040516318b0f13b60e11b8152600481018290526000602482015262278d006044820152606401610475565b6001600160a01b03831660009081526005602090815260408083206001600160e01b0319861684529091529020541561092d576001600160a01b03831660008181526004602081815260408084206001600160e01b03198816808652908352818520548686526005845282862082875290935293819020549051637b5f264d60e11b815292830194909452602482019290925260448101919091526064810191909152608401610475565b6001600160a01b03831660009081526003602090815260408083206001600160e01b0319861684529091528120546109659042611479565b6001600160a01b03851660008181526004602090815260408083206001600160e01b0319891680855290835281842088905584845260058352818420818552835292819020859055805187815291820185905293945090927ff9dbeeb916b19bc175339008d81ea2ca8c0242322ec03269f4b023fdeb911b60910160405180910390a350505050565b6109f6610ee5565b604051638905116560e01b815260040160405180910390fd5b60015433906001600160a01b03168114610a3e578060405163118cdaa760e01b81526004016104759190611316565b610a4781611011565b50565b600087878787878787604051602001610a69979695949392919061150a565b6040516020818303038152906040528051906020012090505b979650505050505050565b6001600160a01b038516600090815260036020526040812081610ab287878787610fa0565b6001600160e01b03191681526020810191909152604001600020549695505050505050565b6060610ae1610ee5565b610ae961102a565b6000610af786868686610fa0565b6001600160a01b03891660009081526003602090815260408083206001600160e01b0319851684529091529020549091508015610b695760405163d8e1ed8d60e01b81526001600160a01b038a1660048201526001600160e01b03198316602482015260448101829052606401610475565b873414610b9257604051630626ade360e41b815234600482015260248101899052604401610475565b6000610ba088888888610f14565b905060008a6001600160a01b03168a83604051610bbd919061155a565b60006040518083038185875af1925050503d8060008114610bfa576040519150601f19603f3d011682016040523d82523d6000602084013e610bff565b606091505b509550905080610c2457846040516370de1b4b60e01b81526004016104759190611229565b8a6001600160a01b03167f22b25ade8a87ebf99c2560c4e7a51daa6db5a6175701dd906677a74459963b4e8b8b8b8b8b8b604051610c6796959493929190611576565b60405180910390a250505050610c7d6001600255565b9695505050505050565b6060610c91610ee5565b610c9961102a565b6000610caa89898989898989610a4a565b60008181526006602052604090205490915060ff16610cdf5760405163f80a117b60e01b815260048101829052602401610475565b82421015610d09576040516364d611b760e11b815260048101849052426024820152604401610475565b6000610d186212750085611479565b905080421115610d4b576040516368a21b3d60e11b81526004810185905260248101829052426044820152606401610475565b883414610d7457604051630626ade360e41b8152346004820152602481018a9052604401610475565b6000828152600660205260408120805460ff19169055610d9689898989610f14565b905060008b6001600160a01b03168b83604051610db3919061155a565b60006040518083038185875af1925050503d8060008114610df0576040519150601f19603f3d011682016040523d82523d6000602084013e610df5565b606091505b509550905080610e1a57846040516370de1b4b60e01b81526004016104759190611229565b8b6001600160a01b0316847ff8f34dc2df781c77b4cf78ff8df1df9fa976352e7bb7efad0378d719b1fb5dcb8d8d8d8d8d8c604051610e5e96959493929190611576565b60405180910390a350505050610a826001600255565b610e7c610ee5565b600180546001600160a01b0383166001600160a01b03199091168117909155610ead6000546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6000546001600160a01b03163314610f12573360405163118cdaa760e01b81526004016104759190611316565b565b60606000849003610f5e5782828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092935061051b92505050565b8484604051610f6e9291906115c4565b604051908190038120610f8791859085906020016115d4565b6040516020818303038152906040529050949350505050565b60008315610fc7578484604051610fb89291906115c4565b6040518091039020905061051b565b6000829003610fd85750600061051b565b6004821015610ffa5760405163068b856560e21b815260040160405180910390fd5b6110086004600084866115f8565b61051891611622565b600180546001600160a01b0319169055610a4781611052565b600280540361104c57604051633ee5aeb560e01b815260040160405180910390fd5b60028055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80356001600160a01b03811681146110b957600080fd5b919050565b80356001600160e01b0319811681146110b957600080fd5b600080604083850312156110e957600080fd5b6110f2836110a2565b9150611100602084016110be565b90509250929050565b60006020828403121561111b57600080fd5b5035919050565b60008083601f84011261113457600080fd5b5081356001600160401b0381111561114b57600080fd5b60208301915083602082850101111561116357600080fd5b9250929050565b6000806000806040858703121561118057600080fd5b84356001600160401b0381111561119657600080fd5b6111a287828801611122565b90955093505060208501356001600160401b038111156111c157600080fd5b6111cd87828801611122565b95989497509550505050565b60005b838110156111f45781810151838201526020016111dc565b50506000910152565b600081518084526112158160208601602086016111d9565b601f01601f19169290920160200192915050565b60208152600061123c60208301846111fd565b9392505050565b600080600080600080600060a0888a03121561125e57600080fd5b611267886110a2565b96506020880135955060408801356001600160401b0381111561128957600080fd5b6112958a828b01611122565b90965094505060608801356001600160401b038111156112b457600080fd5b6112c08a828b01611122565b989b979a50959894979596608090950135949350505050565b6000806000606084860312156112ee57600080fd5b6112f7846110a2565b9250611305602085016110be565b929592945050506040919091013590565b6001600160a01b0391909116815260200190565b60008060008060006060868803121561134257600080fd5b61134b866110a2565b945060208601356001600160401b0381111561136657600080fd5b61137288828901611122565b90955093505060408601356001600160401b0381111561139157600080fd5b61139d88828901611122565b969995985093965092949392505050565b600080600080600080608087890312156113c757600080fd5b6113d0876110a2565b95506020870135945060408701356001600160401b038111156113f257600080fd5b6113fe89828a01611122565b90955093505060608701356001600160401b0381111561141d57600080fd5b61142989828a01611122565b979a9699509497509295939492505050565b60006020828403121561144d57600080fd5b61123c826110a2565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b8082018082111561149a57634e487b7160e01b600052601160045260246000fd5b92915050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8681526080602082015260006114e36080830187896114a0565b82810360408401526114f68186886114a0565b915050826060830152979650505050505050565b60018060a01b038816815286602082015260a06040820152600061153260a0830187896114a0565b82810360608401526115458186886114a0565b91505082608083015298975050505050505050565b6000825161156c8184602087016111d9565b9190910192915050565b8681526080602082015260006115906080830187896114a0565b82810360408401526115a38186886114a0565b905082810360608401526115b781856111fd565b9998505050505050505050565b8183823760009101908152919050565b6001600160e01b031984168152818360048301376000910160040190815292915050565b6000808585111561160857600080fd5b8386111561161557600080fd5b5050820193919092039150565b80356001600160e01b03198116906004841015611653576001600160e01b0319600485900360031b81901b82161691505b509291505056fea2646970667358221220738b9d07d0182672f921e80185e93fe1e1bac6d600cd400d50d156e76a837dca64736f6c634300081c0033000000000000000000000000173806021b18c4e60170e412dc88f991eb00d699","name":"SelectiveTimelock","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"@openzeppelin/contracts/access/Ownable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/access/Ownable2Step.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.20;\n\nimport {Ownable} from \"./Ownable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * This extension of the {Ownable} contract includes a two-step mechanism to transfer\n * ownership, where the new owner must call {acceptOwnership} in order to replace the\n * old one. This can help prevent common mistakes, such as transfers of ownership to\n * incorrect accounts, or to contracts that are unable to interact with the\n * permission system.\n *\n * The initial owner is specified at deployment time in the constructor for `Ownable`. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2Step is Ownable {\n    address private _pendingOwner;\n\n    event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Returns the address of the pending owner.\n     */\n    function pendingOwner() public view virtual returns (address) {\n        return _pendingOwner;\n    }\n\n    /**\n     * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n     * Can only be called by the current owner.\n     *\n     * Setting `newOwner` to the zero address is allowed; this can be used to cancel an initiated ownership transfer.\n     */\n    function transferOwnership(address newOwner) public virtual override onlyOwner {\n        _pendingOwner = newOwner;\n        emit OwnershipTransferStarted(owner(), newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual override {\n        delete _pendingOwner;\n        super._transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev The new owner accepts the ownership transfer.\n     */\n    function acceptOwnership() public virtual {\n        address sender = _msgSender();\n        if (pendingOwner() != sender) {\n            revert OwnableUnauthorizedAccount(sender);\n        }\n        _transferOwnership(sender);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Context.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/ReentrancyGuard.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Contract module that helps prevent reentrant calls to a function.\n *\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\n * available, which can be applied to functions to make sure there are no nested\n * (reentrant) calls to them.\n *\n * Note that because there is a single `nonReentrant` guard, functions marked as\n * `nonReentrant` may not call one another. This can be worked around by making\n * those functions `private`, and then adding `external` `nonReentrant` entry\n * points to them.\n *\n * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,\n * consider using {ReentrancyGuardTransient} instead.\n *\n * TIP: If you would like to learn more about reentrancy and alternative ways\n * to protect against it, check out our blog post\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\n */\nabstract contract ReentrancyGuard {\n    // Booleans are more expensive than uint256 or any type that takes up a full\n    // word because each write operation emits an extra SLOAD to first read the\n    // slot's contents, replace the bits taken up by the boolean, and then write\n    // back. This is the compiler's defense against contract upgrades and\n    // pointer aliasing, and it cannot be disabled.\n\n    // The values being non-zero value makes deployment a bit more expensive,\n    // but in exchange the refund on every call to nonReentrant will be lower in\n    // amount. Since refunds are capped to a percentage of the total\n    // transaction's gas, it is best to keep them low in cases like this one, to\n    // increase the likelihood of the full refund coming into effect.\n    uint256 private constant NOT_ENTERED = 1;\n    uint256 private constant ENTERED = 2;\n\n    uint256 private _status;\n\n    /**\n     * @dev Unauthorized reentrant call.\n     */\n    error ReentrancyGuardReentrantCall();\n\n    constructor() {\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Prevents a contract from calling itself, directly or indirectly.\n     * Calling a `nonReentrant` function from another `nonReentrant`\n     * function is not supported. It is possible to prevent this from happening\n     * by making the `nonReentrant` function external, and making it call a\n     * `private` function that does the actual work.\n     */\n    modifier nonReentrant() {\n        _nonReentrantBefore();\n        _;\n        _nonReentrantAfter();\n    }\n\n    function _nonReentrantBefore() private {\n        // On the first call to nonReentrant, _status will be NOT_ENTERED\n        if (_status == ENTERED) {\n            revert ReentrancyGuardReentrantCall();\n        }\n\n        // Any calls to nonReentrant after this point will fail\n        _status = ENTERED;\n    }\n\n    function _nonReentrantAfter() private {\n        // By storing the original value once again, a refund is triggered (see\n        // https://eips.ethereum.org/EIPS/eip-2200)\n        _status = NOT_ENTERED;\n    }\n\n    /**\n     * @dev Returns true if the reentrancy guard is currently set to \"entered\", which indicates there is a\n     * `nonReentrant` function in the call stack.\n     */\n    function _reentrancyGuardEntered() internal view returns (bool) {\n        return _status == ENTERED;\n    }\n}\n"},{"file_path":"contracts/interfaces/ISelectiveTimelock.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.28;\n\n/// @title ISelectiveTimelock\n/// @notice Events and errors emitted by SelectiveTimelock. Same shapes as\n///         IGenericTimelock for the queue / execute / cancel pipeline, with the\n///         delay administration keyed by (target, selector) and one extra\n///         path: the owner's direct `call` for zero-delay pairs.\ninterface ISelectiveTimelock {\n    // ============ Events ============\n\n    /// @notice Emitted when a (target, selector) delay change is applied by\n    ///         executeDelayChange.\n    event DelayUpdated(\n        address indexed target,\n        bytes4 indexed selector,\n        uint256 previousDelay,\n        uint256 newDelay\n    );\n\n    /// @notice Emitted when a (target, selector) delay change is scheduled.\n    /// @param eta Earliest timestamp at which executeDelayChange can succeed\n    ///        (block.timestamp + current delay of that pair).\n    event DelayChangeScheduled(\n        address indexed target,\n        bytes4 indexed selector,\n        uint256 newDelay,\n        uint256 eta\n    );\n\n    /// @notice Emitted when a pending (target, selector) delay change is cancelled.\n    event DelayChangeCancelled(\n        address indexed target,\n        bytes4 indexed selector,\n        uint256 pendingDelay\n    );\n\n    /// @notice Emitted when a call is queued for delayed execution.\n    event OperationQueued(\n        bytes32 indexed opHash,\n        address indexed target,\n        uint256 value,\n        string signature,\n        bytes data,\n        uint256 eta\n    );\n\n    /// @notice Emitted after a queued operation is successfully executed.\n    event OperationExecuted(\n        bytes32 indexed opHash,\n        address indexed target,\n        uint256 value,\n        string signature,\n        bytes data,\n        bytes returnData\n    );\n\n    /// @notice Emitted when a queued operation is cancelled (before or after expiry).\n    event OperationCancelled(bytes32 indexed opHash);\n\n    /// @notice Emitted when the owner executes a zero-delay call directly.\n    event DirectCall(\n        address indexed target,\n        uint256 value,\n        string signature,\n        bytes data,\n        bytes returnData\n    );\n\n    // ============ Errors ============\n\n    /// @notice Given delay is outside [0, MAX_DELAY].\n    error DelayOutOfBounds(uint256 given, uint256 min, uint256 max);\n\n    /// @notice queue: `eta` must be at least `block.timestamp + delay[target][selector]`.\n    error EtaTooSoon(uint256 eta, uint256 minEta);\n\n    /// @notice Cannot queue: the identical operation is already queued.\n    error OperationAlreadyQueued(bytes32 opHash);\n\n    /// @notice Cannot execute/cancel: no such operation is currently queued.\n    error OperationNotQueued(bytes32 opHash);\n\n    /// @notice execute: current time has not yet reached `eta`.\n    error OperationNotReady(uint256 eta, uint256 nowTs);\n\n    /// @notice execute: current time is past `eta + GRACE_PERIOD`.\n    error OperationExpired(uint256 eta, uint256 gracePeriodEnd, uint256 nowTs);\n\n    /// @notice execute / call: `msg.value` did not match the value given for this op.\n    error ValueMismatch(uint256 given, uint256 expected);\n\n    /// @notice executeDelayChange / cancelDelayChange: no pending delay change for this pair.\n    error NoPendingDelayChange(address target, bytes4 selector);\n\n    /// @notice scheduleDelayChange: a delay change is already pending for this pair.\n    error DelayChangeAlreadyPending(\n        address target,\n        bytes4 selector,\n        uint256 pendingDelay,\n        uint256 pendingEta\n    );\n\n    /// @notice executeDelayChange: current time has not yet reached the pending\n    ///         delay change's eta.\n    error DelayChangeNotReady(uint256 eta, uint256 nowTs);\n\n    /// @notice execute / call: the forwarded target call reverted.\n    error CallReverted(bytes returnData);\n\n    /// @notice call: this (target, selector) carries a delay; use queue.\n    error SelectorIsDelayed(address target, bytes4 selector, uint256 delay);\n\n    /// @notice Raw calldata shorter than a selector (1 to 3 bytes).\n    error BadCalldata();\n\n    /// @notice Zero address given where a target is required.\n    error ZeroAddress();\n\n    /// @notice renounceOwnership is disabled on the timelock.\n    error RenounceDisabled();\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BadCalldata","type":"error"},{"inputs":[{"internalType":"bytes","name":"returnData","type":"bytes"}],"name":"CallReverted","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"uint256","name":"pendingDelay","type":"uint256"},{"internalType":"uint256","name":"pendingEta","type":"uint256"}],"name":"DelayChangeAlreadyPending","type":"error"},{"inputs":[{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"DelayChangeNotReady","type":"error"},{"inputs":[{"internalType":"uint256","name":"given","type":"uint256"},{"internalType":"uint256","name":"min","type":"uint256"},{"internalType":"uint256","name":"max","type":"uint256"}],"name":"DelayOutOfBounds","type":"error"},{"inputs":[{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"minEta","type":"uint256"}],"name":"EtaTooSoon","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"NoPendingDelayChange","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opHash","type":"bytes32"}],"name":"OperationAlreadyQueued","type":"error"},{"inputs":[{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"gracePeriodEnd","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"OperationExpired","type":"error"},{"inputs":[{"internalType":"bytes32","name":"opHash","type":"bytes32"}],"name":"OperationNotQueued","type":"error"},{"inputs":[{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"nowTs","type":"uint256"}],"name":"OperationNotReady","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[],"name":"RenounceDisabled","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"uint256","name":"delay","type":"uint256"}],"name":"SelectorIsDelayed","type":"error"},{"inputs":[{"internalType":"uint256","name":"given","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"ValueMismatch","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"bytes4","name":"selector","type":"bytes4"},{"indexed":false,"internalType":"uint256","name":"pendingDelay","type":"uint256"}],"name":"DelayChangeCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"bytes4","name":"selector","type":"bytes4"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"DelayChangeScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"bytes4","name":"selector","type":"bytes4"},{"indexed":false,"internalType":"uint256","name":"previousDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"DelayUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"returnData","type":"bytes"}],"name":"DirectCall","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opHash","type":"bytes32"}],"name":"OperationCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"returnData","type":"bytes"}],"name":"OperationExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"opHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"OperationQueued","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"},{"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"buildCalldata","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","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"}],"name":"call","outputs":[{"internalType":"bytes","name":"returnData","type":"bytes"}],"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":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"cancelDelayChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"delayFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"execute","outputs":[{"internalType":"bytes","name":"returnData","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"}],"name":"executeDelayChange","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":"hashOperation","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"pendingDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"pendingDelayEta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","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":"queue","outputs":[{"internalType":"bytes32","name":"opHash","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queued","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes4","name":"selector","type":"bytes4"},{"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"scheduleDelayChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x000000000000000000000000173806021b18c4e60170e412dc88f991eb00d699"}