{"file_path":"modules/pool-v2-private/contracts/MaplePool.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.25;\n\nimport { ERC20 }       from \"../modules/erc20/contracts/ERC20.sol\";\nimport { ERC20Helper } from \"../modules/erc20-helper/src/ERC20Helper.sol\";\n\nimport { IPoolManagerLike }   from \"./interfaces/Interfaces.sol\";\nimport { IERC20, IMaplePool } from \"./interfaces/IMaplePool.sol\";\n\n/*\n\n    ███╗   ███╗ █████╗ ██████╗ ██╗     ███████╗    ██████╗  ██████╗  ██████╗ ██╗\n    ████╗ ████║██╔══██╗██╔══██╗██║     ██╔════╝    ██╔══██╗██╔═══██╗██╔═══██╗██║\n    ██╔████╔██║███████║██████╔╝██║     █████╗      ██████╔╝██║   ██║██║   ██║██║\n    ██║╚██╔╝██║██╔══██║██╔═══╝ ██║     ██╔══╝      ██╔═══╝ ██║   ██║██║   ██║██║\n    ██║ ╚═╝ ██║██║  ██║██║     ███████╗███████╗    ██║     ╚██████╔╝╚██████╔╝███████╗\n    ╚═╝     ╚═╝╚═╝  ╚═╝╚═╝     ╚══════╝╚══════╝    ╚═╝      ╚═════╝  ╚═════╝ ╚══════╝\n\n*/\n\ncontract MaplePool is IMaplePool, ERC20 {\n\n    uint256 public immutable override BOOTSTRAP_MINT;\n\n    address public override asset;    // Underlying ERC-20 asset handled by the ERC-4626 contract.\n    address public override manager;  // Address of the contract that manages administrative functionality.\n\n    uint256 private _locked = 1;  // Used when checking for reentrancy.\n\n    constructor(\n        address manager_,\n        address asset_,\n        address destination_,\n        uint256 bootstrapMint_,\n        uint256 initialSupply_,\n        string memory name_,\n        string memory symbol_\n    )\n        ERC20(name_, symbol_, ERC20(asset_).decimals())\n    {\n        require((manager = manager_) != address(0), \"P:C:ZERO_MANAGER\");\n        require((asset   = asset_)   != address(0), \"P:C:ZERO_ASSET\");\n\n        if (initialSupply_ != 0) {\n            _mint(destination_, initialSupply_);\n        }\n\n        BOOTSTRAP_MINT = bootstrapMint_;\n\n        require(ERC20Helper.approve(asset_, manager_, type(uint256).max), \"P:C:FAILED_APPROVE\");\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Modifiers                                                                                                                      ***/\n    /**************************************************************************************************************************************/\n\n    modifier checkCall(bytes32 functionId_) {\n        ( bool success_, string memory errorMessage_ ) = IPoolManagerLike(manager).canCall(functionId_, msg.sender, msg.data[4:]);\n\n        require(success_, errorMessage_);\n\n        _;\n    }\n\n    modifier nonReentrant() {\n        require(_locked == 1, \"P:LOCKED\");\n\n        _locked = 2;\n\n        _;\n\n        _locked = 1;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** LP Functions                                                                                                                   ***/\n    /**************************************************************************************************************************************/\n\n    function deposit(uint256 assets_, address receiver_) external override nonReentrant checkCall(\"P:deposit\") returns (uint256 shares_) {\n        _mint(shares_ = previewDeposit(assets_), assets_, receiver_, msg.sender);\n    }\n\n    function depositWithPermit(\n        uint256 assets_,\n        address receiver_,\n        uint256 deadline_,\n        uint8   v_,\n        bytes32 r_,\n        bytes32 s_\n    )\n        external override nonReentrant checkCall(\"P:depositWithPermit\") returns (uint256 shares_)\n    {\n        ERC20(asset).permit(msg.sender, address(this), assets_, deadline_, v_, r_, s_);\n        _mint(shares_ = previewDeposit(assets_), assets_, receiver_, msg.sender);\n    }\n\n    function mint(uint256 shares_, address receiver_) external override nonReentrant checkCall(\"P:mint\") returns (uint256 assets_) {\n        _mint(shares_, assets_ = previewMint(shares_), receiver_, msg.sender);\n    }\n\n    function mintWithPermit(\n        uint256 shares_,\n        address receiver_,\n        uint256 maxAssets_,\n        uint256 deadline_,\n        uint8   v_,\n        bytes32 r_,\n        bytes32 s_\n    )\n        external override nonReentrant checkCall(\"P:mintWithPermit\") returns (uint256 assets_)\n    {\n        require((assets_ = previewMint(shares_)) <= maxAssets_, \"P:MWP:INSUFFICIENT_PERMIT\");\n\n        ERC20(asset).permit(msg.sender, address(this), maxAssets_, deadline_, v_, r_, s_);\n        _mint(shares_, assets_, receiver_, msg.sender);\n    }\n\n    function redeem(uint256 shares_, address receiver_, address owner_)\n        external override nonReentrant checkCall(\"P:redeem\") returns (uint256 assets_)\n    {\n        uint256 redeemableShares_;\n        ( redeemableShares_, assets_ ) = IPoolManagerLike(manager).processRedeem(shares_, owner_, msg.sender);\n        _burn(redeemableShares_, assets_, receiver_, owner_, msg.sender);\n    }\n\n    function withdraw(uint256 assets_, address receiver_, address owner_)\n        external override nonReentrant checkCall(\"P:withdraw\") returns (uint256 shares_)\n    {\n        ( shares_, assets_ ) = IPoolManagerLike(manager).processWithdraw(assets_, owner_, msg.sender);\n        _burn(shares_, assets_, receiver_, owner_, msg.sender);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** ERC-20 Overridden Functions                                                                                                    ***/\n    /**************************************************************************************************************************************/\n\n    function transfer(\n        address recipient_,\n        uint256 amount_\n    )\n        public override(IERC20, ERC20) checkCall(\"P:transfer\") returns (bool success_)\n    {\n        success_ = super.transfer(recipient_, amount_);\n    }\n\n    function transferFrom(\n        address owner_,\n        address recipient_,\n        uint256 amount_\n    )\n        public override(IERC20, ERC20) checkCall(\"P:transferFrom\") returns (bool success_)\n    {\n        success_ = super.transferFrom(owner_, recipient_, amount_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Withdrawal Request Functions                                                                                                   ***/\n    /**************************************************************************************************************************************/\n\n    function removeShares(uint256 shares_, address owner_)\n        external override nonReentrant checkCall(\"P:removeShares\") returns (uint256 sharesReturned_)\n    {\n        if (msg.sender != owner_) _decreaseAllowance(owner_, msg.sender, shares_);\n\n        emit SharesRemoved(\n            owner_,\n            sharesReturned_ = IPoolManagerLike(manager).removeShares(shares_, owner_)\n        );\n    }\n\n    function requestRedeem(uint256 shares_, address owner_)\n        external override nonReentrant checkCall(\"P:requestRedeem\") returns (uint256 escrowedShares_)\n    {\n        emit RedemptionRequested(\n            owner_,\n            shares_,\n            escrowedShares_ = _requestRedeem(shares_, owner_)\n        );\n    }\n\n    function requestWithdraw(uint256 assets_, address owner_)\n        external override nonReentrant checkCall(\"P:requestWithdraw\") returns (uint256 escrowedShares_)\n    {\n        emit WithdrawRequested(\n            owner_,\n            assets_,\n            escrowedShares_ = _requestWithdraw(assets_, owner_)\n        );\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Internal Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    function _burn(uint256 shares_, uint256 assets_, address receiver_, address owner_, address caller_) internal {\n        require(receiver_ != address(0), \"P:B:ZERO_RECEIVER\");\n\n        if (shares_ == 0) return;\n\n        if (caller_ != owner_) {\n            _decreaseAllowance(owner_, caller_, shares_);\n        }\n\n        _burn(owner_, shares_);\n\n        emit Withdraw(caller_, receiver_, owner_, assets_, shares_);\n\n        require(ERC20Helper.transfer(asset, receiver_, assets_), \"P:B:TRANSFER\");\n    }\n\n    function _divRoundUp(uint256 numerator_, uint256 divisor_) internal pure returns (uint256 result_) {\n        result_ = (numerator_ + divisor_ - 1) / divisor_;\n    }\n\n    function _mint(uint256 shares_, uint256 assets_, address receiver_, address caller_) internal {\n        require(receiver_ != address(0), \"P:M:ZERO_RECEIVER\");\n        require(shares_   != uint256(0), \"P:M:ZERO_SHARES\");\n        require(assets_   != uint256(0), \"P:M:ZERO_ASSETS\");\n\n        if (totalSupply == 0 && BOOTSTRAP_MINT != 0) {\n            _mint(address(0), BOOTSTRAP_MINT);\n\n            emit BootstrapMintPerformed(caller_, receiver_, assets_, shares_, BOOTSTRAP_MINT);\n\n            shares_ -= BOOTSTRAP_MINT;\n        }\n\n        _mint(receiver_, shares_);\n\n        emit Deposit(caller_, receiver_, assets_, shares_);\n\n        require(ERC20Helper.transferFrom(asset, caller_, address(this), assets_), \"P:M:TRANSFER_FROM\");\n    }\n\n    function _requestRedeem(uint256 shares_, address owner_) internal returns (uint256 escrowShares_) {\n        address destination_;\n\n        ( escrowShares_, destination_ ) = IPoolManagerLike(manager).getEscrowParams(owner_, shares_);\n\n        if (msg.sender != owner_) {\n            _decreaseAllowance(owner_, msg.sender, escrowShares_);\n        }\n\n        if (escrowShares_ != 0 && destination_ != address(0)) {\n            _transfer(owner_, destination_, escrowShares_);\n        }\n\n        IPoolManagerLike(manager).requestRedeem(escrowShares_, owner_, msg.sender);\n    }\n\n    function _requestWithdraw(uint256 assets_, address owner_) internal returns (uint256 escrowShares_) {\n        address destination_;\n\n        ( escrowShares_, destination_ ) = IPoolManagerLike(manager).getEscrowParams(owner_, convertToExitShares(assets_));\n\n        if (msg.sender != owner_) {\n            _decreaseAllowance(owner_, msg.sender, escrowShares_);\n        }\n\n        if (escrowShares_ != 0 && destination_ != address(0)) {\n            _transfer(owner_, destination_, escrowShares_);\n        }\n\n        IPoolManagerLike(manager).requestWithdraw(escrowShares_, assets_, owner_, msg.sender);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** External View Functions                                                                                                        ***/\n    /**************************************************************************************************************************************/\n\n    function balanceOfAssets(address account_) external view override returns (uint256 balanceOfAssets_) {\n        balanceOfAssets_ = convertToAssets(balanceOf[account_]);\n    }\n\n    function maxDeposit(address receiver_) external view override returns (uint256 maxAssets_) {\n        maxAssets_ = IPoolManagerLike(manager).maxDeposit(receiver_);\n    }\n\n    function maxMint(address receiver_) external view override returns (uint256 maxShares_) {\n        maxShares_ = IPoolManagerLike(manager).maxMint(receiver_);\n    }\n\n    function maxRedeem(address owner_) external view override returns (uint256 maxShares_) {\n        maxShares_ = IPoolManagerLike(manager).maxRedeem(owner_);\n    }\n\n    function maxWithdraw(address owner_) external view override returns (uint256 maxAssets_) {\n        maxAssets_ = IPoolManagerLike(manager).maxWithdraw(owner_);\n    }\n\n    function previewRedeem(uint256 shares_) external view override returns (uint256 assets_) {\n        assets_ = IPoolManagerLike(manager).previewRedeem(msg.sender, shares_);\n    }\n\n    function previewWithdraw(uint256 assets_) external view override returns (uint256 shares_) {\n        shares_ = IPoolManagerLike(manager).previewWithdraw(msg.sender, assets_);\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Public View Functions                                                                                                          ***/\n    /**************************************************************************************************************************************/\n\n    function convertToAssets(uint256 shares_) public view override returns (uint256 assets_) {\n        uint256 totalSupply_ = totalSupply;\n\n        assets_ = totalSupply_ == 0 ? shares_ : (shares_ * totalAssets()) / totalSupply_;\n    }\n\n    function convertToExitAssets(uint256 shares_) public view override returns (uint256 assets_) {\n        uint256 totalSupply_ = totalSupply;\n\n        assets_ = totalSupply_ == 0 ? shares_ : shares_ * (totalAssets() - unrealizedLosses()) / totalSupply_;\n    }\n\n    function convertToShares(uint256 assets_) public view override returns (uint256 shares_) {\n        uint256 totalSupply_ = totalSupply;\n\n        shares_ = totalSupply_ == 0 ? assets_ : (assets_ * totalSupply_) / totalAssets();\n    }\n\n    function convertToExitShares(uint256 amount_) public view override returns (uint256 shares_) {\n        shares_ = _divRoundUp(amount_ * totalSupply, totalAssets() - unrealizedLosses());\n    }\n\n    function previewDeposit(uint256 assets_) public view override returns (uint256 shares_) {\n        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,\n        // it should round DOWN if it’s calculating the amount of shares to issue to a user, given an amount of assets provided.\n        shares_ = convertToShares(assets_);\n    }\n\n    function previewMint(uint256 shares_) public view override returns (uint256 assets_) {\n        uint256 totalSupply_ = totalSupply;\n\n        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,\n        // it should round UP if it’s calculating the amount of assets a user must provide, to be issued a given amount of shares.\n        assets_ = totalSupply_ == 0 ? shares_ : _divRoundUp(shares_ * totalAssets(), totalSupply_);\n    }\n\n    function totalAssets() public view override returns (uint256 totalAssets_) {\n        totalAssets_ = IPoolManagerLike(manager).totalAssets();\n    }\n\n    function unrealizedLosses() public view override returns (uint256 unrealizedLosses_) {\n        unrealizedLosses_ = IPoolManagerLike(manager).unrealizedLosses();\n    }\n\n}\n","deployed_bytecode":"0x608060405234801561000f575f80fd5b5060043610610255575f3560e01c80636e553f6511610140578063b460af94116100bf578063ce96cb7711610084578063ce96cb771461055e578063d505accf14610571578063d905777e14610586578063dd62ed3e14610599578063ef8b30f7146105c3578063f1a0e4cb146105d6575f80fd5b8063b460af94146104ff578063ba08765214610512578063c63d75b614610525578063c6e6f59214610538578063ccc143b81461054b575f80fd5b806395d89b411161010557806395d89b41146104ab578063a457c2d7146104b3578063a58c3eff146104c6578063a9059cbb146104d9578063b3d7f6b9146104ec575f80fd5b80636e553f651461043457806370a08231146104475780637ecebe00146104665780639159b2061461048557806394bf804d14610498575f80fd5b8063313ce567116101d7578063481c6a751161019c578063481c6a75146103cd5780634cdad506146103e057806350496cbd146103f357806350921b231461040657806360dd37d91461041957806367e2ba231461042c575f80fd5b8063313ce5671461033b5780633644e5151461037457806338d52e0f1461037c57806339509351146103a7578063402d267d146103ba575f80fd5b8063107703ab1161021d578063107703ab146102d257806318160ddd146102e55780631b8f1830146102ee57806323b872dd1461030157806330adf81f14610314575f80fd5b806301e1d1141461025957806306fdde031461027457806307a2d13a14610289578063095ea7b31461029c5780630a28a477146102bf575b5f80fd5b6102616105fd565b6040519081526020015b60405180910390f35b61027c61066c565b60405161026b91906124b5565b6102616102973660046124ea565b6106f7565b6102af6102aa366004612518565b61072d565b604051901515815260200161026b565b6102616102cd3660046124ea565b610743565b6102616102e0366004612542565b6107b5565b61026160025481565b6102616102fc366004612542565b610902565b6102af61030f366004612570565b610aaa565b6102617f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6103627f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff909116815260200161026b565b610261610b7e565b60065461038f906001600160a01b031681565b6040516001600160a01b03909116815260200161026b565b6102af6103b5366004612518565b610c2b565b6102616103c83660046125ae565b610c66565b60075461038f906001600160a01b031681565b6102616103ee3660046124ea565b610c98565b6102616104013660046124ea565b610ccf565b6102616104143660046125de565b610cf5565b610261610427366004612634565b610e70565b610261611039565b610261610442366004612542565b611080565b6102616104553660046125ae565b60036020525f908152604090205481565b6102616104743660046125ae565b60056020525f908152604090205481565b6102616104933660046125ae565b611184565b6102616104a6366004612542565b6111a5565b61027c611298565b6102af6104c1366004612518565b6112a5565b6102616104d43660046124ea565b6112b1565b6102af6104e7366004612518565b6112e2565b6102616104fa3660046124ea565b6113b0565b61026161050d366004612694565b6113d6565b610261610520366004612694565b61154f565b6102616105333660046125ae565b6116c8565b6102616105463660046124ea565b6116fa565b610261610559366004612542565b611717565b61026161056c3660046125ae565b611834565b61058461057f3660046126d3565b611866565b005b6102616105943660046125ae565b611add565b6102616105a7366004612704565b600460209081525f928352604080842090915290825290205481565b6102616105d13660046124ea565b611b0f565b6102617f000000000000000000000000000000000000000000000000000000000000000081565b600754604080516278744560e21b815290515f926001600160a01b0316916301e1d1149160048083019260209291908290030181865afa158015610643573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106679190612730565b905090565b5f805461067890612747565b80601f01602080910402602001604051908101604052809291908181526020018280546106a490612747565b80156106ef5780601f106106c6576101008083540402835291602001916106ef565b820191905f5260205f20905b8154815290600101906020018083116106d257829003601f168201915b505050505081565b6002545f908015610724578061070b6105fd565b6107159085612793565b61071f91906127aa565b610726565b825b9392505050565b5f610739338484611b19565b5060015b92915050565b600754604051632ef1bc7760e21b8152336004820152602481018390525f916001600160a01b03169063bbc6f1dc906044015b602060405180830381865afa158015610791573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073d9190612730565b5f6008546001146107e15760405162461bcd60e51b81526004016107d8906127c9565b60405180910390fd5b60026008556007546e503a7265717565737452656465656d60881b905f9081906001600160a01b0316637bd243de843361081e36600481886127eb565b6040518563ffffffff1660e01b815260040161083d9493929190612812565b5f60405180830381865afa158015610857573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261087e919081019061287b565b915091508181906108a25760405162461bcd60e51b81526004016107d891906124b5565b50846001600160a01b03167f46949ee51143d5b58e4df83122d6c382a04f7bffbe563f78cd7fa61ee519ec08876108d98989611b7a565b6040805192835260208301829052909750015b60405180910390a2505060016008555092915050565b5f6008546001146109255760405162461bcd60e51b81526004016107d8906127c9565b60026008556007546d503a72656d6f766553686172657360901b905f9081906001600160a01b0316637bd243de843361096136600481886127eb565b6040518563ffffffff1660e01b81526004016109809493929190612812565b5f60405180830381865afa15801561099a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109c1919081019061287b565b915091508181906109e55760405162461bcd60e51b81526004016107d891906124b5565b50336001600160a01b03861614610a0157610a01853388611ca5565b6007546040516301b8f18360e41b8152600481018890526001600160a01b0387811660248301819052927f4b171f7fc0550bd6b41ba56e9b2b88100206431510ba9427518f3485198db36d92911690631b8f1830906044016020604051808303815f875af1158015610a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a999190612730565b6040518181529096506020016108ec565b6007545f906d503a7472616e7366657246726f6d60901b90829081906001600160a01b0316637bd243de8433610ae336600481886127eb565b6040518563ffffffff1660e01b8152600401610b029493929190612812565b5f60405180830381865afa158015610b1c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b43919081019061287b565b91509150818190610b675760405162461bcd60e51b81526004016107d891906124b5565b50610b73878787611ce7565b979650505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610bae9190612937565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610739918590610c619086906129d5565b611b19565b60075460405163402d267d60e01b81526001600160a01b0383811660048301525f92169063402d267d90602401610776565b60075460405163cbe52ae360e01b8152336004820152602481018390525f916001600160a01b03169063cbe52ae390604401610776565b6002545f9080156107245780610ce3611039565b610ceb6105fd565b61070b91906129e8565b5f600854600114610d185760405162461bcd60e51b81526004016107d8906127c9565b600260085560075472140e99195c1bdcda5d15da5d1a14195c9b5a5d606a1b905f9081906001600160a01b0316637bd243de8433610d5936600481886127eb565b6040518563ffffffff1660e01b8152600401610d789493929190612812565b5f60405180830381865afa158015610d92573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610db9919081019061287b565b91509150818190610ddd5760405162461bcd60e51b81526004016107d891906124b5565b5060065460405163d505accf60e01b81526001600160a01b039091169063d505accf90610e1a90339030908f908e908e908e908e906004016129fb565b5f604051808303815f87803b158015610e31575f80fd5b505af1158015610e43573d5f803e3d5ffd5b50505050610e5e610e538b611b0f565b9450848b8b33611d08565b50506001600855509695505050505050565b5f600854600114610e935760405162461bcd60e51b81526004016107d8906127c9565b60026008556007546f140e9b5a5b9d15da5d1a14195c9b5a5d60821b905f9081906001600160a01b0316637bd243de8433610ed136600481886127eb565b6040518563ffffffff1660e01b8152600401610ef09493929190612812565b5f60405180830381865afa158015610f0a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f31919081019061287b565b91509150818190610f555760405162461bcd60e51b81526004016107d891906124b5565b5088610f608c6113b0565b9450841115610fb15760405162461bcd60e51b815260206004820152601960248201527f503a4d57503a494e53554646494349454e545f5045524d49540000000000000060448201526064016107d8565b60065460405163d505accf60e01b81526001600160a01b039091169063d505accf90610fed90339030908e908e908e908e908e906004016129fb565b5f604051808303815f87803b158015611004575f80fd5b505af1158015611016573d5f803e3d5ffd5b505050506110268b858c33611d08565b5050600160085550979650505050505050565b600754604080516367e2ba2360e01b815290515f926001600160a01b0316916367e2ba239160048083019260209291908290030181865afa158015610643573d5f803e3d5ffd5b5f6008546001146110a35760405162461bcd60e51b81526004016107d8906127c9565b600260085560075468140e99195c1bdcda5d60ba1b905f9081906001600160a01b0316637bd243de84336110da36600481886127eb565b6040518563ffffffff1660e01b81526004016110f99493929190612812565b5f60405180830381865afa158015611113573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261113a919081019061287b565b9150915081819061115e5760405162461bcd60e51b81526004016107d891906124b5565b5061117661116b87611b0f565b945084878733611d08565b505060016008555092915050565b6001600160a01b0381165f9081526003602052604081205461073d906106f7565b5f6008546001146111c85760405162461bcd60e51b81526004016107d8906127c9565b600260085560075465140e9b5a5b9d60d21b905f9081906001600160a01b0316637bd243de84336111fc36600481886127eb565b6040518563ffffffff1660e01b815260040161121b9493929190612812565b5f60405180830381865afa158015611235573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125c919081019061287b565b915091508181906112805760405162461bcd60e51b81526004016107d891906124b5565b506111768661128e886113b0565b9550858733611d08565b6001805461067890612747565b5f610739338484611ca5565b5f61073d600254836112c39190612793565b6112cb611039565b6112d36105fd565b6112dd91906129e8565b611f93565b6007545f9069281d3a3930b739b332b960b11b90829081906001600160a01b0316637bd243de843361131736600481886127eb565b6040518563ffffffff1660e01b81526004016113369493929190612812565b5f60405180830381865afa158015611350573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611377919081019061287b565b9150915081819061139b5760405162461bcd60e51b81526004016107d891906124b5565b506113a68686611fb5565b9695505050505050565b6002545f9080156107245761071f6113c66105fd565b6113d09085612793565b82611f93565b5f6008546001146113f95760405162461bcd60e51b81526004016107d8906127c9565b600260085560075469503a776974686472617760b01b905f9081906001600160a01b0316637bd243de843361143136600481886127eb565b6040518563ffffffff1660e01b81526004016114509493929190612812565b5f60405180830381865afa15801561146a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611491919081019061287b565b915091508181906114b55760405162461bcd60e51b81526004016107d891906124b5565b506007546040516371a2fa5b60e11b8152600481018990526001600160a01b0387811660248301523360448301529091169063e345f4b69060640160408051808303815f875af115801561150b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f9190612a3c565b975093506115408488888833611fc1565b50506001600855509392505050565b5f6008546001146115725760405162461bcd60e51b81526004016107d8906127c9565b600260085560075467503a72656465656d60c01b905f9081906001600160a01b0316637bd243de84336115a836600481886127eb565b6040518563ffffffff1660e01b81526004016115c79493929190612812565b5f60405180830381865afa1580156115e1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611608919081019061287b565b9150915081819061162c5760405162461bcd60e51b81526004016107d891906124b5565b506007546040516360af6ad360e01b8152600481018990526001600160a01b0387811660248301523360448301525f9216906360af6ad39060640160408051808303815f875af1158015611682573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a69190612a3c565b955090506116b78186898933611fc1565b505060016008555090949350505050565b60075460405163631ebadb60e11b81526001600160a01b0383811660048301525f92169063c63d75b690602401610776565b6002545f9080156107245761170d6105fd565b6107158285612793565b5f60085460011461173a5760405162461bcd60e51b81526004016107d8906127c9565b600260085560075470503a72657175657374576974686472617760781b905f9081906001600160a01b0316637bd243de843361177936600481886127eb565b6040518563ffffffff1660e01b81526004016117989493929190612812565b5f60405180830381865afa1580156117b2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117d9919081019061287b565b915091508181906117fd5760405162461bcd60e51b81526004016107d891906124b5565b50846001600160a01b03167fd72eb5d043f24a0168ae744d5c44f9596fd673a26bf74d9646bff4b844882d14876108d989896120f8565b60075460405163ce96cb7760e01b81526001600160a01b0383811660048301525f92169063ce96cb7790602401610776565b428410156118a85760405162461bcd60e51b815260206004820152600f60248201526e115490cc8c0e940e91561412549151608a1b60448201526064016107d8565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081118015906118e857508260ff16601b14806118e857508260ff16601c145b6119285760405162461bcd60e51b815260206004820152601160248201527045524332303a503a4d414c4c4541424c4560781b60448201526064016107d8565b5f611931610b7e565b6001600160a01b038981165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611a46573d5f803e3d5ffd5b505050602060405103519050886001600160a01b0316816001600160a01b0316148015611a7b57506001600160a01b03891615155b611ac75760405162461bcd60e51b815260206004820152601960248201527f45524332303a503a494e56414c49445f5349474e41545552450000000000000060448201526064016107d8565b5050611ad4878787611b19565b50505050505050565b600754604051636c82bbbf60e11b81526001600160a01b0383811660048301525f92169063d905777e90602401610776565b5f61073d826116fa565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600754604051635cf2ed5760e01b81526001600160a01b038381166004830152602482018590525f928392911690635cf2ed57906044016040805180830381865afa158015611bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bef9190612a5e565b9092509050336001600160a01b03841614611c0f57611c0f833384611ca5565b8115801590611c2657506001600160a01b03811615155b15611c3657611c3683828461220e565b600754604051633ea0e43760e11b8152600481018490526001600160a01b03858116602483015233604483015290911690637d41c86e906064015b5f604051808303815f87803b158015611c88575f80fd5b505af1158015611c9a573d5f803e3d5ffd5b505050505092915050565b6001600160a01b038084165f908152600460209081526040808320938616835292905220545f198114611ce157611ce18484610c6185856129e8565b50505050565b5f611cf3843384611ca5565b611cfe84848461220e565b5060019392505050565b6001600160a01b038216611d525760405162461bcd60e51b8152602060048201526011602482015270281d269d2d22a927afa922a1a2a4ab22a960791b60448201526064016107d8565b83611d915760405162461bcd60e51b815260206004820152600f60248201526e503a4d3a5a45524f5f53484152455360881b60448201526064016107d8565b82611dd05760405162461bcd60e51b815260206004820152600f60248201526e503a4d3a5a45524f5f41535345545360881b60448201526064016107d8565b600254158015611dff57507f000000000000000000000000000000000000000000000000000000000000000015155b15611edb57611e2e5f7f000000000000000000000000000000000000000000000000000000000000000061228f565b816001600160a01b0316816001600160a01b03167fc5e0c49c290d3bf655c61fddb46eb9fd8d635737c3119287c40c1c1dd78e771e85877f0000000000000000000000000000000000000000000000000000000000000000604051611ea6939291909283526020830191909152604082015260600190565b60405180910390a3611ed87f0000000000000000000000000000000000000000000000000000000000000000856129e8565b93505b611ee5828561228f565b816001600160a01b0316816001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78587604051611f33929190918252602082015260400190565b60405180910390a3600654611f53906001600160a01b03168230866122f9565b611ce15760405162461bcd60e51b8152602060048201526011602482015270503a4d3a5452414e534645525f46524f4d60781b60448201526064016107d8565b5f816001611fa182866129d5565b611fab91906129e8565b61072691906127aa565b5f61073933848461220e565b6001600160a01b03831661200b5760405162461bcd60e51b8152602060048201526011602482015270281d211d2d22a927afa922a1a2a4ab22a960791b60448201526064016107d8565b84156120f157816001600160a01b0316816001600160a01b03161461203557612035828287611ca5565b61203f828661236f565b816001600160a01b0316836001600160a01b0316826001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8789604051612097929190918252602082015260400190565b60405180910390a46006546120b6906001600160a01b031684866123e1565b6120f15760405162461bcd60e51b815260206004820152600c60248201526b281d211d2a2920a729a322a960a11b60448201526064016107d8565b5050505050565b6007545f9081906001600160a01b0316635cf2ed5784612117876112b1565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016040805180830381865afa15801561215d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121819190612a5e565b9092509050336001600160a01b038416146121a1576121a1833384611ca5565b81158015906121b857506001600160a01b03811615155b156121c8576121c883828461220e565b600754604051631a9ba08760e31b815260048101849052602481018690526001600160a01b0385811660448301523360648301529091169063d4dd043890608401611c71565b6001600160a01b0383165f90815260036020526040812080548392906122359084906129e8565b90915550506001600160a01b038083165f81815260036020526040908190208054850190555190918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611b6d9085815260200190565b8060025f8282546122a091906129d5565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6040516001600160a01b03808516602483015283166044820152606481018290525f906123669086906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261241b565b95945050505050565b6001600160a01b0382165f90815260036020526040812080548392906123969084906129e8565b90915550506002805482900390556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016122ed565b6040516001600160a01b0383166024820152604481018290525f9061241390859063a9059cbb60e01b9060640161232f565b949350505050565b5f6001600160a01b0383163b61243257505f61073d565b6060836001600160a01b03168360405161244c9190612a81565b5f604051808303815f865af19150503d805f8114612485576040519150601f19603f3d011682016040523d82523d5f602084013e61248a565b606091505b5090925090508180156124135750805115806124135750808060200190518101906124139190612a97565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156124fa575f80fd5b5035919050565b6001600160a01b0381168114612515575f80fd5b50565b5f8060408385031215612529575f80fd5b823561253481612501565b946020939093013593505050565b5f8060408385031215612553575f80fd5b82359150602083013561256581612501565b809150509250929050565b5f805f60608486031215612582575f80fd5b833561258d81612501565b9250602084013561259d81612501565b929592945050506040919091013590565b5f602082840312156125be575f80fd5b813561072681612501565b803560ff811681146125d9575f80fd5b919050565b5f805f805f8060c087890312156125f3575f80fd5b86359550602087013561260581612501565b94506040870135935061261a606088016125c9565b92506080870135915060a087013590509295509295509295565b5f805f805f805f60e0888a03121561264a575f80fd5b87359650602088013561265c81612501565b95506040880135945060608801359350612678608089016125c9565b925060a0880135915060c0880135905092959891949750929550565b5f805f606084860312156126a6575f80fd5b8335925060208401356126b881612501565b915060408401356126c881612501565b809150509250925092565b5f805f805f805f60e0888a0312156126e9575f80fd5b87356126f481612501565b9650602088013561265c81612501565b5f8060408385031215612715575f80fd5b823561272081612501565b9150602083013561256581612501565b5f60208284031215612740575f80fd5b5051919050565b600181811c9082168061275b57607f821691505b60208210810361277957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761073d5761073d61277f565b5f826127c457634e487b7160e01b5f52601260045260245ffd5b500490565b602080825260089082015267140e9313d0d2d15160c21b604082015260600190565b5f80858511156127f9575f80fd5b83861115612805575f80fd5b5050820193919092039150565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b805180151581146125d9575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561288c575f80fd5b61289583612858565b9150602083015167ffffffffffffffff808211156128b1575f80fd5b818501915085601f8301126128c4575f80fd5b8151818111156128d6576128d6612867565b604051601f8201601f19908116603f011681019083821181831017156128fe576128fe612867565b81604052828152886020848701011115612916575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f8083545f60018260011c9150600183168061295457607f831692505b6020808410820361297357634e487b7160e01b5f52602260045260245ffd5b818015612987576001811461299c576129c7565b60ff19861689528415158502890196506129c7565b5f8a8152602090205f5b868110156129bf5781548b8201529085019083016129a6565b505084890196505b509498975050505050505050565b8082018082111561073d5761073d61277f565b8181038181111561073d5761073d61277f565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b5f8060408385031215612a4d575f80fd5b505080516020909101519092909150565b5f8060408385031215612a6f575f80fd5b82519150602083015161256581612501565b5f82518060208501845e5f920191825250919050565b5f60208284031215612aa7575f80fd5b6107268261285856fea26469706673582212200e747a02a05a25b58b2a07797009adcbf80309e1c85371ffc8858b3bf2cfc29964736f6c63430008190033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}},"remappings":["@openzeppelin/contracts/=modules/syrup-utils-private/modules/open-zeppelin/contracts/","address-registry/=modules/mplv2-private/modules/address-registry/contracts/","contract-test-utils/=modules/fixed-term-loan-v6/modules/contract-test-utils/contracts/","ds-test/=modules/forge-std/lib/ds-test/src/","dss-interfaces/=modules/syrup-utils-private/modules/lite-psm/lib/dss-test/lib/dss-interfaces/src/","dss-test/=modules/syrup-utils-private/modules/lite-psm/lib/dss-test/src/","environment-mocks/=modules/environment-mocks/contracts/","erc20-helper/=modules/pool-v2/modules/erc20-helper/src/","erc20/=modules/erc20/","erc4626-tests/=modules/syrup-utils-private/modules/open-zeppelin/lib/erc4626-tests/","fixed-term-loan-manager/=modules/fixed-term-loan-manager/contracts/","fixed-term-loan-v5/=modules/fixed-term-loan-v5/contracts/","fixed-term-loan-v6/=modules/fixed-term-loan-v6/contracts/","fixed-term-loan/=modules/fixed-term-loan/contracts/","forge-std/=modules/forge-std/src/","globals-v2-private/=modules/globals-v2-private/contracts/","globals-v2/=modules/globals-v2/contracts/","globals/=modules/mplv2-private/modules/globals/","liquidations/=modules/liquidations/contracts/","lite-psm/=modules/syrup-utils-private/modules/lite-psm/","maple-proxy-factory/=modules/pool-v2/modules/maple-proxy-factory/","maple-strategies/=modules/maple-strategies/","maple-token/=modules/maple-token/modules/maple-test/modules/ds-test/src/","migrator/=modules/mplv2-private/modules/migrator/","mpl-migration/=modules/mpl-migration/","mpl-v2/=modules/syrup-utils-private/modules/mpl-v2/contracts/","mplv2-private/=modules/mplv2-private/contracts/","non-transparent-proxy/=modules/non-transparent-proxy/","ntp/=modules/mplv2-private/modules/ntp/","open-term-loan-manager/=modules/open-term-loan-manager/contracts/","open-term-loan-v2/=modules/open-term-loan-v2/contracts/","open-term-loan/=modules/open-term-loan/contracts/","open-zeppelin/=modules/syrup-utils-private/modules/open-zeppelin/","pool-permission-manager/=modules/pool-permission-manager/contracts/","pool-v2-private/=modules/pool-v2-private/contracts/","pool-v2/=modules/pool-v2/contracts/","proxy-factory/=modules/pool-v2/modules/maple-proxy-factory/modules/proxy-factory/","revenue-distribution-token/=modules/xMPL/modules/revenue-distribution-token/contracts/","syrup-router/=modules/syrup-router/","syrup-utils-private/=modules/syrup-utils-private/","treasury/=modules/treasury/","withdrawal-manager-cyclical/=modules/withdrawal-manager-cyclical/contracts/","withdrawal-manager-queue/=modules/withdrawal-manager-queue/contracts/","xMPL/=modules/xMPL/","xmpl/=modules/mplv2-private/modules/xmpl/"]},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":[["0x6c48CD22086F3Db3F23E7cEeDD5c429D93FF3327",{"internalType":"address","name":"manager_","type":"address"}],["0xe343167631d89B6Ffc58B88d6b7fB0228795491D",{"internalType":"address","name":"asset_","type":"address"}],["0x0000000000000000000000000000000000000000",{"internalType":"address","name":"destination_","type":"address"}],["0",{"internalType":"uint256","name":"bootstrapMint_","type":"uint256"}],["0",{"internalType":"uint256","name":"initialSupply_","type":"uint256"}],["syrupUSDG",{"internalType":"string","name":"name_","type":"string"}],["syrupUSDG",{"internalType":"string","name":"symbol_","type":"string"}]],"compiler_version":"v0.8.25+commit.b61c2a91","is_verified_via_verifier_alliance":false,"verified_at":"2026-05-26T21:53:05.083024Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60c06040526001600855348015610014575f80fd5b506040516131da3803806131da8339810160408190526100339161045d565b8181876001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610071573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906100959190610500565b5f6100a084826105a4565b5060016100ad83826105a4565b5060ff166080525050600780546001600160a01b0319166001600160a01b0389169081179091556101185760405162461bcd60e51b815260206004820152601060248201526f281d219d2d22a927afa6a0a720a3a2a960811b60448201526064015b60405180910390fd5b600680546001600160a01b0319166001600160a01b0388169081179091556101735760405162461bcd60e51b815260206004820152600e60248201526d140e90ce96915493d7d054d4d15560921b604482015260640161010f565b82156101835761018385846101e1565b60a084905261019486885f1961024a565b6101d55760405162461bcd60e51b8152602060048201526012602482015271503a433a4641494c45445f415050524f564560701b604482015260640161010f565b505050505050506106b7565b8060025f8282546101f29190610663565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6040516001600160a01b03831660248201525f60448201819052906102b090859063095ea7b360e01b906064015b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b039384161790529061030216565b6102bb57505f6102fb565b816102c8575060016102fb565b6040516001600160a01b0384166024820152604481018390526102f890859063095ea7b360e01b90606401610278565b90505b9392505050565b5f6001600160a01b0383163b61031957505f6103a0565b6060836001600160a01b0316836040516103339190610682565b5f604051808303815f865af19150503d805f811461036c576040519150601f19603f3d011682016040523d82523d5f602084013e610371565b606091505b50909250905081801561039c57508051158061039c57508080602001905181019061039c9190610698565b9150505b92915050565b80516001600160a01b03811681146103bc575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126103e4575f80fd5b81516001600160401b03808211156103fe576103fe6103c1565b604051601f8301601f19908116603f01168101908282118183101715610426576104266103c1565b8160405283815286602085880101111561043e575f80fd5b8360208701602083015e5f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215610473575f80fd5b61047c886103a6565b965061048a602089016103a6565b9550610498604089016103a6565b606089015160808a015160a08b015192975090955093506001600160401b03808211156104c3575f80fd5b6104cf8b838c016103d5565b935060c08a01519150808211156104e4575f80fd5b506104f18a828b016103d5565b91505092959891949750929550565b5f60208284031215610510575f80fd5b815160ff811681146102fb575f80fd5b600181811c9082168061053457607f821691505b60208210810361055257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561059f57805f5260205f20601f840160051c8101602085101561057d5750805b601f840160051c820191505b8181101561059c575f8155600101610589565b50505b505050565b81516001600160401b038111156105bd576105bd6103c1565b6105d1816105cb8454610520565b84610558565b602080601f831160018114610604575f84156105ed5750858301515b5f19600386901b1c1916600185901b17855561065b565b5f85815260208120601f198616915b8281101561063257888601518255948401946001909101908401610613565b508582101561064f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b808201808211156103a057634e487b7160e01b5f52601160045260245ffd5b5f82518060208501845e5f920191825250919050565b5f602082840312156106a8575f80fd5b815180151581146102fb575f80fd5b60805160a051612ae66106f45f395f81816105db01528181611ddd01528181611e0a01528181611e670152611eb301525f6103400152612ae65ff3fe608060405234801561000f575f80fd5b5060043610610255575f3560e01c80636e553f6511610140578063b460af94116100bf578063ce96cb7711610084578063ce96cb771461055e578063d505accf14610571578063d905777e14610586578063dd62ed3e14610599578063ef8b30f7146105c3578063f1a0e4cb146105d6575f80fd5b8063b460af94146104ff578063ba08765214610512578063c63d75b614610525578063c6e6f59214610538578063ccc143b81461054b575f80fd5b806395d89b411161010557806395d89b41146104ab578063a457c2d7146104b3578063a58c3eff146104c6578063a9059cbb146104d9578063b3d7f6b9146104ec575f80fd5b80636e553f651461043457806370a08231146104475780637ecebe00146104665780639159b2061461048557806394bf804d14610498575f80fd5b8063313ce567116101d7578063481c6a751161019c578063481c6a75146103cd5780634cdad506146103e057806350496cbd146103f357806350921b231461040657806360dd37d91461041957806367e2ba231461042c575f80fd5b8063313ce5671461033b5780633644e5151461037457806338d52e0f1461037c57806339509351146103a7578063402d267d146103ba575f80fd5b8063107703ab1161021d578063107703ab146102d257806318160ddd146102e55780631b8f1830146102ee57806323b872dd1461030157806330adf81f14610314575f80fd5b806301e1d1141461025957806306fdde031461027457806307a2d13a14610289578063095ea7b31461029c5780630a28a477146102bf575b5f80fd5b6102616105fd565b6040519081526020015b60405180910390f35b61027c61066c565b60405161026b91906124b5565b6102616102973660046124ea565b6106f7565b6102af6102aa366004612518565b61072d565b604051901515815260200161026b565b6102616102cd3660046124ea565b610743565b6102616102e0366004612542565b6107b5565b61026160025481565b6102616102fc366004612542565b610902565b6102af61030f366004612570565b610aaa565b6102617f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b6103627f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff909116815260200161026b565b610261610b7e565b60065461038f906001600160a01b031681565b6040516001600160a01b03909116815260200161026b565b6102af6103b5366004612518565b610c2b565b6102616103c83660046125ae565b610c66565b60075461038f906001600160a01b031681565b6102616103ee3660046124ea565b610c98565b6102616104013660046124ea565b610ccf565b6102616104143660046125de565b610cf5565b610261610427366004612634565b610e70565b610261611039565b610261610442366004612542565b611080565b6102616104553660046125ae565b60036020525f908152604090205481565b6102616104743660046125ae565b60056020525f908152604090205481565b6102616104933660046125ae565b611184565b6102616104a6366004612542565b6111a5565b61027c611298565b6102af6104c1366004612518565b6112a5565b6102616104d43660046124ea565b6112b1565b6102af6104e7366004612518565b6112e2565b6102616104fa3660046124ea565b6113b0565b61026161050d366004612694565b6113d6565b610261610520366004612694565b61154f565b6102616105333660046125ae565b6116c8565b6102616105463660046124ea565b6116fa565b610261610559366004612542565b611717565b61026161056c3660046125ae565b611834565b61058461057f3660046126d3565b611866565b005b6102616105943660046125ae565b611add565b6102616105a7366004612704565b600460209081525f928352604080842090915290825290205481565b6102616105d13660046124ea565b611b0f565b6102617f000000000000000000000000000000000000000000000000000000000000000081565b600754604080516278744560e21b815290515f926001600160a01b0316916301e1d1149160048083019260209291908290030181865afa158015610643573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106679190612730565b905090565b5f805461067890612747565b80601f01602080910402602001604051908101604052809291908181526020018280546106a490612747565b80156106ef5780601f106106c6576101008083540402835291602001916106ef565b820191905f5260205f20905b8154815290600101906020018083116106d257829003601f168201915b505050505081565b6002545f908015610724578061070b6105fd565b6107159085612793565b61071f91906127aa565b610726565b825b9392505050565b5f610739338484611b19565b5060015b92915050565b600754604051632ef1bc7760e21b8152336004820152602481018390525f916001600160a01b03169063bbc6f1dc906044015b602060405180830381865afa158015610791573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073d9190612730565b5f6008546001146107e15760405162461bcd60e51b81526004016107d8906127c9565b60405180910390fd5b60026008556007546e503a7265717565737452656465656d60881b905f9081906001600160a01b0316637bd243de843361081e36600481886127eb565b6040518563ffffffff1660e01b815260040161083d9493929190612812565b5f60405180830381865afa158015610857573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261087e919081019061287b565b915091508181906108a25760405162461bcd60e51b81526004016107d891906124b5565b50846001600160a01b03167f46949ee51143d5b58e4df83122d6c382a04f7bffbe563f78cd7fa61ee519ec08876108d98989611b7a565b6040805192835260208301829052909750015b60405180910390a2505060016008555092915050565b5f6008546001146109255760405162461bcd60e51b81526004016107d8906127c9565b60026008556007546d503a72656d6f766553686172657360901b905f9081906001600160a01b0316637bd243de843361096136600481886127eb565b6040518563ffffffff1660e01b81526004016109809493929190612812565b5f60405180830381865afa15801561099a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109c1919081019061287b565b915091508181906109e55760405162461bcd60e51b81526004016107d891906124b5565b50336001600160a01b03861614610a0157610a01853388611ca5565b6007546040516301b8f18360e41b8152600481018890526001600160a01b0387811660248301819052927f4b171f7fc0550bd6b41ba56e9b2b88100206431510ba9427518f3485198db36d92911690631b8f1830906044016020604051808303815f875af1158015610a75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a999190612730565b6040518181529096506020016108ec565b6007545f906d503a7472616e7366657246726f6d60901b90829081906001600160a01b0316637bd243de8433610ae336600481886127eb565b6040518563ffffffff1660e01b8152600401610b029493929190612812565b5f60405180830381865afa158015610b1c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b43919081019061287b565b91509150818190610b675760405162461bcd60e51b81526004016107d891906124b5565b50610b73878787611ce7565b979650505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f604051610bae9190612937565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b335f8181526004602090815260408083206001600160a01b03871684529091528120549091610739918590610c619086906129d5565b611b19565b60075460405163402d267d60e01b81526001600160a01b0383811660048301525f92169063402d267d90602401610776565b60075460405163cbe52ae360e01b8152336004820152602481018390525f916001600160a01b03169063cbe52ae390604401610776565b6002545f9080156107245780610ce3611039565b610ceb6105fd565b61070b91906129e8565b5f600854600114610d185760405162461bcd60e51b81526004016107d8906127c9565b600260085560075472140e99195c1bdcda5d15da5d1a14195c9b5a5d606a1b905f9081906001600160a01b0316637bd243de8433610d5936600481886127eb565b6040518563ffffffff1660e01b8152600401610d789493929190612812565b5f60405180830381865afa158015610d92573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610db9919081019061287b565b91509150818190610ddd5760405162461bcd60e51b81526004016107d891906124b5565b5060065460405163d505accf60e01b81526001600160a01b039091169063d505accf90610e1a90339030908f908e908e908e908e906004016129fb565b5f604051808303815f87803b158015610e31575f80fd5b505af1158015610e43573d5f803e3d5ffd5b50505050610e5e610e538b611b0f565b9450848b8b33611d08565b50506001600855509695505050505050565b5f600854600114610e935760405162461bcd60e51b81526004016107d8906127c9565b60026008556007546f140e9b5a5b9d15da5d1a14195c9b5a5d60821b905f9081906001600160a01b0316637bd243de8433610ed136600481886127eb565b6040518563ffffffff1660e01b8152600401610ef09493929190612812565b5f60405180830381865afa158015610f0a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f31919081019061287b565b91509150818190610f555760405162461bcd60e51b81526004016107d891906124b5565b5088610f608c6113b0565b9450841115610fb15760405162461bcd60e51b815260206004820152601960248201527f503a4d57503a494e53554646494349454e545f5045524d49540000000000000060448201526064016107d8565b60065460405163d505accf60e01b81526001600160a01b039091169063d505accf90610fed90339030908e908e908e908e908e906004016129fb565b5f604051808303815f87803b158015611004575f80fd5b505af1158015611016573d5f803e3d5ffd5b505050506110268b858c33611d08565b5050600160085550979650505050505050565b600754604080516367e2ba2360e01b815290515f926001600160a01b0316916367e2ba239160048083019260209291908290030181865afa158015610643573d5f803e3d5ffd5b5f6008546001146110a35760405162461bcd60e51b81526004016107d8906127c9565b600260085560075468140e99195c1bdcda5d60ba1b905f9081906001600160a01b0316637bd243de84336110da36600481886127eb565b6040518563ffffffff1660e01b81526004016110f99493929190612812565b5f60405180830381865afa158015611113573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261113a919081019061287b565b9150915081819061115e5760405162461bcd60e51b81526004016107d891906124b5565b5061117661116b87611b0f565b945084878733611d08565b505060016008555092915050565b6001600160a01b0381165f9081526003602052604081205461073d906106f7565b5f6008546001146111c85760405162461bcd60e51b81526004016107d8906127c9565b600260085560075465140e9b5a5b9d60d21b905f9081906001600160a01b0316637bd243de84336111fc36600481886127eb565b6040518563ffffffff1660e01b815260040161121b9493929190612812565b5f60405180830381865afa158015611235573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125c919081019061287b565b915091508181906112805760405162461bcd60e51b81526004016107d891906124b5565b506111768661128e886113b0565b9550858733611d08565b6001805461067890612747565b5f610739338484611ca5565b5f61073d600254836112c39190612793565b6112cb611039565b6112d36105fd565b6112dd91906129e8565b611f93565b6007545f9069281d3a3930b739b332b960b11b90829081906001600160a01b0316637bd243de843361131736600481886127eb565b6040518563ffffffff1660e01b81526004016113369493929190612812565b5f60405180830381865afa158015611350573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611377919081019061287b565b9150915081819061139b5760405162461bcd60e51b81526004016107d891906124b5565b506113a68686611fb5565b9695505050505050565b6002545f9080156107245761071f6113c66105fd565b6113d09085612793565b82611f93565b5f6008546001146113f95760405162461bcd60e51b81526004016107d8906127c9565b600260085560075469503a776974686472617760b01b905f9081906001600160a01b0316637bd243de843361143136600481886127eb565b6040518563ffffffff1660e01b81526004016114509493929190612812565b5f60405180830381865afa15801561146a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611491919081019061287b565b915091508181906114b55760405162461bcd60e51b81526004016107d891906124b5565b506007546040516371a2fa5b60e11b8152600481018990526001600160a01b0387811660248301523360448301529091169063e345f4b69060640160408051808303815f875af115801561150b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f9190612a3c565b975093506115408488888833611fc1565b50506001600855509392505050565b5f6008546001146115725760405162461bcd60e51b81526004016107d8906127c9565b600260085560075467503a72656465656d60c01b905f9081906001600160a01b0316637bd243de84336115a836600481886127eb565b6040518563ffffffff1660e01b81526004016115c79493929190612812565b5f60405180830381865afa1580156115e1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611608919081019061287b565b9150915081819061162c5760405162461bcd60e51b81526004016107d891906124b5565b506007546040516360af6ad360e01b8152600481018990526001600160a01b0387811660248301523360448301525f9216906360af6ad39060640160408051808303815f875af1158015611682573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a69190612a3c565b955090506116b78186898933611fc1565b505060016008555090949350505050565b60075460405163631ebadb60e11b81526001600160a01b0383811660048301525f92169063c63d75b690602401610776565b6002545f9080156107245761170d6105fd565b6107158285612793565b5f60085460011461173a5760405162461bcd60e51b81526004016107d8906127c9565b600260085560075470503a72657175657374576974686472617760781b905f9081906001600160a01b0316637bd243de843361177936600481886127eb565b6040518563ffffffff1660e01b81526004016117989493929190612812565b5f60405180830381865afa1580156117b2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117d9919081019061287b565b915091508181906117fd5760405162461bcd60e51b81526004016107d891906124b5565b50846001600160a01b03167fd72eb5d043f24a0168ae744d5c44f9596fd673a26bf74d9646bff4b844882d14876108d989896120f8565b60075460405163ce96cb7760e01b81526001600160a01b0383811660048301525f92169063ce96cb7790602401610776565b428410156118a85760405162461bcd60e51b815260206004820152600f60248201526e115490cc8c0e940e91561412549151608a1b60448201526064016107d8565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a081118015906118e857508260ff16601b14806118e857508260ff16601c145b6119285760405162461bcd60e51b815260206004820152601160248201527045524332303a503a4d414c4c4541424c4560781b60448201526064016107d8565b5f611931610b7e565b6001600160a01b038981165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e08301909152805192019190912061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f1981840301815282825280516020918201205f80855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611a46573d5f803e3d5ffd5b505050602060405103519050886001600160a01b0316816001600160a01b0316148015611a7b57506001600160a01b03891615155b611ac75760405162461bcd60e51b815260206004820152601960248201527f45524332303a503a494e56414c49445f5349474e41545552450000000000000060448201526064016107d8565b5050611ad4878787611b19565b50505050505050565b600754604051636c82bbbf60e11b81526001600160a01b0383811660048301525f92169063d905777e90602401610776565b5f61073d826116fa565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600754604051635cf2ed5760e01b81526001600160a01b038381166004830152602482018590525f928392911690635cf2ed57906044016040805180830381865afa158015611bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bef9190612a5e565b9092509050336001600160a01b03841614611c0f57611c0f833384611ca5565b8115801590611c2657506001600160a01b03811615155b15611c3657611c3683828461220e565b600754604051633ea0e43760e11b8152600481018490526001600160a01b03858116602483015233604483015290911690637d41c86e906064015b5f604051808303815f87803b158015611c88575f80fd5b505af1158015611c9a573d5f803e3d5ffd5b505050505092915050565b6001600160a01b038084165f908152600460209081526040808320938616835292905220545f198114611ce157611ce18484610c6185856129e8565b50505050565b5f611cf3843384611ca5565b611cfe84848461220e565b5060019392505050565b6001600160a01b038216611d525760405162461bcd60e51b8152602060048201526011602482015270281d269d2d22a927afa922a1a2a4ab22a960791b60448201526064016107d8565b83611d915760405162461bcd60e51b815260206004820152600f60248201526e503a4d3a5a45524f5f53484152455360881b60448201526064016107d8565b82611dd05760405162461bcd60e51b815260206004820152600f60248201526e503a4d3a5a45524f5f41535345545360881b60448201526064016107d8565b600254158015611dff57507f000000000000000000000000000000000000000000000000000000000000000015155b15611edb57611e2e5f7f000000000000000000000000000000000000000000000000000000000000000061228f565b816001600160a01b0316816001600160a01b03167fc5e0c49c290d3bf655c61fddb46eb9fd8d635737c3119287c40c1c1dd78e771e85877f0000000000000000000000000000000000000000000000000000000000000000604051611ea6939291909283526020830191909152604082015260600190565b60405180910390a3611ed87f0000000000000000000000000000000000000000000000000000000000000000856129e8565b93505b611ee5828561228f565b816001600160a01b0316816001600160a01b03167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78587604051611f33929190918252602082015260400190565b60405180910390a3600654611f53906001600160a01b03168230866122f9565b611ce15760405162461bcd60e51b8152602060048201526011602482015270503a4d3a5452414e534645525f46524f4d60781b60448201526064016107d8565b5f816001611fa182866129d5565b611fab91906129e8565b61072691906127aa565b5f61073933848461220e565b6001600160a01b03831661200b5760405162461bcd60e51b8152602060048201526011602482015270281d211d2d22a927afa922a1a2a4ab22a960791b60448201526064016107d8565b84156120f157816001600160a01b0316816001600160a01b03161461203557612035828287611ca5565b61203f828661236f565b816001600160a01b0316836001600160a01b0316826001600160a01b03167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db8789604051612097929190918252602082015260400190565b60405180910390a46006546120b6906001600160a01b031684866123e1565b6120f15760405162461bcd60e51b815260206004820152600c60248201526b281d211d2a2920a729a322a960a11b60448201526064016107d8565b5050505050565b6007545f9081906001600160a01b0316635cf2ed5784612117876112b1565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016040805180830381865afa15801561215d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121819190612a5e565b9092509050336001600160a01b038416146121a1576121a1833384611ca5565b81158015906121b857506001600160a01b03811615155b156121c8576121c883828461220e565b600754604051631a9ba08760e31b815260048101849052602481018690526001600160a01b0385811660448301523360648301529091169063d4dd043890608401611c71565b6001600160a01b0383165f90815260036020526040812080548392906122359084906129e8565b90915550506001600160a01b038083165f81815260036020526040908190208054850190555190918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611b6d9085815260200190565b8060025f8282546122a091906129d5565b90915550506001600160a01b0382165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6040516001600160a01b03808516602483015283166044820152606481018290525f906123669086906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261241b565b95945050505050565b6001600160a01b0382165f90815260036020526040812080548392906123969084906129e8565b90915550506002805482900390556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016122ed565b6040516001600160a01b0383166024820152604481018290525f9061241390859063a9059cbb60e01b9060640161232f565b949350505050565b5f6001600160a01b0383163b61243257505f61073d565b6060836001600160a01b03168360405161244c9190612a81565b5f604051808303815f865af19150503d805f8114612485576040519150601f19603f3d011682016040523d82523d5f602084013e61248a565b606091505b5090925090508180156124135750805115806124135750808060200190518101906124139190612a97565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f602082840312156124fa575f80fd5b5035919050565b6001600160a01b0381168114612515575f80fd5b50565b5f8060408385031215612529575f80fd5b823561253481612501565b946020939093013593505050565b5f8060408385031215612553575f80fd5b82359150602083013561256581612501565b809150509250929050565b5f805f60608486031215612582575f80fd5b833561258d81612501565b9250602084013561259d81612501565b929592945050506040919091013590565b5f602082840312156125be575f80fd5b813561072681612501565b803560ff811681146125d9575f80fd5b919050565b5f805f805f8060c087890312156125f3575f80fd5b86359550602087013561260581612501565b94506040870135935061261a606088016125c9565b92506080870135915060a087013590509295509295509295565b5f805f805f805f60e0888a03121561264a575f80fd5b87359650602088013561265c81612501565b95506040880135945060608801359350612678608089016125c9565b925060a0880135915060c0880135905092959891949750929550565b5f805f606084860312156126a6575f80fd5b8335925060208401356126b881612501565b915060408401356126c881612501565b809150509250925092565b5f805f805f805f60e0888a0312156126e9575f80fd5b87356126f481612501565b9650602088013561265c81612501565b5f8060408385031215612715575f80fd5b823561272081612501565b9150602083013561256581612501565b5f60208284031215612740575f80fd5b5051919050565b600181811c9082168061275b57607f821691505b60208210810361277957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761073d5761073d61277f565b5f826127c457634e487b7160e01b5f52601260045260245ffd5b500490565b602080825260089082015267140e9313d0d2d15160c21b604082015260600190565b5f80858511156127f9575f80fd5b83861115612805575f80fd5b5050820193919092039150565b8481526001600160a01b03841660208201526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b805180151581146125d9575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561288c575f80fd5b61289583612858565b9150602083015167ffffffffffffffff808211156128b1575f80fd5b818501915085601f8301126128c4575f80fd5b8151818111156128d6576128d6612867565b604051601f8201601f19908116603f011681019083821181831017156128fe576128fe612867565b81604052828152886020848701011115612916575f80fd5b8260208601602083015e5f6020848301015280955050505050509250929050565b5f8083545f60018260011c9150600183168061295457607f831692505b6020808410820361297357634e487b7160e01b5f52602260045260245ffd5b818015612987576001811461299c576129c7565b60ff19861689528415158502890196506129c7565b5f8a8152602090205f5b868110156129bf5781548b8201529085019083016129a6565b505084890196505b509498975050505050505050565b8082018082111561073d5761073d61277f565b8181038181111561073d5761073d61277f565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b5f8060408385031215612a4d575f80fd5b505080516020909101519092909150565b5f8060408385031215612a6f575f80fd5b82519150602083015161256581612501565b5f82518060208501845e5f920191825250919050565b5f60208284031215612aa7575f80fd5b6107268261285856fea26469706673582212200e747a02a05a25b58b2a07797009adcbf80309e1c85371ffc8858b3bf2cfc29964736f6c634300081900330000000000000000000000006c48cd22086f3db3f23e7ceedd5c429d93ff3327000000000000000000000000e343167631d89b6ffc58b88d6b7fb0228795491d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000009737972757055534447000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097379727570555344470000000000000000000000000000000000000000000000","name":"MaplePool","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":false,"additional_sources":[{"file_path":"modules/pool-v2-private/contracts/interfaces/IERC4626.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\nimport { IERC20 } from \"../../modules/erc20/contracts/interfaces/IERC20.sol\";\n\n/// @title A standard for tokenized Vaults with a single underlying ERC-20 token.\ninterface IERC4626 is IERC20 {\n\n    /**************************************************************************************************************************************/\n    /*** Events                                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   `caller_` has exchanged `assets_` for `shares_` and transferred them to `owner_`.\n     *         MUST be emitted when assets are deposited via the `deposit` or `mint` methods.\n     *  @param caller_ The caller of the function that emitted the `Deposit` event.\n     *  @param owner_  The owner of the shares.\n     *  @param assets_ The amount of assets deposited.\n     *  @param shares_ The amount of shares minted.\n     */\n    event Deposit(address indexed caller_, address indexed owner_, uint256 assets_, uint256 shares_);\n\n    /**\n     *  @dev   `caller_` has exchanged `shares_`, owned by `owner_`, for `assets_`, and transferred them to `receiver_`.\n     *         MUST be emitted when assets are withdrawn via the `withdraw` or `redeem` methods.\n     *  @param caller_   The caller of the function that emitted the `Withdraw` event.\n     *  @param receiver_ The receiver of the assets.\n     *  @param owner_    The owner of the shares.\n     *  @param assets_   The amount of assets withdrawn.\n     *  @param shares_   The amount of shares burned.\n     */\n    event Withdraw(address indexed caller_, address indexed receiver_, address indexed owner_, uint256 assets_, uint256 shares_);\n\n    /**************************************************************************************************************************************/\n    /*** State Variables                                                                                                                ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    The address of the underlying asset used by the Vault.\n     *          MUST be a contract that implements the ERC-20 standard.\n     *          MUST NOT revert.\n     *  @return asset_ The address of the underlying asset.\n     */\n    function asset() external view returns (address asset_);\n\n    /**************************************************************************************************************************************/\n    /*** State Changing Functions                                                                                                       ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Mints `shares_` to `receiver_` by depositing `assets_` into the Vault.\n     *          MUST emit the {Deposit} event.\n     *          MUST revert if all of the assets cannot be deposited (due to insufficient approval, deposit limits, slippage, etc).\n     *  @param  assets_   The amount of assets to deposit.\n     *  @param  receiver_ The receiver of the shares.\n     *  @return shares_   The amount of shares minted.\n     */\n    function deposit(uint256 assets_, address receiver_) external returns (uint256 shares_);\n\n    /**\n     *  @dev    Mints `shares_` to `receiver_` by depositing `assets_` into the Vault.\n     *          MUST emit the {Deposit} event.\n     *          MUST revert if all of shares cannot be minted (due to insufficient approval, deposit limits, slippage, etc).\n     *  @param  shares_   The amount of shares to mint.\n     *  @param  receiver_ The receiver of the shares.\n     *  @return assets_   The amount of assets deposited.\n     */\n    function mint(uint256 shares_, address receiver_) external returns (uint256 assets_);\n\n    /**\n     *  @dev    Burns `shares_` from `owner_` and sends `assets_` to `receiver_`.\n     *          MUST emit the {Withdraw} event.\n     *          MUST revert if all of the shares cannot be redeemed (due to insufficient shares, withdrawal limits, slippage, etc).\n     *  @param  shares_   The amount of shares to redeem.\n     *  @param  receiver_ The receiver of the assets.\n     *  @param  owner_    The owner of the shares.\n     *  @return assets_   The amount of assets sent to the receiver.\n     */\n    function redeem(uint256 shares_, address receiver_, address owner_) external returns (uint256 assets_);\n\n    /**\n     *  @dev    Burns `shares_` from `owner_` and sends `assets_` to `receiver_`.\n     *          MUST emit the {Withdraw} event.\n     *          MUST revert if all of the assets cannot be withdrawn (due to insufficient assets, withdrawal limits, slippage, etc).\n     *  @param  assets_   The amount of assets to withdraw.\n     *  @param  receiver_ The receiver of the assets.\n     *  @param  owner_    The owner of the assets.\n     *  @return shares_   The amount of shares burned from the owner.\n     */\n    function withdraw(uint256 assets_, address receiver_, address owner_) external returns (uint256 shares_);\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    The amount of `assets_` the `shares_` are currently equivalent to.\n     *          MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     *          MUST NOT reflect slippage or other on-chain conditions when performing the actual exchange.\n     *          MUST NOT show any variations depending on the caller.\n     *          MUST NOT revert.\n     *  @param  shares_ The amount of shares to convert.\n     *  @return assets_ The amount of equivalent assets.\n     */\n    function convertToAssets(uint256 shares_) external view returns (uint256 assets_);\n\n    /**\n     *  @dev    The amount of `shares_` the `assets_` are currently equivalent to.\n     *          MUST NOT be inclusive of any fees that are charged against assets in the Vault.\n     *          MUST NOT reflect slippage or other on-chain conditions when performing the actual exchange.\n     *          MUST NOT show any variations depending on the caller.\n     *          MUST NOT revert.\n     *  @param  assets_ The amount of assets to convert.\n     *  @return shares_ The amount of equivalent shares.\n     */\n    function convertToShares(uint256 assets_) external view returns (uint256 shares_);\n\n    /**\n     *  @dev    Maximum amount of `assets_` that can be deposited on behalf of the `receiver_` through a `deposit` call.\n     *          MUST return a limited value if the receiver is subject to any limits, or the maximum value otherwise.\n     *          MUST NOT revert.\n     *  @param  receiver_ The receiver of the assets.\n     *  @return assets_   The maximum amount of assets that can be deposited.\n     */\n    function maxDeposit(address receiver_) external view returns (uint256 assets_);\n\n    /**\n     *  @dev    Maximum amount of `shares_` that can be minted on behalf of the `receiver_` through a `mint` call.\n     *          MUST return a limited value if the receiver is subject to any limits, or the maximum value otherwise.\n     *          MUST NOT revert.\n     *  @param  receiver_ The receiver of the shares.\n     *  @return shares_   The maximum amount of shares that can be minted.\n     */\n    function maxMint(address receiver_) external view returns (uint256 shares_);\n\n    /**\n     *  @dev    Maximum amount of `shares_` that can be redeemed from the `owner_` through a `redeem` call.\n     *          MUST return a limited value if the owner is subject to any limits, or the total amount of owned shares otherwise.\n     *          MUST NOT revert.\n     *  @param  owner_  The owner of the shares.\n     *  @return shares_ The maximum amount of shares that can be redeemed.\n     */\n    function maxRedeem(address owner_) external view returns (uint256 shares_);\n\n    /**\n     *  @dev    Maximum amount of `assets_` that can be withdrawn from the `owner_` through a `withdraw` call.\n     *          MUST return a limited value if the owner is subject to any limits, or the total amount of owned assets otherwise.\n     *          MUST NOT revert.\n     *  @param  owner_  The owner of the assets.\n     *  @return assets_ The maximum amount of assets that can be withdrawn.\n     */\n    function maxWithdraw(address owner_) external view returns (uint256 assets_);\n\n    /**\n     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given current on-chain conditions.\n     *          MUST return as close to and no more than the exact amount of shares that would be minted in a `deposit` call in the same transaction.\n     *          MUST NOT account for deposit limits like those returned from `maxDeposit` and should always act as though the deposit would be accepted.\n     *  @param  assets_ The amount of assets to deposit.\n     *  @return shares_ The amount of shares that would be minted.\n     */\n    function previewDeposit(uint256 assets_) external view returns (uint256 shares_);\n\n    /**\n     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given current on-chain conditions.\n     *          MUST return as close to and no fewer than the exact amount of assets that would be deposited in a `mint` call in the same transaction.\n     *          MUST NOT account for mint limits like those returned from `maxMint` and should always act as though the minting would be accepted.\n     *  @param  shares_ The amount of shares to mint.\n     *  @return assets_ The amount of assets that would be deposited.\n     */\n    function previewMint(uint256 shares_) external view returns (uint256 assets_);\n\n    /**\n     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block, given current on-chain conditions.\n     *          MUST return as close to and no more than the exact amount of assets that would be withdrawn in a `redeem` call in the same transaction.\n     *          MUST NOT account for redemption limits like those returned from `maxRedeem` and should always act as though the redemption would be accepted.\n     *  @param  shares_ The amount of shares to redeem.\n     *  @return assets_ The amount of assets that would be withdrawn.\n     */\n    function previewRedeem(uint256 shares_) external view returns (uint256 assets_);\n\n    /**\n     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, given current on-chain conditions.\n     *          MUST return as close to and no fewer than the exact amount of shares that would be burned in a `withdraw` call in the same transaction.\n     *          MUST NOT account for withdrawal limits like those returned from `maxWithdraw` and should always act as though the withdrawal would be accepted.\n     *  @param  assets_ The amount of assets to withdraw.\n     *  @return shares_ The amount of shares that would be redeemed.\n     */\n    function previewWithdraw(uint256 assets_) external view returns (uint256 shares_);\n\n    /**\n     *  @dev    Total amount of the underlying asset that is managed by the Vault.\n     *          SHOULD include compounding that occurs from any yields.\n     *          MUST NOT revert.\n     *  @return totalAssets_ The total amount of assets the Vault manages.\n     */\n    function totalAssets() external view returns (uint256 totalAssets_);\n\n}\n"},{"file_path":"modules/pool-v2-private/contracts/interfaces/IMaplePool.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\nimport { IERC20 } from \"../../modules/erc20/contracts/interfaces/IERC20.sol\";\n\nimport { IERC4626 } from \"./IERC4626.sol\";\n\ninterface IMaplePool is IERC20, IERC4626 {\n\n    /**************************************************************************************************************************************/\n    /*** Events                                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Initial shares amount was minted to the zero address to prevent the first depositor frontrunning exploit.\n     *  @param caller_              The caller of the function that emitted the `BootstrapMintPerformed` event.\n     *  @param receiver_            The user that was minted the shares.\n     *  @param assets_              The amount of assets deposited.\n     *  @param shares_              The amount of shares that would have been minted to the user if it was not the first deposit.\n     *  @param bootStrapMintAmount_ The amount of shares that was minted to the zero address to protect the first depositor.\n     */\n    event BootstrapMintPerformed(\n        address indexed caller_,\n        address indexed receiver_,\n        uint256 assets_,\n        uint256 shares_,\n        uint256 bootStrapMintAmount_\n    );\n\n    /**\n     *  @dev   `newOwner_` has accepted the transferral of RDT ownership from `previousOwner_`.\n     *  @param previousOwner_ The previous RDT owner.\n     *  @param newOwner_      The new RDT owner.\n     */\n    event OwnershipAccepted(address indexed previousOwner_, address indexed newOwner_);\n\n    /**\n     *  @dev   `owner_` has set the new pending owner of RDT to `pendingOwner_`.\n     *  @param owner_        The current RDT owner.\n     *  @param pendingOwner_ The new pending RDT owner.\n     */\n    event PendingOwnerSet(address indexed owner_, address indexed pendingOwner_);\n\n    /**\n     *  @dev   A new redemption request has been made.\n     *  @param owner_          The owner of shares.\n     *  @param shares_         The amount of shares requested to redeem.\n     *  @param escrowedShares_ The amount of shares actually escrowed for this withdrawal request.\n     */\n    event RedemptionRequested(address indexed owner_, uint256 shares_, uint256 escrowedShares_);\n\n    /**\n     *  @dev   Shares have been removed.\n     *  @param owner_  The owner of shares.\n     *  @param shares_ The amount of shares requested to be removed.\n     */\n    event SharesRemoved(address indexed owner_, uint256 shares_);\n\n    /**\n     *  @dev   A new withdrawal request has been made.\n     *  @param owner_          The owner of shares.\n     *  @param assets_         The amount of assets requested to withdraw.\n     *  @param escrowedShares_ The amount of shares actually escrowed for this withdrawal request.\n     */\n    event WithdrawRequested(address indexed owner_, uint256 assets_, uint256 escrowedShares_);\n\n    /**************************************************************************************************************************************/\n    /*** State Variables                                                                                                                ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    The amount of shares that will be burned during the first deposit/mint.\n     *  @return bootstrapMint_ The amount of shares to be burned.\n     */\n    function BOOTSTRAP_MINT() external view returns (uint256 bootstrapMint_);\n\n    /**\n     *  @dev    The address of the account that is allowed to update the vesting schedule.\n     *  @return manager_ The address of the pool manager.\n     */\n    function manager() external view returns (address manager_);\n\n    /**************************************************************************************************************************************/\n    /*** LP Functions                                                                                                                   ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Does a ERC4626 `deposit` with a ERC-2612 `permit`.\n     *  @param  assets_   The amount of `asset` to deposit.\n     *  @param  receiver_ The receiver of the shares.\n     *  @param  deadline_ The timestamp after which the `permit` signature is no longer valid.\n     *  @param  v_        ECDSA signature v component.\n     *  @param  r_        ECDSA signature r component.\n     *  @param  s_        ECDSA signature s component.\n     *  @return shares_   The amount of shares minted.\n     */\n    function depositWithPermit(uint256 assets_, address receiver_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_)\n        external returns (uint256 shares_);\n\n    /**\n     *  @dev    Does a ERC4626 `mint` with a ERC-2612 `permit`.\n     *  @param  shares_    The amount of `shares` to mint.\n     *  @param  receiver_  The receiver of the shares.\n     *  @param  maxAssets_ The maximum amount of assets that can be taken, as per the permit.\n     *  @param  deadline_  The timestamp after which the `permit` signature is no longer valid.\n     *  @param  v_         ECDSA signature v component.\n     *  @param  r_         ECDSA signature r component.\n     *  @param  s_         ECDSA signature s component.\n     *  @return assets_    The amount of shares deposited.\n     */\n    function mintWithPermit(uint256 shares_, address receiver_, uint256 maxAssets_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_)\n        external returns (uint256 assets_);\n\n    /**************************************************************************************************************************************/\n    /*** Withdrawal Request Functions                                                                                                   ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Removes shares from the withdrawal mechanism, can only be called after the beginning of the withdrawal window has passed.\n     *  @param  shares_         The amount of shares to redeem.\n     *  @param  owner_          The owner of the shares.\n     *  @return sharesReturned_ The amount of shares withdrawn.\n     */\n    function removeShares(uint256 shares_, address owner_) external returns (uint256 sharesReturned_);\n\n    /**\n     *  @dev    Requests a redemption of shares from the pool.\n     *  @param  shares_       The amount of shares to redeem.\n     *  @param  owner_        The owner of the shares.\n     *  @return escrowShares_ The amount of shares sent to escrow.\n     */\n    function requestRedeem(uint256 shares_, address owner_) external returns (uint256 escrowShares_);\n\n    /**\n     *  @dev    Requests a withdrawal of assets from the pool.\n     *  @param  assets_       The amount of assets to withdraw.\n     *  @param  owner_        The owner of the shares.\n     *  @return escrowShares_ The amount of shares sent to escrow.\n     */\n    function requestWithdraw(uint256 assets_, address owner_) external returns (uint256 escrowShares_);\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Returns the amount of underlying assets owned by the specified account.\n     *  @param  account_ Address of the account.\n     *  @return assets_  Amount of assets owned.\n     */\n    function balanceOfAssets(address account_) external view returns (uint256 assets_);\n\n    /**\n     *  @dev    Returns the amount of exit assets for the input amount.\n     *  @param  shares_ The amount of shares to convert to assets.\n     *  @return assets_ Amount of assets able to be exited.\n     */\n    function convertToExitAssets(uint256 shares_) external view returns (uint256 assets_);\n\n    /**\n     *  @dev    Returns the amount of exit shares for the input amount.\n     *  @param  assets_ The amount of assets to convert to shares.\n     *  @return shares_ Amount of shares able to be exited.\n     */\n    function convertToExitShares(uint256 assets_) external view returns (uint256 shares_);\n\n    /**\n     *  @dev    Returns the amount unrealized losses.\n     *  @return unrealizedLosses_ Amount of unrealized losses.\n     */\n    function unrealizedLosses() external view returns (uint256 unrealizedLosses_);\n\n}\n"},{"file_path":"modules/pool-v2-private/contracts/interfaces/Interfaces.sol","source_code":"// SPDX-License-Identifier: BUSL-1.1\npragma solidity ^0.8.7;\n\ninterface IERC20Like {\n\n    function allowance(address owner_, address spender_) external view returns (uint256 allowance_);\n\n    function balanceOf(address account_) external view returns (uint256 balance_);\n\n    function totalSupply() external view returns (uint256 totalSupply_);\n\n}\n\ninterface IGlobalsLike {\n\n    function bootstrapMint(address asset_) external view returns (uint256 bootstrapMint_);\n\n    function governor() external view returns (address governor_);\n\n    function isFunctionPaused(bytes4 sig_) external view returns (bool isFunctionPaused_);\n\n    function isInstanceOf(bytes32 instanceId_, address instance_) external view returns (bool isInstance_);\n\n    function isPoolAsset(address asset_) external view returns (bool isPoolAsset_);\n\n    function isPoolDelegate(address account_) external view returns (bool isPoolDelegate_);\n\n    function isPoolDeployer(address poolDeployer_) external view returns (bool isPoolDeployer_);\n\n    function isValidScheduledCall(address caller_, address contract_, bytes32 functionId_, bytes calldata callData_)\n        external view\n        returns (bool isValid_);\n\n    function mapleTreasury() external view returns (address mapleTreasury_);\n\n    function maxCoverLiquidationPercent(address poolManager_) external view returns (uint256 maxCoverLiquidationPercent_);\n\n    function migrationAdmin() external view returns (address migrationAdmin_);\n\n    function minCoverAmount(address poolManager_) external view returns (uint256 minCoverAmount_);\n\n    function operationalAdmin() external view returns (address operationalAdmin_);\n\n    function ownedPoolManager(address poolDelegate_) external view returns (address poolManager_);\n\n    function securityAdmin() external view returns (address securityAdmin_);\n\n    function transferOwnedPoolManager(address fromPoolDelegate_, address toPoolDelegate_) external;\n\n    function unscheduleCall(address caller_, bytes32 functionId_, bytes calldata callData_) external;\n\n}\n\ninterface IStrategyLike {\n\n    function assetsUnderManagement() external view returns (uint256 assetsUnderManagement_);\n\n    function unrealizedLosses() external view returns (uint256 unrealizedLosses_);\n\n}\n\ninterface ILoanManagerLike {\n\n    \n    function finishCollateralLiquidation(address loan_) external returns (uint256 remainingLosses_, uint256 serviceFee_);\n\n    function triggerDefault(address loan_, address liquidatorFactory_)\n        external\n        returns (bool liquidationComplete_, uint256 remainingLosses_, uint256 platformFees_);\n\n}\n\ninterface ILoanLike {\n\n    function lender() external view returns (address lender_);\n\n}\n\ninterface IMapleProxyFactoryLike {\n\n    function isInstance(address instance_) external view returns (bool isInstance_);\n\n    function mapleGlobals() external view returns (address mapleGlobals_);\n\n}\n\ninterface IPoolDelegateCoverLike {\n\n    function moveFunds(uint256 amount_, address recipient_) external;\n\n}\n\ninterface IPoolLike is IERC20Like {\n\n    function convertToExitShares(uint256 assets_) external view returns (uint256 shares_);\n\n    function previewDeposit(uint256 assets_) external view returns (uint256 shares_);\n\n    function previewMint(uint256 shares_) external view returns (uint256 assets_);\n\n}\n\ninterface IPoolManagerLike {\n\n    function addStrategy(address strategyFactory_, bytes calldata deploymentData_) external returns (address strategy_);\n\n    function canCall(bytes32 functionId_, address caller_, bytes memory data_)\n        external view\n        returns (bool canCall_, string memory errorMessage_);\n\n    function completeConfiguration() external;\n\n    function getEscrowParams(address owner_, uint256 shares_) external view returns (uint256 escrowShares_, address escrow_);\n\n    function maxDeposit(address receiver_) external view returns (uint256 maxAssets_);\n\n    function maxMint(address receiver_) external view returns (uint256 maxShares_);\n\n    function maxRedeem(address owner_) external view returns (uint256 maxShares_);\n\n    function maxWithdraw(address owner_) external view returns (uint256 maxAssets_);\n\n    function pool() external view returns (address pool_);\n\n    function poolDelegateCover() external view returns (address poolDelegateCover_);\n\n    function previewRedeem(address owner_, uint256 shares_) external view returns (uint256 assets_);\n\n    function previewWithdraw(address owner_, uint256 assets_) external view returns (uint256 shares_);\n\n    function processRedeem(uint256 shares_, address owner_, address sender_)\n        external\n        returns (uint256 redeemableShares_, uint256 resultingAssets_);\n\n    function processWithdraw(uint256 assets_, address owner_, address sender_)\n        external\n        returns (uint256 redeemableShares_, uint256 resultingAssets_);\n\n    function removeShares(uint256 shares_, address owner_) external returns (uint256 sharesReturned_);\n\n    function requestRedeem(uint256 shares_, address owner_, address sender_) external;\n\n    function requestWithdraw(uint256 shares_, uint256 assets_, address owner_, address sender_) external;\n\n    function setDelegateManagementFeeRate(uint256 delegateManagementFeeRate_) external;\n\n    function setLiquidityCap(uint256 liquidityCap_) external;\n\n    function setPoolPermissionManager(address poolPermissionManager_) external;\n\n    function setWithdrawalManager(address withdrawalManager_) external;\n\n    function totalAssets() external view returns (uint256 totalAssets_);\n\n    function unrealizedLosses() external view returns (uint256 unrealizedLosses_);\n\n}\n\ninterface IPoolPermissionManagerLike {\n\n    function hasPermission(address poolManager, address caller, bytes32 functionId) external view returns (bool allowed);\n\n    function hasPermission(address poolManager, address[] calldata caller, bytes32 functionId) external view returns (bool allowed);\n\n}\n\ninterface IWithdrawalManagerLike {\n\n    function addShares(uint256 shares_, address owner_) external;\n\n    function factory() external view returns (address factory_);\n\n    function isInExitWindow(address owner_) external view returns (bool isInExitWindow_);\n\n    function lockedLiquidity() external view returns (uint256 lockedLiquidity_);\n\n    function lockedShares(address owner_) external view returns (uint256 lockedShares_);\n\n    function previewRedeem(address owner_, uint256 shares) external view returns (uint256 redeemableShares, uint256 resultingAssets_);\n\n    function previewWithdraw(address owner_, uint256 assets_) external view returns (uint256 redeemableAssets_, uint256 resultingShares_);\n\n    function processExit(uint256 shares_, address account_) external returns (uint256 redeemableShares_, uint256 resultingAssets_);\n\n    function removeShares(uint256 shares_, address owner_) external returns (uint256 sharesReturned_);\n\n}\n"},{"file_path":"modules/pool-v2-private/modules/erc20-helper/src/ERC20Helper.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\nimport { IERC20Like } from \"./interfaces/IERC20Like.sol\";\n\n/**\n * @title Small Library to standardize erc20 token interactions.\n */\nlibrary ERC20Helper {\n\n    /**************************************************************************************************************************************/\n    /*** Internal Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    function transfer(address token_, address to_, uint256 amount_) internal returns (bool success_) {\n        return _call(token_, abi.encodeWithSelector(IERC20Like.transfer.selector, to_, amount_));\n    }\n\n    function transferFrom(address token_, address from_, address to_, uint256 amount_) internal returns (bool success_) {\n        return _call(token_, abi.encodeWithSelector(IERC20Like.transferFrom.selector, from_, to_, amount_));\n    }\n\n    function approve(address token_, address spender_, uint256 amount_) internal returns (bool success_) {\n        // If setting approval to zero fails, return false.\n        if (!_call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, uint256(0)))) return false;\n\n        // If `amount_` is zero, return true as the previous step already did this.\n        if (amount_ == uint256(0)) return true;\n\n        // Return the result of setting the approval to `amount_`.\n        return _call(token_, abi.encodeWithSelector(IERC20Like.approve.selector, spender_, amount_));\n    }\n\n    function _call(address token_, bytes memory data_) private returns (bool success_) {\n        if (token_.code.length == uint256(0)) return false;\n\n        bytes memory returnData;\n        ( success_, returnData ) = token_.call(data_);\n\n        return success_ && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));\n    }\n\n}\n"},{"file_path":"modules/pool-v2-private/modules/erc20-helper/src/interfaces/IERC20Like.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\n/// @title Interface of the ERC20 standard as needed by ERC20Helper.\ninterface IERC20Like {\n\n    function approve(address spender_, uint256 amount_) external returns (bool success_);\n\n    function transfer(address recipient_, uint256 amount_) external returns (bool success_);\n\n    function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_);\n\n}\n"},{"file_path":"modules/pool-v2-private/modules/erc20/contracts/ERC20.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\nimport { IERC20 } from \"./interfaces/IERC20.sol\";\n\n/*\n    ███████╗██████╗  ██████╗    ██████╗  ██████╗\n    ██╔════╝██╔══██╗██╔════╝    ╚════██╗██╔═████╗\n    █████╗  ██████╔╝██║          █████╔╝██║██╔██║\n    ██╔══╝  ██╔══██╗██║         ██╔═══╝ ████╔╝██║\n    ███████╗██║  ██║╚██████╗    ███████╗╚██████╔╝\n    ╚══════╝╚═╝  ╚═╝ ╚═════╝    ╚══════╝ ╚═════╝\n*/\n\n/**\n *  @title Modern ERC-20 implementation.\n *  @dev   Acknowledgements to Solmate, OpenZeppelin, and DSS for inspiring this code.\n */\ncontract ERC20 is IERC20 {\n\n    /**************************************************************************************************************************************/\n    /*** ERC-20                                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    string public override name;\n    string public override symbol;\n\n    uint8 public immutable override decimals;\n\n    uint256 public override totalSupply;\n\n    mapping(address => uint256) public override balanceOf;\n\n    mapping(address => mapping(address => uint256)) public override allowance;\n\n    /**************************************************************************************************************************************/\n    /*** ERC-2612                                                                                                                       ***/\n    /**************************************************************************************************************************************/\n\n    // PERMIT_TYPEHASH = keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n    bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;\n\n    mapping(address => uint256) public override nonces;\n\n    /**\n     *  @param name_     The name of the token.\n     *  @param symbol_   The symbol of the token.\n     *  @param decimals_ The decimal precision used by the token.\n     */\n    constructor(string memory name_, string memory symbol_, uint8 decimals_) {\n        name     = name_;\n        symbol   = symbol_;\n        decimals = decimals_;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** External Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    function approve(address spender_, uint256 amount_) public virtual override returns (bool success_) {\n        _approve(msg.sender, spender_, amount_);\n        return true;\n    }\n\n    function decreaseAllowance(address spender_, uint256 subtractedAmount_) public virtual override returns (bool success_) {\n        _decreaseAllowance(msg.sender, spender_, subtractedAmount_);\n        return true;\n    }\n\n    function increaseAllowance(address spender_, uint256 addedAmount_) public virtual override returns (bool success_) {\n        _approve(msg.sender, spender_, allowance[msg.sender][spender_] + addedAmount_);\n        return true;\n    }\n\n    function permit(address owner_, address spender_, uint256 amount_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_)\n        public virtual override\n    {\n        require(deadline_ >= block.timestamp, \"ERC20:P:EXPIRED\");\n\n        // Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines\n        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}.\n        require(\n            uint256(s_) <= uint256(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) &&\n            (v_ == 27 || v_ == 28),\n            \"ERC20:P:MALLEABLE\"\n        );\n\n        // Nonce realistically cannot overflow.\n        unchecked {\n            bytes32 digest_ = keccak256(\n                abi.encodePacked(\n                    \"\\x19\\x01\",\n                    DOMAIN_SEPARATOR(),\n                    keccak256(abi.encode(PERMIT_TYPEHASH, owner_, spender_, amount_, nonces[owner_]++, deadline_))\n                )\n            );\n\n            address recoveredAddress_ = ecrecover(digest_, v_, r_, s_);\n\n            require(recoveredAddress_ == owner_ && owner_ != address(0), \"ERC20:P:INVALID_SIGNATURE\");\n        }\n\n        _approve(owner_, spender_, amount_);\n    }\n\n    function transfer(address recipient_, uint256 amount_) public virtual override returns (bool success_) {\n        _transfer(msg.sender, recipient_, amount_);\n        return true;\n    }\n\n    function transferFrom(address owner_, address recipient_, uint256 amount_) public virtual override returns (bool success_) {\n        _decreaseAllowance(owner_, msg.sender, amount_);\n        _transfer(owner_, recipient_, amount_);\n        return true;\n    }\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    function DOMAIN_SEPARATOR() public view override returns (bytes32 domainSeparator_) {\n        return keccak256(\n            abi.encode(\n                keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n                keccak256(bytes(name)),\n                keccak256(bytes(\"1\")),\n                block.chainid,\n                address(this)\n            )\n        );\n    }\n\n    /**************************************************************************************************************************************/\n    /*** Internal Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    function _approve(address owner_, address spender_, uint256 amount_) internal {\n        emit Approval(owner_, spender_, allowance[owner_][spender_] = amount_);\n    }\n\n    function _burn(address owner_, uint256 amount_) internal {\n        balanceOf[owner_] -= amount_;\n\n        // Cannot underflow because a user's balance will never be larger than the total supply.\n        unchecked { totalSupply -= amount_; }\n\n        emit Transfer(owner_, address(0), amount_);\n    }\n\n    function _decreaseAllowance(address owner_, address spender_, uint256 subtractedAmount_) internal {\n        uint256 spenderAllowance = allowance[owner_][spender_];  // Cache to memory.\n\n        if (spenderAllowance != type(uint256).max) {\n            _approve(owner_, spender_, spenderAllowance - subtractedAmount_);\n        }\n    }\n\n    function _mint(address recipient_, uint256 amount_) internal {\n        totalSupply += amount_;\n\n        // Cannot overflow because totalSupply would first overflow in the statement above.\n        unchecked { balanceOf[recipient_] += amount_; }\n\n        emit Transfer(address(0), recipient_, amount_);\n    }\n\n    function _transfer(address owner_, address recipient_, uint256 amount_) internal {\n        balanceOf[owner_] -= amount_;\n\n        // Cannot overflow because minting prevents overflow of totalSupply, and sum of user balances == totalSupply.\n        unchecked { balanceOf[recipient_] += amount_; }\n\n        emit Transfer(owner_, recipient_, amount_);\n    }\n\n}\n"},{"file_path":"modules/pool-v2-private/modules/erc20/contracts/interfaces/IERC20.sol","source_code":"// SPDX-License-Identifier: AGPL-3.0-only\npragma solidity ^0.8.7;\n\n/// @title Interface of the ERC20 standard as defined in the EIP, including EIP-2612 permit functionality.\ninterface IERC20 {\n\n    /**************************************************************************************************************************************/\n    /*** Events                                                                                                                         ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev   Emitted when one account has set the allowance of another account over their tokens.\n     *  @param owner_   Account that tokens are approved from.\n     *  @param spender_ Account that tokens are approved for.\n     *  @param amount_  Amount of tokens that have been approved.\n     */\n    event Approval(address indexed owner_, address indexed spender_, uint256 amount_);\n\n    /**\n     *  @dev   Emitted when tokens have moved from one account to another.\n     *  @param owner_     Account that tokens have moved from.\n     *  @param recipient_ Account that tokens have moved to.\n     *  @param amount_    Amount of tokens that have been transferred.\n     */\n    event Transfer(address indexed owner_, address indexed recipient_, uint256 amount_);\n\n    /**************************************************************************************************************************************/\n    /*** External Functions                                                                                                             ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Function that allows one account to set the allowance of another account over their tokens.\n     *          Emits an {Approval} event.\n     *  @param  spender_ Account that tokens are approved for.\n     *  @param  amount_  Amount of tokens that have been approved.\n     *  @return success_ Boolean indicating whether the operation succeeded.\n     */\n    function approve(address spender_, uint256 amount_) external returns (bool success_);\n\n    /**\n     *  @dev    Function that allows one account to decrease the allowance of another account over their tokens.\n     *          Emits an {Approval} event.\n     *  @param  spender_          Account that tokens are approved for.\n     *  @param  subtractedAmount_ Amount to decrease approval by.\n     *  @return success_          Boolean indicating whether the operation succeeded.\n     */\n    function decreaseAllowance(address spender_, uint256 subtractedAmount_) external returns (bool success_);\n\n    /**\n     *  @dev    Function that allows one account to increase the allowance of another account over their tokens.\n     *          Emits an {Approval} event.\n     *  @param  spender_     Account that tokens are approved for.\n     *  @param  addedAmount_ Amount to increase approval by.\n     *  @return success_     Boolean indicating whether the operation succeeded.\n     */\n    function increaseAllowance(address spender_, uint256 addedAmount_) external returns (bool success_);\n\n    /**\n     *  @dev   Approve by signature.\n     *  @param owner_    Owner address that signed the permit.\n     *  @param spender_  Spender of the permit.\n     *  @param amount_   Permit approval spend limit.\n     *  @param deadline_ Deadline after which the permit is invalid.\n     *  @param v_        ECDSA signature v component.\n     *  @param r_        ECDSA signature r component.\n     *  @param s_        ECDSA signature s component.\n     */\n    function permit(address owner_, address spender_, uint amount_, uint deadline_, uint8 v_, bytes32 r_, bytes32 s_) external;\n\n    /**\n     *  @dev    Moves an amount of tokens from `msg.sender` to a specified account.\n     *          Emits a {Transfer} event.\n     *  @param  recipient_ Account that receives tokens.\n     *  @param  amount_    Amount of tokens that are transferred.\n     *  @return success_   Boolean indicating whether the operation succeeded.\n     */\n    function transfer(address recipient_, uint256 amount_) external returns (bool success_);\n\n    /**\n     *  @dev    Moves a pre-approved amount of tokens from a sender to a specified account.\n     *          Emits a {Transfer} event.\n     *          Emits an {Approval} event.\n     *  @param  owner_     Account that tokens are moving from.\n     *  @param  recipient_ Account that receives tokens.\n     *  @param  amount_    Amount of tokens that are transferred.\n     *  @return success_   Boolean indicating whether the operation succeeded.\n     */\n    function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_);\n\n    /**************************************************************************************************************************************/\n    /*** View Functions                                                                                                                 ***/\n    /**************************************************************************************************************************************/\n\n    /**\n     *  @dev    Returns the allowance that one account has given another over their tokens.\n     *  @param  owner_     Account that tokens are approved from.\n     *  @param  spender_   Account that tokens are approved for.\n     *  @return allowance_ Allowance that one account has given another over their tokens.\n     */\n    function allowance(address owner_, address spender_) external view returns (uint256 allowance_);\n\n    /**\n     *  @dev    Returns the amount of tokens owned by a given account.\n     *  @param  account_ Account that owns the tokens.\n     *  @return balance_ Amount of tokens owned by a given account.\n     */\n    function balanceOf(address account_) external view returns (uint256 balance_);\n\n    /**\n     *  @dev    Returns the decimal precision used by the token.\n     *  @return decimals_ The decimal precision used by the token.\n     */\n    function decimals() external view returns (uint8 decimals_);\n\n    /**\n     *  @dev    Returns the signature domain separator.\n     *  @return domainSeparator_ The signature domain separator.\n     */\n    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator_);\n\n    /**\n     *  @dev    Returns the name of the token.\n     *  @return name_ The name of the token.\n     */\n    function name() external view returns (string memory name_);\n\n    /**\n      *  @dev    Returns the nonce for the given owner.\n      *  @param  owner_  The address of the owner account.\n      *  @return nonce_ The nonce for the given owner.\n     */\n    function nonces(address owner_) external view returns (uint256 nonce_);\n\n    /**\n     *  @dev    Returns the permit type hash.\n     *  @return permitTypehash_ The permit type hash.\n     */\n    function PERMIT_TYPEHASH() external view returns (bytes32 permitTypehash_);\n\n    /**\n     *  @dev    Returns the symbol of the token.\n     *  @return symbol_ The symbol of the token.\n     */\n    function symbol() external view returns (string memory symbol_);\n\n    /**\n     *  @dev    Returns the total amount of tokens in existence.\n     *  @return totalSupply_ The total amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256 totalSupply_);\n\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"manager_","type":"address"},{"internalType":"address","name":"asset_","type":"address"},{"internalType":"address","name":"destination_","type":"address"},{"internalType":"uint256","name":"bootstrapMint_","type":"uint256"},{"internalType":"uint256","name":"initialSupply_","type":"uint256"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"spender_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"receiver_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bootStrapMintAmount_","type":"uint256"}],"name":"BootstrapMintPerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner_","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner_","type":"address"}],"name":"OwnershipAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"pendingOwner_","type":"address"}],"name":"PendingOwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"escrowedShares_","type":"uint256"}],"name":"RedemptionRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"SharesRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"recipient_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"receiver_","type":"address"},{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"escrowedShares_","type":"uint256"}],"name":"WithdrawRequested","type":"event"},{"inputs":[],"name":"BOOTSTRAP_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"domainSeparator_","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"balanceOfAssets","outputs":[{"internalType":"uint256","name":"balanceOfAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"convertToExitAssets","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"convertToExitShares","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"subtractedAmount_","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"depositWithPermit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"addedAmount_","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"maxAssets_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"mintWithPermit","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"name":"removeShares","outputs":[{"internalType":"uint256","name":"sharesReturned_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"name":"requestRedeem","outputs":[{"internalType":"uint256","name":"escrowedShares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"owner_","type":"address"}],"name":"requestWithdraw","outputs":[{"internalType":"uint256","name":"escrowedShares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"totalAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrealizedLosses","outputs":[{"internalType":"uint256","name":"unrealizedLosses_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":"0000000000000000000000006c48cd22086f3db3f23e7ceedd5c429d93ff3327000000000000000000000000e343167631d89b6ffc58b88d6b7fb0228795491d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000009737972757055534447000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000097379727570555344470000000000000000000000000000000000000000000000"}