{"file_path":"GovernorTimelock.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: BUSL-1.1\r\npragma solidity ^0.8.25 ^0.8.7;\r\n\r\n// modules/globals/modules/erc20-helper/src/interfaces/IERC20Like.sol\r\n\r\n/// @title Interface of the ERC20 standard as needed by ERC20Helper.\r\ninterface IERC20Like {\r\n\r\n    function approve(address spender_, uint256 amount_) external returns (bool success_);\r\n\r\n    function transfer(address recipient_, uint256 amount_) external returns (bool success_);\r\n\r\n    function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_);\r\n\r\n}\r\n\r\n// modules/globals/contracts/interfaces/IGovernorTimelock.sol\r\n\r\ninterface IGovernorTimelock {\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Structs                                                                                                                        ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    struct Proposal {\r\n        bytes32 proposalHash;\r\n        bool    isUnschedulable;\r\n        uint32  scheduledAt;\r\n        uint32  delayedUntil;\r\n        uint32  validUntil;\r\n    }\r\n\r\n    struct TimelockParameters {\r\n        uint32 delay;\r\n        uint32 executionWindow;\r\n    }\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Events                                                                                                                         ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    /**\r\n     * @notice Emitted when the default timelock parameters are set\r\n     * @param  delay           The new default delay\r\n     * @param  executionWindow The new default execution window\r\n     */\r\n    event DefaultTimelockSet(uint32 delay, uint32 executionWindow);\r\n\r\n    /**\r\n     * @notice Emitted when tokens are withdrawn from the governor timelock contract\r\n     * @param  token    The address of the token withdrawn\r\n     * @param  receiver The address of the receiver of the tokens\r\n     * @param  amount   The amount of tokens withdrawn\r\n     */\r\n    event ERC20TokenWithdrawn(address indexed token, address indexed receiver, uint256 amount);\r\n\r\n    /**\r\n     * @notice Emitted when the function timelock parameters are set\r\n     * @param  target           The target of the function\r\n     * @param  functionSelector The function selector\r\n     * @param  delay            The new delay\r\n     * @param  executionWindow  The new execution window\r\n     */\r\n    event FunctionTimelockSet(address indexed target, bytes4  indexed functionSelector, uint32 delay, uint32 executionWindow);\r\n\r\n    /**\r\n     * @notice Emitted when the pending token withdrawer is set\r\n     * @param  newPendingTokenWithdrawer The address of the new pending token withdrawer\r\n     */\r\n    event PendingTokenWithdrawerSet(address indexed newPendingTokenWithdrawer);\r\n\r\n    /**\r\n     * @notice Emitted when a proposal is executed\r\n     * @param  proposalId The id of the proposal\r\n     */\r\n    event ProposalExecuted(uint256 indexed proposalId);\r\n\r\n    /**\r\n     * @notice Emitted when a proposal is scheduled\r\n     * @param  proposalId The id of the proposal\r\n     * @param  proposal   The proposal\r\n     */\r\n    event ProposalScheduled(uint256 indexed proposalId, Proposal proposal);\r\n\r\n    /**\r\n     * @notice Emitted when a proposal is unscheduled\r\n     * @param  proposalId The id of the proposal\r\n     */\r\n    event ProposalUnscheduled(uint256 indexed proposalId);\r\n\r\n    /**\r\n     * @notice Emitted when a role is updated\r\n     * @param  role      The role updated\r\n     * @param  account   The account updated the role for\r\n     * @param  grantRole Whether the role is granted or revoked\r\n     */\r\n    event RoleUpdated(bytes32 indexed role, address indexed account, bool grantRole);\r\n\r\n    /**\r\n     * @notice Emitted when the token withdrawer is accepted\r\n     * @param  tokenWithdrawer The address of the new token withdrawer\r\n     */\r\n    event TokenWithdrawerAccepted(address indexed tokenWithdrawer);\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Role constants                                                                                                                 ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    /**\r\n     * @notice Returns the bytes32 representation of the canceler role\r\n     * @dev    Address that has the canceler role can unschedule proposals but can not unschedule role updates\r\n     * @return cancelerRole The canceler role\r\n     */\r\n    function CANCELLER_ROLE() external view returns (bytes32 cancelerRole);\r\n\r\n    /**\r\n     * @notice Returns the bytes32 representation of the executor role\r\n     * @dev    Address that has the executor role can execute all proposals including role updates\r\n     * @return executorRole The executor role\r\n     */\r\n    function EXECUTOR_ROLE() external view returns (bytes32 executorRole);\r\n\r\n    /**\r\n     * @notice Returns the bytes32 representation of the proposer role\r\n     * @dev    Address that has the proposer role can schedule proposals but can not schedule role updates\r\n     * @return proposerRole The proposer role\r\n     */\r\n    function PROPOSER_ROLE() external view returns (bytes32 proposerRole);\r\n\r\n    /**\r\n     * @notice Returns the bytes32 representation of the role admin role\r\n     * @dev    Address that has the role admin role can update roles including the role admin role itself\r\n     * @return roleAdmin The role admin role\r\n     */\r\n    function ROLE_ADMIN() external view returns (bytes32 roleAdmin);\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Timelock constants                                                                                                             ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    /**\r\n     * @notice Returns the minimum delay for a proposal\r\n     * @return minDelay The minimum delay for a proposal\r\n     */\r\n    function MIN_DELAY() external view returns (uint32 minDelay);\r\n\r\n    /**\r\n     * @notice Returns the minimum execution window for a proposal\r\n     * @return minExecutionWindow The minimum execution window for a proposal\r\n     */\r\n    function MIN_EXECUTION_WINDOW() external view returns (uint32 minExecutionWindow);\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** View Functions                                                                                                                 ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    /**\r\n     * @notice Returns the default timelock parameters\r\n     * @return delay           The delay\r\n     * @return executionWindow The execution window\r\n     */\r\n    function defaultTimelockParameters() external view returns (uint32 delay, uint32 executionWindow);\r\n\r\n    /**\r\n     * @notice Returns the timelock parameters for a given target and function selector\r\n     * @param  target           The target of the function\r\n     * @param  functionSelector The function selector\r\n     * @return delay            The delay\r\n     * @return executionWindow  The execution window\r\n     */\r\n    function functionTimelockParameters(\r\n        address target,\r\n        bytes4 functionSelector\r\n    ) external view returns (uint32 delay, uint32 executionWindow);\r\n\r\n    /**\r\n     * @notice Checks if an account has a role\r\n     * @param  account      The account to check\r\n     * @param  role         The role to check\r\n     * @return doesHaveRole Whether the account has the role\r\n     */\r\n    function hasRole(address account, bytes32 role) external view returns (bool doesHaveRole);\r\n\r\n    /**\r\n     * @notice Checks if a proposal is executable\r\n     * @param  proposalId   The id of the proposal\r\n     * @return isExecutable Whether the proposal is executable\r\n     */\r\n    function isExecutable(uint256 proposalId) external view returns (bool isExecutable);\r\n\r\n    /**\r\n     * @notice Returns the latest proposal id\r\n     * @return latestProposalId The latest proposal id\r\n     */\r\n    function latestProposalId() external view returns (uint256 latestProposalId);\r\n\r\n    /**\r\n     * @notice Returns the pending token withdrawer\r\n     * @return pendingTokenWithdrawer The address of the pending token withdrawer\r\n     */\r\n    function pendingTokenWithdrawer() external view returns (address pendingTokenWithdrawer);\r\n\r\n    /**\r\n     * @notice Returns the proposal for a given proposal id\r\n     * @param  proposalId The id of the proposal\r\n     * @return proposalHash    The hash of the proposal\r\n     * @return isUnschedulable Whether the proposal is unschedulable\r\n     * @return scheduledAt     The timestamp when the proposal was scheduled\r\n     * @return delayedUntil    The timestamp when the proposal was delayed\r\n     * @return validUntil      The timestamp when the proposal was valid\r\n     */\r\n    function proposals(uint256 proposalId) external view returns (\r\n        bytes32 proposalHash,\r\n        bool    isUnschedulable,\r\n        uint32  scheduledAt,\r\n        uint32  delayedUntil,\r\n        uint32  validUntil\r\n    );\r\n\r\n    /**\r\n     * @notice Returns the token withdrawer\r\n     * @return tokenWithdrawer The address of the token withdrawer\r\n     */\r\n    function tokenWithdrawer() external view returns (address tokenWithdrawer);\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Token Withdrawer Functions                                                                                                     ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    /**\r\n     * @notice Accepts the token withdrawer role and sets pending token withdrawer to zero address\r\n     * @dev    Only the pending token withdrawer can accept the token withdrawer role\r\n     */\r\n    function acceptTokenWithdrawer() external;\r\n\r\n    /**\r\n     * @notice Sets the pending token withdrawer\r\n     * @dev    Only the token withdrawer can set the pending token withdrawer\r\n     * @param  newPendingTokenWithdrawer The address of the new pending token withdrawer\r\n     */\r\n    function setPendingTokenWithdrawer(address newPendingTokenWithdrawer) external;\r\n\r\n    /**\r\n     * @notice Withdraws tokens from the governor timelock contract\r\n     * @dev    Only the token withdrawer can withdraw tokens and tokens are sent to the token withdrawer\r\n     * @param  token  The address of the token to withdraw\r\n     * @param  amount The amount of tokens to withdraw\r\n     */\r\n    function withdrawERC20Token(address token, uint256 amount) external;\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Timelock Configuration                                                                                                         ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    /**\r\n     * @notice Sets the default timelock parameters\r\n     * @param  delay           The new default delay\r\n     * @param  executionWindow The new default execution window\r\n     */\r\n    function setDefaultTimelockParameters(uint32 delay, uint32 executionWindow) external;\r\n\r\n    /**\r\n     * @notice Sets the function timelock parameters\r\n     * @param  target           The target of the function\r\n     * @param  functionSelector The function selector\r\n     * @param  delay            The new delay\r\n     * @param  executionWindow  The new execution window\r\n     */\r\n    function setFunctionTimelockParameters(address target, bytes4 functionSelector, uint32 delay, uint32 executionWindow) external;\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Role Management                                                                                                                ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    /**\r\n     * @notice Updates a role\r\n     * @dev    The role updating needs to be done through the timelock contract\r\n     * @param  role      The role to update\r\n     * @param  account   The account to update the role for\r\n     * @param  grantRole Whether the role is granted or revoked\r\n     */\r\n    function updateRole(bytes32 role, address account, bool grantRole) external;\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Proposal Management                                                                                                            ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    /**\r\n     * @notice Executes proposals\r\n     * @dev    The proposalIds, targets and data arrays must have the same length\r\n     * @param  proposalIds The ids of the proposals to execute\r\n     * @param  targets     The targets of the proposals\r\n     * @param  data        The calldata of the proposals that the contract is going to execute\r\n     */\r\n    function executeProposals(\r\n        uint256[] calldata proposalIds,\r\n        address[] calldata targets,\r\n        bytes[]   calldata data\r\n    ) external;\r\n\r\n    /**\r\n     * @notice Proposes to update roles\r\n     * @dev    The role updating needs to be done through the timelock contract\r\n     * @param  roles       The roles to update\r\n     * @param  accounts    The accounts to update the roles for\r\n     * @param  shouldGrant Whether to grant or revoke the roles\r\n     */\r\n    function proposeRoleUpdates(bytes32[] calldata roles, address[] calldata accounts, bool[] calldata shouldGrant) external;\r\n\r\n    /**\r\n     * @notice Schedules proposals\r\n     * @dev    The targets and data arrays must have the same length\r\n     * @param  targets The targets of the proposals\r\n     * @param  data    The calldata of the proposals that the contract is going to execute\r\n     */\r\n    function scheduleProposals(address[] calldata targets, bytes[] calldata data) external;\r\n\r\n    /**\r\n     * @notice Unschedule proposals\r\n     * @dev    The proposalIds array must not contain duplicates\r\n     * @param  proposalIds The ids of the proposals to unschedule\r\n     */\r\n    function unscheduleProposals(uint256[] calldata proposalIds) external;\r\n\r\n}\r\n\r\n// modules/globals/modules/erc20-helper/src/ERC20Helper.sol\r\n\r\n/**\r\n * @title Small Library to standardize erc20 token interactions.\r\n */\r\nlibrary ERC20Helper {\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Internal Functions                                                                                                             ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    function transfer(address token_, address to_, uint256 amount_) internal returns (bool success_) {\r\n        return _call(token_, abi.encodeWithSelector(IERC20Like.transfer.selector, to_, amount_));\r\n    }\r\n\r\n    function transferFrom(address token_, address from_, address to_, uint256 amount_) internal returns (bool success_) {\r\n        return _call(token_, abi.encodeWithSelector(IERC20Like.transferFrom.selector, from_, to_, amount_));\r\n    }\r\n\r\n    function approve(address token_, address spender_, uint256 amount_) internal returns (bool success_) {\r\n        // If setting approval to zero fails, return false.\r\n        if (!_call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, uint256(0)))) return false;\r\n\r\n        // If `amount_` is zero, return true as the previous step already did this.\r\n        if (amount_ == uint256(0)) return true;\r\n\r\n        // Return the result of setting the approval to `amount_`.\r\n        return _call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, amount_));\r\n    }\r\n\r\n    function _call(address token_, bytes memory data_) private returns (bool success_) {\r\n        if (token_.code.length == uint256(0)) return false;\r\n\r\n        bytes memory returnData;\r\n        ( success_, returnData ) = token_.call(data_);\r\n\r\n        return success_ && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));\r\n    }\r\n\r\n}\r\n\r\n// modules/globals/contracts/GovernorTimelock.sol\r\n\r\ncontract GovernorTimelock is IGovernorTimelock {\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Storage                                                                                                                        ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    bytes32 public override constant PROPOSER_ROLE  = keccak256(\"PROPOSER_ROLE\");\r\n    bytes32 public override constant EXECUTOR_ROLE  = keccak256(\"EXECUTOR_ROLE\");\r\n    bytes32 public override constant CANCELLER_ROLE = keccak256(\"CANCELLER_ROLE\");\r\n    bytes32 public override constant ROLE_ADMIN     = keccak256(\"ROLE_ADMIN\");\r\n\r\n    uint32 public override constant MIN_DELAY            = 1 days;\r\n    uint32 public override constant MIN_EXECUTION_WINDOW = 1 days;\r\n\r\n    address public override pendingTokenWithdrawer;\r\n    address public override tokenWithdrawer;\r\n\r\n    uint256 public override latestProposalId;\r\n\r\n    TimelockParameters public override defaultTimelockParameters;\r\n\r\n    mapping(uint256 => Proposal) public override proposals;\r\n\r\n    mapping(address => mapping(bytes32 => bool)) public override hasRole;\r\n\r\n    mapping(address => mapping(bytes4 => TimelockParameters)) public override functionTimelockParameters;\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Modifiers                                                                                                                      ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    modifier onlyRole(bytes32 role_) {\r\n        require(hasRole[msg.sender][role_], \"GT:NOT_AUTHORIZED\");\r\n\r\n        _;\r\n    }\r\n\r\n    modifier onlySelf() {\r\n        require(msg.sender == address(this), \"GT:NOT_SELF\");\r\n\r\n        _;\r\n    }\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Constructor                                                                                                                    ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    constructor(address tokenWithdrawer_, address proposer_, address executor_, address canceller_, address roleAdmin_) {\r\n        tokenWithdrawer           = tokenWithdrawer_;\r\n        defaultTimelockParameters = TimelockParameters({ delay: MIN_DELAY, executionWindow: MIN_EXECUTION_WINDOW });\r\n\r\n        emit DefaultTimelockSet(MIN_DELAY, MIN_EXECUTION_WINDOW);\r\n\r\n        _updateRole(PROPOSER_ROLE,  proposer_,  true);\r\n        _updateRole(EXECUTOR_ROLE,  executor_,  true);\r\n        _updateRole(CANCELLER_ROLE, canceller_, true);\r\n        _updateRole(ROLE_ADMIN,     roleAdmin_, true);\r\n    }\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Token Withdrawer Functions                                                                                                     ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    function acceptTokenWithdrawer() external override {\r\n        address newTokenWithdrawer_ = pendingTokenWithdrawer;\r\n\r\n        require(msg.sender == newTokenWithdrawer_, \"GT:ATW:NOT_AUTHORIZED\");\r\n\r\n        tokenWithdrawer        = newTokenWithdrawer_;\r\n        pendingTokenWithdrawer = address(0);\r\n\r\n        emit TokenWithdrawerAccepted(newTokenWithdrawer_);\r\n    }\r\n\r\n    function setPendingTokenWithdrawer(address newPendingTokenWithdrawer_) external override onlyRole(ROLE_ADMIN) {\r\n        pendingTokenWithdrawer = newPendingTokenWithdrawer_;\r\n\r\n        emit PendingTokenWithdrawerSet(newPendingTokenWithdrawer_);\r\n    }\r\n\r\n    function withdrawERC20Token(address token_, uint256 amount_) external override {\r\n        require(msg.sender == tokenWithdrawer,                     \"GT:WET:NOT_AUTHORIZED\");\r\n        require(ERC20Helper.transfer(token_, msg.sender, amount_), \"GT:WET:TRANSFER_FAILED\");\r\n\r\n        emit ERC20TokenWithdrawn(token_, msg.sender, amount_);\r\n    }\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Timelock Configuration                                                                                                         ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    function setDefaultTimelockParameters(uint32 delay_, uint32 executionWindow_) external override onlySelf {\r\n        require(delay_           >= MIN_DELAY,            \"GT:SDTP:INVALID_DELAY\");\r\n        require(executionWindow_ >= MIN_EXECUTION_WINDOW, \"GT:SDTP:INVALID_EXEC_WINDOW\");\r\n\r\n        defaultTimelockParameters = TimelockParameters({ delay: delay_, executionWindow: executionWindow_ });\r\n\r\n        emit DefaultTimelockSet(delay_, executionWindow_);\r\n    }\r\n\r\n    function setFunctionTimelockParameters(\r\n        address target_,\r\n        bytes4  functionSelector_,\r\n        uint32  delay_,\r\n        uint32  executionWindow_\r\n    )\r\n        external override onlySelf\r\n    {\r\n         // Both delay_ & executionWindow_ must be zero to use defaults, or both must meet minimums.\r\n        require(\r\n            (delay_ == 0 && executionWindow_ == 0) ||\r\n            (delay_ >= MIN_DELAY && executionWindow_ >= MIN_EXECUTION_WINDOW),\r\n            \"GT:SFTP:INVALID_PARAMETERS\"\r\n        );\r\n\r\n        functionTimelockParameters[target_][functionSelector_] = TimelockParameters({ delay: delay_, executionWindow: executionWindow_ });\r\n\r\n        emit FunctionTimelockSet(target_, functionSelector_, delay_, executionWindow_);\r\n    }\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Role Management                                                                                                                ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    function updateRole(bytes32 role_, address account_, bool grantRole_) external override onlySelf {\r\n        _updateRole(role_, account_, grantRole_);\r\n    }\r\n\r\n    function proposeRoleUpdates(\r\n        bytes32[] calldata roles_,\r\n        address[] calldata accounts_,\r\n        bool[]    calldata shouldGrant_\r\n    )\r\n        external override onlyRole(ROLE_ADMIN)\r\n    {\r\n        require(roles_.length > 0,                    \"GT:PRU:EMPTY_ARRAY\");\r\n        require(roles_.length == accounts_.length,    \"GT:PRU:INVALID_ACCOUNTS_LENGTH\");\r\n        require(roles_.length == shouldGrant_.length, \"GT:PRU:INVALID_SHOULD_GRANT_LENGTH\");\r\n\r\n        for (uint256 i = 0; i < roles_.length; i++) {\r\n            _scheduleProposal(address(this), this.updateRole.selector, abi.encode(roles_[i], accounts_[i], shouldGrant_[i]));\r\n        }\r\n    }\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Proposal Management                                                                                                            ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    function executeProposals(\r\n        uint256[] calldata proposalIds_,\r\n        address[] calldata targets_,\r\n        bytes[]   calldata data_\r\n    )\r\n        external override onlyRole(EXECUTOR_ROLE)\r\n    {\r\n        require(proposalIds_.length != 0,               \"GT:EP:EMPTY_ARRAY\");\r\n        require(proposalIds_.length == targets_.length, \"GT:EP:INVALID_TARGETS_LENGTH\");\r\n        require(proposalIds_.length == data_.length,    \"GT:EP:INVALID_DATA_LENGTH\");\r\n\r\n        for (uint256 i = 0; i < proposalIds_.length; i++) {\r\n            Proposal memory proposal_     = proposals[proposalIds_[i]];\r\n            bytes32 expectedProposalHash_ = keccak256(abi.encode(targets_[i], data_[i]));\r\n\r\n            require(proposals[proposalIds_[i]].proposalHash != bytes32(0), \"GT:EP:PROPOSAL_NOT_FOUND\");\r\n            require(isExecutable(proposalIds_[i]),                         \"GT:EP:NOT_EXECUTABLE\");\r\n            require(expectedProposalHash_ == proposal_.proposalHash,       \"GT:EP:INVALID_DATA\");\r\n\r\n            delete proposals[proposalIds_[i]];\r\n\r\n            _call(targets_[i], data_[i]);\r\n\r\n            emit ProposalExecuted(proposalIds_[i]);\r\n        }\r\n    }\r\n\r\n    function scheduleProposals(address[] calldata targets_, bytes[] calldata data_) external override onlyRole(PROPOSER_ROLE) {\r\n        require(targets_.length != 0,            \"GT:SP:EMPTY_ARRAY\");\r\n        require(targets_.length == data_.length, \"GT:SP:ARRAY_LENGTH_MISMATCH\");\r\n\r\n        for (uint256 i = 0; i < targets_.length; i++) {\r\n            bytes4 selector_     = bytes4(data_[i][:4]);\r\n            bytes memory params_ = data_[i][4:];\r\n\r\n            require(!_isUpdatingRoles(targets_[i], selector_), \"GT:SP:UPDATE_ROLE_NOT_ALLOWED\");\r\n\r\n            _scheduleProposal(targets_[i], selector_, params_);\r\n        }\r\n    }\r\n\r\n    function unscheduleProposals(uint256[] calldata proposalIds_) external override onlyRole(CANCELLER_ROLE) {\r\n        for (uint256 i = 0; i < proposalIds_.length; i++) {\r\n            require(proposals[proposalIds_[i]].proposalHash != 0, \"GT:UP:PROPOSAL_NOT_FOUND\");\r\n            require(proposals[proposalIds_[i]].isUnschedulable,   \"GT:UP:NOT_UNSCHEDULABLE\");\r\n\r\n            delete proposals[proposalIds_[i]];\r\n\r\n            emit ProposalUnscheduled(proposalIds_[i]);\r\n        }\r\n    }\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** View Functions                                                                                                                 ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    function isExecutable(uint256 proposalId_) public override view returns (bool isExecutable_) {\r\n        isExecutable_ = block.timestamp >= proposals[proposalId_].delayedUntil && block.timestamp <= proposals[proposalId_].validUntil;\r\n    }\r\n\r\n    /**************************************************************************************************************************************/\r\n    /*** Internal Functions                                                                                                             ***/\r\n    /**************************************************************************************************************************************/\r\n\r\n    function _call(address target_, bytes calldata calldata_) internal {\r\n        ( bool success_, bytes memory returndata_ ) = target_.call(calldata_);\r\n\r\n        if (success_) {\r\n            return;\r\n        }\r\n\r\n        if (returndata_.length > 0) {\r\n            assembly (\"memory-safe\") {\r\n                let size_ := mload(returndata_)\r\n                revert(add(32, returndata_), size_)\r\n            }\r\n        } else {\r\n            revert(\"GT:EP:CALL_FAILED\");\r\n        }\r\n    }\r\n\r\n    function _getTimelockParameters(\r\n        address target_, bytes4 selector_, bytes memory parameters_\r\n    )\r\n        internal view returns (TimelockParameters memory timelockParameters_)\r\n    {\r\n        // Use prior timelock params if set when updating timelock params.\r\n        if (target_ == address(this) && selector_ == this.setFunctionTimelockParameters.selector) {\r\n            ( target_, selector_, , ) = abi.decode(parameters_, (address, bytes4, uint32, uint32));\r\n        }\r\n\r\n        uint32 functionDelay_ = functionTimelockParameters[target_][selector_].delay;\r\n\r\n        timelockParameters_ =\r\n            functionDelay_ == 0 ? defaultTimelockParameters : functionTimelockParameters[target_][selector_];\r\n    }\r\n\r\n    function _isUpdatingRoles(address target_, bytes4 selector_) internal view returns (bool isUpdatingRoles_) {\r\n        isUpdatingRoles_ = target_ == address(this) && selector_ == this.updateRole.selector;\r\n    }\r\n\r\n    function _updateRole(bytes32 role_, address account_, bool grantRole_) internal {\r\n        require(hasRole[account_][role_] != grantRole_, \"GT:UR:ROLE_NOT_CHANGED\");\r\n\r\n        hasRole[account_][role_] = grantRole_;\r\n\r\n        emit RoleUpdated(role_, account_, grantRole_);\r\n    }\r\n\r\n    function _scheduleProposal(address target_, bytes4 selector_, bytes memory parameters_) internal {\r\n        require(target_.code.length > 0, \"GT:SP:EMPTY_ADDRESS\");\r\n\r\n        TimelockParameters memory timelockParameters_ = _getTimelockParameters(target_, selector_, parameters_);\r\n\r\n        Proposal memory proposal_ = Proposal({\r\n            proposalHash:    keccak256(abi.encode(target_, bytes.concat(selector_, parameters_))),\r\n            scheduledAt:     uint32(block.timestamp),\r\n            delayedUntil:    uint32(block.timestamp) + timelockParameters_.delay,\r\n            validUntil:      uint32(block.timestamp) + timelockParameters_.delay + timelockParameters_.executionWindow,\r\n            isUnschedulable: !_isUpdatingRoles(target_, selector_)\r\n        });\r\n\r\n        uint256 latestProposalId_ = ++latestProposalId;\r\n\r\n        proposals[latestProposalId_] = proposal_;\r\n\r\n        emit ProposalScheduled(latestProposalId_, proposal_);\r\n    }\r\n\r\n}","deployed_bytecode":"0x608060405234801561000f575f80fd5b5060043610610153575f3560e01c8063928d81c1116100bf578063c4b13ca711610079578063c4b13ca71461034b578063d391014b146103fc578063d9ab927014610423578063efb3486c14610436578063f62f395a14610449578063f837804c1461045b575f80fd5b8063928d81c1146103385780639f81aed71461034b578063ac4ab3fb1461036a578063b08e51c014610397578063b573bf82146103be578063b9728311146103d1575f80fd5b80633ccfc95c116101105780633ccfc95c146102a35780634e395e2a146102bf5780636277e61d146102e25780636fad2f40146102f55780637f0edf33146103085780638f61f4f514610311575f80fd5b8063013cf08b1461015757806307bd0265146101da578063232562341461020f578063296dec07146102685780632d6e853c1461027d578063346080af14610290575b5f80fd5b6101a2610165366004611a6c565b60046020525f90815260409020805460019091015460ff81169063ffffffff6101008204811691600160281b8104821691600160481b9091041685565b60408051958652931515602086015263ffffffff928316938501939093528116606084015216608082015260a0015b60405180910390f35b6102017fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b6040519081526020016101d1565b61024b61021d366004611aaf565b600660209081525f928352604080842090915290825290205463ffffffff8082169164010000000090041682565b6040805163ffffffff9384168152929091166020830152016101d1565b61027b610276366004611af7565b610463565b005b61027b61028b366004611b98565b6105c4565b61027b61029e366004611c38565b6107da565b60035461024b9063ffffffff8082169164010000000090041682565b6102d26102cd366004611a6c565b610809565b60405190151581526020016101d1565b61027b6102f0366004611b98565b610859565b61027b610303366004611c77565b610caa565b61020160025481565b6102017fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b61027b610346366004611cb6565b610ea6565b6103556201518081565b60405163ffffffff90911681526020016101d1565b6102d2610378366004611cb6565b600560209081525f928352604080842090915290825290205460ff1681565b6102017ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b61027b6103cc366004611ce0565b610f8c565b6001546103e4906001600160a01b031681565b6040516001600160a01b0390911681526020016101d1565b6102017f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca02509681565b61027b610431366004611d0c565b6110cb565b61027b610444366004611d73565b61132c565b5f546103e4906001600160a01b031681565b61027b6113ce565b33301461048b5760405162461bcd60e51b815260040161048290611d8e565b60405180910390fd5b63ffffffff82161580156104a3575063ffffffff8116155b806104cb57506201518063ffffffff8316108015906104cb57506201518063ffffffff821610155b6105175760405162461bcd60e51b815260206004820152601a60248201527f47543a534654503a494e56414c49445f504152414d45544552530000000000006044820152606401610482565b60408051808201825263ffffffff84811680835284821660208085018281526001600160a01b038b165f818152600684528881206001600160e01b03198d168083529085529089902097518854935188166401000000000267ffffffffffffffff1990941697169690961791909117909555855192835282015290927f2d9b7acb53b5cd04a3d9efd4b226826119e1b611e4f3356b5158a1ac53c64b9d910160405180910390a350505050565b335f9081526005602090815260408083207f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca02509680855292529091205460ff1661061e5760405162461bcd60e51b815260040161048290611db3565b856106605760405162461bcd60e51b815260206004820152601260248201527147543a5052553a454d5054595f415252415960701b6044820152606401610482565b8584146106af5760405162461bcd60e51b815260206004820152601e60248201527f47543a5052553a494e56414c49445f4143434f554e54535f4c454e47544800006044820152606401610482565b8582146107095760405162461bcd60e51b815260206004820152602260248201527f47543a5052553a494e56414c49445f53484f554c445f4752414e545f4c454e476044820152610a8960f31b6064820152608401610482565b5f5b868110156107d0576107c83063346080af60e01b8a8a8581811061073157610731611dde565b9050602002013589898681811061074a5761074a611dde565b905060200201602081019061075f9190611d73565b88888781811061077157610771611dde565b90506020020160208101906107869190611df2565b6040516020016107b4939291909283526001600160a01b039190911660208301521515604082015260600190565b604051602081830303815290604052611471565b60010161070b565b5050505050505050565b3330146107f95760405162461bcd60e51b815260040161048290611d8e565b6108048383836116bb565b505050565b5f81815260046020526040812060010154600160281b900463ffffffff16421080159061085357505f82815260046020526040902060010154600160481b900463ffffffff164211155b92915050565b335f9081526005602090815260408083207fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6380855292529091205460ff166108b35760405162461bcd60e51b815260040161048290611db3565b5f8690036108f75760405162461bcd60e51b815260206004820152601160248201527047543a45503a454d5054595f415252415960781b6044820152606401610482565b8584146109465760405162461bcd60e51b815260206004820152601c60248201527f47543a45503a494e56414c49445f544152474554535f4c454e475448000000006044820152606401610482565b8582146109955760405162461bcd60e51b815260206004820152601960248201527f47543a45503a494e56414c49445f444154415f4c454e475448000000000000006044820152606401610482565b5f5b868110156107d0575f60045f8a8a858181106109b5576109b5611dde565b602090810292909201358352508181019290925260409081015f908120825160a0810184528154815260019091015460ff811615159482019490945263ffffffff6101008504811693820193909352600160281b840483166060820152600160481b9093049091166080830152909150878784818110610a3757610a37611dde565b9050602002016020810190610a4c9190611d73565b868685818110610a5e57610a5e611dde565b9050602002810190610a709190611e0d565b604051602001610a8293929190611e50565b6040516020818303038152906040528051906020012090505f801b60045f8c8c87818110610ab257610ab2611dde565b9050602002013581526020019081526020015f205f015403610b165760405162461bcd60e51b815260206004820152601860248201527f47543a45503a50524f504f53414c5f4e4f545f464f554e4400000000000000006044820152606401610482565b610b378a8a85818110610b2b57610b2b611dde565b90506020020135610809565b610b7a5760405162461bcd60e51b815260206004820152601460248201527347543a45503a4e4f545f45584543555441424c4560601b6044820152606401610482565b81518114610bbf5760405162461bcd60e51b815260206004820152601260248201527147543a45503a494e56414c49445f4441544160701b6044820152606401610482565b60045f8b8b86818110610bd457610bd4611dde565b602090810292909201358352508101919091526040015f90812090815560010180546cffffffffffffffffffffffffff19169055610c5b888885818110610c1d57610c1d611dde565b9050602002016020810190610c329190611d73565b878786818110610c4457610c44611dde565b9050602002810190610c569190611e0d565b611797565b898984818110610c6d57610c6d611dde565b905060200201357f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f60405160405180910390a25050600101610997565b335f9081526005602090815260408083207ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78380855292529091205460ff16610d045760405162461bcd60e51b815260040161048290611db3565b5f5b82811015610ea05760045f858584818110610d2357610d23611dde565b9050602002013581526020019081526020015f205f01545f801b03610d8a5760405162461bcd60e51b815260206004820152601860248201527f47543a55503a50524f504f53414c5f4e4f545f464f554e4400000000000000006044820152606401610482565b60045f858584818110610d9f57610d9f611dde565b602090810292909201358352508101919091526040015f206001015460ff16610e0a5760405162461bcd60e51b815260206004820152601760248201527f47543a55503a4e4f545f554e5343484544554c41424c450000000000000000006044820152606401610482565b60045f858584818110610e1f57610e1f611dde565b602090810292909201358352508101919091526040015f90812090815560010180546cffffffffffffffffffffffffff19169055838382818110610e6557610e65611dde565b905060200201357f48b8b240a60eff15bb66d600b32e335d0bbb802aa58f7684b978361d5c1f6e0960405160405180910390a2600101610d06565b50505050565b6001546001600160a01b03163314610ef85760405162461bcd60e51b815260206004820152601560248201527411d50e95d1550e9393d517d055551213d492569151605a1b6044820152606401610482565b610f0382338361184f565b610f485760405162461bcd60e51b815260206004820152601660248201527511d50e95d1550e9514905394d1915497d1905253115160521b6044820152606401610482565b60405181815233906001600160a01b038416907facf3ec80f13d1c43e4c70cdf27a5966509d7582fff9fe9c2d4d2bc3268b19a2d9060200160405180910390a35050565b333014610fab5760405162461bcd60e51b815260040161048290611d8e565b6201518063ffffffff83161015610ffc5760405162461bcd60e51b815260206004820152601560248201527447543a534454503a494e56414c49445f44454c415960581b6044820152606401610482565b6201518063ffffffff821610156110555760405162461bcd60e51b815260206004820152601b60248201527f47543a534454503a494e56414c49445f455845435f57494e444f5700000000006044820152606401610482565b60408051808201825263ffffffff84811680835290841660209283018190526003805467ffffffffffffffff1916831764010000000083021790558351918252918101919091527fd6b63d7c8c56f853871a74a4d0dad263607ac8275163f59558c5874e4183d5e3910160405180910390a15050565b335f9081526005602090815260408083207fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc180855292529091205460ff166111255760405162461bcd60e51b815260040161048290611db3565b5f8490036111695760405162461bcd60e51b815260206004820152601160248201527047543a53503a454d5054595f415252415960781b6044820152606401610482565b8382146111b85760405162461bcd60e51b815260206004820152601b60248201527f47543a53503a41525241595f4c454e4754485f4d49534d4154434800000000006044820152606401610482565b5f5b84811015611324575f8484838181106111d5576111d5611dde565b90506020028101906111e79190611e0d565b6111f5916004915f91611e8f565b6111fe91611eb6565b90505f85858481811061121357611213611dde565b90506020028101906112259190611e0d565b611233916004908290611e8f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092935061129c92508a91508990508581811061128157611281611dde565b90506020020160208101906112969190611d73565b836118ab565b156112e95760405162461bcd60e51b815260206004820152601d60248201527f47543a53503a5550444154455f524f4c455f4e4f545f414c4c4f5745440000006044820152606401610482565b61131a8888858181106112fe576112fe611dde565b90506020020160208101906113139190611d73565b8383611471565b50506001016111ba565b505050505050565b335f9081526005602090815260408083207f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca02509680855292529091205460ff166113865760405162461bcd60e51b815260040161048290611db3565b5f80546001600160a01b0319166001600160a01b038416908117825560405190917f19b56abb75fa72d33f6f24ace548989f94d315c39ef330bf9f55971714c6e4cf91a25050565b5f546001600160a01b03163381146114205760405162461bcd60e51b815260206004820152601560248201527411d50e905515ce9393d517d055551213d492569151605a1b6044820152606401610482565b600180546001600160a01b0383166001600160a01b031991821681179092555f805490911681556040517f8436654714c989a0fb94d740f9b8a16486acd84818983025f1f88c90bab8b19a9190a250565b5f836001600160a01b03163b116114c05760405162461bcd60e51b815260206004820152601360248201527247543a53503a454d5054595f4144445245535360681b6044820152606401610482565b5f6114cc8484846118db565b90505f6040518060a001604052808686866040516020016114ee929190611efd565b60408051601f198184030181529082905261150c9291602001611f18565b60405160208183030381529060405280519060200120815260200161153187876118ab565b1581524263ffffffff81166020830152845160409092019161155291611f70565b63ffffffff1681526020018360200151845f0151426115719190611f70565b61157b9190611f70565b63ffffffff1681525090505f60025f815461159590611f94565b91829055505f81815260046020908152604091829020855181559085015160019091018054838701516060880151608089015163ffffffff908116600160481b026cffffffff00000000000000000019928216600160281b02929092166cffffffffffffffff000000000019919093166101000264ffffffff00199615159690961664ffffffffff19909416939093179490941791909116179190911790555190915081907f7cf8e972d12a0f89cff0246543584ec072dc3ea51e3a8e190e9b641abc2d4774906116ab9085905f60a08201905082518252602083015115156020830152604083015163ffffffff8082166040850152806060860151166060850152806080860151166080850152505092915050565b60405180910390a2505050505050565b6001600160a01b0382165f90815260056020908152604080832086845290915290205481151560ff90911615150361172e5760405162461bcd60e51b815260206004820152601660248201527511d50e95548e9493d31157d393d517d0d2105391d15160521b6044820152606401610482565b6001600160a01b0382165f818152600560209081526040808320878452825291829020805460ff1916851515908117909155915191825285917f5f0ecfd1ea5555d5b4b6140b49c92365beaf40d0a057dc34a9746990cd4ce8d4910160405180910390a3505050565b5f80846001600160a01b031684846040516117b3929190611fac565b5f604051808303815f865af19150503d805f81146117ec576040519150601f19603f3d011682016040523d82523d5f602084013e6117f1565b606091505b50915091508115611803575050505050565b8051156118135780518082602001fd5b60405162461bcd60e51b815260206004820152601160248201527011d50e91540e90d0531317d19052531151607a1b6044820152606401610482565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790525f906118a39085906119d2565b949350505050565b5f6001600160a01b038316301480156118d457506001600160e01b0319821663346080af60e01b145b9392505050565b604080518082019091525f80825260208201526001600160a01b0384163014801561191657506001600160e01b0319831663296dec0760e01b145b15611937578180602001905181019061192f9190611fbb565b509195509350505b6001600160a01b0384165f9081526006602090815260408083206001600160e01b03198716845290915290205463ffffffff1680156119a1576001600160a01b0385165f9081526006602090815260408083206001600160e01b03198816845290915290206119a4565b60035b60408051808201909152905463ffffffff808216835264010000000090910416602082015295945050505050565b5f6001600160a01b0383163b6119e957505f610853565b6060836001600160a01b031683604051611a03919061200c565b5f604051808303815f865af19150503d805f8114611a3c576040519150601f19603f3d011682016040523d82523d5f602084013e611a41565b606091505b5090925090508180156118a35750805115806118a35750808060200190518101906118a39190612017565b5f60208284031215611a7c575f80fd5b5035919050565b6001600160a01b0381168114611a97575f80fd5b50565b6001600160e01b031981168114611a97575f80fd5b5f8060408385031215611ac0575f80fd5b8235611acb81611a83565b91506020830135611adb81611a9a565b809150509250929050565b63ffffffff81168114611a97575f80fd5b5f805f8060808587031215611b0a575f80fd5b8435611b1581611a83565b93506020850135611b2581611a9a565b92506040850135611b3581611ae6565b91506060850135611b4581611ae6565b939692955090935050565b5f8083601f840112611b60575f80fd5b50813567ffffffffffffffff811115611b77575f80fd5b6020830191508360208260051b8501011115611b91575f80fd5b9250929050565b5f805f805f8060608789031215611bad575f80fd5b863567ffffffffffffffff80821115611bc4575f80fd5b611bd08a838b01611b50565b90985096506020890135915080821115611be8575f80fd5b611bf48a838b01611b50565b90965094506040890135915080821115611c0c575f80fd5b50611c1989828a01611b50565b979a9699509497509295939492505050565b8015158114611a97575f80fd5b5f805f60608486031215611c4a575f80fd5b833592506020840135611c5c81611a83565b91506040840135611c6c81611c2b565b809150509250925092565b5f8060208385031215611c88575f80fd5b823567ffffffffffffffff811115611c9e575f80fd5b611caa85828601611b50565b90969095509350505050565b5f8060408385031215611cc7575f80fd5b8235611cd281611a83565b946020939093013593505050565b5f8060408385031215611cf1575f80fd5b8235611cfc81611ae6565b91506020830135611adb81611ae6565b5f805f8060408587031215611d1f575f80fd5b843567ffffffffffffffff80821115611d36575f80fd5b611d4288838901611b50565b90965094506020870135915080821115611d5a575f80fd5b50611d6787828801611b50565b95989497509550505050565b5f60208284031215611d83575f80fd5b81356118d481611a83565b6020808252600b908201526a23aa1d2727aa2fa9a2a62360a91b604082015260600190565b60208082526011908201527011d50e9393d517d055551213d492569151607a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611e02575f80fd5b81356118d481611c2b565b5f808335601e19843603018112611e22575f80fd5b83018035915067ffffffffffffffff821115611e3c575f80fd5b602001915036819003821315611b91575f80fd5b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8085851115611e9d575f80fd5b83861115611ea9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015611ede5780818660040360031b1b83161692505b505092915050565b5f81518060208401855e5f93019283525090919050565b6001600160e01b0319831681525f6118a36004830184611ee6565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff818116838216019080821115611f8d57611f8d611f5c565b5092915050565b5f60018201611fa557611fa5611f5c565b5060010190565b818382375f9101908152919050565b5f805f8060808587031215611fce575f80fd5b8451611fd981611a83565b6020860151909450611fea81611a9a565b6040860151909350611ffb81611ae6565b6060860151909250611b4581611ae6565b5f6118d48284611ee6565b5f60208284031215612027575f80fd5b81516118d481611c2b56fea2646970667358221220ac8e8924126a54dbd6bcf10895e85da5f54265c841d49d8828f5709fa145185264736f6c63430008190033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"libraries":{},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}}},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":[["0xd6d4Bcde6c816F17889f1Dd3000aF0261B03a196",{"internalType":"address","name":"tokenWithdrawer_","type":"address"}],["0xd6d4Bcde6c816F17889f1Dd3000aF0261B03a196",{"internalType":"address","name":"proposer_","type":"address"}],["0xCe1cE7c7F436DCc4E28Bc8bf86115514d3DC34E8",{"internalType":"address","name":"executor_","type":"address"}],["0x6b1A78C1943b03086F7Ee53360f9b0672bD60818",{"internalType":"address","name":"canceller_","type":"address"}],["0xd6d4Bcde6c816F17889f1Dd3000aF0261B03a196",{"internalType":"address","name":"roleAdmin_","type":"address"}]],"compiler_version":"v0.8.25+commit.b61c2a91","is_verified_via_verifier_alliance":false,"verified_at":"2026-01-20T20:02:49.311289Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561000f575f80fd5b5060405161234038038061234083398101604081905261002e9161026a565b600180546001600160a01b0319166001600160a01b038716179055604080518082018252620151808082526020918201819052600380546001600160401b03191666015180000151801790558251818152918201527fd6b63d7c8c56f853871a74a4d0dad263607ac8275163f59558c5874e4183d5e3910160405180910390a16100da7fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc1856001610168565b6101067fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63846001610168565b6101327ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f783836001610168565b61015e7f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca025096826001610168565b50505050506102cb565b6001600160a01b0382165f90815260056020908152604080832086845290915290205481151560ff9091161515036101e65760405162461bcd60e51b815260206004820152601660248201527f47543a55523a524f4c455f4e4f545f4348414e47454400000000000000000000604482015260640160405180910390fd5b6001600160a01b0382165f818152600560209081526040808320878452825291829020805460ff1916851515908117909155915191825285917f5f0ecfd1ea5555d5b4b6140b49c92365beaf40d0a057dc34a9746990cd4ce8d4910160405180910390a3505050565b80516001600160a01b0381168114610265575f80fd5b919050565b5f805f805f60a0868803121561027e575f80fd5b6102878661024f565b94506102956020870161024f565b93506102a36040870161024f565b92506102b16060870161024f565b91506102bf6080870161024f565b90509295509295909350565b612068806102d85f395ff3fe608060405234801561000f575f80fd5b5060043610610153575f3560e01c8063928d81c1116100bf578063c4b13ca711610079578063c4b13ca71461034b578063d391014b146103fc578063d9ab927014610423578063efb3486c14610436578063f62f395a14610449578063f837804c1461045b575f80fd5b8063928d81c1146103385780639f81aed71461034b578063ac4ab3fb1461036a578063b08e51c014610397578063b573bf82146103be578063b9728311146103d1575f80fd5b80633ccfc95c116101105780633ccfc95c146102a35780634e395e2a146102bf5780636277e61d146102e25780636fad2f40146102f55780637f0edf33146103085780638f61f4f514610311575f80fd5b8063013cf08b1461015757806307bd0265146101da578063232562341461020f578063296dec07146102685780632d6e853c1461027d578063346080af14610290575b5f80fd5b6101a2610165366004611a6c565b60046020525f90815260409020805460019091015460ff81169063ffffffff6101008204811691600160281b8104821691600160481b9091041685565b60408051958652931515602086015263ffffffff928316938501939093528116606084015216608082015260a0015b60405180910390f35b6102017fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b6040519081526020016101d1565b61024b61021d366004611aaf565b600660209081525f928352604080842090915290825290205463ffffffff8082169164010000000090041682565b6040805163ffffffff9384168152929091166020830152016101d1565b61027b610276366004611af7565b610463565b005b61027b61028b366004611b98565b6105c4565b61027b61029e366004611c38565b6107da565b60035461024b9063ffffffff8082169164010000000090041682565b6102d26102cd366004611a6c565b610809565b60405190151581526020016101d1565b61027b6102f0366004611b98565b610859565b61027b610303366004611c77565b610caa565b61020160025481565b6102017fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc181565b61027b610346366004611cb6565b610ea6565b6103556201518081565b60405163ffffffff90911681526020016101d1565b6102d2610378366004611cb6565b600560209081525f928352604080842090915290825290205460ff1681565b6102017ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78381565b61027b6103cc366004611ce0565b610f8c565b6001546103e4906001600160a01b031681565b6040516001600160a01b0390911681526020016101d1565b6102017f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca02509681565b61027b610431366004611d0c565b6110cb565b61027b610444366004611d73565b61132c565b5f546103e4906001600160a01b031681565b61027b6113ce565b33301461048b5760405162461bcd60e51b815260040161048290611d8e565b60405180910390fd5b63ffffffff82161580156104a3575063ffffffff8116155b806104cb57506201518063ffffffff8316108015906104cb57506201518063ffffffff821610155b6105175760405162461bcd60e51b815260206004820152601a60248201527f47543a534654503a494e56414c49445f504152414d45544552530000000000006044820152606401610482565b60408051808201825263ffffffff84811680835284821660208085018281526001600160a01b038b165f818152600684528881206001600160e01b03198d168083529085529089902097518854935188166401000000000267ffffffffffffffff1990941697169690961791909117909555855192835282015290927f2d9b7acb53b5cd04a3d9efd4b226826119e1b611e4f3356b5158a1ac53c64b9d910160405180910390a350505050565b335f9081526005602090815260408083207f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca02509680855292529091205460ff1661061e5760405162461bcd60e51b815260040161048290611db3565b856106605760405162461bcd60e51b815260206004820152601260248201527147543a5052553a454d5054595f415252415960701b6044820152606401610482565b8584146106af5760405162461bcd60e51b815260206004820152601e60248201527f47543a5052553a494e56414c49445f4143434f554e54535f4c454e47544800006044820152606401610482565b8582146107095760405162461bcd60e51b815260206004820152602260248201527f47543a5052553a494e56414c49445f53484f554c445f4752414e545f4c454e476044820152610a8960f31b6064820152608401610482565b5f5b868110156107d0576107c83063346080af60e01b8a8a8581811061073157610731611dde565b9050602002013589898681811061074a5761074a611dde565b905060200201602081019061075f9190611d73565b88888781811061077157610771611dde565b90506020020160208101906107869190611df2565b6040516020016107b4939291909283526001600160a01b039190911660208301521515604082015260600190565b604051602081830303815290604052611471565b60010161070b565b5050505050505050565b3330146107f95760405162461bcd60e51b815260040161048290611d8e565b6108048383836116bb565b505050565b5f81815260046020526040812060010154600160281b900463ffffffff16421080159061085357505f82815260046020526040902060010154600160481b900463ffffffff164211155b92915050565b335f9081526005602090815260408083207fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6380855292529091205460ff166108b35760405162461bcd60e51b815260040161048290611db3565b5f8690036108f75760405162461bcd60e51b815260206004820152601160248201527047543a45503a454d5054595f415252415960781b6044820152606401610482565b8584146109465760405162461bcd60e51b815260206004820152601c60248201527f47543a45503a494e56414c49445f544152474554535f4c454e475448000000006044820152606401610482565b8582146109955760405162461bcd60e51b815260206004820152601960248201527f47543a45503a494e56414c49445f444154415f4c454e475448000000000000006044820152606401610482565b5f5b868110156107d0575f60045f8a8a858181106109b5576109b5611dde565b602090810292909201358352508181019290925260409081015f908120825160a0810184528154815260019091015460ff811615159482019490945263ffffffff6101008504811693820193909352600160281b840483166060820152600160481b9093049091166080830152909150878784818110610a3757610a37611dde565b9050602002016020810190610a4c9190611d73565b868685818110610a5e57610a5e611dde565b9050602002810190610a709190611e0d565b604051602001610a8293929190611e50565b6040516020818303038152906040528051906020012090505f801b60045f8c8c87818110610ab257610ab2611dde565b9050602002013581526020019081526020015f205f015403610b165760405162461bcd60e51b815260206004820152601860248201527f47543a45503a50524f504f53414c5f4e4f545f464f554e4400000000000000006044820152606401610482565b610b378a8a85818110610b2b57610b2b611dde565b90506020020135610809565b610b7a5760405162461bcd60e51b815260206004820152601460248201527347543a45503a4e4f545f45584543555441424c4560601b6044820152606401610482565b81518114610bbf5760405162461bcd60e51b815260206004820152601260248201527147543a45503a494e56414c49445f4441544160701b6044820152606401610482565b60045f8b8b86818110610bd457610bd4611dde565b602090810292909201358352508101919091526040015f90812090815560010180546cffffffffffffffffffffffffff19169055610c5b888885818110610c1d57610c1d611dde565b9050602002016020810190610c329190611d73565b878786818110610c4457610c44611dde565b9050602002810190610c569190611e0d565b611797565b898984818110610c6d57610c6d611dde565b905060200201357f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f60405160405180910390a25050600101610997565b335f9081526005602090815260408083207ffd643c72710c63c0180259aba6b2d05451e3591a24e58b62239378085726f78380855292529091205460ff16610d045760405162461bcd60e51b815260040161048290611db3565b5f5b82811015610ea05760045f858584818110610d2357610d23611dde565b9050602002013581526020019081526020015f205f01545f801b03610d8a5760405162461bcd60e51b815260206004820152601860248201527f47543a55503a50524f504f53414c5f4e4f545f464f554e4400000000000000006044820152606401610482565b60045f858584818110610d9f57610d9f611dde565b602090810292909201358352508101919091526040015f206001015460ff16610e0a5760405162461bcd60e51b815260206004820152601760248201527f47543a55503a4e4f545f554e5343484544554c41424c450000000000000000006044820152606401610482565b60045f858584818110610e1f57610e1f611dde565b602090810292909201358352508101919091526040015f90812090815560010180546cffffffffffffffffffffffffff19169055838382818110610e6557610e65611dde565b905060200201357f48b8b240a60eff15bb66d600b32e335d0bbb802aa58f7684b978361d5c1f6e0960405160405180910390a2600101610d06565b50505050565b6001546001600160a01b03163314610ef85760405162461bcd60e51b815260206004820152601560248201527411d50e95d1550e9393d517d055551213d492569151605a1b6044820152606401610482565b610f0382338361184f565b610f485760405162461bcd60e51b815260206004820152601660248201527511d50e95d1550e9514905394d1915497d1905253115160521b6044820152606401610482565b60405181815233906001600160a01b038416907facf3ec80f13d1c43e4c70cdf27a5966509d7582fff9fe9c2d4d2bc3268b19a2d9060200160405180910390a35050565b333014610fab5760405162461bcd60e51b815260040161048290611d8e565b6201518063ffffffff83161015610ffc5760405162461bcd60e51b815260206004820152601560248201527447543a534454503a494e56414c49445f44454c415960581b6044820152606401610482565b6201518063ffffffff821610156110555760405162461bcd60e51b815260206004820152601b60248201527f47543a534454503a494e56414c49445f455845435f57494e444f5700000000006044820152606401610482565b60408051808201825263ffffffff84811680835290841660209283018190526003805467ffffffffffffffff1916831764010000000083021790558351918252918101919091527fd6b63d7c8c56f853871a74a4d0dad263607ac8275163f59558c5874e4183d5e3910160405180910390a15050565b335f9081526005602090815260408083207fb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca736082b6819cc180855292529091205460ff166111255760405162461bcd60e51b815260040161048290611db3565b5f8490036111695760405162461bcd60e51b815260206004820152601160248201527047543a53503a454d5054595f415252415960781b6044820152606401610482565b8382146111b85760405162461bcd60e51b815260206004820152601b60248201527f47543a53503a41525241595f4c454e4754485f4d49534d4154434800000000006044820152606401610482565b5f5b84811015611324575f8484838181106111d5576111d5611dde565b90506020028101906111e79190611e0d565b6111f5916004915f91611e8f565b6111fe91611eb6565b90505f85858481811061121357611213611dde565b90506020028101906112259190611e0d565b611233916004908290611e8f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525092935061129c92508a91508990508581811061128157611281611dde565b90506020020160208101906112969190611d73565b836118ab565b156112e95760405162461bcd60e51b815260206004820152601d60248201527f47543a53503a5550444154455f524f4c455f4e4f545f414c4c4f5745440000006044820152606401610482565b61131a8888858181106112fe576112fe611dde565b90506020020160208101906113139190611d73565b8383611471565b50506001016111ba565b505050505050565b335f9081526005602090815260408083207f2172861495e7b85edac73e3cd5fbb42dd675baadf627720e687bcfdaca02509680855292529091205460ff166113865760405162461bcd60e51b815260040161048290611db3565b5f80546001600160a01b0319166001600160a01b038416908117825560405190917f19b56abb75fa72d33f6f24ace548989f94d315c39ef330bf9f55971714c6e4cf91a25050565b5f546001600160a01b03163381146114205760405162461bcd60e51b815260206004820152601560248201527411d50e905515ce9393d517d055551213d492569151605a1b6044820152606401610482565b600180546001600160a01b0383166001600160a01b031991821681179092555f805490911681556040517f8436654714c989a0fb94d740f9b8a16486acd84818983025f1f88c90bab8b19a9190a250565b5f836001600160a01b03163b116114c05760405162461bcd60e51b815260206004820152601360248201527247543a53503a454d5054595f4144445245535360681b6044820152606401610482565b5f6114cc8484846118db565b90505f6040518060a001604052808686866040516020016114ee929190611efd565b60408051601f198184030181529082905261150c9291602001611f18565b60405160208183030381529060405280519060200120815260200161153187876118ab565b1581524263ffffffff81166020830152845160409092019161155291611f70565b63ffffffff1681526020018360200151845f0151426115719190611f70565b61157b9190611f70565b63ffffffff1681525090505f60025f815461159590611f94565b91829055505f81815260046020908152604091829020855181559085015160019091018054838701516060880151608089015163ffffffff908116600160481b026cffffffff00000000000000000019928216600160281b02929092166cffffffffffffffff000000000019919093166101000264ffffffff00199615159690961664ffffffffff19909416939093179490941791909116179190911790555190915081907f7cf8e972d12a0f89cff0246543584ec072dc3ea51e3a8e190e9b641abc2d4774906116ab9085905f60a08201905082518252602083015115156020830152604083015163ffffffff8082166040850152806060860151166060850152806080860151166080850152505092915050565b60405180910390a2505050505050565b6001600160a01b0382165f90815260056020908152604080832086845290915290205481151560ff90911615150361172e5760405162461bcd60e51b815260206004820152601660248201527511d50e95548e9493d31157d393d517d0d2105391d15160521b6044820152606401610482565b6001600160a01b0382165f818152600560209081526040808320878452825291829020805460ff1916851515908117909155915191825285917f5f0ecfd1ea5555d5b4b6140b49c92365beaf40d0a057dc34a9746990cd4ce8d4910160405180910390a3505050565b5f80846001600160a01b031684846040516117b3929190611fac565b5f604051808303815f865af19150503d805f81146117ec576040519150601f19603f3d011682016040523d82523d5f602084013e6117f1565b606091505b50915091508115611803575050505050565b8051156118135780518082602001fd5b60405162461bcd60e51b815260206004820152601160248201527011d50e91540e90d0531317d19052531151607a1b6044820152606401610482565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790525f906118a39085906119d2565b949350505050565b5f6001600160a01b038316301480156118d457506001600160e01b0319821663346080af60e01b145b9392505050565b604080518082019091525f80825260208201526001600160a01b0384163014801561191657506001600160e01b0319831663296dec0760e01b145b15611937578180602001905181019061192f9190611fbb565b509195509350505b6001600160a01b0384165f9081526006602090815260408083206001600160e01b03198716845290915290205463ffffffff1680156119a1576001600160a01b0385165f9081526006602090815260408083206001600160e01b03198816845290915290206119a4565b60035b60408051808201909152905463ffffffff808216835264010000000090910416602082015295945050505050565b5f6001600160a01b0383163b6119e957505f610853565b6060836001600160a01b031683604051611a03919061200c565b5f604051808303815f865af19150503d805f8114611a3c576040519150601f19603f3d011682016040523d82523d5f602084013e611a41565b606091505b5090925090508180156118a35750805115806118a35750808060200190518101906118a39190612017565b5f60208284031215611a7c575f80fd5b5035919050565b6001600160a01b0381168114611a97575f80fd5b50565b6001600160e01b031981168114611a97575f80fd5b5f8060408385031215611ac0575f80fd5b8235611acb81611a83565b91506020830135611adb81611a9a565b809150509250929050565b63ffffffff81168114611a97575f80fd5b5f805f8060808587031215611b0a575f80fd5b8435611b1581611a83565b93506020850135611b2581611a9a565b92506040850135611b3581611ae6565b91506060850135611b4581611ae6565b939692955090935050565b5f8083601f840112611b60575f80fd5b50813567ffffffffffffffff811115611b77575f80fd5b6020830191508360208260051b8501011115611b91575f80fd5b9250929050565b5f805f805f8060608789031215611bad575f80fd5b863567ffffffffffffffff80821115611bc4575f80fd5b611bd08a838b01611b50565b90985096506020890135915080821115611be8575f80fd5b611bf48a838b01611b50565b90965094506040890135915080821115611c0c575f80fd5b50611c1989828a01611b50565b979a9699509497509295939492505050565b8015158114611a97575f80fd5b5f805f60608486031215611c4a575f80fd5b833592506020840135611c5c81611a83565b91506040840135611c6c81611c2b565b809150509250925092565b5f8060208385031215611c88575f80fd5b823567ffffffffffffffff811115611c9e575f80fd5b611caa85828601611b50565b90969095509350505050565b5f8060408385031215611cc7575f80fd5b8235611cd281611a83565b946020939093013593505050565b5f8060408385031215611cf1575f80fd5b8235611cfc81611ae6565b91506020830135611adb81611ae6565b5f805f8060408587031215611d1f575f80fd5b843567ffffffffffffffff80821115611d36575f80fd5b611d4288838901611b50565b90965094506020870135915080821115611d5a575f80fd5b50611d6787828801611b50565b95989497509550505050565b5f60208284031215611d83575f80fd5b81356118d481611a83565b6020808252600b908201526a23aa1d2727aa2fa9a2a62360a91b604082015260600190565b60208082526011908201527011d50e9393d517d055551213d492569151607a1b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611e02575f80fd5b81356118d481611c2b565b5f808335601e19843603018112611e22575f80fd5b83018035915067ffffffffffffffff821115611e3c575f80fd5b602001915036819003821315611b91575f80fd5b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8085851115611e9d575f80fd5b83861115611ea9575f80fd5b5050820193919092039150565b6001600160e01b03198135818116916004851015611ede5780818660040360031b1b83161692505b505092915050565b5f81518060208401855e5f93019283525090919050565b6001600160e01b0319831681525f6118a36004830184611ee6565b60018060a01b0383168152604060208201525f82518060408401528060208501606085015e5f606082850101526060601f19601f8301168401019150509392505050565b634e487b7160e01b5f52601160045260245ffd5b63ffffffff818116838216019080821115611f8d57611f8d611f5c565b5092915050565b5f60018201611fa557611fa5611f5c565b5060010190565b818382375f9101908152919050565b5f805f8060808587031215611fce575f80fd5b8451611fd981611a83565b6020860151909450611fea81611a9a565b6040860151909350611ffb81611ae6565b6060860151909250611b4581611ae6565b5f6118d48284611ee6565b5f60208284031215612027575f80fd5b81516118d481611c2b56fea2646970667358221220ac8e8924126a54dbd6bcf10895e85da5f54265c841d49d8828f5709fa145185264736f6c63430008190033000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a196000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a196000000000000000000000000ce1ce7c7f436dcc4e28bc8bf86115514d3dc34e80000000000000000000000006b1a78c1943b03086f7ee53360f9b0672bd60818000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a196","name":"GovernorTimelock","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"default","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"tokenWithdrawer_","type":"address"},{"internalType":"address","name":"proposer_","type":"address"},{"internalType":"address","name":"executor_","type":"address"},{"internalType":"address","name":"canceller_","type":"address"},{"internalType":"address","name":"roleAdmin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"delay","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"executionWindow","type":"uint32"}],"name":"DefaultTimelockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20TokenWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"bytes4","name":"functionSelector","type":"bytes4"},{"indexed":false,"internalType":"uint32","name":"delay","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"executionWindow","type":"uint32"}],"name":"FunctionTimelockSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newPendingTokenWithdrawer","type":"address"}],"name":"PendingTokenWithdrawerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"components":[{"internalType":"bytes32","name":"proposalHash","type":"bytes32"},{"internalType":"bool","name":"isUnschedulable","type":"bool"},{"internalType":"uint32","name":"scheduledAt","type":"uint32"},{"internalType":"uint32","name":"delayedUntil","type":"uint32"},{"internalType":"uint32","name":"validUntil","type":"uint32"}],"indexed":false,"internalType":"struct IGovernorTimelock.Proposal","name":"proposal","type":"tuple"}],"name":"ProposalScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalUnscheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"grantRole","type":"bool"}],"name":"RoleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenWithdrawer","type":"address"}],"name":"TokenWithdrawerAccepted","type":"event"},{"inputs":[],"name":"CANCELLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_DELAY","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_EXECUTION_WINDOW","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROPOSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLE_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptTokenWithdrawer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultTimelockParameters","outputs":[{"internalType":"uint32","name":"delay","type":"uint32"},{"internalType":"uint32","name":"executionWindow","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"proposalIds_","type":"uint256[]"},{"internalType":"address[]","name":"targets_","type":"address[]"},{"internalType":"bytes[]","name":"data_","type":"bytes[]"}],"name":"executeProposals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"functionTimelockParameters","outputs":[{"internalType":"uint32","name":"delay","type":"uint32"},{"internalType":"uint32","name":"executionWindow","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId_","type":"uint256"}],"name":"isExecutable","outputs":[{"internalType":"bool","name":"isExecutable_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestProposalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTokenWithdrawer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"bytes32","name":"proposalHash","type":"bytes32"},{"internalType":"bool","name":"isUnschedulable","type":"bool"},{"internalType":"uint32","name":"scheduledAt","type":"uint32"},{"internalType":"uint32","name":"delayedUntil","type":"uint32"},{"internalType":"uint32","name":"validUntil","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"roles_","type":"bytes32[]"},{"internalType":"address[]","name":"accounts_","type":"address[]"},{"internalType":"bool[]","name":"shouldGrant_","type":"bool[]"}],"name":"proposeRoleUpdates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets_","type":"address[]"},{"internalType":"bytes[]","name":"data_","type":"bytes[]"}],"name":"scheduleProposals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"delay_","type":"uint32"},{"internalType":"uint32","name":"executionWindow_","type":"uint32"}],"name":"setDefaultTimelockParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target_","type":"address"},{"internalType":"bytes4","name":"functionSelector_","type":"bytes4"},{"internalType":"uint32","name":"delay_","type":"uint32"},{"internalType":"uint32","name":"executionWindow_","type":"uint32"}],"name":"setFunctionTimelockParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newPendingTokenWithdrawer_","type":"address"}],"name":"setPendingTokenWithdrawer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenWithdrawer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"proposalIds_","type":"uint256[]"}],"name":"unscheduleProposals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role_","type":"bytes32"},{"internalType":"address","name":"account_","type":"address"},{"internalType":"bool","name":"grantRole_","type":"bool"}],"name":"updateRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdrawERC20Token","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":"000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a196000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a196000000000000000000000000ce1ce7c7f436dcc4e28bc8bf86115514d3dc34e80000000000000000000000006b1a78c1943b03086f7ee53360f9b0672bd60818000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a196"}