{"file_path":"src/Executor.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: AGPL-3.0\npragma solidity ^0.8.22;\n\nimport { AccessControl } from \"openzeppelin-contracts/contracts/access/AccessControl.sol\";\nimport { Address }       from \"openzeppelin-contracts/contracts/utils/Address.sol\";\n\nimport { IExecutor } from './interfaces/IExecutor.sol';\n\n/**\n * @title  Executor\n * @author Aave\n * @notice Executor which queues up message calls and executes them after an optional delay\n */\ncontract Executor is IExecutor, AccessControl {\n\n    using Address for address;\n\n    /******************************************************************************************************************/\n    /*** State variables and constructor                                                                            ***/\n    /******************************************************************************************************************/\n\n    bytes32 public constant SUBMISSION_ROLE = keccak256('SUBMISSION_ROLE');\n    bytes32 public constant GUARDIAN_ROLE   = keccak256('GUARDIAN_ROLE');\n\n    uint256 public constant MINIMUM_GRACE_PERIOD = 10 minutes;\n\n    // Map of registered actions sets (id => ActionsSet)\n    mapping(uint256 => ActionsSet) private _actionsSets;\n\n    uint256 public override actionsSetCount;  // Number of actions sets\n    uint256 public override delay;            // Time between queuing and execution\n    uint256 public override gracePeriod;      // Time after delay during which an actions set can be executed\n\n    /**\n    *  @dev   Constructor\n    *  @param delay_       The delay before which an actions set can be executed.\n    *  @param gracePeriod_ The time period after a delay during which an actions set can be executed.\n    */\n    constructor(\n        uint256 delay_,\n        uint256 gracePeriod_\n    ) {\n        _updateDelay(delay_);\n        _updateGracePeriod(gracePeriod_);\n\n        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);\n        _grantRole(DEFAULT_ADMIN_ROLE, address(this));  // Necessary for self-referential calls to change configuration\n    }\n\n    /******************************************************************************************************************/\n    /*** ActionSet functions                                                                                        ***/\n    /******************************************************************************************************************/\n\n    /// @inheritdoc IExecutor\n    function queue(\n        address[] memory targets,\n        uint256[] memory values,\n        string[] memory signatures,\n        bytes[] memory calldatas,\n        bool[] memory withDelegatecalls\n    ) external override onlyRole(SUBMISSION_ROLE) {\n        if (targets.length == 0) revert EmptyTargets();\n\n        uint256 targetsLength = targets.length;\n        if (\n            targetsLength != values.length     ||\n            targetsLength != signatures.length ||\n            targetsLength != calldatas.length  ||\n            targetsLength != withDelegatecalls.length\n        ) revert InconsistentParamsLength();\n\n        uint256 actionsSetId  = actionsSetCount;\n        uint256 executionTime = block.timestamp + delay;\n\n        unchecked { ++actionsSetCount; }\n\n        ActionsSet storage actionsSet = _actionsSets[actionsSetId];\n\n        actionsSet.targets           = targets;\n        actionsSet.values            = values;\n        actionsSet.signatures        = signatures;\n        actionsSet.calldatas         = calldatas;\n        actionsSet.withDelegatecalls = withDelegatecalls;\n        actionsSet.executionTime     = executionTime;\n\n        emit ActionsSetQueued(\n            actionsSetId,\n            targets,\n            values,\n            signatures,\n            calldatas,\n            withDelegatecalls,\n            executionTime\n        );\n    }\n\n    /// @inheritdoc IExecutor\n    function execute(uint256 actionsSetId) external payable override {\n        if (getCurrentState(actionsSetId) != ActionsSetState.Queued) revert OnlyQueuedActions();\n\n        ActionsSet storage actionsSet = _actionsSets[actionsSetId];\n\n        if (block.timestamp < actionsSet.executionTime) revert TimelockNotFinished();\n\n        actionsSet.executed = true;\n\n        uint256 actionCount = actionsSet.targets.length;\n\n        bytes[] memory returnedData = new bytes[](actionCount);\n        for (uint256 i = 0; i < actionCount; ++i) {\n            returnedData[i] = _executeTransaction(\n                actionsSet.targets[i],\n                actionsSet.values[i],\n                actionsSet.signatures[i],\n                actionsSet.calldatas[i],\n                actionsSet.withDelegatecalls[i]\n            );\n        }\n\n        emit ActionsSetExecuted(actionsSetId, msg.sender, returnedData);\n    }\n\n    /// @inheritdoc IExecutor\n    function cancel(uint256 actionsSetId) external override onlyRole(GUARDIAN_ROLE) {\n        if (getCurrentState(actionsSetId) != ActionsSetState.Queued) revert OnlyQueuedActions();\n\n        ActionsSet storage actionsSet = _actionsSets[actionsSetId];\n        actionsSet.canceled = true;\n\n        emit ActionsSetCanceled(actionsSetId);\n    }\n\n    /******************************************************************************************************************/\n    /*** Admin functions                                                                                            ***/\n    /******************************************************************************************************************/\n\n    /// @inheritdoc IExecutor\n    function updateDelay(uint256 newDelay) external override onlyRole(DEFAULT_ADMIN_ROLE) {\n        _updateDelay(newDelay);\n    }\n\n    /// @inheritdoc IExecutor\n    function updateGracePeriod(uint256 newGracePeriod)\n        external override onlyRole(DEFAULT_ADMIN_ROLE)\n    {\n        _updateGracePeriod(newGracePeriod);\n    }\n\n    /******************************************************************************************************************/\n    /*** External misc functions                                                                                    ***/\n    /******************************************************************************************************************/\n\n    /// @inheritdoc IExecutor\n    function executeDelegateCall(address target, bytes calldata data)\n        external\n        payable\n        override\n        onlyRole(DEFAULT_ADMIN_ROLE)\n        returns (bytes memory)\n    {\n        return target.functionDelegateCall(data);\n    }\n\n    /// @inheritdoc IExecutor\n    function receiveFunds() external payable override {}\n\n    /******************************************************************************************************************/\n    /*** External view functions                                                                                    ***/\n    /******************************************************************************************************************/\n\n    /// @inheritdoc IExecutor\n    function getActionsSetById(uint256 actionsSetId)\n        external\n        view\n        override\n        returns (ActionsSet memory)\n    {\n        return _actionsSets[actionsSetId];\n    }\n\n    /// @inheritdoc IExecutor\n    function getCurrentState(uint256 actionsSetId) public view override returns (ActionsSetState) {\n        if (actionsSetCount <= actionsSetId) revert InvalidActionsSetId();\n\n        ActionsSet storage actionsSet = _actionsSets[actionsSetId];\n\n        if      (actionsSet.canceled) return ActionsSetState.Canceled;\n        else if (actionsSet.executed) return ActionsSetState.Executed;\n        else if (block.timestamp > actionsSet.executionTime + gracePeriod) return ActionsSetState.Expired;\n        else return ActionsSetState.Queued;\n    }\n\n    /******************************************************************************************************************/\n    /*** Internal ActionSet helper functions                                                                        ***/\n    /******************************************************************************************************************/\n\n    function _executeTransaction(\n        address target,\n        uint256 value,\n        string memory signature,\n        bytes memory data,\n        bool withDelegatecall\n    ) internal returns (bytes memory) {\n        if (address(this).balance < value) revert InsufficientBalance();\n\n        bytes memory callData = bytes(signature).length == 0\n            ? data\n            : abi.encodePacked(bytes4(keccak256(bytes(signature))), data);\n\n        if (withDelegatecall) return this.executeDelegateCall{value: value}(target, callData);\n\n        return target.functionCallWithValue(callData, value);\n    }\n\n    /******************************************************************************************************************/\n    /*** Internal admin helper functions                                                                            ***/\n    /******************************************************************************************************************/\n\n    function _updateDelay(uint256 newDelay) internal {\n        emit DelayUpdate(delay, newDelay);\n        delay = newDelay;\n    }\n\n    function _updateGracePeriod(uint256 newGracePeriod) internal {\n        if (newGracePeriod < MINIMUM_GRACE_PERIOD) revert GracePeriodTooShort();\n        emit GracePeriodUpdate(gracePeriod, newGracePeriod);\n        gracePeriod = newGracePeriod;\n    }\n\n}\n","deployed_bytecode":"0x6080604052600436106101345760003560e01c806364d62353116100ab578063b3c82e921161006f578063b3c82e921461035a578063b68df16d14610387578063d547741f146103a7578063d8406c82146103c7578063d9a4cbdf146103dd578063fe0d94c1146103fd57600080fd5b806364d62353146102d95780636a42b8f8146102f957806391d148541461030f578063a06db7dc1461032f578063a217fddf1461034557600080fd5b806336568abe116100fd57806336568abe1461020257806340e58ee5146102225780635748c130146102425780635ab98d5a1461026f5780635c024b1f1461028f5780635f402a37146102c357600080fd5b80625c33e11461013957806301ffc9a71461013b578063248a9ca31461017057806324ea54f4146101ae5780632f2ff15d146101e2575b600080fd5b005b34801561014757600080fd5b5061015b6101563660046115cb565b610410565b60405190151581526020015b60405180910390f35b34801561017c57600080fd5b506101a061018b3660046115f5565b60009081526020819052604090206001015490565b604051908152602001610167565b3480156101ba57600080fd5b506101a07f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b3480156101ee57600080fd5b506101396101fd36600461162a565b610447565b34801561020e57600080fd5b5061013961021d36600461162a565b610472565b34801561022e57600080fd5b5061013961023d3660046115f5565b6104aa565b34801561024e57600080fd5b5061026261025d3660046115f5565b61055d565b604051610167919061166c565b34801561027b57600080fd5b5061013961028a3660046115f5565b6105f1565b34801561029b57600080fd5b506101a07f85af328ca8dd848a128ca6b89dd0d76e6255ddd3da76b6fde4e67309c27f780a81565b3480156102cf57600080fd5b506101a061025881565b3480156102e557600080fd5b506101396102f43660046115f5565b610609565b34801561030557600080fd5b506101a060035481565b34801561031b57600080fd5b5061015b61032a36600461162a565b61061d565b34801561033b57600080fd5b506101a060045481565b34801561035157600080fd5b506101a0600081565b34801561036657600080fd5b5061037a6103753660046115f5565b610646565b60405161016791906117e7565b61039a6103953660046118b3565b6109b9565b6040516101679190611936565b3480156103b357600080fd5b506101396103c236600461162a565b610a19565b3480156103d357600080fd5b506101a060025481565b3480156103e957600080fd5b506101396103f8366004611bed565b610a3e565b61013961040b3660046115f5565b610bc5565b60006001600160e01b03198216637965db0b60e01b148061044157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461046281610ee8565b61046c8383610ef5565b50505050565b6001600160a01b038116331461049b5760405163334bd91960e11b815260040160405180910390fd5b6104a58282610f87565b505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416104d481610ee8565b60006104df8361055d565b60038111156104f0576104f0611656565b1461050e5760405163050ac78b60e11b815260040160405180910390fd5b60008281526001602052604080822060068101805461ff0019166101001790559051909184917f0743c673685efcbf3db8591d9e1d98336bc844fe4f4599e6f7efb6d71c0256349190a2505050565b600081600254116105815760405163e5bc0e7b60e01b815260040160405180910390fd5b60008281526001602052604090206006810154610100900460ff16156105aa5750600292915050565b600681015460ff16156105c05750600192915050565b60045481600501546105d29190611cbf565b4211156105e25750600392915050565b50600092915050565b50919050565b60006105fc81610ee8565b61060582610ff2565b5050565b600061061481610ee8565b61060582611056565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6106926040518061010001604052806060815260200160608152602001606081526020016060815260200160608152602001600081526020016000151581526020016000151581525090565b6000828152600160209081526040918290208251815461012093810282018401909452610100810184815290939192849284918401828280156106fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106e0575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561075657602002820191906000526020600020905b815481526020019060010190808311610742575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156108305783829060005260206000200180546107a390611ce0565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf90611ce0565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b505050505081526020019060010190610784565b50505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561090957838290600052602060002001805461087c90611ce0565b80601f01602080910402602001604051908101604052809291908181526020018280546108a890611ce0565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b50505050508152602001906001019061085d565b5050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561098057602002820191906000526020600020906000905b825461010083900a900460ff16151581526020600192830181810494850194909303909202910180841161094f5790505b50505091835250506005820154602082015260069091015460ff8082161515604084015261010090910416151560609091015292915050565b606060006109c681610ee8565b610a1084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03891692915050611097565b95945050505050565b600082815260208190526040902060010154610a3481610ee8565b61046c8383610f87565b7f85af328ca8dd848a128ca6b89dd0d76e6255ddd3da76b6fde4e67309c27f780a610a6881610ee8565b8551600003610a8a57604051636a8e3e9360e11b815260040160405180910390fd5b8551855181141580610a9d575084518114155b80610aa9575083518114155b80610ab5575082518114155b15610ad357604051630d10f63b60e01b815260040160405180910390fd5b600254600354600090610ae69042611cbf565b60028054600190810190915560008481526020918252604090208b5192935091610b15918391908d0190611362565b508851610b2b90600183019060208c01906113c7565b508751610b4190600283019060208b0190611402565b508651610b5790600383019060208a0190611454565b508551610b6d90600483019060208901906114a6565b50818160050181905550827f0325966a4aa089b42f4766ec96f599405102bb309e065f24874aff59082dbc8b8b8b8b8b8b88604051610bb196959493929190611d14565b60405180910390a250505050505050505050565b6000610bd08261055d565b6003811115610be157610be1611656565b14610bff5760405163050ac78b60e11b815260040160405180910390fd5b60008181526001602052604090206005810154421015610c3257604051635192dd5560e01b815260040160405180910390fd5b60068101805460ff19166001179055805460008167ffffffffffffffff811115610c5e57610c5e611949565b604051908082528060200260200182016040528015610c9157816020015b6060815260200190600190039081610c7c5790505b50905060005b82811015610e9f57610e7a846000018281548110610cb757610cb7611dbc565b6000918252602090912001546001860180546001600160a01b039092169184908110610ce557610ce5611dbc565b9060005260206000200154866002018481548110610d0557610d05611dbc565b906000526020600020018054610d1a90611ce0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4690611ce0565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b5050505050876003018581548110610dad57610dad611dbc565b906000526020600020018054610dc290611ce0565b80601f0160208091040260200160405190810160405280929190818152602001828054610dee90611ce0565b8015610e3b5780601f10610e1057610100808354040283529160200191610e3b565b820191906000526020600020905b815481529060010190602001808311610e1e57829003601f168201915b5050505050886004018681548110610e5557610e55611dbc565b90600052602060002090602091828204019190069054906101000a900460ff16611104565b828281518110610e8c57610e8c611dbc565b6020908102919091010152600101610c97565b50336001600160a01b0316847ff5efc4bb09a12b6c9561a7e7ab02938a72a4351316b473d574fdaaa89c43eb9a83604051610eda9190611dd2565b60405180910390a350505050565b610ef281336111ff565b50565b6000610f01838361061d565b610f7f576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610f373390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610441565b506000610441565b6000610f93838361061d565b15610f7f576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610441565b610258811015611015576040516301f6f9e560e71b815260040160405180910390fd5b60045460408051918252602082018390527f9953f3a71052edcd4ae7a0f97302839d1dda32ab93c1039207c91c866b094f72910160405180910390a1600455565b60035460408051918252602082018390527f43de56b886294fc29767e51a88b5c67fd24aefebc5ddf813b1d9b91b1df38444910160405180910390a1600355565b6060600080846001600160a01b0316846040516110b49190611de5565b600060405180830381855af49150503d80600081146110ef576040519150601f19603f3d011682016040523d82523d6000602084013e6110f4565b606091505b5091509150610a1085838361123d565b60608447101561112757604051631e9acf1760e31b815260040160405180910390fd5b600084516000146111605784805190602001208460405160200161114c929190611e01565b604051602081830303815290604052611162565b835b905082156111e05760405163b68df16d60e01b8152309063b68df16d908890611191908b908690600401611e32565b60006040518083038185885af11580156111af573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526111d89190810190611e5e565b915050610a10565b6111f46001600160a01b038816828861129c565b979650505050505050565b611209828261061d565b6106055760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b6060826112525761124d82611339565b611295565b815115801561126957506001600160a01b0384163b155b1561129257604051639996b31560e01b81526001600160a01b0385166004820152602401611234565b50805b9392505050565b6060814710156112c15760405163cd78605960e01b8152306004820152602401611234565b600080856001600160a01b031684866040516112dd9190611de5565b60006040518083038185875af1925050503d806000811461131a576040519150601f19603f3d011682016040523d82523d6000602084013e61131f565b606091505b509150915061132f86838361123d565b9695505050505050565b8051156113495780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b8280548282559060005260206000209081019282156113b7579160200282015b828111156113b757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611382565b506113c3929150611542565b5090565b8280548282559060005260206000209081019282156113b7579160200282015b828111156113b75782518255916020019190600101906113e7565b828054828255906000526020600020908101928215611448579160200282015b8281111561144857825182906114389082611f1c565b5091602001919060010190611422565b506113c3929150611557565b82805482825590600052602060002090810192821561149a579160200282015b8281111561149a578251829061148a9082611f1c565b5091602001919060010190611474565b506113c3929150611574565b82805482825590600052602060002090601f016020900481019282156113b75791602002820160005b8382111561150c57835183826101000a81548160ff02191690831515021790555092602001926001016020816000010492830192600103026114cf565b80156115395782816101000a81549060ff021916905560010160208160000104928301926001030261150c565b50506113c39291505b5b808211156113c35760008155600101611543565b808211156113c357600061156b8282611591565b50600101611557565b808211156113c35760006115888282611591565b50600101611574565b50805461159d90611ce0565b6000825580601f106115ad575050565b601f016020900490600052602060002090810190610ef29190611542565b6000602082840312156115dd57600080fd5b81356001600160e01b03198116811461129557600080fd5b60006020828403121561160757600080fd5b5035919050565b80356001600160a01b038116811461162557600080fd5b919050565b6000806040838503121561163d57600080fd5b8235915061164d6020840161160e565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061168e57634e487b7160e01b600052602160045260246000fd5b91905290565b60008151808452602080850194506020840160005b838110156116ce5781516001600160a01b0316875295820195908201906001016116a9565b509495945050505050565b60008151808452602080850194506020840160005b838110156116ce578151875295820195908201906001016116ee565b60005b8381101561172557818101518382015260200161170d565b50506000910152565b6000815180845261174681602086016020860161170a565b601f01601f19169290920160200192915050565b60008282518085526020808601955060208260051b8401016020860160005b848110156117a757601f1986840301895261179583835161172e565b98840198925090830190600101611779565b5090979650505050505050565b60008151808452602080850194506020840160005b838110156116ce5781511515875295820195908201906001016117c9565b6020815260008251610100806020850152611806610120850183611694565b91506020850151601f198086850301604087015261182484836116d9565b93506040870151915080868503016060870152611841848361175a565b9350606087015191508086850301608087015261185e848361175a565b935060808701519150808685030160a08701525061187c83826117b4565b92505060a085015160c085015260c085015161189c60e086018215159052565b5060e0850151801515858301525090949350505050565b6000806000604084860312156118c857600080fd5b6118d18461160e565b9250602084013567ffffffffffffffff808211156118ee57600080fd5b818601915086601f83011261190257600080fd5b81358181111561191157600080fd5b87602082850101111561192357600080fd5b6020830194508093505050509250925092565b602081526000611295602083018461172e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561198857611988611949565b604052919050565b600067ffffffffffffffff8211156119aa576119aa611949565b5060051b60200190565b600082601f8301126119c557600080fd5b813560206119da6119d583611990565b61195f565b8083825260208201915060208460051b8701019350868411156119fc57600080fd5b602086015b84811015611a1f57611a128161160e565b8352918301918301611a01565b509695505050505050565b600082601f830112611a3b57600080fd5b81356020611a4b6119d583611990565b8083825260208201915060208460051b870101935086841115611a6d57600080fd5b602086015b84811015611a1f5780358352918301918301611a72565b600067ffffffffffffffff821115611aa357611aa3611949565b50601f01601f191660200190565b6000611abf6119d584611a89565b9050828152838383011115611ad357600080fd5b828260208301376000602084830101529392505050565b600082601f830112611afb57600080fd5b81356020611b0b6119d583611990565b82815260059290921b84018101918181019086841115611b2a57600080fd5b8286015b84811015611a1f57803567ffffffffffffffff811115611b4e5760008081fd5b8701603f81018913611b605760008081fd5b611b71898683013560408401611ab1565b845250918301918301611b2e565b600082601f830112611b9057600080fd5b81356020611ba06119d583611990565b8083825260208201915060208460051b870101935086841115611bc257600080fd5b602086015b84811015611a1f5780358015158114611be05760008081fd5b8352918301918301611bc7565b600080600080600060a08688031215611c0557600080fd5b853567ffffffffffffffff80821115611c1d57600080fd5b611c2989838a016119b4565b96506020880135915080821115611c3f57600080fd5b611c4b89838a01611a2a565b95506040880135915080821115611c6157600080fd5b611c6d89838a01611aea565b94506060880135915080821115611c8357600080fd5b611c8f89838a01611aea565b93506080880135915080821115611ca557600080fd5b50611cb288828901611b7f565b9150509295509295909350565b8082018082111561044157634e487b7160e01b600052601160045260246000fd5b600181811c90821680611cf457607f821691505b6020821081036105eb57634e487b7160e01b600052602260045260246000fd5b60c0808252875190820181905260009060209060e0840190828b01845b82811015611d565781516001600160a01b031684529284019290840190600101611d31565b5050508381036020850152611d6b818a6116d9565b9150508281036040840152611d80818861175a565b90508281036060840152611d94818761175a565b90508281036080840152611da881866117b4565b9150508260a0830152979650505050505050565b634e487b7160e01b600052603260045260246000fd5b602081526000611295602083018461175a565b60008251611df781846020870161170a565b9190910192915050565b6001600160e01b0319831681528151600090611e2481600485016020870161170a565b919091016004019392505050565b6001600160a01b0383168152604060208201819052600090611e569083018461172e565b949350505050565b600060208284031215611e7057600080fd5b815167ffffffffffffffff811115611e8757600080fd5b8201601f81018413611e9857600080fd5b8051611ea66119d582611a89565b818152856020838501011115611ebb57600080fd5b610a1082602083016020860161170a565b601f8211156104a5576000816000526020600020601f850160051c81016020861015611ef55750805b601f850160051c820191505b81811015611f1457828155600101611f01565b505050505050565b815167ffffffffffffffff811115611f3657611f36611949565b611f4a81611f448454611ce0565b84611ecc565b602080601f831160018114611f7f5760008415611f675750858301515b600019600386901b1c1916600185901b178555611f14565b600085815260208120601f198616915b82811015611fae57888601518255948401946001909101908401611f8f565b5085821015611fcc5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220b1753d860d4c7ade84e0c9eaa1f7e9e3584bd6992ec405289446941887a2179264736f6c63430008190033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":ds-test/=lib/spark-address-registry/lib/forge-std/lib/ds-test/src/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":spark-address-registry/=lib/spark-address-registry/src/",":xchain-helpers/=lib/xchain-helpers/src/"]},"optimization_runs":200,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/full_match/8453/0xF93B7122450A50AF3e5A76E1d546e95Ac1d0F579/","decoded_constructor_args":[["100",{"internalType":"uint256","name":"delay_","type":"uint256"}],["1000",{"internalType":"uint256","name":"gracePeriod_","type":"uint256"}]],"compiler_version":"0.8.25+commit.b61c2a91","is_verified_via_verifier_alliance":false,"verified_at":"2025-12-15T21:13:22.282341Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561001057600080fd5b506040516121f63803806121f683398101604081905261002f916101b1565b61003882610060565b610041816100a1565b61004c600033610105565b50610058600030610105565b5050506101d5565b60035460408051918252602082018390527f43de56b886294fc29767e51a88b5c67fd24aefebc5ddf813b1d9b91b1df38444910160405180910390a1600355565b6102588110156100c4576040516301f6f9e560e71b815260040160405180910390fd5b60045460408051918252602082018390527f9953f3a71052edcd4ae7a0f97302839d1dda32ab93c1039207c91c866b094f72910160405180910390a1600455565b6000828152602081815260408083206001600160a01b038516845290915281205460ff166101a7576000838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561015f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016101ab565b5060005b92915050565b600080604083850312156101c457600080fd5b505080516020909101519092909150565b612012806101e46000396000f3fe6080604052600436106101345760003560e01c806364d62353116100ab578063b3c82e921161006f578063b3c82e921461035a578063b68df16d14610387578063d547741f146103a7578063d8406c82146103c7578063d9a4cbdf146103dd578063fe0d94c1146103fd57600080fd5b806364d62353146102d95780636a42b8f8146102f957806391d148541461030f578063a06db7dc1461032f578063a217fddf1461034557600080fd5b806336568abe116100fd57806336568abe1461020257806340e58ee5146102225780635748c130146102425780635ab98d5a1461026f5780635c024b1f1461028f5780635f402a37146102c357600080fd5b80625c33e11461013957806301ffc9a71461013b578063248a9ca31461017057806324ea54f4146101ae5780632f2ff15d146101e2575b600080fd5b005b34801561014757600080fd5b5061015b6101563660046115cb565b610410565b60405190151581526020015b60405180910390f35b34801561017c57600080fd5b506101a061018b3660046115f5565b60009081526020819052604090206001015490565b604051908152602001610167565b3480156101ba57600080fd5b506101a07f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a504181565b3480156101ee57600080fd5b506101396101fd36600461162a565b610447565b34801561020e57600080fd5b5061013961021d36600461162a565b610472565b34801561022e57600080fd5b5061013961023d3660046115f5565b6104aa565b34801561024e57600080fd5b5061026261025d3660046115f5565b61055d565b604051610167919061166c565b34801561027b57600080fd5b5061013961028a3660046115f5565b6105f1565b34801561029b57600080fd5b506101a07f85af328ca8dd848a128ca6b89dd0d76e6255ddd3da76b6fde4e67309c27f780a81565b3480156102cf57600080fd5b506101a061025881565b3480156102e557600080fd5b506101396102f43660046115f5565b610609565b34801561030557600080fd5b506101a060035481565b34801561031b57600080fd5b5061015b61032a36600461162a565b61061d565b34801561033b57600080fd5b506101a060045481565b34801561035157600080fd5b506101a0600081565b34801561036657600080fd5b5061037a6103753660046115f5565b610646565b60405161016791906117e7565b61039a6103953660046118b3565b6109b9565b6040516101679190611936565b3480156103b357600080fd5b506101396103c236600461162a565b610a19565b3480156103d357600080fd5b506101a060025481565b3480156103e957600080fd5b506101396103f8366004611bed565b610a3e565b61013961040b3660046115f5565b610bc5565b60006001600160e01b03198216637965db0b60e01b148061044157506301ffc9a760e01b6001600160e01b03198316145b92915050565b60008281526020819052604090206001015461046281610ee8565b61046c8383610ef5565b50505050565b6001600160a01b038116331461049b5760405163334bd91960e11b815260040160405180910390fd5b6104a58282610f87565b505050565b7f55435dd261a4b9b3364963f7738a7a662ad9c84396d64be3365284bb7f0a50416104d481610ee8565b60006104df8361055d565b60038111156104f0576104f0611656565b1461050e5760405163050ac78b60e11b815260040160405180910390fd5b60008281526001602052604080822060068101805461ff0019166101001790559051909184917f0743c673685efcbf3db8591d9e1d98336bc844fe4f4599e6f7efb6d71c0256349190a2505050565b600081600254116105815760405163e5bc0e7b60e01b815260040160405180910390fd5b60008281526001602052604090206006810154610100900460ff16156105aa5750600292915050565b600681015460ff16156105c05750600192915050565b60045481600501546105d29190611cbf565b4211156105e25750600392915050565b50600092915050565b50919050565b60006105fc81610ee8565b61060582610ff2565b5050565b600061061481610ee8565b61060582611056565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b6106926040518061010001604052806060815260200160608152602001606081526020016060815260200160608152602001600081526020016000151581526020016000151581525090565b6000828152600160209081526040918290208251815461012093810282018401909452610100810184815290939192849284918401828280156106fe57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106e0575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561075657602002820191906000526020600020905b815481526020019060010190808311610742575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020016000905b828210156108305783829060005260206000200180546107a390611ce0565b80601f01602080910402602001604051908101604052809291908181526020018280546107cf90611ce0565b801561081c5780601f106107f15761010080835404028352916020019161081c565b820191906000526020600020905b8154815290600101906020018083116107ff57829003601f168201915b505050505081526020019060010190610784565b50505050815260200160038201805480602002602001604051908101604052809291908181526020016000905b8282101561090957838290600052602060002001805461087c90611ce0565b80601f01602080910402602001604051908101604052809291908181526020018280546108a890611ce0565b80156108f55780601f106108ca576101008083540402835291602001916108f5565b820191906000526020600020905b8154815290600101906020018083116108d857829003601f168201915b50505050508152602001906001019061085d565b5050505081526020016004820180548060200260200160405190810160405280929190818152602001828054801561098057602002820191906000526020600020906000905b825461010083900a900460ff16151581526020600192830181810494850194909303909202910180841161094f5790505b50505091835250506005820154602082015260069091015460ff8082161515604084015261010090910416151560609091015292915050565b606060006109c681610ee8565b610a1084848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250506001600160a01b03891692915050611097565b95945050505050565b600082815260208190526040902060010154610a3481610ee8565b61046c8383610f87565b7f85af328ca8dd848a128ca6b89dd0d76e6255ddd3da76b6fde4e67309c27f780a610a6881610ee8565b8551600003610a8a57604051636a8e3e9360e11b815260040160405180910390fd5b8551855181141580610a9d575084518114155b80610aa9575083518114155b80610ab5575082518114155b15610ad357604051630d10f63b60e01b815260040160405180910390fd5b600254600354600090610ae69042611cbf565b60028054600190810190915560008481526020918252604090208b5192935091610b15918391908d0190611362565b508851610b2b90600183019060208c01906113c7565b508751610b4190600283019060208b0190611402565b508651610b5790600383019060208a0190611454565b508551610b6d90600483019060208901906114a6565b50818160050181905550827f0325966a4aa089b42f4766ec96f599405102bb309e065f24874aff59082dbc8b8b8b8b8b8b88604051610bb196959493929190611d14565b60405180910390a250505050505050505050565b6000610bd08261055d565b6003811115610be157610be1611656565b14610bff5760405163050ac78b60e11b815260040160405180910390fd5b60008181526001602052604090206005810154421015610c3257604051635192dd5560e01b815260040160405180910390fd5b60068101805460ff19166001179055805460008167ffffffffffffffff811115610c5e57610c5e611949565b604051908082528060200260200182016040528015610c9157816020015b6060815260200190600190039081610c7c5790505b50905060005b82811015610e9f57610e7a846000018281548110610cb757610cb7611dbc565b6000918252602090912001546001860180546001600160a01b039092169184908110610ce557610ce5611dbc565b9060005260206000200154866002018481548110610d0557610d05611dbc565b906000526020600020018054610d1a90611ce0565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4690611ce0565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b5050505050876003018581548110610dad57610dad611dbc565b906000526020600020018054610dc290611ce0565b80601f0160208091040260200160405190810160405280929190818152602001828054610dee90611ce0565b8015610e3b5780601f10610e1057610100808354040283529160200191610e3b565b820191906000526020600020905b815481529060010190602001808311610e1e57829003601f168201915b5050505050886004018681548110610e5557610e55611dbc565b90600052602060002090602091828204019190069054906101000a900460ff16611104565b828281518110610e8c57610e8c611dbc565b6020908102919091010152600101610c97565b50336001600160a01b0316847ff5efc4bb09a12b6c9561a7e7ab02938a72a4351316b473d574fdaaa89c43eb9a83604051610eda9190611dd2565b60405180910390a350505050565b610ef281336111ff565b50565b6000610f01838361061d565b610f7f576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610f373390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610441565b506000610441565b6000610f93838361061d565b15610f7f576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610441565b610258811015611015576040516301f6f9e560e71b815260040160405180910390fd5b60045460408051918252602082018390527f9953f3a71052edcd4ae7a0f97302839d1dda32ab93c1039207c91c866b094f72910160405180910390a1600455565b60035460408051918252602082018390527f43de56b886294fc29767e51a88b5c67fd24aefebc5ddf813b1d9b91b1df38444910160405180910390a1600355565b6060600080846001600160a01b0316846040516110b49190611de5565b600060405180830381855af49150503d80600081146110ef576040519150601f19603f3d011682016040523d82523d6000602084013e6110f4565b606091505b5091509150610a1085838361123d565b60608447101561112757604051631e9acf1760e31b815260040160405180910390fd5b600084516000146111605784805190602001208460405160200161114c929190611e01565b604051602081830303815290604052611162565b835b905082156111e05760405163b68df16d60e01b8152309063b68df16d908890611191908b908690600401611e32565b60006040518083038185885af11580156111af573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526111d89190810190611e5e565b915050610a10565b6111f46001600160a01b038816828861129c565b979650505050505050565b611209828261061d565b6106055760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044015b60405180910390fd5b6060826112525761124d82611339565b611295565b815115801561126957506001600160a01b0384163b155b1561129257604051639996b31560e01b81526001600160a01b0385166004820152602401611234565b50805b9392505050565b6060814710156112c15760405163cd78605960e01b8152306004820152602401611234565b600080856001600160a01b031684866040516112dd9190611de5565b60006040518083038185875af1925050503d806000811461131a576040519150601f19603f3d011682016040523d82523d6000602084013e61131f565b606091505b509150915061132f86838361123d565b9695505050505050565b8051156113495780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b8280548282559060005260206000209081019282156113b7579160200282015b828111156113b757825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190611382565b506113c3929150611542565b5090565b8280548282559060005260206000209081019282156113b7579160200282015b828111156113b75782518255916020019190600101906113e7565b828054828255906000526020600020908101928215611448579160200282015b8281111561144857825182906114389082611f1c565b5091602001919060010190611422565b506113c3929150611557565b82805482825590600052602060002090810192821561149a579160200282015b8281111561149a578251829061148a9082611f1c565b5091602001919060010190611474565b506113c3929150611574565b82805482825590600052602060002090601f016020900481019282156113b75791602002820160005b8382111561150c57835183826101000a81548160ff02191690831515021790555092602001926001016020816000010492830192600103026114cf565b80156115395782816101000a81549060ff021916905560010160208160000104928301926001030261150c565b50506113c39291505b5b808211156113c35760008155600101611543565b808211156113c357600061156b8282611591565b50600101611557565b808211156113c35760006115888282611591565b50600101611574565b50805461159d90611ce0565b6000825580601f106115ad575050565b601f016020900490600052602060002090810190610ef29190611542565b6000602082840312156115dd57600080fd5b81356001600160e01b03198116811461129557600080fd5b60006020828403121561160757600080fd5b5035919050565b80356001600160a01b038116811461162557600080fd5b919050565b6000806040838503121561163d57600080fd5b8235915061164d6020840161160e565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061168e57634e487b7160e01b600052602160045260246000fd5b91905290565b60008151808452602080850194506020840160005b838110156116ce5781516001600160a01b0316875295820195908201906001016116a9565b509495945050505050565b60008151808452602080850194506020840160005b838110156116ce578151875295820195908201906001016116ee565b60005b8381101561172557818101518382015260200161170d565b50506000910152565b6000815180845261174681602086016020860161170a565b601f01601f19169290920160200192915050565b60008282518085526020808601955060208260051b8401016020860160005b848110156117a757601f1986840301895261179583835161172e565b98840198925090830190600101611779565b5090979650505050505050565b60008151808452602080850194506020840160005b838110156116ce5781511515875295820195908201906001016117c9565b6020815260008251610100806020850152611806610120850183611694565b91506020850151601f198086850301604087015261182484836116d9565b93506040870151915080868503016060870152611841848361175a565b9350606087015191508086850301608087015261185e848361175a565b935060808701519150808685030160a08701525061187c83826117b4565b92505060a085015160c085015260c085015161189c60e086018215159052565b5060e0850151801515858301525090949350505050565b6000806000604084860312156118c857600080fd5b6118d18461160e565b9250602084013567ffffffffffffffff808211156118ee57600080fd5b818601915086601f83011261190257600080fd5b81358181111561191157600080fd5b87602082850101111561192357600080fd5b6020830194508093505050509250925092565b602081526000611295602083018461172e565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561198857611988611949565b604052919050565b600067ffffffffffffffff8211156119aa576119aa611949565b5060051b60200190565b600082601f8301126119c557600080fd5b813560206119da6119d583611990565b61195f565b8083825260208201915060208460051b8701019350868411156119fc57600080fd5b602086015b84811015611a1f57611a128161160e565b8352918301918301611a01565b509695505050505050565b600082601f830112611a3b57600080fd5b81356020611a4b6119d583611990565b8083825260208201915060208460051b870101935086841115611a6d57600080fd5b602086015b84811015611a1f5780358352918301918301611a72565b600067ffffffffffffffff821115611aa357611aa3611949565b50601f01601f191660200190565b6000611abf6119d584611a89565b9050828152838383011115611ad357600080fd5b828260208301376000602084830101529392505050565b600082601f830112611afb57600080fd5b81356020611b0b6119d583611990565b82815260059290921b84018101918181019086841115611b2a57600080fd5b8286015b84811015611a1f57803567ffffffffffffffff811115611b4e5760008081fd5b8701603f81018913611b605760008081fd5b611b71898683013560408401611ab1565b845250918301918301611b2e565b600082601f830112611b9057600080fd5b81356020611ba06119d583611990565b8083825260208201915060208460051b870101935086841115611bc257600080fd5b602086015b84811015611a1f5780358015158114611be05760008081fd5b8352918301918301611bc7565b600080600080600060a08688031215611c0557600080fd5b853567ffffffffffffffff80821115611c1d57600080fd5b611c2989838a016119b4565b96506020880135915080821115611c3f57600080fd5b611c4b89838a01611a2a565b95506040880135915080821115611c6157600080fd5b611c6d89838a01611aea565b94506060880135915080821115611c8357600080fd5b611c8f89838a01611aea565b93506080880135915080821115611ca557600080fd5b50611cb288828901611b7f565b9150509295509295909350565b8082018082111561044157634e487b7160e01b600052601160045260246000fd5b600181811c90821680611cf457607f821691505b6020821081036105eb57634e487b7160e01b600052602260045260246000fd5b60c0808252875190820181905260009060209060e0840190828b01845b82811015611d565781516001600160a01b031684529284019290840190600101611d31565b5050508381036020850152611d6b818a6116d9565b9150508281036040840152611d80818861175a565b90508281036060840152611d94818761175a565b90508281036080840152611da881866117b4565b9150508260a0830152979650505050505050565b634e487b7160e01b600052603260045260246000fd5b602081526000611295602083018461175a565b60008251611df781846020870161170a565b9190910192915050565b6001600160e01b0319831681528151600090611e2481600485016020870161170a565b919091016004019392505050565b6001600160a01b0383168152604060208201819052600090611e569083018461172e565b949350505050565b600060208284031215611e7057600080fd5b815167ffffffffffffffff811115611e8757600080fd5b8201601f81018413611e9857600080fd5b8051611ea66119d582611a89565b818152856020838501011115611ebb57600080fd5b610a1082602083016020860161170a565b601f8211156104a5576000816000526020600020601f850160051c81016020861015611ef55750805b601f850160051c820191505b81811015611f1457828155600101611f01565b505050505050565b815167ffffffffffffffff811115611f3657611f36611949565b611f4a81611f448454611ce0565b84611ecc565b602080601f831160018114611f7f5760008415611f675750858301515b600019600386901b1c1916600185901b178555611f14565b600085815260208120601f198616915b82811015611fae57888601518255948401946001909101908401611f8f565b5085821015611fcc5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220b1753d860d4c7ade84e0c9eaa1f7e9e3584bd6992ec405289446941887a2179264736f6c63430008190033000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000003e8","name":"Executor","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":"lib/openzeppelin-contracts/contracts/access/AccessControl.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.20;\n\nimport {IAccessControl} from \"./IAccessControl.sol\";\nimport {Context} from \"../utils/Context.sol\";\nimport {ERC165} from \"../utils/introspection/ERC165.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\n    struct RoleData {\n        mapping(address account => bool) hasRole;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 role => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with an {AccessControlUnauthorizedAccount} error including the required role.\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual returns (bool) {\n        return _roles[role].hasRole[account];\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`\n     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`\n     * is missing `role`.\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert AccessControlUnauthorizedAccount(account, role);\n        }\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) public virtual {\n        if (callerConfirmation != _msgSender()) {\n            revert AccessControlBadConfirmation();\n        }\n\n        _revokeRole(role, callerConfirmation);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     *\n     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (!hasRole(role, account)) {\n            _roles[role].hasRole[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {\n        if (hasRole(role, account)) {\n            _roles[role].hasRole[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n            return true;\n        } else {\n            return false;\n        }\n    }\n}\n"},{"file_path":"lib/openzeppelin-contracts/contracts/access/IAccessControl.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControl {\n    /**\n     * @dev The `account` is missing a role.\n     */\n    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);\n\n    /**\n     * @dev The caller of a function is not the expected one.\n     *\n     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.\n     */\n    error AccessControlBadConfirmation();\n\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted signaling this.\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call, an admin role\n     * bearer except when using {AccessControl-_setupRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `callerConfirmation`.\n     */\n    function renounceRole(bytes32 role, address callerConfirmation) external;\n}\n"},{"file_path":"lib/openzeppelin-contracts/contracts/utils/Address.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n    /**\n     * @dev The ETH balance of the account is not enough to perform the operation.\n     */\n    error AddressInsufficientBalance(address account);\n\n    /**\n     * @dev There's no code at `target` (it is not a contract).\n     */\n    error AddressEmptyCode(address target);\n\n    /**\n     * @dev A call to an address target failed. The target may have reverted.\n     */\n    error FailedInnerCall();\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        if (address(this).balance < amount) {\n            revert AddressInsufficientBalance(address(this));\n        }\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        if (!success) {\n            revert FailedInnerCall();\n        }\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason or custom error, it is bubbled\n     * up by this function (like regular Solidity function calls). However, if\n     * the call reverted with no returned reason, this function reverts with a\n     * {FailedInnerCall} error.\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        if (address(this).balance < value) {\n            revert AddressInsufficientBalance(address(this));\n        }\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target\n     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an\n     * unsuccessful call.\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata\n    ) internal view returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            // only check if target is a contract if the call was successful and the return data is empty\n            // otherwise we already know that it was a contract\n            if (returndata.length == 0 && target.code.length == 0) {\n                revert AddressEmptyCode(target);\n            }\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the\n     * revert reason or with a default {FailedInnerCall} error.\n     */\n    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {\n        if (!success) {\n            _revert(returndata);\n        } else {\n            return returndata;\n        }\n    }\n\n    /**\n     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.\n     */\n    function _revert(bytes memory returndata) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert FailedInnerCall();\n        }\n    }\n}\n"},{"file_path":"lib/openzeppelin-contracts/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":"lib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC165} from \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n */\nabstract contract ERC165 is IERC165 {\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return interfaceId == type(IERC165).interfaceId;\n    }\n}\n"},{"file_path":"lib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},{"file_path":"src/interfaces/IExecutor.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0\npragma solidity >=0.8.0;\n\nimport { IAccessControl } from 'openzeppelin-contracts/contracts/access/IAccessControl.sol';\n\n/**\n * @title  IExecutor\n * @author Aave\n * @notice Defines the interface for the Executor\n */\ninterface IExecutor is IAccessControl {\n\n    /******************************************************************************************************************/\n    /*** Errors                                                                                                     ***/\n    /******************************************************************************************************************/\n\n    error GracePeriodTooShort();\n    error OnlyQueuedActions();\n    error TimelockNotFinished();\n    error InvalidActionsSetId();\n    error EmptyTargets();\n    error InconsistentParamsLength();\n    error InsufficientBalance();\n\n    /******************************************************************************************************************/\n    /*** Enums                                                                                                      ***/\n    /******************************************************************************************************************/\n\n    /**\n     * @notice This enum contains all possible actions set states\n     */\n    enum ActionsSetState {\n        Queued,\n        Executed,\n        Canceled,\n        Expired\n    }\n\n    /******************************************************************************************************************/\n    /*** Events                                                                                                     ***/\n    /******************************************************************************************************************/\n\n    /**\n     * @notice This struct contains the data needed to execute a specified set of actions.\n     * @param  targets           Array of targets to call.\n     * @param  values            Array of values to pass in each call.\n     * @param  signatures        Array of function signatures to encode in each call by the actions which can be empty strings.\n     * @param  calldatas         Array of calldatas to pass in each call, appended to the signature at the same array index if not empty.\n     * @param  withDelegateCalls Array of whether to delegatecall for each call.\n     * @param  executionTime     Timestamp starting from which the actions set can be executed.\n     * @param  executed          True if the actions set has been executed, false otherwise.\n     * @param  canceled          True if the actions set has been canceled, false otherwise.\n     */\n    struct ActionsSet {\n        address[] targets;\n        uint256[] values;\n        string[] signatures;\n        bytes[] calldatas;\n        bool[] withDelegatecalls;\n        uint256 executionTime;\n        bool executed;\n        bool canceled;\n    }\n\n    /**\n     * @dev   Emitted when an ActionsSet is queued.\n     * @param id                Id of the ActionsSet.\n     * @param targets           Array of targets to be called by the actions set.\n     * @param values            Array of values to pass in each call by the actions set.\n     * @param signatures        Array of function signatures to encode in each call by the actions set.\n     * @param calldatas         Array of calldata to pass in each call by the actions set.\n     * @param withDelegatecalls Array of whether to delegatecall for each call of the actions set.\n     * @param executionTime     The timestamp at which this actions set can be executed.\n     **/\n    event ActionsSetQueued(\n        uint256 indexed id,\n        address[] targets,\n        uint256[] values,\n        string[] signatures,\n        bytes[] calldatas,\n        bool[] withDelegatecalls,\n        uint256 executionTime\n    );\n\n    /**\n     * @dev   Emitted when an ActionsSet is successfully executed.\n     * @param id                 Id of the ActionsSet.\n     * @param initiatorExecution The address that triggered the ActionsSet execution.\n     * @param returnedData       The returned data from the ActionsSet execution.\n     **/\n    event ActionsSetExecuted(\n        uint256 indexed id,\n        address indexed initiatorExecution,\n        bytes[] returnedData\n    );\n\n    /**\n     * @dev   Emitted when an ActionsSet is cancelled by the guardian.\n     * @param id Id of the ActionsSet.\n     **/\n    event ActionsSetCanceled(uint256 indexed id);\n\n    /**\n     * @dev   Emitted when the delay (between queueing and execution) is updated.\n     * @param oldDelay The value of the old delay.\n     * @param newDelay The value of the new delay.\n     **/\n    event DelayUpdate(uint256 oldDelay, uint256 newDelay);\n\n    /**\n     * @dev   Emitted when the grace period (between executionTime and expiration) is updated.\n     * @param oldGracePeriod The value of the old grace period.\n     * @param newGracePeriod The value of the new grace period.\n     **/\n    event GracePeriodUpdate(uint256 oldGracePeriod, uint256 newGracePeriod);\n\n    /******************************************************************************************************************/\n    /*** State variables                                                                                            ***/\n    /******************************************************************************************************************/\n\n    /**\n     * @notice The role that allows submission of a queued action.\n     **/\n    function SUBMISSION_ROLE() external view returns (bytes32);\n\n    /**\n     * @notice The role that allows a guardian to cancel a pending action.\n     **/\n    function GUARDIAN_ROLE() external view returns (bytes32);\n\n    /**\n     * @notice Returns the minimum grace period that can be set, 10 minutes.\n     */\n    function MINIMUM_GRACE_PERIOD() external view returns (uint256);\n\n     /**\n     * @notice Returns the total number of actions sets of the executor.\n     * @return The number of actions sets.\n     **/\n    function actionsSetCount() external view returns (uint256);\n\n    /**\n     * @notice Returns the delay (between queuing and execution)\n     * @return The value of the delay (in seconds)\n     **/\n    function delay() external view returns (uint256);\n\n    /**\n     * @notice Time after the execution time during which the actions set can be executed.\n     * @return The value of the grace period (in seconds)\n     **/\n    function gracePeriod() external view returns (uint256);\n\n    /******************************************************************************************************************/\n    /*** ActionSet functions                                                                                        ***/\n    /******************************************************************************************************************/\n\n    /**\n     * @notice Queue an ActionsSet.\n     * @dev    If a signature is empty, calldata is used for the execution, calldata is appended to signature otherwise.\n     * @param  targets           Array of targets to be called by the actions set.\n     * @param  values            Array of values to pass in each call by the actions set.\n     * @param  signatures        Array of function signatures to encode in each call by the actions which can be empty strings.\n     * @param  calldatas         Array of calldata to pass in each call by the actions set.\n     * @param  withDelegatecalls Array of whether to delegatecall for each call of the actions set.\n     **/\n    function queue(\n        address[] memory targets,\n        uint256[] memory values,\n        string[] memory signatures,\n        bytes[] memory calldatas,\n        bool[] memory withDelegatecalls\n    ) external;\n\n    /**\n     * @notice Execute the ActionsSet\n     * @param  actionsSetId The id of the ActionsSet to execute\n     **/\n    function execute(uint256 actionsSetId) external payable;\n\n    /**\n     * @notice Cancel the ActionsSet.\n     * @param  actionsSetId The id of the ActionsSet to cancel.\n     **/\n    function cancel(uint256 actionsSetId) external;\n\n    /******************************************************************************************************************/\n    /*** Admin functions                                                                                            ***/\n    /******************************************************************************************************************/\n\n    /**\n     * @notice Update the delay, time between queueing and execution of ActionsSet.\n     * @dev    It does not affect to actions set that are already queued.\n     * @param  delay The value of the delay (in seconds).\n     **/\n    function updateDelay(uint256 delay) external;\n\n    /**\n     * @notice Update the grace period, the period after the execution time during which an actions set can be executed\n     * @param  gracePeriod The value of the grace period (in seconds).\n     **/\n    function updateGracePeriod(uint256 gracePeriod) external;\n\n    /******************************************************************************************************************/\n    /*** Misc functions                                                                                             ***/\n    /******************************************************************************************************************/\n\n    /**\n     * @notice Allows to delegatecall a given target with an specific amount of value.\n     * @dev    This function is external so it allows to specify a defined msg.value for the delegate call, reducing\n     *         the risk that a delegatecall gets executed with more value than intended.\n     * @return The bytes returned by the delegate call.\n     **/\n    function executeDelegateCall(address target, bytes calldata data)\n        external\n        payable\n        returns (bytes memory);\n\n    /**\n     * @notice Allows to receive funds into the executor.\n     * @dev    Useful for actionsSet that needs funds to gets executed.\n     */\n    function receiveFunds() external payable;\n\n    /******************************************************************************************************************/\n    /*** View functions                                                                                             ***/\n    /******************************************************************************************************************/\n\n\n    /**\n     * @notice Returns the data of an actions set.\n     * @param  actionsSetId The id of the ActionsSet.\n     * @return The data of the ActionsSet.\n     **/\n     function getActionsSetById(uint256 actionsSetId) external view returns (ActionsSet memory);\n\n     /**\n      * @notice Returns the current state of an actions set.\n      * @param  actionsSetId The id of the ActionsSet.\n      * @return The current state of theI ActionsSet.\n      **/\n     function getCurrentState(uint256 actionsSetId) external view returns (ActionsSetState);\n\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"uint256","name":"delay_","type":"uint256"},{"internalType":"uint256","name":"gracePeriod_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EmptyTargets","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"GracePeriodTooShort","type":"error"},{"inputs":[],"name":"InconsistentParamsLength","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidActionsSetId","type":"error"},{"inputs":[],"name":"OnlyQueuedActions","type":"error"},{"inputs":[],"name":"TimelockNotFinished","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ActionsSetCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"initiatorExecution","type":"address"},{"indexed":false,"internalType":"bytes[]","name":"returnedData","type":"bytes[]"}],"name":"ActionsSetExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"targets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"},{"indexed":false,"internalType":"string[]","name":"signatures","type":"string[]"},{"indexed":false,"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"indexed":false,"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"indexed":false,"internalType":"uint256","name":"executionTime","type":"uint256"}],"name":"ActionsSetQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldDelay","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"DelayUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldGracePeriod","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newGracePeriod","type":"uint256"}],"name":"GracePeriodUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GUARDIAN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUBMISSION_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"actionsSetCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"actionsSetId","type":"uint256"}],"name":"cancel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"actionsSetId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeDelegateCall","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"actionsSetId","type":"uint256"}],"name":"getActionsSetById","outputs":[{"components":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"},{"internalType":"uint256","name":"executionTime","type":"uint256"},{"internalType":"bool","name":"executed","type":"bool"},{"internalType":"bool","name":"canceled","type":"bool"}],"internalType":"struct IExecutor.ActionsSet","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"actionsSetId","type":"uint256"}],"name":"getCurrentState","outputs":[{"internalType":"enum IExecutor.ActionsSetState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"bool[]","name":"withDelegatecalls","type":"bool[]"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveFunds","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"updateDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newGracePeriod","type":"uint256"}],"name":"updateGracePeriod","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":"0x000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000003e8"}