{"file_path":"contracts/MapleGlobals.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.25;\n\nimport { NonTransparentProxied } from \"../modules/non-transparent-proxy/contracts/NonTransparentProxied.sol\";\n\nimport { IMapleGlobals } from \"./interfaces/IMapleGlobals.sol\";\n\nimport { IChainlinkAggregatorV3Like, IPoolManagerLike, IProxyLike, IProxyFactoryLike } from \"./interfaces/Interfaces.sol\";\n\n/*\n\n    ███╗   ███╗ █████╗ ██████╗ ██╗     ███████╗     ██████╗ ██╗      ██████╗ ██████╗  █████╗ ██╗     ███████╗\n    ████╗ ████║██╔══██╗██╔══██╗██║     ██╔════╝    ██╔════╝ ██║     ██╔═══██╗██╔══██╗██╔══██╗██║     ██╔════╝\n    ██╔████╔██║███████║██████╔╝██║     █████╗      ██║  ███╗██║     ██║   ██║██████╔╝███████║██║     ███████╗\n    ██║╚██╔╝██║██╔══██║██╔═══╝ ██║     ██╔══╝      ██║   ██║██║     ██║   ██║██╔══██╗██╔══██║██║     ╚════██║\n    ██║ ╚═╝ ██║██║  ██║██║     ███████╗███████╗    ╚██████╔╝███████╗╚██████╔╝██████╔╝██║  ██║███████╗███████║\n    ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚══════╝╚══════╝     ╚═════╝ ╚══════╝ ╚═════╝ ╚═════╝ ╚═╝  ╚═╝╚══════╝╚══════╝\n\n*/\n\ncontract MapleGlobals is IMapleGlobals, NonTransparentProxied {\n\n    /**************************************************************************************************************************************/\n    /*** Structs                                                                                                                        ***/\n    /**************************************************************************************************************************************/\n\n    struct PoolDelegate {\n        address ownedPoolManager;\n        bool    isPoolDelegate;\n    }\n\n    struct ScheduledCall {\n        uint256 timestamp;\n        bytes32 dataHash;\n    }\n\n    struct TimelockParameters {\n        uint128 delay;\n        uint128 duration;\n    }\n\n    struct PriceOracle {\n        address oracle;\n        uint96  maxDelay;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Storage                                                                                                                        ***/\n    /**************************************************************************************************************************************/\n\n    uint256 public constant HUNDRED_PERCENT = 100_0000;\n\n    address public override mapleTreasury;\n    address public override migrationAdmin;\n    address public override pendingGovernor;\n    address public override securityAdmin;\n\n    bool public override protocolPaused;\n\n    TimelockParameters public override defaultTimelockParameters;\n\n    mapping(address => PriceOracle) public override priceOracleOf;\n\n    mapping(address => bool) public override isBorrower;\n    mapping(address => bool) public override isCollateralAsset;\n    mapping(address => bool) public override isPoolAsset;\n\n    mapping(address => bool) internal _isPoolDeployer;  // NOTE: Deprecated, but currently allowing only disabling.\n\n    mapping(address => uint256) public override manualOverridePrice;\n    mapping(address => uint256) public override maxCoverLiquidationPercent;\n    mapping(address => uint256) public override minCoverAmount;\n    mapping(address => uint256) public override bootstrapMint;\n    mapping(address => uint256) public override platformManagementFeeRate;\n    mapping(address => uint256) public override platformOriginationFeeRate;\n    mapping(address => uint256) public override platformServiceFeeRate;\n\n    mapping(address => mapping(bytes32 => TimelockParameters)) public override timelockParametersOf;\n\n    mapping(bytes32 => mapping(address => bool)) public override isInstanceOf;\n\n    // Timestamp and call data hash for a caller, on a contract, for a function id.\n    mapping(address => mapping(address => mapping(bytes32 => ScheduledCall))) public override scheduledCalls;\n\n    mapping(address => PoolDelegate) public override poolDelegates;\n\n    mapping(address => bool) public override isContractPaused;\n\n    mapping(address => mapping(bytes4 => bool)) public override isFunctionUnpaused;\n\n    mapping(address => mapping(address => bool)) internal _canDeployFrom;\n\n    address public override operationalAdmin;\n\n    /**************************************************************************************************************************************/\n    /*** Modifiers                                                                                                                      ***/\n    /**************************************************************************************************************************************/\n\n    modifier onlyGovernor() {\n        _revertIfNotGovernor();\n        _;\n    }\n\n    modifier onlyGovernorOrOperationalAdmin() {\n        _revertIfNotGovernorOrOperationalAdmin();\n        _;\n    }\n\n    modifier onlyGovernorOrSecurityAdmin() {\n        _revertIfNotGovernorOrSecurityAdmin();\n        _;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Governor Transfer Functions                                                                                                    ***/\n    /**************************************************************************************************************************************/\n\n    function acceptGovernor() external override {\n        require(msg.sender == pendingGovernor, \"MG:NOT_PENDING_GOV\");\n        emit GovernorshipAccepted(admin(), msg.sender);\n        _setAddress(ADMIN_SLOT, msg.sender);\n        pendingGovernor = address(0);\n    }\n\n    function setPendingGovernor(address pendingGovernor_) external override onlyGovernor {\n        emit PendingGovernorSet(pendingGovernor = pendingGovernor_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Global Setters                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    // NOTE: `minCoverAmount` is not enforced at activation time.\n    function activatePoolManager(address poolManager_) external override onlyGovernorOrOperationalAdmin {\n        address factory_  = IPoolManagerLike(poolManager_).factory();\n        address delegate_ = IPoolManagerLike(poolManager_).poolDelegate();\n\n        require(isInstanceOf[\"POOL_MANAGER_FACTORY\"][factory_],          \"MG:APM:INVALID_FACTORY\");\n        require(IProxyFactoryLike(factory_).isInstance(poolManager_),    \"MG:APM:INVALID_POOL_MANAGER\");\n        require(poolDelegates[delegate_].isPoolDelegate,                 \"MG:APM:INVALID_DELEGATE\");\n        require(poolDelegates[delegate_].ownedPoolManager == address(0), \"MG:APM:ALREADY_OWNS\");\n\n        emit PoolManagerActivated(poolManager_, delegate_);\n\n        poolDelegates[delegate_].ownedPoolManager = poolManager_;\n\n        IPoolManagerLike(poolManager_).setActive(true);\n    }\n\n    function setBootstrapMint(address asset_, uint256 amount_) external override onlyGovernorOrOperationalAdmin {\n        emit BootstrapMintSet(asset_, bootstrapMint[asset_] = amount_);\n    }\n\n    function setDefaultTimelockParameters(uint128 defaultTimelockDelay_, uint128 defaultTimelockDuration_) external override onlyGovernor {\n        emit DefaultTimelockParametersSet(\n            defaultTimelockParameters.delay,\n            defaultTimelockDelay_,\n            defaultTimelockParameters.duration,\n            defaultTimelockDuration_\n        );\n\n        defaultTimelockParameters = TimelockParameters(defaultTimelockDelay_, defaultTimelockDuration_);\n    }\n\n    function setMapleTreasury(address mapleTreasury_) external override onlyGovernor {\n        require(mapleTreasury_ != address(0), \"MG:SMT:ZERO_ADDR\");\n        emit MapleTreasurySet(mapleTreasury, mapleTreasury_);\n        mapleTreasury = mapleTreasury_;\n    }\n\n    function setMigrationAdmin(address migrationAdmin_) external override onlyGovernor {\n        emit MigrationAdminSet(migrationAdmin, migrationAdmin_);\n        migrationAdmin = migrationAdmin_;\n    }\n\n    function setOperationalAdmin(address operationalAdmin_) external override onlyGovernor {\n        emit OperationalAdminSet(operationalAdmin, operationalAdmin_);\n        operationalAdmin = operationalAdmin_;\n    }\n\n    function setPriceOracle(address asset_, address oracle_, uint96 maxDelay_) external override onlyGovernor {\n        require(oracle_ != address(0) && asset_ != address(0), \"MG:SPO:ZERO_ADDR\");\n        require(maxDelay_ > 0,                                 \"MG:SPO:ZERO_TIME\");\n\n        priceOracleOf[asset_].oracle   = oracle_;\n        priceOracleOf[asset_].maxDelay = maxDelay_;\n\n        emit PriceOracleSet(asset_, oracle_, maxDelay_);\n    }\n\n    function setSecurityAdmin(address securityAdmin_) external override onlyGovernor {\n        require(securityAdmin_ != address(0), \"MG:SSA:ZERO_ADDR\");\n        emit SecurityAdminSet(securityAdmin, securityAdmin_);\n        securityAdmin = securityAdmin_;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Boolean Setters                                                                                                                ***/\n    /**************************************************************************************************************************************/\n\n    function setContractPause(address contract_, bool contractPaused_) external override onlyGovernorOrSecurityAdmin {\n        emit ContractPauseSet(\n            msg.sender,\n            contract_,\n            isContractPaused[contract_] = contractPaused_\n        );\n    }\n\n    function setFunctionUnpause(address contract_, bytes4 sig_, bool functionUnpaused_) external override onlyGovernorOrSecurityAdmin {\n        emit FunctionUnpauseSet(\n            msg.sender,\n            contract_,\n            sig_,\n            isFunctionUnpaused[contract_][sig_] = functionUnpaused_\n        );\n    }\n\n    function setProtocolPause(bool protocolPaused_) external override onlyGovernorOrSecurityAdmin {\n        emit ProtocolPauseSet(\n            msg.sender,\n            protocolPaused = protocolPaused_\n        );\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Allowlist Setters                                                                                                              ***/\n    /**************************************************************************************************************************************/\n\n    function setCanDeployFrom(address factory_, address account_, bool canDeployFrom_) external override onlyGovernorOrOperationalAdmin {\n        emit CanDeployFromSet(factory_, account_, _canDeployFrom[factory_][account_] = canDeployFrom_);\n    }\n\n    function setValidBorrower(address borrower_, bool isValid_) external override onlyGovernorOrOperationalAdmin {\n        isBorrower[borrower_] = isValid_;\n        emit ValidBorrowerSet(borrower_, isValid_);\n    }\n\n    function setValidCollateralAsset(address collateralAsset_, bool isValid_) external override onlyGovernor {\n        isCollateralAsset[collateralAsset_] = isValid_;\n        emit ValidCollateralAssetSet(collateralAsset_, isValid_);\n    }\n\n    function setValidInstanceOf(bytes32 instanceKey_, address instance_, bool isValid_) external override onlyGovernorOrOperationalAdmin {\n        isInstanceOf[instanceKey_][instance_] = isValid_;\n        emit ValidInstanceSet(instanceKey_, instance_, isValid_);\n    }\n\n    function setValidPoolAsset(address poolAsset_, bool isValid_) external override onlyGovernor {\n        isPoolAsset[poolAsset_] = isValid_;\n        emit ValidPoolAssetSet(poolAsset_, isValid_);\n    }\n\n    function setValidPoolDelegate(address account_, bool isValid_) external override onlyGovernorOrOperationalAdmin {\n        require(account_ != address(0), \"MG:SVPD:ZERO_ADDR\");\n\n        // Cannot remove pool delegates that own a pool manager.\n        require(isValid_ || poolDelegates[account_].ownedPoolManager == address(0), \"MG:SVPD:OWNS_POOL_MANAGER\");\n\n        poolDelegates[account_].isPoolDelegate = isValid_;\n        emit ValidPoolDelegateSet(account_, isValid_);\n    }\n\n    function setValidPoolDeployer(address account_, bool isPoolDeployer_) external override onlyGovernor {\n        // NOTE: Explicit PoolDeployers via mapping are deprecated in favour of generalized canDeployFrom mapping.\n        require(!isPoolDeployer_, \"MG:SVPD:ONLY_DISABLING\");\n\n        emit ValidPoolDeployerSet(account_, _isPoolDeployer[account_] = isPoolDeployer_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Price Setters                                                                                                                  ***/\n    /**************************************************************************************************************************************/\n\n    function setManualOverridePrice(address asset_, uint256 price_) external override onlyGovernor {\n        manualOverridePrice[asset_] = price_;\n        emit ManualOverridePriceSet(asset_, price_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Cover Setters                                                                                                                  ***/\n    /**************************************************************************************************************************************/\n\n    function setMaxCoverLiquidationPercent(\n        address poolManager_,\n        uint256 maxCoverLiquidationPercent_\n    )\n        external override onlyGovernorOrOperationalAdmin\n    {\n        require(maxCoverLiquidationPercent_ <= HUNDRED_PERCENT, \"MG:SMCLP:GT_100\");\n        maxCoverLiquidationPercent[poolManager_] = maxCoverLiquidationPercent_;\n        emit MaxCoverLiquidationPercentSet(poolManager_, maxCoverLiquidationPercent_);\n    }\n\n    function setMinCoverAmount(address poolManager_, uint256 minCoverAmount_) external override onlyGovernorOrOperationalAdmin {\n        minCoverAmount[poolManager_] = minCoverAmount_;\n        emit MinCoverAmountSet(poolManager_, minCoverAmount_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Fee Setters                                                                                                                    ***/\n    /**************************************************************************************************************************************/\n\n    function setPlatformManagementFeeRate(\n        address poolManager_,\n        uint256 platformManagementFeeRate_\n    )\n        external override onlyGovernorOrOperationalAdmin\n    {\n        require(platformManagementFeeRate_ <= HUNDRED_PERCENT, \"MG:SPMFR:RATE_GT_100\");\n        platformManagementFeeRate[poolManager_] = platformManagementFeeRate_;\n        emit PlatformManagementFeeRateSet(poolManager_, platformManagementFeeRate_);\n    }\n\n    function setPlatformOriginationFeeRate(\n        address poolManager_,\n        uint256 platformOriginationFeeRate_\n    )\n        external override onlyGovernorOrOperationalAdmin\n    {\n        require(platformOriginationFeeRate_ <= HUNDRED_PERCENT, \"MG:SPOFR:RATE_GT_100\");\n        platformOriginationFeeRate[poolManager_] = platformOriginationFeeRate_;\n        emit PlatformOriginationFeeRateSet(poolManager_, platformOriginationFeeRate_);\n    }\n\n    function setPlatformServiceFeeRate(\n        address poolManager_,\n        uint256 platformServiceFeeRate_\n    )\n        external override onlyGovernorOrOperationalAdmin\n    {\n        require(platformServiceFeeRate_ <= HUNDRED_PERCENT, \"MG:SPSFR:RATE_GT_100\");\n        platformServiceFeeRate[poolManager_] = platformServiceFeeRate_;\n        emit PlatformServiceFeeRateSet(poolManager_, platformServiceFeeRate_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Contract Control Functions                                                                                                     ***/\n    /**************************************************************************************************************************************/\n\n    function setTimelockWindow(address contract_, bytes32 functionId_, uint128 delay_, uint128 duration_) public override onlyGovernor {\n        timelockParametersOf[contract_][functionId_] = TimelockParameters(delay_, duration_);\n        emit TimelockWindowSet(contract_, functionId_, delay_, duration_);\n    }\n\n    function setTimelockWindows(\n        address            contract_,\n        bytes32[] calldata functionIds_,\n        uint128[] calldata delays_,\n        uint128[] calldata durations_\n    )\n        public override onlyGovernor\n    {\n        for (uint256 i_; i_ < functionIds_.length; ++i_) {\n            _setTimelockWindow(contract_, functionIds_[i_], delays_[i_], durations_[i_]);\n        }\n    }\n\n    function transferOwnedPoolManager(address fromPoolDelegate_, address toPoolDelegate_) external override {\n        PoolDelegate storage fromDelegate_ = poolDelegates[fromPoolDelegate_];\n        PoolDelegate storage toDelegate_   = poolDelegates[toPoolDelegate_];\n\n        require(fromDelegate_.ownedPoolManager == msg.sender, \"MG:TOPM:NO_AUTH\");\n        require(toDelegate_.isPoolDelegate,                   \"MG:TOPM:NOT_PD\");\n        require(toDelegate_.ownedPoolManager == address(0),   \"MG:TOPM:ALREADY_OWNS\");\n\n        fromDelegate_.ownedPoolManager = address(0);\n        toDelegate_.ownedPoolManager   = msg.sender;\n\n        emit PoolManagerOwnershipTransferred(fromPoolDelegate_, toPoolDelegate_, msg.sender);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Schedule Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    function isValidScheduledCall(address caller_, address contract_, bytes32 functionId_, bytes calldata callData_)\n        public override view returns (bool isValid_)\n    {\n        ScheduledCall      storage scheduledCall_      = scheduledCalls[caller_][contract_][functionId_];\n        TimelockParameters storage timelockParameters_ = timelockParametersOf[contract_][functionId_];\n\n        uint256 timestamp_ = scheduledCall_.timestamp;\n        uint128 delay_     = timelockParameters_.delay;\n        uint128 duration_  = timelockParameters_.duration;\n\n        if (duration_ == uint128(0)) {\n            delay_    = defaultTimelockParameters.delay;\n            duration_ = defaultTimelockParameters.duration;\n        }\n\n        isValid_ =\n            (block.timestamp >= timestamp_ + delay_) &&\n            (block.timestamp <= timestamp_ + delay_ + duration_) &&\n            (keccak256(abi.encode(callData_)) == scheduledCall_.dataHash);\n    }\n\n    function scheduleCall(address contract_, bytes32 functionId_, bytes calldata callData_) external override {\n        bytes32 dataHash_ = keccak256(abi.encode(callData_));\n\n        scheduledCalls[msg.sender][contract_][functionId_] = ScheduledCall(block.timestamp, dataHash_);\n\n        emit CallScheduled(msg.sender, contract_, functionId_, dataHash_, block.timestamp);\n    }\n\n    function unscheduleCall(address caller_, bytes32 functionId_, bytes calldata callData_) external override {\n        _unscheduleCall(caller_, msg.sender, functionId_, callData_);\n    }\n\n    function unscheduleCall(address caller_, address contract_, bytes32 functionId_, bytes calldata callData_)\n        external override onlyGovernor\n    {\n        _unscheduleCall(caller_, contract_, functionId_, callData_);\n    }\n\n    function _unscheduleCall(address caller_, address contract_, bytes32 functionId_, bytes calldata callData_) internal {\n        bytes32 dataHash_ = keccak256(abi.encode(callData_));\n\n        require(dataHash_ == scheduledCalls[caller_][contract_][functionId_].dataHash, \"MG:UC:CALLDATA_MISMATCH\");\n\n        delete scheduledCalls[caller_][contract_][functionId_];\n\n        emit CallUnscheduled(caller_, contract_, functionId_, dataHash_, block.timestamp);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    function canDeploy(address caller_) public override view returns (bool canDeploy_) {\n        canDeploy_ = canDeployFrom(msg.sender, caller_);\n    }\n\n    function canDeployFrom(address factory_, address caller_) public override view returns (bool canDeployFrom_) {\n        // Simply check if the caller can deploy at the factory. If not, since a PoolManager is often deployed in the same transaction as\n        // the Strategies it deploys, check if `factory_` is a StrategyFactory and the caller is a PoolManager or\n        // if the factory is a loan factory and the caller is a valid borrower.\n        canDeployFrom_ = _canDeployFrom[factory_][caller_] ||\n                         (isInstanceOf[\"LOAN_FACTORY\"][factory_] && isBorrower[caller_]) ||\n                         (isInstanceOf[\"STRATEGY_FACTORY\"][factory_] && _isPoolManager(caller_));\n    }\n\n    function getLatestPrice(address asset_) external override view returns (uint256 latestPrice_) {\n        // If governor has overridden price because of oracle outage, return overridden price.\n        if (manualOverridePrice[asset_] != 0) return manualOverridePrice[asset_];\n\n        address oracle_ = priceOracleOf[asset_].oracle;\n\n        require(oracle_ != address(0), \"MG:GLP:ZERO_ORACLE\");\n\n        (\n            ,\n            int256 price_,\n            ,\n            uint256 updatedAt_,\n        ) = IChainlinkAggregatorV3Like(oracle_).latestRoundData();\n\n        require(updatedAt_ != 0,                                                  \"MG:GLP:ROUND_NOT_COMPLETE\");\n        require(updatedAt_ >= (block.timestamp - priceOracleOf[asset_].maxDelay), \"MG:GLP:STALE_PRICE\");\n        require(price_ > int256(0),                                               \"MG:GLP:ZERO_PRICE\");\n\n        latestPrice_ = uint256(price_);\n    }\n\n    function governor() external view override returns (address governor_) {\n        governor_ = admin();\n    }\n\n    // NOTE: This function is deprecated.\n    // NOTE: This is only used by the LiquidatorFactory to determine if the factory of it's caller is a FixedTermLoanManagerFactory.\n    // NOTE: Original liquidatorFactory checks isFactory(\"LOAN_MANAGER\", IMapleProxied(msg.sender).factory());\n    function isFactory(bytes32 factoryId_, address factory_) external view override returns (bool isFactory_) {\n        // NOTE: Key is not used as this function is deprecated and narrowed.\n        factoryId_;\n\n        // Revert if caller is not LiquidatorFactory, the only allowed caller of this deprecated function.\n        require(isInstanceOf[\"LIQUIDATOR_FACTORY\"][msg.sender], \"MG:IF:NOT_LIQ_FACTORY\");\n\n        // Determine if the `factory_` is a `FixedTermLoanManagerFactory`.\n        isFactory_ = isInstanceOf[\"FT_LOAN_MANAGER_FACTORY\"][factory_];\n    }\n\n    function isFunctionPaused(bytes4 sig_) external view override returns (bool functionIsPaused_) {\n        functionIsPaused_ = isFunctionPaused(msg.sender, sig_);\n    }\n\n    function isFunctionPaused(address contract_, bytes4 sig_) public view override returns (bool functionIsPaused_) {\n        functionIsPaused_ = (protocolPaused || isContractPaused[contract_]) && !isFunctionUnpaused[contract_][sig_];\n    }\n\n    function isPoolDelegate(address account_) external view override returns (bool isPoolDelegate_) {\n        isPoolDelegate_ = poolDelegates[account_].isPoolDelegate;\n    }\n\n    // NOTE: This function is deprecated.\n    // NOTE: This is only used by FixedTermLoanManagerFactory, PoolManagerFactory, and WithdrawalManagerFactory, so it must return true for\n    //       any caller that is either:\n    //       - An actual PoolDeployer contract (in the case of a PoolManagerFactory or WithdrawalManagerFactory), or\n    //       - A PoolManager contract (in the case of a FixedTermLoanManagerFactory)\n    function isPoolDeployer(address caller_) external view override returns (bool isPoolDeployer_) {\n        // Revert if caller is not FixedTermLoanManagerFactory, PoolManagerFactory, or WithdrawalManagerFactory,\n        // the only allowed callers of this deprecated function.\n        require(\n            isInstanceOf[\"FT_LOAN_MANAGER_FACTORY\"][msg.sender] ||\n            isInstanceOf[\"POOL_MANAGER_FACTORY\"][msg.sender] ||\n            isInstanceOf[\"WITHDRAWAL_MANAGER_FACTORY\"][msg.sender],\n            \"MG:IPD:INV_FACTORY\"\n        );\n\n        // This demonstrates that canDeploy() is a full replacement for isPoolDeployer().\n        isPoolDeployer_ = canDeploy(caller_);\n    }\n\n    function ownedPoolManager(address account_) external view override returns (address poolManager_) {\n        poolManager_ = poolDelegates[account_].ownedPoolManager;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Helper Functions                                                                                                               ***/\n    /**************************************************************************************************************************************/\n\n    function _isPoolManager(address contract_) internal view returns (bool isPoolManager_) {\n        address factory_ = IProxyLike(contract_).factory();\n\n        isPoolManager_ = (isInstanceOf[\"POOL_MANAGER_FACTORY\"][factory_]) && IProxyFactoryLike(factory_).isInstance(contract_);\n    }\n\n    function _revertIfNotGovernor() internal view {\n        require(msg.sender == admin(), \"MG:NOT_GOV\");\n    }\n\n    function _revertIfNotGovernorOrOperationalAdmin() internal view {\n        require(msg.sender == admin() || msg.sender == operationalAdmin, \"MG:NOT_GOV_OR_OA\");\n    }\n\n    function _revertIfNotGovernorOrSecurityAdmin() internal view {\n        require(msg.sender == admin() || msg.sender == securityAdmin, \"MG:NOT_GOV_OR_SA\");\n    }\n\n    function _setAddress(bytes32 slot_, address value_) private {\n        assembly {\n            sstore(slot_, value_)\n        }\n    }\n\n    function _setTimelockWindow(address contract_, bytes32 functionId_, uint128 delay_, uint128 duration_) internal {\n        timelockParametersOf[contract_][functionId_] = TimelockParameters(delay_, duration_);\n        emit TimelockWindowSet(contract_, functionId_, delay_, duration_);\n    }\n\n}\n","deployed_bytecode":"0x608060405234801561000f575f80fd5b5060043610610401575f3560e01c80637303de2511610216578063be7c13f71161012a578063e826f7cb116100b4578063f1ae6ebc11610084578063f1ae6ebc14610b03578063f235757f14610b16578063f4c8956714610b29578063f851a44014610b3c578063fd4c5b3714610b44575f80fd5b8063e826f7cb14610a68578063e958ae9114610a7b578063eaf6e48314610a8e578063f12f1bbf14610ab0575f80fd5b8063dcb075ac116100fa578063dcb075ac14610a14578063dd6d65e914610a27578063e115f5d214610a3a578063e3056a3414610a4d578063e58bb63914610a60575f80fd5b8063be7c13f7146109b9578063c75c4bef146109cc578063cae182fe146109df578063d5853e8514610a01575f80fd5b8063a82d2d73116101ab578063b05cbfc21161017b578063b05cbfc21461093f578063b0f008eb14610952578063b19c673314610974578063b5ab6dee14610993578063bddf01d3146109a6575f80fd5b8063a82d2d731461085d578063a95a32bb146108a9578063ad7ca41d146108cb578063af3d5cfc146108de575f80fd5b80638987d418116101e65780638987d418146107db5780638d16e42b1461080d578063a5a276051461082c578063a77337ca1461083e575f80fd5b80637303de251461078357806374df255814610796578063774f269c146107a957806379212350146107c8575f80fd5b80633597ec6311610318578063569e0d29116102a25780636b6dd127116102725780636b6dd1271461072d5780636ed289bb146107405780636ed93dd0146107535780636fbaf5051461075d57806370ae07a114610770575f80fd5b8063569e0d29146106ec5780635c60da1b146106ff5780635da00560146107075780636167f9311461071a575f80fd5b80634672d6a6116102e85780634672d6a61461068157806349df554a146106a05780634c532de1146106b35780634df70d2b146106c65780634e989118146106d9575f80fd5b80633597ec631461061d5780633628263a146106305780633ccfc95c1461064f578063425fad581461066d575f80fd5b8063217ab1021161039957806327416e5e1161036957806327416e5e1461057257806327b437631461059d57806329faef23146105b05780632f973059146105dd578063305c9e05146105f0575f80fd5b8063217ab10214610526578063257db1a41461053957806326ce63871461054c57806326ed05a01461055f575f80fd5b8063135fd844116103d4578063135fd844146104b057806313e48c54146104d357806316345f18146104e65780631a70f05e14610507575f80fd5b806305c0b75b146104055780630b52d12d146104685780630c340a24146104935780630cbd5ca71461049b575b5f80fd5b6104436104133660046129e6565b601160209081525f92835260408084209091529082529020546001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152015b60405180910390f35b60185461047b906001600160a01b031681565b6040516001600160a01b03909116815260200161045f565b61047b610b57565b6104ae6104a9366004612a10565b610b65565b005b6104c36104be366004612a10565b610c16565b604051901515815260200161045f565b6104ae6104e13660046129e6565b610d07565b6104f96104f4366004612a10565b610d67565b60405190815260200161045f565b6104f9610515366004612a10565b60106020525f908152604090205481565b6104ae610534366004612a38565b610f74565b6104ae610547366004612a10565b610fd3565b6104ae61055a366004612ab4565b611036565b6104ae61056d3660046129e6565b611052565b61047b610580366004612a10565b6001600160a01b039081165f908152601460205260409020541690565b6104ae6105ab366004612a38565b6110f0565b6104c36105be366004612b3e565b601660209081525f928352604080842090915290825290205460ff1681565b6104ae6105eb366004612b71565b61114f565b6104c36105fe366004612b9d565b601260209081525f928352604080842090915290825290205460ff1681565b6104ae61062b366004612bc0565b6112a5565b6104f961063e366004612a10565b600e6020525f908152604090205481565b600454610443906001600160801b0380821691600160801b90041682565b6003546104c390600160a01b900460ff1681565b6104f961068f366004612a10565b600c6020525f908152604090205481565b6104ae6106ae366004612a38565b611325565b6104c36106c1366004612c06565b611448565b6104ae6106d4366004612a38565b611453565b6104ae6106e7366004612c1f565b6114bb565b6104c36106fa366004612a10565b61151d565b61047b611528565b6104ae610715366004612c3a565b61155b565b6104c3610728366004612b9d565b6115d0565b6104ae61073b3660046129e6565b611684565b6104ae61074e366004612c67565b61171d565b6104f9620f424081565b6104ae61076b366004612ca1565b611787565b6104ae61077e366004612a10565b611823565b6104ae610791366004612a10565b611886565b60015461047b906001600160a01b031681565b6104f96107b7366004612a10565b600f6020525f908152604090205481565b6104ae6107d6366004612d2e565b611930565b6104c36107e9366004612a10565b6001600160a01b03165f90815260146020526040902054600160a01b900460ff1690565b6104f961081b366004612a10565b600b6020525f908152604090205481565b5f5461047b906001600160a01b031681565b6104f961084c366004612a10565b600a6020525f908152604090205481565b61089461086b366004612dd3565b601360209081525f93845260408085208252928452828420905282529020805460019091015482565b6040805192835260208301919091520161045f565b6104c36108b7366004612a10565b60086020525f908152604090205460ff1681565b6104ae6108d9366004612e11565b6119c4565b6109186108ec366004612a10565b60056020525f90815260409020546001600160a01b03811690600160a01b90046001600160601b031682565b604080516001600160a01b0390931683526001600160601b0390911660208301520161045f565b6104c361094d366004612b71565b611a5b565b6104c3610960366004612a10565b60156020525f908152604090205460ff1681565b6104f9610982366004612a10565b600d6020525f908152604090205481565b6104ae6109a1366004612e39565b611b3f565b6104ae6109b43660046129e6565b611b52565b60035461047b906001600160a01b031681565b6104ae6109da366004612a38565b611ba6565b6104c36109ed366004612a10565b60076020525f908152604090205460ff1681565b6104ae610a0f366004612a10565b611c05565b6104ae610a22366004612e39565b611f8d565b6104ae610a35366004612a38565b61204b565b6104ae610a483660046129e6565b6120f1565b60025461047b906001600160a01b031681565b6104ae61218f565b6104ae610a76366004612e91565b612261565b6104c3610a89366004612b3e565b612376565b6104c3610a9c366004612a10565b60066020525f908152604090205460ff1681565b610ae4610abe366004612a10565b60146020525f90815260409020546001600160a01b03811690600160a01b900460ff1682565b604080516001600160a01b03909316835290151560208301520161045f565b6104ae610b113660046129e6565b6123e6565b6104ae610b24366004612a10565b612484565b6104ae610b373660046129e6565b6124d5565b61047b612529565b6104c3610b52366004612ab4565b612558565b5f610b60612529565b905090565b610b6d612663565b6001600160a01b038116610bbb5760405162461bcd60e51b815260206004820152601060248201526f26a39d29a9a09d2d22a927afa0a2222960811b60448201526064015b60405180910390fd5b6003546040516001600160a01b038084169216907f810affd6f2df6d2f80c1b08402235774ea0a9098a988d37f24fdd018eba954fe905f90a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b335f9081527f3e9622e2ec7f4959f75ad9ba97435aec69ac0e6992394c4c734a5a13c13d8454602052604081205460ff1680610c7f5750335f9081527f6433dbe6986802908056ed8d6ab54c4a6de4169e2480f0394e986567d34c9578602052604090205460ff165b80610cb75750335f9081527f5846cf07ca354f6d33cf8281694b66c9a8216c6af2d7c0890e26764092db815a602052604090205460ff165b610cf85760405162461bcd60e51b81526020600482015260126024820152714d473a4950443a494e565f464143544f525960701b6044820152606401610bb2565b610d018261151d565b92915050565b610d0f6126ba565b6001600160a01b0382165f818152600d602052604090819020839055517f0e7b0ce188890b96962c595c4ae269a92a5177934226db679b320c6583f706fb90610d5b9084815260200190565b60405180910390a25050565b6001600160a01b0381165f908152600a602052604081205415610d9f57506001600160a01b03165f908152600a602052604090205490565b6001600160a01b038083165f908152600560205260409020541680610dfb5760405162461bcd60e51b81526020600482015260126024820152714d473a474c503a5a45524f5f4f5241434c4560701b6044820152606401610bb2565b5f80826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5d9190612ef2565b50935050925050805f03610eb35760405162461bcd60e51b815260206004820152601960248201527f4d473a474c503a524f554e445f4e4f545f434f4d504c455445000000000000006044820152606401610bb2565b6001600160a01b0385165f90815260056020526040902054610ee590600160a01b90046001600160601b031642612f52565b811015610f295760405162461bcd60e51b81526020600482015260126024820152714d473a474c503a5354414c455f505249434560701b6044820152606401610bb2565b5f8213610f6c5760405162461bcd60e51b81526020600482015260116024820152704d473a474c503a5a45524f5f505249434560781b6044820152606401610bb2565b509392505050565b610f7c612663565b6001600160a01b0382165f81815260076020908152604091829020805460ff191685151590811790915591519182527f5c809c1415b76a84d85c70805a4afd4e7abc5cec2413abe9f8dfcdb7371bef469101610d5b565b610fdb612663565b6018546040516001600160a01b038084169216907f19ba404b55c94da34f775886bc001e06d2a3ceb5dc14f9eb56e377a77a94798a905f90a3601880546001600160a01b0319166001600160a01b0392909216919091179055565b61103e612663565b61104b858585858561272a565b5050505050565b61105a6126ba565b620f42408111156110a45760405162461bcd60e51b815260206004820152601460248201527304d473a53504d46523a524154455f47545f3130360641b6044820152606401610bb2565b6001600160a01b0382165f818152600e602052604090819020839055517fe998069ba599146444a0e5cd11a2fbcae9e3a27d8d2c20b766a2e49ad803922790610d5b9084815260200190565b6110f86126ba565b6001600160a01b0382165f81815260066020908152604091829020805460ff191685151590811790915591519182527f2af58fb89afde124bcd64362b41930d2c9ce5fa42bacc37cb1ecaadfe5d94e689101610d5b565b6001600160a01b038083165f90815260146020526040808220848416835291208154919290911633146111b65760405162461bcd60e51b815260206004820152600f60248201526e09a8e74a89ea09a749c9ebe82aaa89608b1b6044820152606401610bb2565b8054600160a01b900460ff166111ff5760405162461bcd60e51b815260206004820152600e60248201526d1351ce9513d4134e9393d517d41160921b6044820152606401610bb2565b80546001600160a01b03161561124e5760405162461bcd60e51b81526020600482015260146024820152734d473a544f504d3a414c52454144595f4f574e5360601b6044820152606401610bb2565b81546001600160a01b031990811683558154163390811782556040516001600160a01b0385811691908716907f7132804b3067fac5f5529a62d5bc5328560c23f530d7920b315ec9ee4a3303b2905f90a450505050565b6112ad612851565b6001600160a01b0383165f8181526016602090815260408083206001600160e01b0319871680855290835292819020805460ff1916861515908117909155905190815291929133917fe2429bc26c82284e4c71743b4ebd173f26b7d00002c9a7632778c85045fbafac910160405180910390a4505050565b61132d6126ba565b6001600160a01b0382166113775760405162461bcd60e51b815260206004820152601160248201527026a39d29ab28221d2d22a927afa0a2222960791b6044820152606401610bb2565b808061139a57506001600160a01b038281165f9081526014602052604090205416155b6113e65760405162461bcd60e51b815260206004820152601960248201527f4d473a535650443a4f574e535f504f4f4c5f4d414e41474552000000000000006044820152606401610bb2565b6001600160a01b0382165f81815260146020526040908190208054841515600160a01b0260ff60a01b19909116179055517f0adfcdb9226a5f42203d9c44c8778b496f63b036595b7ecc75788ada868ef60890610d5b90841515815260200190565b5f610d013383612376565b61145b612851565b6001600160a01b0382165f81815260156020908152604091829020805460ff1916851515908117909155915191825233917f2220ca8bd141408205f39aa956bf2aaa9bd4430dbdbd988e7bc1afa18ea5780a910160405180910390a35050565b6114c3612851565b60038054821515600160a01b0260ff60a01b1990911617905560405133907f620114f5555bca5b5882296e1f619a342641fd10e3517b1c86c0ff1de28579b29061151290841515815260200190565b60405180910390a250565b5f610d013383611a5b565b5f610b6061155760017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd612f52565b5490565b6115636126ba565b6001600160a01b038381165f81815260176020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527fb786e4ed2ea848ebffd8f53bd92080da6f6498012cd7c2f84e02e5e5960ce41591015b60405180910390a3505050565b335f9081527f5b96731a3471c3741ae4571e1d02654d0cdecc02fe3683ac1f568761d2241a8c602052604081205460ff166116455760405162461bcd60e51b81526020600482015260156024820152744d473a49463a4e4f545f4c49515f464143544f525960581b6044820152606401610bb2565b506001600160a01b03165f9081527f3e9622e2ec7f4959f75ad9ba97435aec69ac0e6992394c4c734a5a13c13d8454602052604090205460ff16919050565b61168c6126ba565b620f42408111156116d15760405162461bcd60e51b815260206004820152600f60248201526e04d473a534d434c503a47545f31303608c1b6044820152606401610bb2565b6001600160a01b0382165f818152600b602052604090819020839055517fcb303b9c8f943435a0c14b89123ca6ee58bdf0843e03be61624157303ad71e8c90610d5b9084815260200190565b6117256126ba565b5f8381526012602090815260408083206001600160a01b03861680855290835292819020805460ff1916851515908117909155905190815285917f57c2985237d36106b3006c22a6bd79dfd8a26b3821516081b9441c92cd56b77391016115c3565b61178f612663565b6040805180820182526001600160801b0384811680835284821660208085018281526001600160a01b038b165f818152601184528881208c82528452889020965191518616600160801b029190951617909455845191825292810192909252859290917f7cb3624c2eb9937f6b1515928bf132aafb4f6fa92867dd69817fcdc64ae5c207910160405180910390a350505050565b61182b612663565b6001546040516001600160a01b038084169216907ffbc885083d3ff1c67cc7ec14d7d030c094926776b896de6e53081d36fc719b82905f90a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b61188e612663565b6001600160a01b0381166118d75760405162461bcd60e51b815260206004820152601060248201526f26a39d29a6aa1d2d22a927afa0a2222960811b6044820152606401610bb2565b5f80546040516001600160a01b03808516939216917fc619257458f9a1f674710f71e9dfe609d85759fe1ae34ad64a98bfb56a3f5d6e91a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b611938612663565b5f5b858110156119ba576119b28888888481811061195857611958612f65565b9050602002013587878581811061197157611971612f65565b90506020020160208101906119869190612f79565b86868681811061199857611998612f65565b90506020020160208101906119ad9190612f79565b61178f565b60010161193a565b5050505050505050565b6119cc612663565b600454604080516001600160801b0380841682528581166020830152600160801b9093048316818301529183166060830152517fc06e6fb2ec96a701762459e81d83476088765d01cf1eef7675f34aa857961bbb9181900360800190a1604080518082019091526001600160801b03928316808252919092166020909201829052600160801b90910217600455565b6001600160a01b038083165f90815260176020908152604080832093851683529290529081205460ff1680611ae857506001600160a01b0383165f9081527ff069a3e36e9556a08c5766ff988c6c05cb11ab4142a424a792a6e0b544b42264602052604090205460ff168015611ae857506001600160a01b0382165f9081526006602052604090205460ff165b80611b3857506001600160a01b0383165f9081527ff59212ab7b954b6b0fdf7e493b12df3dd524c4677e13b1fc5a3ca8e7f8502d43602052604090205460ff168015611b385750611b38826128c1565b9392505050565b611b4c843385858561272a565b50505050565b611b5a612663565b6001600160a01b0382165f818152600a602052604090819020839055517faa523f4c33fb318192e1d18f937d3d1f85b7329a20cd7ad7dbb377f4ecedefc290610d5b9084815260200190565b611bae612663565b6001600160a01b0382165f81815260086020908152604091829020805460ff191685151590811790915591519182527f5244539f240d5c7be6eeafc869a240cf1b3943de2d51d30c89c71517ccda515c9101610d5b565b611c0d6126ba565b5f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6e9190612f92565b90505f826001600160a01b0316634046af2b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd19190612f92565b6001600160a01b0383165f9081527f6433dbe6986802908056ed8d6ab54c4a6de4169e2480f0394e986567d34c9578602052604090205490915060ff16611d535760405162461bcd60e51b81526020600482015260166024820152754d473a41504d3a494e56414c49445f464143544f525960501b6044820152606401610bb2565b6040516335a2735f60e11b81526001600160a01b038481166004830152831690636b44e6be90602401602060405180830381865afa158015611d97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbb9190612fad565b611e075760405162461bcd60e51b815260206004820152601b60248201527f4d473a41504d3a494e56414c49445f504f4f4c5f4d414e4147455200000000006044820152606401610bb2565b6001600160a01b0381165f90815260146020526040902054600160a01b900460ff16611e755760405162461bcd60e51b815260206004820152601760248201527f4d473a41504d3a494e56414c49445f44454c45474154450000000000000000006044820152606401610bb2565b6001600160a01b038181165f908152601460205260409020541615611ed25760405162461bcd60e51b81526020600482015260136024820152724d473a41504d3a414c52454144595f4f574e5360681b6044820152606401610bb2565b806001600160a01b0316836001600160a01b03167fc706aa1fb4c4fb14955ca4f5bb72c245ac19b91066ab3d5eb560fc8fc2d51ddd60405160405180910390a36001600160a01b038181165f908152601460205260409081902080546001600160a01b03191692861692831790555163567619c560e11b81526001600482015263acec338a906024015f604051808303815f87803b158015611f72575f80fd5b505af1158015611f84573d5f803e3d5ffd5b50505050505050565b5f8282604051602001611fa1929190612fc8565b60408051601f198184030181528282528051602091820120838301835242808552848301828152335f818152601386528681206001600160a01b038e168083529087528782208d83529096528690209651875590516001909601959095559251909450879391927f05524f9d1f3589f2f019f8c3729a02486ca80fdceffa357bb97ad922a6f095e49161203c91878252602082015260400190565b60405180910390a45050505050565b612053612663565b801561209a5760405162461bcd60e51b81526020600482015260166024820152754d473a535650443a4f4e4c595f44495341424c494e4760501b6044820152606401610bb2565b6001600160a01b0382165f81815260096020908152604091829020805460ff191685151590811790915591519182527f8a169ecb707fe7290802d091990c23c4cf8dfc71f258f913b031d8c7db055d119101610d5b565b6120f96126ba565b620f42408111156121435760405162461bcd60e51b815260206004820152601460248201527304d473a53504f46523a524154455f47545f3130360641b6044820152606401610bb2565b6001600160a01b0382165f818152600f602052604090819020839055517f70ddd49185dbecd8f3853ba179c76e5c26f4e007b0fae297b89f4c71c1227e8e90610d5b9084815260200190565b6002546001600160a01b031633146121de5760405162461bcd60e51b815260206004820152601260248201527126a39d2727aa2fa822a72224a723afa3a7ab60711b6044820152606401610bb2565b336121e7612529565b6001600160a01b03167f3efe9f8d18f0f36499ceb56359e94698c85edfa134dbfb2aa6abf18fbc989c1760405160405180910390a361224f61224a60017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104612f52565b339055565b600280546001600160a01b0319169055565b612269612663565b6001600160a01b0382161580159061228957506001600160a01b03831615155b6122c85760405162461bcd60e51b815260206004820152601060248201526f26a39d29a8279d2d22a927afa0a2222960811b6044820152606401610bb2565b5f816001600160601b0316116123135760405162461bcd60e51b815260206004820152601060248201526f4d473a53504f3a5a45524f5f54494d4560801b6044820152606401610bb2565b6001600160a01b038381165f818152600560209081526040918290206001600160601b038616600160a01b810295881695861790915591519182527fd6a03a3f6f609b602b40fd3827005cd3b3554dd1094799d270dc289d10e4e89a91016115c3565b6003545f90600160a01b900460ff16806123a757506001600160a01b0383165f9081526015602052604090205460ff165b8015611b3857506001600160a01b0383165f9081526016602090815260408083206001600160e01b03198616845290915290205460ff16159392505050565b6123ee6126ba565b620f42408111156124385760405162461bcd60e51b815260206004820152601460248201527304d473a53505346523a524154455f47545f3130360641b6044820152606401610bb2565b6001600160a01b0382165f8181526010602052604090819020839055517f019ca78206bc7953c1d136063577a48573e72bca6ada43c05fc713e732280cec90610d5b9084815260200190565b61248c612663565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f56bddfa0cee9697cebddf9acd7f23dc6583663b05e007b877056d05017994def905f90a250565b6124dd6126ba565b6001600160a01b0382165f818152600c602052604090819020839055517fe11dc1602d16b5b40237416016dc882fa3ee553f9508f2cd3f645c7faae29c0e90610d5b9084815260200190565b5f610b6061155760017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104612f52565b6001600160a01b038086165f9081526013602090815260408083209388168084529382528083208784528252808320938352601182528083208784529091528120825481549293926001600160801b0380821691600160801b900416806125d35750506004546001600160801b0380821691600160801b9004165b6125e66001600160801b03831684612ff6565b421015801561261d5750806001600160801b0316826001600160801b03168461260f9190612ff6565b6126199190612ff6565b4211155b801561265457508460010154888860405160200161263c929190612fc8565b60405160208183030381529060405280519060200120145b9b9a5050505050505050505050565b61266b612529565b6001600160a01b0316336001600160a01b0316146126b85760405162461bcd60e51b815260206004820152600a60248201526926a39d2727aa2fa3a7ab60b11b6044820152606401610bb2565b565b6126c2612529565b6001600160a01b0316336001600160a01b031614806126eb57506018546001600160a01b031633145b6126b85760405162461bcd60e51b815260206004820152601060248201526f4d473a4e4f545f474f565f4f525f4f4160801b6044820152606401610bb2565b5f828260405160200161273e929190612fc8565b60408051601f1981840301815291815281516020928301206001600160a01b03808a165f90815260138552838120918a16815290845282812088825290935291206001015490915081146127d45760405162461bcd60e51b815260206004820152601760248201527f4d473a55433a43414c4c444154415f4d49534d415443480000000000000000006044820152606401610bb2565b6001600160a01b038681165f818152601360209081526040808320948a1680845294825280832089845282528083208381556001019290925581518581524291810191909152879392917fa7789a85ae3b441b37d0d5d3618fdc08e5be9831463a8295ec420eef5b54a3d9910160405180910390a4505050505050565b612859612529565b6001600160a01b0316336001600160a01b0316148061288257506003546001600160a01b031633145b6126b85760405162461bcd60e51b815260206004820152601060248201526f4d473a4e4f545f474f565f4f525f534160801b6044820152606401610bb2565b5f80826001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129239190612f92565b6001600160a01b0381165f9081527f6433dbe6986802908056ed8d6ab54c4a6de4169e2480f0394e986567d34c9578602052604090205490915060ff168015611b3857506040516335a2735f60e11b81526001600160a01b038481166004830152821690636b44e6be90602401602060405180830381865afa1580156129ab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b389190612fad565b6001600160a01b03811681146129e3575f80fd5b50565b5f80604083850312156129f7575f80fd5b8235612a02816129cf565b946020939093013593505050565b5f60208284031215612a20575f80fd5b8135611b38816129cf565b80151581146129e3575f80fd5b5f8060408385031215612a49575f80fd5b8235612a54816129cf565b91506020830135612a6481612a2b565b809150509250929050565b5f8083601f840112612a7f575f80fd5b50813567ffffffffffffffff811115612a96575f80fd5b602083019150836020828501011115612aad575f80fd5b9250929050565b5f805f805f60808688031215612ac8575f80fd5b8535612ad3816129cf565b94506020860135612ae3816129cf565b935060408601359250606086013567ffffffffffffffff811115612b05575f80fd5b612b1188828901612a6f565b969995985093965092949392505050565b80356001600160e01b031981168114612b39575f80fd5b919050565b5f8060408385031215612b4f575f80fd5b8235612b5a816129cf565b9150612b6860208401612b22565b90509250929050565b5f8060408385031215612b82575f80fd5b8235612b8d816129cf565b91506020830135612a64816129cf565b5f8060408385031215612bae575f80fd5b823591506020830135612a64816129cf565b5f805f60608486031215612bd2575f80fd5b8335612bdd816129cf565b9250612beb60208501612b22565b91506040840135612bfb81612a2b565b809150509250925092565b5f60208284031215612c16575f80fd5b611b3882612b22565b5f60208284031215612c2f575f80fd5b8135611b3881612a2b565b5f805f60608486031215612c4c575f80fd5b8335612c57816129cf565b92506020840135612beb816129cf565b5f805f60608486031215612c79575f80fd5b833592506020840135612beb816129cf565b80356001600160801b0381168114612b39575f80fd5b5f805f8060808587031215612cb4575f80fd5b8435612cbf816129cf565b935060208501359250612cd460408601612c8b565b9150612ce260608601612c8b565b905092959194509250565b5f8083601f840112612cfd575f80fd5b50813567ffffffffffffffff811115612d14575f80fd5b6020830191508360208260051b8501011115612aad575f80fd5b5f805f805f805f6080888a031215612d44575f80fd5b8735612d4f816129cf565b9650602088013567ffffffffffffffff80821115612d6b575f80fd5b612d778b838c01612ced565b909850965060408a0135915080821115612d8f575f80fd5b612d9b8b838c01612ced565b909650945060608a0135915080821115612db3575f80fd5b50612dc08a828b01612ced565b989b979a50959850939692959293505050565b5f805f60608486031215612de5575f80fd5b8335612df0816129cf565b92506020840135612e00816129cf565b929592945050506040919091013590565b5f8060408385031215612e22575f80fd5b612e2b83612c8b565b9150612b6860208401612c8b565b5f805f8060608587031215612e4c575f80fd5b8435612e57816129cf565b935060208501359250604085013567ffffffffffffffff811115612e79575f80fd5b612e8587828801612a6f565b95989497509550505050565b5f805f60608486031215612ea3575f80fd5b8335612eae816129cf565b92506020840135612ebe816129cf565b915060408401356001600160601b0381168114612bfb575f80fd5b805169ffffffffffffffffffff81168114612b39575f80fd5b5f805f805f60a08688031215612f06575f80fd5b612f0f86612ed9565b9450602086015193506040860151925060608601519150612f3260808701612ed9565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0157610d01612f3e565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612f89575f80fd5b611b3882612c8b565b5f60208284031215612fa2575f80fd5b8151611b38816129cf565b5f60208284031215612fbd575f80fd5b8151611b3881612a2b565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b80820180821115610d0157610d01612f3e56fea26469706673582212208882c7c965d157f72cb43e894df79f750aec8c35d2e9f1e3485d3b2c1f18932464736f6c63430008190033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[":contract-test-utils/=modules/non-transparent-proxy/modules/contract-test-utils/contracts/",":ds-test/=modules/forge-std/lib/ds-test/src/",":forge-std/=modules/forge-std/src/",":non-transparent-proxy/=modules/non-transparent-proxy/"]},"optimization_runs":200,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/partial_match/1/0x9BeAbb1B6F3ad1DdB87b65148BA5Eb6102334956/","decoded_constructor_args":null,"compiler_version":"0.8.25+commit.b61c2a91","is_verified_via_verifier_alliance":false,"verified_at":"2025-05-28T13:40:37.658704Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x6080604052348015600e575f80fd5b5061303f8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610401575f3560e01c80637303de2511610216578063be7c13f71161012a578063e826f7cb116100b4578063f1ae6ebc11610084578063f1ae6ebc14610b03578063f235757f14610b16578063f4c8956714610b29578063f851a44014610b3c578063fd4c5b3714610b44575f80fd5b8063e826f7cb14610a68578063e958ae9114610a7b578063eaf6e48314610a8e578063f12f1bbf14610ab0575f80fd5b8063dcb075ac116100fa578063dcb075ac14610a14578063dd6d65e914610a27578063e115f5d214610a3a578063e3056a3414610a4d578063e58bb63914610a60575f80fd5b8063be7c13f7146109b9578063c75c4bef146109cc578063cae182fe146109df578063d5853e8514610a01575f80fd5b8063a82d2d73116101ab578063b05cbfc21161017b578063b05cbfc21461093f578063b0f008eb14610952578063b19c673314610974578063b5ab6dee14610993578063bddf01d3146109a6575f80fd5b8063a82d2d731461085d578063a95a32bb146108a9578063ad7ca41d146108cb578063af3d5cfc146108de575f80fd5b80638987d418116101e65780638987d418146107db5780638d16e42b1461080d578063a5a276051461082c578063a77337ca1461083e575f80fd5b80637303de251461078357806374df255814610796578063774f269c146107a957806379212350146107c8575f80fd5b80633597ec6311610318578063569e0d29116102a25780636b6dd127116102725780636b6dd1271461072d5780636ed289bb146107405780636ed93dd0146107535780636fbaf5051461075d57806370ae07a114610770575f80fd5b8063569e0d29146106ec5780635c60da1b146106ff5780635da00560146107075780636167f9311461071a575f80fd5b80634672d6a6116102e85780634672d6a61461068157806349df554a146106a05780634c532de1146106b35780634df70d2b146106c65780634e989118146106d9575f80fd5b80633597ec631461061d5780633628263a146106305780633ccfc95c1461064f578063425fad581461066d575f80fd5b8063217ab1021161039957806327416e5e1161036957806327416e5e1461057257806327b437631461059d57806329faef23146105b05780632f973059146105dd578063305c9e05146105f0575f80fd5b8063217ab10214610526578063257db1a41461053957806326ce63871461054c57806326ed05a01461055f575f80fd5b8063135fd844116103d4578063135fd844146104b057806313e48c54146104d357806316345f18146104e65780631a70f05e14610507575f80fd5b806305c0b75b146104055780630b52d12d146104685780630c340a24146104935780630cbd5ca71461049b575b5f80fd5b6104436104133660046129e6565b601160209081525f92835260408084209091529082529020546001600160801b0380821691600160801b90041682565b604080516001600160801b039384168152929091166020830152015b60405180910390f35b60185461047b906001600160a01b031681565b6040516001600160a01b03909116815260200161045f565b61047b610b57565b6104ae6104a9366004612a10565b610b65565b005b6104c36104be366004612a10565b610c16565b604051901515815260200161045f565b6104ae6104e13660046129e6565b610d07565b6104f96104f4366004612a10565b610d67565b60405190815260200161045f565b6104f9610515366004612a10565b60106020525f908152604090205481565b6104ae610534366004612a38565b610f74565b6104ae610547366004612a10565b610fd3565b6104ae61055a366004612ab4565b611036565b6104ae61056d3660046129e6565b611052565b61047b610580366004612a10565b6001600160a01b039081165f908152601460205260409020541690565b6104ae6105ab366004612a38565b6110f0565b6104c36105be366004612b3e565b601660209081525f928352604080842090915290825290205460ff1681565b6104ae6105eb366004612b71565b61114f565b6104c36105fe366004612b9d565b601260209081525f928352604080842090915290825290205460ff1681565b6104ae61062b366004612bc0565b6112a5565b6104f961063e366004612a10565b600e6020525f908152604090205481565b600454610443906001600160801b0380821691600160801b90041682565b6003546104c390600160a01b900460ff1681565b6104f961068f366004612a10565b600c6020525f908152604090205481565b6104ae6106ae366004612a38565b611325565b6104c36106c1366004612c06565b611448565b6104ae6106d4366004612a38565b611453565b6104ae6106e7366004612c1f565b6114bb565b6104c36106fa366004612a10565b61151d565b61047b611528565b6104ae610715366004612c3a565b61155b565b6104c3610728366004612b9d565b6115d0565b6104ae61073b3660046129e6565b611684565b6104ae61074e366004612c67565b61171d565b6104f9620f424081565b6104ae61076b366004612ca1565b611787565b6104ae61077e366004612a10565b611823565b6104ae610791366004612a10565b611886565b60015461047b906001600160a01b031681565b6104f96107b7366004612a10565b600f6020525f908152604090205481565b6104ae6107d6366004612d2e565b611930565b6104c36107e9366004612a10565b6001600160a01b03165f90815260146020526040902054600160a01b900460ff1690565b6104f961081b366004612a10565b600b6020525f908152604090205481565b5f5461047b906001600160a01b031681565b6104f961084c366004612a10565b600a6020525f908152604090205481565b61089461086b366004612dd3565b601360209081525f93845260408085208252928452828420905282529020805460019091015482565b6040805192835260208301919091520161045f565b6104c36108b7366004612a10565b60086020525f908152604090205460ff1681565b6104ae6108d9366004612e11565b6119c4565b6109186108ec366004612a10565b60056020525f90815260409020546001600160a01b03811690600160a01b90046001600160601b031682565b604080516001600160a01b0390931683526001600160601b0390911660208301520161045f565b6104c361094d366004612b71565b611a5b565b6104c3610960366004612a10565b60156020525f908152604090205460ff1681565b6104f9610982366004612a10565b600d6020525f908152604090205481565b6104ae6109a1366004612e39565b611b3f565b6104ae6109b43660046129e6565b611b52565b60035461047b906001600160a01b031681565b6104ae6109da366004612a38565b611ba6565b6104c36109ed366004612a10565b60076020525f908152604090205460ff1681565b6104ae610a0f366004612a10565b611c05565b6104ae610a22366004612e39565b611f8d565b6104ae610a35366004612a38565b61204b565b6104ae610a483660046129e6565b6120f1565b60025461047b906001600160a01b031681565b6104ae61218f565b6104ae610a76366004612e91565b612261565b6104c3610a89366004612b3e565b612376565b6104c3610a9c366004612a10565b60066020525f908152604090205460ff1681565b610ae4610abe366004612a10565b60146020525f90815260409020546001600160a01b03811690600160a01b900460ff1682565b604080516001600160a01b03909316835290151560208301520161045f565b6104ae610b113660046129e6565b6123e6565b6104ae610b24366004612a10565b612484565b6104ae610b373660046129e6565b6124d5565b61047b612529565b6104c3610b52366004612ab4565b612558565b5f610b60612529565b905090565b610b6d612663565b6001600160a01b038116610bbb5760405162461bcd60e51b815260206004820152601060248201526f26a39d29a9a09d2d22a927afa0a2222960811b60448201526064015b60405180910390fd5b6003546040516001600160a01b038084169216907f810affd6f2df6d2f80c1b08402235774ea0a9098a988d37f24fdd018eba954fe905f90a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b335f9081527f3e9622e2ec7f4959f75ad9ba97435aec69ac0e6992394c4c734a5a13c13d8454602052604081205460ff1680610c7f5750335f9081527f6433dbe6986802908056ed8d6ab54c4a6de4169e2480f0394e986567d34c9578602052604090205460ff165b80610cb75750335f9081527f5846cf07ca354f6d33cf8281694b66c9a8216c6af2d7c0890e26764092db815a602052604090205460ff165b610cf85760405162461bcd60e51b81526020600482015260126024820152714d473a4950443a494e565f464143544f525960701b6044820152606401610bb2565b610d018261151d565b92915050565b610d0f6126ba565b6001600160a01b0382165f818152600d602052604090819020839055517f0e7b0ce188890b96962c595c4ae269a92a5177934226db679b320c6583f706fb90610d5b9084815260200190565b60405180910390a25050565b6001600160a01b0381165f908152600a602052604081205415610d9f57506001600160a01b03165f908152600a602052604090205490565b6001600160a01b038083165f908152600560205260409020541680610dfb5760405162461bcd60e51b81526020600482015260126024820152714d473a474c503a5a45524f5f4f5241434c4560701b6044820152606401610bb2565b5f80826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5d9190612ef2565b50935050925050805f03610eb35760405162461bcd60e51b815260206004820152601960248201527f4d473a474c503a524f554e445f4e4f545f434f4d504c455445000000000000006044820152606401610bb2565b6001600160a01b0385165f90815260056020526040902054610ee590600160a01b90046001600160601b031642612f52565b811015610f295760405162461bcd60e51b81526020600482015260126024820152714d473a474c503a5354414c455f505249434560701b6044820152606401610bb2565b5f8213610f6c5760405162461bcd60e51b81526020600482015260116024820152704d473a474c503a5a45524f5f505249434560781b6044820152606401610bb2565b509392505050565b610f7c612663565b6001600160a01b0382165f81815260076020908152604091829020805460ff191685151590811790915591519182527f5c809c1415b76a84d85c70805a4afd4e7abc5cec2413abe9f8dfcdb7371bef469101610d5b565b610fdb612663565b6018546040516001600160a01b038084169216907f19ba404b55c94da34f775886bc001e06d2a3ceb5dc14f9eb56e377a77a94798a905f90a3601880546001600160a01b0319166001600160a01b0392909216919091179055565b61103e612663565b61104b858585858561272a565b5050505050565b61105a6126ba565b620f42408111156110a45760405162461bcd60e51b815260206004820152601460248201527304d473a53504d46523a524154455f47545f3130360641b6044820152606401610bb2565b6001600160a01b0382165f818152600e602052604090819020839055517fe998069ba599146444a0e5cd11a2fbcae9e3a27d8d2c20b766a2e49ad803922790610d5b9084815260200190565b6110f86126ba565b6001600160a01b0382165f81815260066020908152604091829020805460ff191685151590811790915591519182527f2af58fb89afde124bcd64362b41930d2c9ce5fa42bacc37cb1ecaadfe5d94e689101610d5b565b6001600160a01b038083165f90815260146020526040808220848416835291208154919290911633146111b65760405162461bcd60e51b815260206004820152600f60248201526e09a8e74a89ea09a749c9ebe82aaa89608b1b6044820152606401610bb2565b8054600160a01b900460ff166111ff5760405162461bcd60e51b815260206004820152600e60248201526d1351ce9513d4134e9393d517d41160921b6044820152606401610bb2565b80546001600160a01b03161561124e5760405162461bcd60e51b81526020600482015260146024820152734d473a544f504d3a414c52454144595f4f574e5360601b6044820152606401610bb2565b81546001600160a01b031990811683558154163390811782556040516001600160a01b0385811691908716907f7132804b3067fac5f5529a62d5bc5328560c23f530d7920b315ec9ee4a3303b2905f90a450505050565b6112ad612851565b6001600160a01b0383165f8181526016602090815260408083206001600160e01b0319871680855290835292819020805460ff1916861515908117909155905190815291929133917fe2429bc26c82284e4c71743b4ebd173f26b7d00002c9a7632778c85045fbafac910160405180910390a4505050565b61132d6126ba565b6001600160a01b0382166113775760405162461bcd60e51b815260206004820152601160248201527026a39d29ab28221d2d22a927afa0a2222960791b6044820152606401610bb2565b808061139a57506001600160a01b038281165f9081526014602052604090205416155b6113e65760405162461bcd60e51b815260206004820152601960248201527f4d473a535650443a4f574e535f504f4f4c5f4d414e41474552000000000000006044820152606401610bb2565b6001600160a01b0382165f81815260146020526040908190208054841515600160a01b0260ff60a01b19909116179055517f0adfcdb9226a5f42203d9c44c8778b496f63b036595b7ecc75788ada868ef60890610d5b90841515815260200190565b5f610d013383612376565b61145b612851565b6001600160a01b0382165f81815260156020908152604091829020805460ff1916851515908117909155915191825233917f2220ca8bd141408205f39aa956bf2aaa9bd4430dbdbd988e7bc1afa18ea5780a910160405180910390a35050565b6114c3612851565b60038054821515600160a01b0260ff60a01b1990911617905560405133907f620114f5555bca5b5882296e1f619a342641fd10e3517b1c86c0ff1de28579b29061151290841515815260200190565b60405180910390a250565b5f610d013383611a5b565b5f610b6061155760017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd612f52565b5490565b6115636126ba565b6001600160a01b038381165f81815260176020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527fb786e4ed2ea848ebffd8f53bd92080da6f6498012cd7c2f84e02e5e5960ce41591015b60405180910390a3505050565b335f9081527f5b96731a3471c3741ae4571e1d02654d0cdecc02fe3683ac1f568761d2241a8c602052604081205460ff166116455760405162461bcd60e51b81526020600482015260156024820152744d473a49463a4e4f545f4c49515f464143544f525960581b6044820152606401610bb2565b506001600160a01b03165f9081527f3e9622e2ec7f4959f75ad9ba97435aec69ac0e6992394c4c734a5a13c13d8454602052604090205460ff16919050565b61168c6126ba565b620f42408111156116d15760405162461bcd60e51b815260206004820152600f60248201526e04d473a534d434c503a47545f31303608c1b6044820152606401610bb2565b6001600160a01b0382165f818152600b602052604090819020839055517fcb303b9c8f943435a0c14b89123ca6ee58bdf0843e03be61624157303ad71e8c90610d5b9084815260200190565b6117256126ba565b5f8381526012602090815260408083206001600160a01b03861680855290835292819020805460ff1916851515908117909155905190815285917f57c2985237d36106b3006c22a6bd79dfd8a26b3821516081b9441c92cd56b77391016115c3565b61178f612663565b6040805180820182526001600160801b0384811680835284821660208085018281526001600160a01b038b165f818152601184528881208c82528452889020965191518616600160801b029190951617909455845191825292810192909252859290917f7cb3624c2eb9937f6b1515928bf132aafb4f6fa92867dd69817fcdc64ae5c207910160405180910390a350505050565b61182b612663565b6001546040516001600160a01b038084169216907ffbc885083d3ff1c67cc7ec14d7d030c094926776b896de6e53081d36fc719b82905f90a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b61188e612663565b6001600160a01b0381166118d75760405162461bcd60e51b815260206004820152601060248201526f26a39d29a6aa1d2d22a927afa0a2222960811b6044820152606401610bb2565b5f80546040516001600160a01b03808516939216917fc619257458f9a1f674710f71e9dfe609d85759fe1ae34ad64a98bfb56a3f5d6e91a35f80546001600160a01b0319166001600160a01b0392909216919091179055565b611938612663565b5f5b858110156119ba576119b28888888481811061195857611958612f65565b9050602002013587878581811061197157611971612f65565b90506020020160208101906119869190612f79565b86868681811061199857611998612f65565b90506020020160208101906119ad9190612f79565b61178f565b60010161193a565b5050505050505050565b6119cc612663565b600454604080516001600160801b0380841682528581166020830152600160801b9093048316818301529183166060830152517fc06e6fb2ec96a701762459e81d83476088765d01cf1eef7675f34aa857961bbb9181900360800190a1604080518082019091526001600160801b03928316808252919092166020909201829052600160801b90910217600455565b6001600160a01b038083165f90815260176020908152604080832093851683529290529081205460ff1680611ae857506001600160a01b0383165f9081527ff069a3e36e9556a08c5766ff988c6c05cb11ab4142a424a792a6e0b544b42264602052604090205460ff168015611ae857506001600160a01b0382165f9081526006602052604090205460ff165b80611b3857506001600160a01b0383165f9081527ff59212ab7b954b6b0fdf7e493b12df3dd524c4677e13b1fc5a3ca8e7f8502d43602052604090205460ff168015611b385750611b38826128c1565b9392505050565b611b4c843385858561272a565b50505050565b611b5a612663565b6001600160a01b0382165f818152600a602052604090819020839055517faa523f4c33fb318192e1d18f937d3d1f85b7329a20cd7ad7dbb377f4ecedefc290610d5b9084815260200190565b611bae612663565b6001600160a01b0382165f81815260086020908152604091829020805460ff191685151590811790915591519182527f5244539f240d5c7be6eeafc869a240cf1b3943de2d51d30c89c71517ccda515c9101610d5b565b611c0d6126ba565b5f816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6e9190612f92565b90505f826001600160a01b0316634046af2b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd19190612f92565b6001600160a01b0383165f9081527f6433dbe6986802908056ed8d6ab54c4a6de4169e2480f0394e986567d34c9578602052604090205490915060ff16611d535760405162461bcd60e51b81526020600482015260166024820152754d473a41504d3a494e56414c49445f464143544f525960501b6044820152606401610bb2565b6040516335a2735f60e11b81526001600160a01b038481166004830152831690636b44e6be90602401602060405180830381865afa158015611d97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbb9190612fad565b611e075760405162461bcd60e51b815260206004820152601b60248201527f4d473a41504d3a494e56414c49445f504f4f4c5f4d414e4147455200000000006044820152606401610bb2565b6001600160a01b0381165f90815260146020526040902054600160a01b900460ff16611e755760405162461bcd60e51b815260206004820152601760248201527f4d473a41504d3a494e56414c49445f44454c45474154450000000000000000006044820152606401610bb2565b6001600160a01b038181165f908152601460205260409020541615611ed25760405162461bcd60e51b81526020600482015260136024820152724d473a41504d3a414c52454144595f4f574e5360681b6044820152606401610bb2565b806001600160a01b0316836001600160a01b03167fc706aa1fb4c4fb14955ca4f5bb72c245ac19b91066ab3d5eb560fc8fc2d51ddd60405160405180910390a36001600160a01b038181165f908152601460205260409081902080546001600160a01b03191692861692831790555163567619c560e11b81526001600482015263acec338a906024015f604051808303815f87803b158015611f72575f80fd5b505af1158015611f84573d5f803e3d5ffd5b50505050505050565b5f8282604051602001611fa1929190612fc8565b60408051601f198184030181528282528051602091820120838301835242808552848301828152335f818152601386528681206001600160a01b038e168083529087528782208d83529096528690209651875590516001909601959095559251909450879391927f05524f9d1f3589f2f019f8c3729a02486ca80fdceffa357bb97ad922a6f095e49161203c91878252602082015260400190565b60405180910390a45050505050565b612053612663565b801561209a5760405162461bcd60e51b81526020600482015260166024820152754d473a535650443a4f4e4c595f44495341424c494e4760501b6044820152606401610bb2565b6001600160a01b0382165f81815260096020908152604091829020805460ff191685151590811790915591519182527f8a169ecb707fe7290802d091990c23c4cf8dfc71f258f913b031d8c7db055d119101610d5b565b6120f96126ba565b620f42408111156121435760405162461bcd60e51b815260206004820152601460248201527304d473a53504f46523a524154455f47545f3130360641b6044820152606401610bb2565b6001600160a01b0382165f818152600f602052604090819020839055517f70ddd49185dbecd8f3853ba179c76e5c26f4e007b0fae297b89f4c71c1227e8e90610d5b9084815260200190565b6002546001600160a01b031633146121de5760405162461bcd60e51b815260206004820152601260248201527126a39d2727aa2fa822a72224a723afa3a7ab60711b6044820152606401610bb2565b336121e7612529565b6001600160a01b03167f3efe9f8d18f0f36499ceb56359e94698c85edfa134dbfb2aa6abf18fbc989c1760405160405180910390a361224f61224a60017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104612f52565b339055565b600280546001600160a01b0319169055565b612269612663565b6001600160a01b0382161580159061228957506001600160a01b03831615155b6122c85760405162461bcd60e51b815260206004820152601060248201526f26a39d29a8279d2d22a927afa0a2222960811b6044820152606401610bb2565b5f816001600160601b0316116123135760405162461bcd60e51b815260206004820152601060248201526f4d473a53504f3a5a45524f5f54494d4560801b6044820152606401610bb2565b6001600160a01b038381165f818152600560209081526040918290206001600160601b038616600160a01b810295881695861790915591519182527fd6a03a3f6f609b602b40fd3827005cd3b3554dd1094799d270dc289d10e4e89a91016115c3565b6003545f90600160a01b900460ff16806123a757506001600160a01b0383165f9081526015602052604090205460ff165b8015611b3857506001600160a01b0383165f9081526016602090815260408083206001600160e01b03198616845290915290205460ff16159392505050565b6123ee6126ba565b620f42408111156124385760405162461bcd60e51b815260206004820152601460248201527304d473a53505346523a524154455f47545f3130360641b6044820152606401610bb2565b6001600160a01b0382165f8181526010602052604090819020839055517f019ca78206bc7953c1d136063577a48573e72bca6ada43c05fc713e732280cec90610d5b9084815260200190565b61248c612663565b600280546001600160a01b0319166001600160a01b0383169081179091556040517f56bddfa0cee9697cebddf9acd7f23dc6583663b05e007b877056d05017994def905f90a250565b6124dd6126ba565b6001600160a01b0382165f818152600c602052604090819020839055517fe11dc1602d16b5b40237416016dc882fa3ee553f9508f2cd3f645c7faae29c0e90610d5b9084815260200190565b5f610b6061155760017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6104612f52565b6001600160a01b038086165f9081526013602090815260408083209388168084529382528083208784528252808320938352601182528083208784529091528120825481549293926001600160801b0380821691600160801b900416806125d35750506004546001600160801b0380821691600160801b9004165b6125e66001600160801b03831684612ff6565b421015801561261d5750806001600160801b0316826001600160801b03168461260f9190612ff6565b6126199190612ff6565b4211155b801561265457508460010154888860405160200161263c929190612fc8565b60405160208183030381529060405280519060200120145b9b9a5050505050505050505050565b61266b612529565b6001600160a01b0316336001600160a01b0316146126b85760405162461bcd60e51b815260206004820152600a60248201526926a39d2727aa2fa3a7ab60b11b6044820152606401610bb2565b565b6126c2612529565b6001600160a01b0316336001600160a01b031614806126eb57506018546001600160a01b031633145b6126b85760405162461bcd60e51b815260206004820152601060248201526f4d473a4e4f545f474f565f4f525f4f4160801b6044820152606401610bb2565b5f828260405160200161273e929190612fc8565b60408051601f1981840301815291815281516020928301206001600160a01b03808a165f90815260138552838120918a16815290845282812088825290935291206001015490915081146127d45760405162461bcd60e51b815260206004820152601760248201527f4d473a55433a43414c4c444154415f4d49534d415443480000000000000000006044820152606401610bb2565b6001600160a01b038681165f818152601360209081526040808320948a1680845294825280832089845282528083208381556001019290925581518581524291810191909152879392917fa7789a85ae3b441b37d0d5d3618fdc08e5be9831463a8295ec420eef5b54a3d9910160405180910390a4505050505050565b612859612529565b6001600160a01b0316336001600160a01b0316148061288257506003546001600160a01b031633145b6126b85760405162461bcd60e51b815260206004820152601060248201526f4d473a4e4f545f474f565f4f525f534160801b6044820152606401610bb2565b5f80826001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129239190612f92565b6001600160a01b0381165f9081527f6433dbe6986802908056ed8d6ab54c4a6de4169e2480f0394e986567d34c9578602052604090205490915060ff168015611b3857506040516335a2735f60e11b81526001600160a01b038481166004830152821690636b44e6be90602401602060405180830381865afa1580156129ab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b389190612fad565b6001600160a01b03811681146129e3575f80fd5b50565b5f80604083850312156129f7575f80fd5b8235612a02816129cf565b946020939093013593505050565b5f60208284031215612a20575f80fd5b8135611b38816129cf565b80151581146129e3575f80fd5b5f8060408385031215612a49575f80fd5b8235612a54816129cf565b91506020830135612a6481612a2b565b809150509250929050565b5f8083601f840112612a7f575f80fd5b50813567ffffffffffffffff811115612a96575f80fd5b602083019150836020828501011115612aad575f80fd5b9250929050565b5f805f805f60808688031215612ac8575f80fd5b8535612ad3816129cf565b94506020860135612ae3816129cf565b935060408601359250606086013567ffffffffffffffff811115612b05575f80fd5b612b1188828901612a6f565b969995985093965092949392505050565b80356001600160e01b031981168114612b39575f80fd5b919050565b5f8060408385031215612b4f575f80fd5b8235612b5a816129cf565b9150612b6860208401612b22565b90509250929050565b5f8060408385031215612b82575f80fd5b8235612b8d816129cf565b91506020830135612a64816129cf565b5f8060408385031215612bae575f80fd5b823591506020830135612a64816129cf565b5f805f60608486031215612bd2575f80fd5b8335612bdd816129cf565b9250612beb60208501612b22565b91506040840135612bfb81612a2b565b809150509250925092565b5f60208284031215612c16575f80fd5b611b3882612b22565b5f60208284031215612c2f575f80fd5b8135611b3881612a2b565b5f805f60608486031215612c4c575f80fd5b8335612c57816129cf565b92506020840135612beb816129cf565b5f805f60608486031215612c79575f80fd5b833592506020840135612beb816129cf565b80356001600160801b0381168114612b39575f80fd5b5f805f8060808587031215612cb4575f80fd5b8435612cbf816129cf565b935060208501359250612cd460408601612c8b565b9150612ce260608601612c8b565b905092959194509250565b5f8083601f840112612cfd575f80fd5b50813567ffffffffffffffff811115612d14575f80fd5b6020830191508360208260051b8501011115612aad575f80fd5b5f805f805f805f6080888a031215612d44575f80fd5b8735612d4f816129cf565b9650602088013567ffffffffffffffff80821115612d6b575f80fd5b612d778b838c01612ced565b909850965060408a0135915080821115612d8f575f80fd5b612d9b8b838c01612ced565b909650945060608a0135915080821115612db3575f80fd5b50612dc08a828b01612ced565b989b979a50959850939692959293505050565b5f805f60608486031215612de5575f80fd5b8335612df0816129cf565b92506020840135612e00816129cf565b929592945050506040919091013590565b5f8060408385031215612e22575f80fd5b612e2b83612c8b565b9150612b6860208401612c8b565b5f805f8060608587031215612e4c575f80fd5b8435612e57816129cf565b935060208501359250604085013567ffffffffffffffff811115612e79575f80fd5b612e8587828801612a6f565b95989497509550505050565b5f805f60608486031215612ea3575f80fd5b8335612eae816129cf565b92506020840135612ebe816129cf565b915060408401356001600160601b0381168114612bfb575f80fd5b805169ffffffffffffffffffff81168114612b39575f80fd5b5f805f805f60a08688031215612f06575f80fd5b612f0f86612ed9565b9450602086015193506040860151925060608601519150612f3260808701612ed9565b90509295509295909350565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d0157610d01612f3e565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215612f89575f80fd5b611b3882612c8b565b5f60208284031215612fa2575f80fd5b8151611b38816129cf565b5f60208284031215612fbd575f80fd5b8151611b3881612a2b565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b80820180821115610d0157610d01612f3e56fea26469706673582212208882c7c965d157f72cb43e894df79f750aec8c35d2e9f1e3485d3b2c1f18932464736f6c63430008190033","name":"MapleGlobals","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"cancun","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"contracts/interfaces/IMapleGlobals.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.0;\n\nimport { INonTransparentProxied } from \"../../modules/non-transparent-proxy/contracts/NonTransparentProxied.sol\";\n\ninterface IMapleGlobals is INonTransparentProxied {\n\n    /**************************************************************************************************************************************/\n    /*** Events                                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   A virtualized first mint that acts as as offset to `totalAssets` and `totalSupply`.\n     *  @param asset_         The address of the pool asset.\n     *  @param bootstrapMint_ The amount of shares that will offset `totalAssets` and `totalSupply`.\n     */\n    event BootstrapMintSet(address indexed asset_, uint256 bootstrapMint_);\n\n    /**\n     *  @dev   A time locked call has been scheduled.\n     *  @param caller_     The address of the function caller.\n     *  @param contract_   The contract to execute the call on.\n     *  @param functionId_ The id of the function to execute.\n     *  @param dataHash_   The hash of the parameters to pass to the function.\n     *  @param timestamp_  The timestamp of the schedule.\n     */\n    event CallScheduled(\n        address indexed caller_,\n        address indexed contract_,\n        bytes32 indexed functionId_,\n        bytes32         dataHash_,\n        uint256         timestamp_\n    );\n\n    /**\n     *  @dev   A time locked call has been unscheduled.\n     *  @param caller_     The address of the function caller.\n     *  @param contract_   The contract to execute the call on.\n     *  @param functionId_ The id of the function to execute.\n     *  @param dataHash_   The hash of the parameters to pass to the function.\n     *  @param timestamp_  The timestamp of the schedule.\n     */\n    event CallUnscheduled(\n        address indexed caller_,\n        address indexed contract_,\n        bytes32 indexed functionId_,\n        bytes32         dataHash_,\n        uint256         timestamp_\n    );\n\n    /**\n     *  @dev   An account has been allowed/disallowed from deploying an instance from a particular factory.\n     *  @param factory_       The address of the factory.\n     *  @param account_       The address of the account.\n     *  @param canDeployFrom_ Whether the account can deploy from the factory.\n     */\n    event CanDeployFromSet(address indexed factory_, address indexed account_, bool canDeployFrom_);\n\n    /**\n     *  @dev   The paused state for a given protocol contract was set.\n     *  @param caller_         The address of the security admin or governor that performed the action.\n     *  @param contract_       The address of a contract in the protocol.\n     *  @param contractPaused_ Whether the contract is uniquely paused.\n     */\n    event ContractPauseSet(address indexed caller_, address indexed contract_, bool contractPaused_);\n\n    /**\n     *  @dev   The default parameters for the time lock has been set.\n     *  @param previousDelay_    The previous required delay.\n     *  @param currentDelay_     The newly set required delay.\n     *  @param previousDuration_ The previous required duration.\n     *  @param currentDuration_  The newly set required duration.\n     */\n    event DefaultTimelockParametersSet(uint256 previousDelay_, uint256 currentDelay_, uint256 previousDuration_, uint256 currentDuration_);\n\n    /**\n     *  @dev   The paused state for a function of a given protocol contract was set.\n     *  @param caller_           The address of the security admin or governor that performed the action.\n     *  @param contract_         The address of a contract in the protocol.\n     *  @param sig_              The function signature within the contract.\n     *  @param functionUnpaused_ Whether the contract's function is uniquely unpaused.\n     */\n    event FunctionUnpauseSet(address indexed caller_, address indexed contract_, bytes4 indexed sig_, bool functionUnpaused_);\n\n    /**\n     *  @dev   The governorship has been accepted.\n     *  @param previousGovernor_ The previous governor.\n     *  @param currentGovernor_  The new governor.\n     */\n    event GovernorshipAccepted(address indexed previousGovernor_, address indexed currentGovernor_);\n\n    /**\n     *  @dev   The price for an asset has been set.\n     *  @param asset_ The address of the asset.\n     *  @param price_ The manually set price of the asset.\n     */\n    event ManualOverridePriceSet(address indexed asset_, uint256 price_);\n\n    /**\n     *  @dev   The address for the Maple treasury has been set.\n     *  @param previousMapleTreasury_ The previous treasury.\n     *  @param currentMapleTreasury_  The new treasury.\n     */\n    event MapleTreasurySet(address indexed previousMapleTreasury_, address indexed currentMapleTreasury_);\n\n    /**\n     *  @dev   The max liquidation percent for the given pool manager has been set.\n     *  @param poolManager_                The address of the pool manager.\n     *  @param maxCoverLiquidationPercent_ The new value for the cover liquidation percent.\n     */\n    event MaxCoverLiquidationPercentSet(address indexed poolManager_, uint256 maxCoverLiquidationPercent_);\n\n    /**\n     *  @dev   The migration admin has been set.\n     *  @param previousMigrationAdmin_ The previous migration admin.\n     *  @param nextMigrationAdmin_     The new migration admin.\n     */\n    event MigrationAdminSet(address indexed previousMigrationAdmin_, address indexed nextMigrationAdmin_);\n\n    /**\n     *  @dev   The minimum cover amount for the given pool manager has been set.\n     *  @param poolManager_    The address of the pool manager.\n     *  @param minCoverAmount_ The new value for the minimum cover amount.\n     */\n    event MinCoverAmountSet(address indexed poolManager_, uint256 minCoverAmount_);\n\n    /**\n     *  @dev   The operational admin was set.\n     *  @param previousOperationalAdmin_ The address of the previous operational admin.\n     *  @param currentOperationalAdmin_  The address of the new operational admin.\n     */\n    event OperationalAdminSet(address indexed previousOperationalAdmin_, address indexed currentOperationalAdmin_);\n\n    /**\n     *  @dev   The pending governor has been set.\n     *  @param pendingGovernor_ The new pending governor.\n     */\n    event PendingGovernorSet(address indexed pendingGovernor_);\n\n    /**\n     *  @dev   The platform management fee rate for the given pool manager has been set.\n     *  @param poolManager_               The address of the pool manager.\n     *  @param platformManagementFeeRate_ The new value for the platform management fee rate.\n     */\n    event PlatformManagementFeeRateSet(address indexed poolManager_, uint256 platformManagementFeeRate_);\n\n    /**\n     *  @dev   The platform origination fee rate for the given pool manager has been set.\n     *  @param poolManager_                The address of the pool manager.\n     *  @param platformOriginationFeeRate_ The new value for the origination fee rate.\n     */\n    event PlatformOriginationFeeRateSet(address indexed poolManager_, uint256 platformOriginationFeeRate_);\n\n    /**\n     *  @dev   The platform service fee rate for the given pool manager has been set.\n     *  @param poolManager_            The address of the pool manager.\n     *  @param platformServiceFeeRate_ The new value for the platform service fee rate.\n     */\n    event PlatformServiceFeeRateSet(address indexed poolManager_, uint256 platformServiceFeeRate_);\n\n    /**\n     *  @dev   The pool manager was activated.\n     *  @param poolManager_  The address of the pool manager.\n     *  @param poolDelegate_ The address of the pool delegate.\n     */\n    event PoolManagerActivated(address indexed poolManager_, address indexed poolDelegate_);\n\n    /**\n     *  @dev   The ownership of the pool manager was transferred.\n     *  @param fromPoolDelegate_ The address of the previous pool delegate.\n     *  @param toPoolDelegate_   The address of the new pool delegate.\n     *  @param poolManager_      The address of the pool manager.\n     */\n    event PoolManagerOwnershipTransferred(address indexed fromPoolDelegate_, address indexed toPoolDelegate_, address indexed poolManager_);\n\n    /**\n     *  @dev   The oracle for an asset has been set.\n     *  @param asset_    The address of the asset.\n     *  @param oracle_   The address of the oracle.\n     *  @param maxDelay_ The maximum delay of the oracle.\n     */\n    event PriceOracleSet(address indexed asset_, address indexed oracle_, uint96 maxDelay_);\n\n    /**\n     *  @dev   The protocol pause was set to a new state.\n     *  @param caller_         The address of the security admin or governor that performed the action.\n     *  @param protocolPaused_ The protocol paused state.\n     */\n    event ProtocolPauseSet(address indexed caller_, bool protocolPaused_);\n\n    /**\n     *  @dev   The security admin was set.\n     *  @param previousSecurityAdmin_ The address of the previous security admin.\n     *  @param currentSecurityAdmin_  The address of the new security admin.\n     */\n    event SecurityAdminSet(address indexed previousSecurityAdmin_, address indexed currentSecurityAdmin_);\n\n    /**\n     *  @dev   A new timelock window was set.\n     *  @param contract_   The contract to execute the call on.\n     *  @param functionId_ The id of the function to execute.\n     *  @param delay_      The delay of the timelock window.\n     *  @param duration_   The duration of the timelock window.\n     */\n    event TimelockWindowSet(address indexed contract_, bytes32 indexed functionId_, uint128 delay_, uint128 duration_);\n\n    /**\n     *  @dev   A valid borrower was set.\n     *  @param borrower_ The address of the borrower.\n     *  @param isValid_  The validity of the borrower.\n     */\n    event ValidBorrowerSet(address indexed borrower_, bool isValid_);\n\n    /**\n     *  @dev   A valid asset was set.\n     *  @param collateralAsset_ The address of the collateral asset.\n     *  @param isValid_         The validity of the collateral asset.\n     */\n    event ValidCollateralAssetSet(address indexed collateralAsset_, bool isValid_);\n\n    /**\n     *  @dev   A valid instance was set.\n     *  @param instanceKey_ The key of the instance.\n     *  @param instance_    The address of the instance.\n     *  @param isValid_     The validity of the instance.\n     */\n    event ValidInstanceSet(bytes32 indexed instanceKey_, address indexed instance_, bool isValid_);\n\n    /**\n     *  @dev   A valid asset was set.\n     *  @param poolAsset_ The address of the asset.\n     *  @param isValid_   The validity of the asset.\n     */\n    event ValidPoolAssetSet(address indexed poolAsset_, bool isValid_);\n\n    /**\n     *  @dev   A valid pool delegate was set.\n     *  @param account_ The address the account.\n     *  @param isValid_ The validity of the asset.\n     */\n    event ValidPoolDelegateSet(address indexed account_, bool isValid_);\n\n    /**\n     *  @dev   A valid pool deployer was set.\n     *  @param poolDeployer_ The address the account.\n     *  @param isValid_      The validity of the asset.\n     */\n    event ValidPoolDeployerSet(address indexed poolDeployer_, bool isValid_);\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Gets the virtualized first mint that acts as as offset to `totalAssets` and `totalSupply` for a given pool asset.\n     *  @param  asset_         The address of the pool asset to query\n     *  @return bootstrapMint_ The amount of shares that will offset `totalAssets` and `totalSupply`.\n     */\n    function bootstrapMint(address asset_) external view returns (uint256 bootstrapMint_);\n\n    /**\n     *  @dev    Gets whether a caller account can deploy from the factory calling this function.\n     *  @param  caller_    The address of the account calling the factory.\n     *  @return canDeploy_ Whether the account can deploy from the factory.\n     */\n    function canDeploy(address caller_) external view returns (bool canDeploy_);\n\n    /**\n     *  @dev    Gets whether a caller account can deploy from a factory.\n     *  @param  factory_       The address of the factory.\n     *  @param  caller_        The address of the account calling the factory.\n     *  @return canDeployFrom_ Whether the account can deploy from the factory.\n     */\n    function canDeployFrom(address factory_, address caller_) external view returns (bool canDeployFrom_);\n\n    /**\n     *  @dev    Gets the default timelock parameters.\n     *  @return delay    The default timelock delay.\n     *  @return duration The default timelock duration.\n     */\n    function defaultTimelockParameters() external view returns (uint128 delay, uint128 duration);\n\n    /**\n     *  @dev    Gets the latest price for an asset.\n     *  @param  asset_       The address of the asset to query.\n     *  @return latestPrice_ The latest price for the asset.\n     */\n    function getLatestPrice(address asset_) external view returns (uint256 latestPrice_);\n\n    /**\n     *  @dev    Gets governor address.\n     *  @return governor_ The address of the governor.\n     */\n    function governor() external view returns (address governor_);\n\n    /**\n     *  @dev    Gets the validity of a borrower.\n     *  @param  borrower_   The address of the borrower to query.\n     *  @return isBorrower_ A boolean indicating the validity of the borrower.\n     */\n    function isBorrower(address borrower_) external view returns (bool isBorrower_);\n\n    /**\n     *  @dev    Gets the validity of a collateral asset.\n     *  @param  collateralAsset_   The address of the collateralAsset to query.\n     *  @return isCollateralAsset_ A boolean indicating the validity of the collateral asset.\n     */\n    function isCollateralAsset(address collateralAsset_) external view returns (bool isCollateralAsset_);\n\n    /**\n     *  @dev    Gets whether a contract is uniquely paused.\n     *  @param  contract_         The address of a contract in the protocol.\n     *  @return isContractPaused_ Whether the contract is uniquely paused.\n     */\n    function isContractPaused(address contract_) external view returns (bool isContractPaused_);\n\n    /**\n     *  @dev    Gets the validity of a factory.\n     *  @param  factoryId_ The address of the factory to query.\n     *  @param  factory_   The address of the factory to query.\n     *  @return isFactory_ A boolean indicating the validity of the factory.\n     */\n    function isFactory(bytes32 factoryId_, address factory_) external view returns (bool isFactory_);\n\n    /**\n     *  @dev    Gets whether a calling contract's function is paused.\n     *  @param  sig_              The function signature within the contract.\n     *  @return isFunctionPaused_ Whether the contract's function is paused.\n     */\n    function isFunctionPaused(bytes4 sig_) external view returns (bool isFunctionPaused_);\n\n    /**\n     *  @dev    Gets whether a contract's function is paused.\n     *  @param  contract_         The address of a contract in the protocol.\n     *  @param  sig_              The function signature within the contract.\n     *  @return isFunctionPaused_ Whether the contract's function is paused.\n     */\n    function isFunctionPaused(address contract_, bytes4 sig_) external view returns (bool isFunctionPaused_);\n\n    /**\n     *  @dev    Gets whether a contract's function is uniquely unpaused. A false does not imply it is paused.\n     *  @param  contract_           The address of a contract in the protocol.\n     *  @param  sig_                The function signature within the contract.\n     *  @return isFunctionUnpaused_ Whether the contract's function is uniquely unpaused.\n     */\n    function isFunctionUnpaused(address contract_, bytes4 sig_) external view returns (bool isFunctionUnpaused_);\n\n    /**\n     *  @dev    Gets wether an instance is of some instance key.\n     *  @param  instanceKey_ The key of some instance type.\n     *  @param  instance_    The address of an instance.\n     *  @return isInstance_  A boolean indicating whether the instance is of the instance key.\n     */\n    function isInstanceOf(bytes32 instanceKey_, address instance_) external view returns (bool isInstance_);\n\n    /**\n     *  @dev    Gets the validity of a pool asset.\n     *  @param  poolAsset_   The address of the poolAsset to query.\n     *  @return isPoolAsset_ A boolean indicating the validity of the pool asset.\n     */\n    function isPoolAsset(address poolAsset_) external view returns (bool isPoolAsset_);\n\n    /**\n     *  @dev    Gets the validity of a pool delegate.\n     *  @param  account_        The address of the account to query.\n     *  @return isPoolDelegate_ A boolean indicating the validity of the pool delegate.\n     */\n    function isPoolDelegate(address account_) external view returns (bool isPoolDelegate_);\n\n    /**\n     *  @dev    Gets the validity of a pool deployer.\n     *  @param  account_        The address of the account to query.\n     *  @return isPoolDeployer_ A boolean indicating the validity of the pool deployer.\n     */\n    function isPoolDeployer(address account_) external view returns (bool isPoolDeployer_);\n\n    /**\n     *  @dev    Gets the manual override price for an asset.\n     *  @param  asset_               The address of the asset to query.\n     *  @return manualOverridePrice_ The manual override price for the asset.\n     */\n    function manualOverridePrice(address asset_) external view returns (uint256 manualOverridePrice_);\n\n    /**\n     *  @dev    Gets maple treasury address.\n     *  @return mapleTreasury_ The address of the maple treasury.\n     */\n    function mapleTreasury() external view returns (address mapleTreasury_);\n\n    /**\n     *  @dev    Gets the maximum cover liquidation percent for a given pool manager.\n     *  @param  poolManager_                The address of the pool manager to query.\n     *  @return maxCoverLiquidationPercent_ The maximum cover liquidation percent.\n     */\n    function maxCoverLiquidationPercent(address poolManager_) external view returns (uint256 maxCoverLiquidationPercent_);\n\n    /**\n     *  @dev    Gets the migration admin address.\n     *  @return migrationAdmin_ The address of the migration admin.\n     */\n    function migrationAdmin() external view returns (address migrationAdmin_);\n\n    /**\n     *  @dev    Gets the minimum cover amount for a given pool manager.\n     *  @param  poolManager_    The address of the pool manager to query.\n     *  @return minCoverAmount_ The minimum cover amount.\n     */\n    function minCoverAmount(address poolManager_) external view returns (uint256 minCoverAmount_);\n\n    /**\n     *  @dev    Gets the operational admin address.\n     *  @return operationalAdmin_ The address of the operational admin.\n     */\n    function operationalAdmin() external view returns (address operationalAdmin_);\n\n    /**\n     *  @dev    Gets the address of the owner pool manager.\n     *  @param  account_     The address of the account to query.\n     *  @return poolManager_ The address of the pool manager.\n     */\n    function ownedPoolManager(address account_) external view returns (address poolManager_);\n\n    /**\n     *  @dev    Gets the address and maximum delay of the oracle for the given asset.\n     *  @param  asset_   The address of the asset to query.\n     *  @return oracle   The address of the oracle.\n     *  @return maxDelay The maximum delay of the oracle.\n     */\n    function priceOracleOf(address asset_) external view returns (address oracle, uint96 maxDelay);\n\n    /**\n     *  @dev    Gets the pending governor address.\n     *  @return pendingGovernor_ The address of the pending governor.\n     */\n    function pendingGovernor() external view returns (address pendingGovernor_);\n\n    /**\n     *  @dev    Gets the platform management fee rate for a given pool manager.\n     *  @param  poolManager_               The address of the pool manager to query.\n     *  @return platformManagementFeeRate_ The platform management fee rate.\n     */\n    function platformManagementFeeRate(address poolManager_) external view returns (uint256 platformManagementFeeRate_);\n\n    /**\n     *  @dev    Gets the platform origination fee rate for a given pool manager.\n     *  @param  poolManager_                The address of the pool manager to query.\n     *  @return platformOriginationFeeRate_ The platform origination fee rate.\n     */\n    function platformOriginationFeeRate(address poolManager_) external view returns (uint256 platformOriginationFeeRate_);\n\n    /**\n     *  @dev    Gets the platform service fee rate for a given pool manager.\n     *  @param  poolManager_            The address of the pool manager to query.\n     *  @return platformServiceFeeRate_ The platform service fee rate.\n     */\n    function platformServiceFeeRate(address poolManager_) external view returns (uint256 platformServiceFeeRate_);\n\n    /**\n     *  @dev    Gets pool delegate address information.\n     *  @param  poolDelegate_    The address of the pool delegate to query.\n     *  @return ownedPoolManager The address of the pool manager owned by the pool delegate.\n     *  @return isPoolDelegate   A boolean indication weather or not the address passed is a current pool delegate.\n     */\n    function poolDelegates(address poolDelegate_) external view returns (address ownedPoolManager, bool isPoolDelegate);\n\n    /**\n     *  @dev    Gets the status of the protocol pause.\n     *  @return protocolPaused_ A boolean indicating the status of the protocol pause.\n     */\n    function protocolPaused() external view returns (bool protocolPaused_);\n\n    /**\n     *  @dev    Gets the schedule calls for the parameters.\n     *  @param  caller_     The address of the caller.\n     *  @param  contract_   The address of the contract.\n     *  @param  functionId_ The id function to call.\n     *  @return timestamp   The timestamp of the next scheduled call.\n     *  @return dataHash    The hash of data fot the scheduled call.\n     */\n    function scheduledCalls(\n        address caller_,\n        address contract_,\n        bytes32 functionId_\n    ) external view returns (uint256 timestamp, bytes32 dataHash);\n\n    /**\n     *  @dev    Gets security admin address.\n     *  @return securityAdmin_ The address of the security admin.\n     */\n    function securityAdmin() external view returns (address securityAdmin_);\n\n    /**\n     *  @dev    Gets the time lock parameters for a given contract and function.\n     *  @param  contract_   The address of the contract to query.\n     *  @param  functionId_ The id of the function to query.\n     *  @return delay       The time lock delay.\n     *  @return duration    The time lock duration.\n     */\n    function timelockParametersOf(address contract_, bytes32 functionId_) external view returns (uint128 delay, uint128 duration);\n\n    /**************************************************************************************************************************************/\n    /*** Governor Transfer Functions                                                                                                    ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev Accepts the governorship if the caller is the `pendingGovernor`.\n     */\n    function acceptGovernor() external;\n\n    /**\n     *  @dev   Sets the pending governor.\n     *  @param pendingGovernor_ The new pending governor.\n     */\n    function setPendingGovernor(address pendingGovernor_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Global Setters                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Activates the pool manager.\n     *  @param poolManager_ The address of the pool manager to activate.\n     */\n    function activatePoolManager(address poolManager_) external;\n\n    /**\n     *  @dev   Sets the virtualized first mint that acts as as offset to `totalAssets` and `totalSupply`\n     *         to prevent an MEV-exploit vector against the first pool depositor.\n     *  @param asset_         The address of the pool asset.\n     *  @param bootstrapMint_ The amount of shares that will offset `totalAssets` and `totalSupply`.\n     */\n    function setBootstrapMint(address asset_, uint256 bootstrapMint_) external;\n\n    /**\n     *  @dev   Sets the default time lock parameters.\n     *  @param defaultTimelockDelay_    The default time lock delay.\n     *  @param defaultTimelockDuration_ The default time lock duration.\n     */\n    function setDefaultTimelockParameters(uint128 defaultTimelockDelay_, uint128 defaultTimelockDuration_) external;\n\n    /**\n     *  @dev   Sets the address of the Maple treasury.\n     *  @param mapleTreasury_ The address of the Maple treasury.\n     */\n    function setMapleTreasury(address mapleTreasury_) external;\n\n    /**\n     *  @dev   Sets the address of the migration admin.\n     *  @param migrationAdmin_ The address of the migration admin.\n     */\n    function setMigrationAdmin(address migrationAdmin_) external;\n\n    /**\n     *  @dev   Sets the address of the operational admin.\n     *  @param operationalAdmin_ The address of the operational admin.\n     */\n    function setOperationalAdmin(address operationalAdmin_) external;\n\n    /**\n     *  @dev   Sets the price oracle for the given asset.\n     *  @param asset_    The address of the asset to set the oracle for.\n     *  @param oracle_   The address of the oracle to set for the asset.\n     *  @param maxDelay_ Maximum delay set to check for stale price.\n     */\n    function setPriceOracle(address asset_, address oracle_, uint96 maxDelay_) external;\n\n    /**\n     *  @dev   Sets the address of the security admin.\n     *  @param securityAdmin_ The address of the security admin.\n     */\n    function setSecurityAdmin(address securityAdmin_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Boolean Setters                                                                                                                ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Sets whether a contract is uniquely paused.\n     *  @param contract_       The address of a contract in the protocol.\n     *  @param contractPaused_ Whether the contract is uniquely paused.\n     */\n    function setContractPause(address contract_, bool contractPaused_) external;\n\n    /**\n     *  @dev   Sets whether a contract's function is uniquely unpaused. A false does not imply it is paused.\n     *  @param contract_         The address of a contract in the protocol.\n     *  @param sig_              The function signature within the contract.\n     *  @param functionUnpaused_ Whether the contract's function is uniquely unpaused.\n     */\n    function setFunctionUnpause(address contract_, bytes4 sig_, bool functionUnpaused_) external;\n\n    /**\n     *  @dev   Sets the protocol pause.\n     *  @param protocolPaused_ A boolean indicating the status of the protocol pause.\n     */\n    function setProtocolPause(bool protocolPaused_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Allowlist Setters                                                                                                              ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Sets whether an account can deploying an instance from a particular factory.\n     *  @param factory_       The address of the factory.\n     *  @param account_       The address of the account.\n     *  @param canDeployFrom_ Whether the account can deploy or not from the factory.\n     */\n    function setCanDeployFrom(address factory_, address account_, bool canDeployFrom_) external;\n\n    /**\n     *  @dev   Sets the validity of the borrower.\n     *  @param borrower_ The address of the borrower to set the validity for.\n     *  @param isValid_  A boolean indicating the validity of the borrower.\n     */\n    function setValidBorrower(address borrower_, bool isValid_) external;\n\n    /**\n     *  @dev   Sets the validity of a collateral asset.\n     *  @param collateralAsset_ The address of the collateral asset to set the validity for.\n     *  @param isValid_         A boolean indicating the validity of the collateral asset.\n     */\n    function setValidCollateralAsset(address collateralAsset_, bool isValid_) external;\n\n    /**\n     *  @dev   Sets the validity of the instance.\n     *  @param instanceKey_ The key of the instance to set the validity for.\n     *  @param instance_    The address of the instance to set the validity for.\n     *  @param isValid_     Boolean indicating the validity of the instance.\n     */\n    function setValidInstanceOf(bytes32 instanceKey_, address instance_, bool isValid_) external;\n\n    /**\n     *  @dev   Sets the validity of the pool asset.\n     *  @param poolAsset_ The address of the pool asset to set the validity for.\n     *  @param isValid_   A boolean indicating the validity of the pool asset.\n     */\n    function setValidPoolAsset(address poolAsset_, bool isValid_) external;\n\n    /**\n     *  @dev   Sets the validity of the pool delegate.\n     *  @param poolDelegate_ The address of the pool delegate to set the validity for.\n     *  @param isValid_      A boolean indicating the validity of the pool delegate.\n     */\n    function setValidPoolDelegate(address poolDelegate_, bool isValid_) external;\n\n    /**\n     *  @dev   Sets the validity of the pool deployer.\n     *  @param account_        The address of the pool deployer to set the validity for.\n     *  @param isPoolDeployer_ A boolean indicating the validity of the pool deployer.\n     */\n    function setValidPoolDeployer(address account_, bool isPoolDeployer_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Price Setters                                                                                                                  ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Sets the manual override price of the asset.\n     *  @param asset_ The address of the asset to set the price for.\n     *  @param price_ The price of the asset.\n     */\n    function setManualOverridePrice(address asset_, uint256 price_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Cover Setters                                                                                                                  ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Sets the maximum cover liquidation percent for the given pool manager.\n     *  @param poolManager_                The address of the pool manager to set the maximum cover liquidation percent for.\n     *  @param maxCoverLiquidationPercent_ The maximum cover liquidation percent.\n     */\n    function setMaxCoverLiquidationPercent(address poolManager_, uint256 maxCoverLiquidationPercent_) external;\n\n    /**\n     *  @dev   Sets the minimum cover amount for the given pool manager.\n     *  @param poolManager_    The address of the pool manager to set the minimum cover amount  for.\n     *  @param minCoverAmount_ The minimum cover amount.\n     */\n    function setMinCoverAmount(address poolManager_, uint256 minCoverAmount_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Fee Setters                                                                                                                    ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Sets the platform management fee rate for the given pool manager.\n     *  @param poolManager_               The address of the pool manager to set the fee for.\n     *  @param platformManagementFeeRate_ The platform management fee rate.\n     */\n    function setPlatformManagementFeeRate(address poolManager_, uint256 platformManagementFeeRate_) external;\n\n    /**\n     *  @dev   Sets the platform origination fee rate for the given pool manager.\n     *  @param poolManager_                The address of the pool manager to set the fee for.\n     *  @param platformOriginationFeeRate_ The platform origination fee rate.\n     */\n    function setPlatformOriginationFeeRate(address poolManager_, uint256 platformOriginationFeeRate_) external;\n\n    /**\n     *  @dev   Sets the platform service fee rate for the given pool manager.\n     *  @param poolManager_            The address of the pool manager to set the fee for.\n     *  @param platformServiceFeeRate_ The platform service fee rate.\n     */\n    function setPlatformServiceFeeRate(address poolManager_, uint256 platformServiceFeeRate_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Contact Control Functions                                                                                                      ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Sets the timelock for the given contract.\n     *  @param contract_   The address of the contract to add.\n     *  @param functionId_ The id of the function.\n     *  @param delay_      The delay for the timelock window.\n     *  @param duration_   The duration for the timelock window.\n     */\n    function setTimelockWindow(address contract_, bytes32 functionId_, uint128 delay_, uint128 duration_) external;\n\n    /**\n     *  @dev   Sets the timelock for the many function ids in a contract.\n     *  @param contract_    The address of the contract to add.\n     *  @param functionIds_ The ids of the functions.\n     *  @param delays_      The delays for the timelock window.\n     *  @param durations_   The durations for the timelock window.\n     */\n    function setTimelockWindows(\n        address            contract_,\n        bytes32[] calldata functionIds_,\n        uint128[] calldata delays_,\n        uint128[] calldata durations_\n    ) external;\n\n    /**\n     *  @dev   Transfer the ownership of the pool manager.\n     *  @param fromPoolDelegate_ The address of the pool delegate to transfer ownership from.\n     *  @param toPoolDelegate_   The address of the pool delegate to transfer ownership to.\n     */\n    function transferOwnedPoolManager(address fromPoolDelegate_, address toPoolDelegate_) external;\n\n    /**************************************************************************************************************************************/\n    /*** Schedule Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Checks if a call is scheduled.\n     *  @param  caller_     The contract to execute the call on.\n     *  @param  contract_   The contract to execute the call on.\n     *  @param  functionId_ The id of the function to execute.\n     *  @param  callData_   The of the parameters to pass to the function.\n     *  @return isValid_    True if the call is scheduled, false otherwise.\n     */\n    function isValidScheduledCall(\n        address          caller_,\n        address          contract_,\n        bytes32          functionId_,\n        bytes   calldata callData_\n    ) external view returns (bool isValid_);\n\n    /**\n     *  @dev   Schedules a call to be executed.\n     *  @param contract_   The contract to execute the call on.\n     *  @param functionId_ The id of the function to execute.\n     *  @param callData_   The of the parameters to pass to the function.\n     */\n    function scheduleCall(address contract_, bytes32 functionId_, bytes calldata callData_) external;\n\n    /**\n     *  @dev   Unschedules a call to be executed.\n     *  @param caller_     The contract to execute the call on.\n     *  @param functionId_ The id of the function to execute.\n     *  @param callData_   The of the parameters to pass to the function.\n     */\n    function unscheduleCall(address caller_, bytes32 functionId_, bytes calldata callData_) external;\n\n    /**\n     *  @dev   Unschedules a call to be executed.\n     *  @param caller_     The contract to execute the call on.\n     *  @param contract_   The contract to execute the call on.\n     *  @param functionId_ The id of the function to execute.\n     *  @param callData_   The of the parameters to pass to the function.\n     */\n    function unscheduleCall(address caller_, address contract_, bytes32 functionId_, bytes calldata callData_) external;\n\n}\n"},{"file_path":"contracts/interfaces/Interfaces.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.0;\n\ninterface IChainlinkAggregatorV3Like {\n\n    function latestRoundData()\n        external\n        view\n        returns (\n            uint80  roundId_,\n            int256  price_,\n            uint256 startedAt_,\n            uint256 updatedAt_,\n            uint80  answeredInRound_\n        );\n\n}\n\ninterface IPoolLike {\n\n    function manager() external view returns (address manager_);\n\n}\n\ninterface IPoolManagerLike {\n\n    function factory() external view returns (address factory_);\n\n    function poolDelegate() external view returns (address poolDelegate_);\n\n    function setActive(bool active_) external;\n\n}\n\ninterface IProxyLike {\n\n    function factory() external view returns (address factory_);\n\n}\n\ninterface IProxyFactoryLike {\n\n    function isInstance(address instance_) external view returns (bool isInstance_);\n\n}\n"},{"file_path":"modules/non-transparent-proxy/contracts/NonTransparentProxied.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\npragma solidity ^0.8.7;\n\nimport { INonTransparentProxied } from \"./interfaces/INonTransparentProxied.sol\";\n\ncontract NonTransparentProxied is INonTransparentProxied {\n\n    bytes32 internal constant ADMIN_SLOT          = bytes32(uint256(keccak256(\"eip1967.proxy.admin\"))          - 1);\n    bytes32 internal constant IMPLEMENTATION_SLOT = bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1);\n\n    function admin() public view override returns (address admin_) {\n        admin_ = _getAddress(ADMIN_SLOT);\n    }\n\n    function implementation() public view override returns (address implementation_) {\n        implementation_ = _getAddress(IMPLEMENTATION_SLOT);\n    }\n\n    function _getAddress(bytes32 slot_) internal view returns (address value_) {\n        assembly {\n            value_ := sload(slot_)\n        }\n    }\n\n}\n"},{"file_path":"modules/non-transparent-proxy/contracts/interfaces/INonTransparentProxied.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\npragma solidity ^0.8.7;\n\ninterface INonTransparentProxied {\n\n    /**\n     *  @dev    Returns the proxy's admin address.\n     *  @return admin_ The address of the admin.\n     */\n    function admin() external view returns (address admin_);\n\n    /**\n     *  @dev    Returns the proxy's implementation address.\n     *  @return implementation_ The address of the implementation.\n     */\n    function implementation() external view returns (address implementation_);\n\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset_","type":"address"},{"indexed":false,"internalType":"uint256","name":"bootstrapMint_","type":"uint256"}],"name":"BootstrapMintSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"contract_","type":"address"},{"indexed":true,"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"dataHash_","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp_","type":"uint256"}],"name":"CallScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"contract_","type":"address"},{"indexed":true,"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"dataHash_","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timestamp_","type":"uint256"}],"name":"CallUnscheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"factory_","type":"address"},{"indexed":true,"internalType":"address","name":"account_","type":"address"},{"indexed":false,"internalType":"bool","name":"canDeployFrom_","type":"bool"}],"name":"CanDeployFromSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"contract_","type":"address"},{"indexed":false,"internalType":"bool","name":"contractPaused_","type":"bool"}],"name":"ContractPauseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousDelay_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentDelay_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousDuration_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"currentDuration_","type":"uint256"}],"name":"DefaultTimelockParametersSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"contract_","type":"address"},{"indexed":true,"internalType":"bytes4","name":"sig_","type":"bytes4"},{"indexed":false,"internalType":"bool","name":"functionUnpaused_","type":"bool"}],"name":"FunctionUnpauseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousGovernor_","type":"address"},{"indexed":true,"internalType":"address","name":"currentGovernor_","type":"address"}],"name":"GovernorshipAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset_","type":"address"},{"indexed":false,"internalType":"uint256","name":"price_","type":"uint256"}],"name":"ManualOverridePriceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousMapleTreasury_","type":"address"},{"indexed":true,"internalType":"address","name":"currentMapleTreasury_","type":"address"}],"name":"MapleTreasurySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager_","type":"address"},{"indexed":false,"internalType":"uint256","name":"maxCoverLiquidationPercent_","type":"uint256"}],"name":"MaxCoverLiquidationPercentSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousMigrationAdmin_","type":"address"},{"indexed":true,"internalType":"address","name":"nextMigrationAdmin_","type":"address"}],"name":"MigrationAdminSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager_","type":"address"},{"indexed":false,"internalType":"uint256","name":"minCoverAmount_","type":"uint256"}],"name":"MinCoverAmountSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperationalAdmin_","type":"address"},{"indexed":true,"internalType":"address","name":"currentOperationalAdmin_","type":"address"}],"name":"OperationalAdminSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingGovernor_","type":"address"}],"name":"PendingGovernorSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager_","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformManagementFeeRate_","type":"uint256"}],"name":"PlatformManagementFeeRateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager_","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformOriginationFeeRate_","type":"uint256"}],"name":"PlatformOriginationFeeRateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager_","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformServiceFeeRate_","type":"uint256"}],"name":"PlatformServiceFeeRateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolManager_","type":"address"},{"indexed":true,"internalType":"address","name":"poolDelegate_","type":"address"}],"name":"PoolManagerActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromPoolDelegate_","type":"address"},{"indexed":true,"internalType":"address","name":"toPoolDelegate_","type":"address"},{"indexed":true,"internalType":"address","name":"poolManager_","type":"address"}],"name":"PoolManagerOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset_","type":"address"},{"indexed":true,"internalType":"address","name":"oracle_","type":"address"},{"indexed":false,"internalType":"uint96","name":"maxDelay_","type":"uint96"}],"name":"PriceOracleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":false,"internalType":"bool","name":"protocolPaused_","type":"bool"}],"name":"ProtocolPauseSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousSecurityAdmin_","type":"address"},{"indexed":true,"internalType":"address","name":"currentSecurityAdmin_","type":"address"}],"name":"SecurityAdminSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contract_","type":"address"},{"indexed":true,"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"indexed":false,"internalType":"uint128","name":"delay_","type":"uint128"},{"indexed":false,"internalType":"uint128","name":"duration_","type":"uint128"}],"name":"TimelockWindowSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"borrower_","type":"address"},{"indexed":false,"internalType":"bool","name":"isValid_","type":"bool"}],"name":"ValidBorrowerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"collateralAsset_","type":"address"},{"indexed":false,"internalType":"bool","name":"isValid_","type":"bool"}],"name":"ValidCollateralAssetSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"instanceKey_","type":"bytes32"},{"indexed":true,"internalType":"address","name":"instance_","type":"address"},{"indexed":false,"internalType":"bool","name":"isValid_","type":"bool"}],"name":"ValidInstanceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolAsset_","type":"address"},{"indexed":false,"internalType":"bool","name":"isValid_","type":"bool"}],"name":"ValidPoolAssetSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account_","type":"address"},{"indexed":false,"internalType":"bool","name":"isValid_","type":"bool"}],"name":"ValidPoolDelegateSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poolDeployer_","type":"address"},{"indexed":false,"internalType":"bool","name":"isValid_","type":"bool"}],"name":"ValidPoolDeployerSet","type":"event"},{"inputs":[],"name":"HUNDRED_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"}],"name":"activatePoolManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"admin_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bootstrapMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller_","type":"address"}],"name":"canDeploy","outputs":[{"internalType":"bool","name":"canDeploy_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"factory_","type":"address"},{"internalType":"address","name":"caller_","type":"address"}],"name":"canDeployFrom","outputs":[{"internalType":"bool","name":"canDeployFrom_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultTimelockParameters","outputs":[{"internalType":"uint128","name":"delay","type":"uint128"},{"internalType":"uint128","name":"duration","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset_","type":"address"}],"name":"getLatestPrice","outputs":[{"internalType":"uint256","name":"latestPrice_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"governor_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"address","name":"implementation_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBorrower","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isCollateralAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isContractPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"factoryId_","type":"bytes32"},{"internalType":"address","name":"factory_","type":"address"}],"name":"isFactory","outputs":[{"internalType":"bool","name":"isFactory_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"sig_","type":"bytes4"}],"name":"isFunctionPaused","outputs":[{"internalType":"bool","name":"functionIsPaused_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"bytes4","name":"sig_","type":"bytes4"}],"name":"isFunctionPaused","outputs":[{"internalType":"bool","name":"functionIsPaused_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"isFunctionUnpaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"isInstanceOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPoolAsset","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"isPoolDelegate","outputs":[{"internalType":"bool","name":"isPoolDelegate_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller_","type":"address"}],"name":"isPoolDeployer","outputs":[{"internalType":"bool","name":"isPoolDeployer_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"caller_","type":"address"},{"internalType":"address","name":"contract_","type":"address"},{"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"internalType":"bytes","name":"callData_","type":"bytes"}],"name":"isValidScheduledCall","outputs":[{"internalType":"bool","name":"isValid_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"manualOverridePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mapleTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxCoverLiquidationPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrationAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minCoverAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operationalAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"ownedPoolManager","outputs":[{"internalType":"address","name":"poolManager_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"platformManagementFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"platformOriginationFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"platformServiceFeeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolDelegates","outputs":[{"internalType":"address","name":"ownedPoolManager","type":"address"},{"internalType":"bool","name":"isPoolDelegate","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"priceOracleOf","outputs":[{"internalType":"address","name":"oracle","type":"address"},{"internalType":"uint96","name":"maxDelay","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"internalType":"bytes","name":"callData_","type":"bytes"}],"name":"scheduleCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"scheduledCalls","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"securityAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"asset_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"setBootstrapMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"factory_","type":"address"},{"internalType":"address","name":"account_","type":"address"},{"internalType":"bool","name":"canDeployFrom_","type":"bool"}],"name":"setCanDeployFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"bool","name":"contractPaused_","type":"bool"}],"name":"setContractPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"defaultTimelockDelay_","type":"uint128"},{"internalType":"uint128","name":"defaultTimelockDuration_","type":"uint128"}],"name":"setDefaultTimelockParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"bytes4","name":"sig_","type":"bytes4"},{"internalType":"bool","name":"functionUnpaused_","type":"bool"}],"name":"setFunctionUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset_","type":"address"},{"internalType":"uint256","name":"price_","type":"uint256"}],"name":"setManualOverridePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mapleTreasury_","type":"address"}],"name":"setMapleTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"uint256","name":"maxCoverLiquidationPercent_","type":"uint256"}],"name":"setMaxCoverLiquidationPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"migrationAdmin_","type":"address"}],"name":"setMigrationAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"uint256","name":"minCoverAmount_","type":"uint256"}],"name":"setMinCoverAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operationalAdmin_","type":"address"}],"name":"setOperationalAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pendingGovernor_","type":"address"}],"name":"setPendingGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"uint256","name":"platformManagementFeeRate_","type":"uint256"}],"name":"setPlatformManagementFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"uint256","name":"platformOriginationFeeRate_","type":"uint256"}],"name":"setPlatformOriginationFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolManager_","type":"address"},{"internalType":"uint256","name":"platformServiceFeeRate_","type":"uint256"}],"name":"setPlatformServiceFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset_","type":"address"},{"internalType":"address","name":"oracle_","type":"address"},{"internalType":"uint96","name":"maxDelay_","type":"uint96"}],"name":"setPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"protocolPaused_","type":"bool"}],"name":"setProtocolPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"securityAdmin_","type":"address"}],"name":"setSecurityAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"internalType":"uint128","name":"delay_","type":"uint128"},{"internalType":"uint128","name":"duration_","type":"uint128"}],"name":"setTimelockWindow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contract_","type":"address"},{"internalType":"bytes32[]","name":"functionIds_","type":"bytes32[]"},{"internalType":"uint128[]","name":"delays_","type":"uint128[]"},{"internalType":"uint128[]","name":"durations_","type":"uint128[]"}],"name":"setTimelockWindows","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrower_","type":"address"},{"internalType":"bool","name":"isValid_","type":"bool"}],"name":"setValidBorrower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collateralAsset_","type":"address"},{"internalType":"bool","name":"isValid_","type":"bool"}],"name":"setValidCollateralAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"instanceKey_","type":"bytes32"},{"internalType":"address","name":"instance_","type":"address"},{"internalType":"bool","name":"isValid_","type":"bool"}],"name":"setValidInstanceOf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolAsset_","type":"address"},{"internalType":"bool","name":"isValid_","type":"bool"}],"name":"setValidPoolAsset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"bool","name":"isValid_","type":"bool"}],"name":"setValidPoolDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"},{"internalType":"bool","name":"isPoolDeployer_","type":"bool"}],"name":"setValidPoolDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timelockParametersOf","outputs":[{"internalType":"uint128","name":"delay","type":"uint128"},{"internalType":"uint128","name":"duration","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fromPoolDelegate_","type":"address"},{"internalType":"address","name":"toPoolDelegate_","type":"address"}],"name":"transferOwnedPoolManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller_","type":"address"},{"internalType":"address","name":"contract_","type":"address"},{"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"internalType":"bytes","name":"callData_","type":"bytes"}],"name":"unscheduleCall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"caller_","type":"address"},{"internalType":"bytes32","name":"functionId_","type":"bytes32"},{"internalType":"bytes","name":"callData_","type":"bytes"}],"name":"unscheduleCall","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":null}