{"file_path":"src/dsr/SavingsUsdd.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/// SavingsUsdd.sol -- A tokenized representation USDD in the DSR (pot)\n\n// Copyright (C) 2017, 2018, 2019 dbrock, rain, mrchico\n// Copyright (C) 2021-2022 Dai Foundation\n//\n// This program is free software: you can redistribute it and/or modify\n// it under the terms of the GNU Affero General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// This program is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU Affero General Public License for more details.\n//\n// You should have received a copy of the GNU Affero General Public License\n// along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\npragma solidity ^0.8.17;\n\ninterface IERC1271 {\n    function isValidSignature(\n        bytes32,\n        bytes memory\n    ) external view returns (bytes4);\n}\n\ninterface VatLike {\n    function hope(address) external;\n}\n\ninterface PotLike {\n    function chi() external view returns (uint256);\n    function rho() external view returns (uint256);\n    function dsr() external view returns (uint256);\n    function drip() external returns (uint256);\n    function join(uint256) external;\n    function exit(uint256) external;\n}\n\ninterface UsddJoinLike {\n    function vat() external view returns (address);\n    function usdd() external view returns (address);\n    function join(address, uint256) external;\n    function exit(address, uint256) external;\n}\n\ninterface UsddLike {\n    function transferFrom(address, address, uint256) external returns (bool);\n    function approve(address, uint256) external returns (bool);\n}\n\ncontract SavingsUsdd {\n\n    // --- ERC20 Data ---\n    string  public constant name     = \"Savings Usdd\";\n    string  public constant symbol   = \"sUSDD\";\n    string  public constant version  = \"1\";\n    uint8   public constant decimals = 18;\n    uint256 public totalSupply;\n\n    mapping (address => uint256)                      public balanceOf;\n    mapping (address => mapping (address => uint256)) public allowance;\n    mapping (address => uint256)                      public nonces;\n\n    // --- Data ---\n    VatLike     public immutable vat;\n    UsddJoinLike public immutable usddJoin;\n    UsddLike     public immutable usdd;\n    PotLike     public immutable pot;\n\n    // --- Events ---\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n    event Transfer(address indexed from, address indexed to, uint256 value);\n    event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);\n    event Withdraw(address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares);\n    event Referral(uint16 indexed referral, address indexed owner, uint256 assets, uint256 shares);\n\n    // --- EIP712 niceties ---\n    uint256 public immutable deploymentChainId;\n    bytes32 private immutable _DOMAIN_SEPARATOR;\n    bytes32 public constant PERMIT_TYPEHASH = keccak256(\"Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)\");\n    \n    uint256 private constant RAY = 10 ** 27;\n\n    constructor(address _usddJoin, address _pot) {\n        usddJoin = UsddJoinLike(_usddJoin);\n        vat = VatLike(usddJoin.vat());\n        usdd = UsddLike(usddJoin.usdd());\n        pot = PotLike(_pot);\n\n        deploymentChainId = block.chainid;\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(block.chainid);\n\n        vat.hope(address(usddJoin));\n        vat.hope(address(pot));\n\n        usdd.approve(address(usddJoin), type(uint256).max);\n    }\n\n    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {\n        return keccak256(\n            abi.encode(\n                keccak256(\"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)\"),\n                keccak256(bytes(name)),\n                keccak256(bytes(version)),\n                chainId,\n                address(this)\n            )\n        );\n    }\n\n    function DOMAIN_SEPARATOR() external view returns (bytes32) {\n        return block.chainid == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(block.chainid);\n    }\n\n    function _rpow(uint256 x, uint256 n) internal pure returns (uint256 z) {\n        assembly {\n            switch x case 0 {switch n case 0 {z := RAY} default {z := 0}}\n            default {\n                switch mod(n, 2) case 0 { z := RAY } default { z := x }\n                let half := div(RAY, 2)  // for rounding.\n                for { n := div(n, 2) } n { n := div(n,2) } {\n                    let xx := mul(x, x)\n                    if iszero(eq(div(xx, x), x)) { revert(0,0) }\n                    let xxRound := add(xx, half)\n                    if lt(xxRound, xx) { revert(0,0) }\n                    x := div(xxRound, RAY)\n                    if mod(n,2) {\n                        let zx := mul(z, x)\n                        if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) }\n                        let zxRound := add(zx, half)\n                        if lt(zxRound, zx) { revert(0,0) }\n                        z := div(zxRound, RAY)\n                    }\n                }\n            }\n        }\n    }\n\n    function _divup(uint256 x, uint256 y) internal pure returns (uint256 z) {\n        unchecked {\n            z = x != 0 ? ((x - 1) / y) + 1 : 0;\n        }\n    }\n\n    // --- ERC20 Mutations ---\n\n    function transfer(address to, uint256 value) external returns (bool) {\n        require(to != address(0) && to != address(this), \"SavingsUsdd/invalid-address\");\n        uint256 balance = balanceOf[msg.sender];\n        require(balance >= value, \"SavingsUsdd/insufficient-balance\");\n\n        unchecked {\n            balanceOf[msg.sender] = balance - value;\n            balanceOf[to] += value;\n        }\n\n        emit Transfer(msg.sender, to, value);\n\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 value) external returns (bool) {\n        require(to != address(0) && to != address(this), \"SavingsUsdd/invalid-address\");\n        uint256 balance = balanceOf[from];\n        require(balance >= value, \"SavingsUsdd/insufficient-balance\");\n\n        if (from != msg.sender) {\n            uint256 allowed = allowance[from][msg.sender];\n            if (allowed != type(uint256).max) {\n                require(allowed >= value, \"SavingsUsdd/insufficient-allowance\");\n\n                unchecked {\n                    allowance[from][msg.sender] = allowed - value;\n                }\n            }\n        }\n\n        unchecked {\n            balanceOf[from] = balance - value;\n            balanceOf[to] += value;\n        }\n\n        emit Transfer(from, to, value);\n\n        return true;\n    }\n\n    function approve(address spender, uint256 value) external returns (bool) {\n        allowance[msg.sender][spender] = value;\n\n        emit Approval(msg.sender, spender, value);\n\n        return true;\n    }\n\n    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {\n        uint256 newValue = allowance[msg.sender][spender] + addedValue;\n        allowance[msg.sender][spender] = newValue;\n\n        emit Approval(msg.sender, spender, newValue);\n\n        return true;\n    }\n\n    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {\n        uint256 allowed = allowance[msg.sender][spender];\n        require(allowed >= subtractedValue, \"SavingsUsdd/insufficient-allowance\");\n        unchecked{\n            allowed = allowed - subtractedValue;\n        }\n        allowance[msg.sender][spender] = allowed;\n\n        emit Approval(msg.sender, spender, allowed);\n\n        return true;\n    }\n\n    // --- Mint/Burn Internal ---\n\n    function _mint(uint256 assets, uint256 shares, address receiver) internal {\n        require(receiver != address(0) && receiver != address(this), \"SavingsUsdd/invalid-address\");\n\n        usdd.transferFrom(msg.sender, address(this), assets);\n        usddJoin.join(address(this), assets);\n        pot.join(shares);\n\n        // note: we don't need an overflow check here b/c shares totalSupply will always be <= usdd totalSupply\n        unchecked {\n            balanceOf[receiver] = balanceOf[receiver] + shares;\n            totalSupply = totalSupply + shares;\n        }\n\n        emit Deposit(msg.sender, receiver, assets, shares);\n        emit Transfer(address(0), receiver, shares);\n    }\n\n    function _burn(uint256 assets, uint256 shares, address receiver, address owner) internal {\n        uint256 balance = balanceOf[owner];\n        require(balance >= shares, \"SavingsUsdd/insufficient-balance\");\n\n        if (owner != msg.sender) {\n            uint256 allowed = allowance[owner][msg.sender];\n            if (allowed != type(uint256).max) {\n                require(allowed >= shares, \"SavingsUsdd/insufficient-allowance\");\n\n                unchecked {\n                    allowance[owner][msg.sender] = allowed - shares;\n                }\n            }\n        }\n\n        unchecked {\n            balanceOf[owner] = balance - shares; // note: we don't need overflow checks b/c require(balance >= value) and balance <= totalSupply\n            totalSupply      = totalSupply - shares;\n        }\n\n        pot.exit(shares);\n        usddJoin.exit(receiver, assets);\n\n        emit Transfer(owner, address(0), shares);\n        emit Withdraw(msg.sender, receiver, owner, assets, shares);\n    }\n\n    // --- ERC-4626 ---\n\n    function asset() external view returns (address) {\n        return address(usdd);\n    }\n\n    function totalAssets() external view returns (uint256) {\n        return convertToAssets(totalSupply);\n    }\n\n    function convertToShares(uint256 assets) public view returns (uint256) {\n        uint256 rho = pot.rho();\n        uint256 chi = (block.timestamp > rho) ? _rpow(pot.dsr(), block.timestamp - rho) * pot.chi() / RAY : pot.chi();\n        return assets * RAY / chi;\n    }\n\n    function convertToAssets(uint256 shares) public view returns (uint256) {\n        uint256 rho = pot.rho();\n        uint256 chi = (block.timestamp > rho) ? _rpow(pot.dsr(), block.timestamp - rho) * pot.chi() / RAY : pot.chi();\n        return shares * chi / RAY;\n    }\n\n    function maxDeposit(address) external pure returns (uint256) {\n        return type(uint256).max;\n    }\n\n    function previewDeposit(uint256 assets) external view returns (uint256) {\n        return convertToShares(assets);\n    }\n\n    function deposit(uint256 assets, address receiver) public returns (uint256 shares) {\n        uint256 chi = (block.timestamp > pot.rho()) ? pot.drip() : pot.chi();\n        shares = assets * RAY / chi;\n        _mint(assets, shares, receiver);\n    }\n\n    function deposit(uint256 assets, address receiver, uint16 referral) external returns (uint256 shares) {\n        shares = deposit(assets, receiver);\n        emit Referral(referral, receiver, assets, shares);\n    }\n\n    function maxMint(address) external pure returns (uint256) {\n        return type(uint256).max;\n    }\n\n    function previewMint(uint256 shares) external view returns (uint256) {\n        uint256 rho = pot.rho();\n        uint256 chi = (block.timestamp > rho) ? _rpow(pot.dsr(), block.timestamp - rho) * pot.chi() / RAY : pot.chi();\n        return _divup(shares * chi, RAY);\n    }\n\n    function mint(uint256 shares, address receiver) public returns (uint256 assets) {\n        uint256 chi = (block.timestamp > pot.rho()) ? pot.drip() : pot.chi();\n        assets = _divup(shares * chi, RAY);\n        _mint(assets, shares, receiver);\n    }\n\n    function mint(uint256 shares, address receiver, uint16 referral) external returns (uint256 assets) {\n        assets = mint(shares, receiver);\n        emit Referral(referral, receiver, assets, shares);\n    }\n\n    function maxWithdraw(address owner) external view returns (uint256) {\n        return convertToAssets(balanceOf[owner]);\n    }\n\n    function previewWithdraw(uint256 assets) external view returns (uint256) {\n        uint256 rho = pot.rho();\n        uint256 chi = (block.timestamp > rho) ? _rpow(pot.dsr(), block.timestamp - rho) * pot.chi() / RAY : pot.chi();\n        return _divup(assets * RAY, chi);\n    }\n\n    function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares) {\n        uint256 chi = (block.timestamp > pot.rho()) ? pot.drip() : pot.chi();\n        shares = _divup(assets * RAY, chi);\n        _burn(assets, shares, receiver, owner);\n    }\n\n    function maxRedeem(address owner) external view returns (uint256) {\n        return balanceOf[owner];\n    }\n\n    function previewRedeem(uint256 shares) external view returns (uint256) {\n        return convertToAssets(shares);\n    }\n\n    function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets) {\n        uint256 chi = (block.timestamp > pot.rho()) ? pot.drip() : pot.chi();\n        assets = shares * chi / RAY;\n        _burn(assets, shares, receiver, owner);\n    }\n\n    // --- Approve by signature ---\n\n    function _isValidSignature(\n        address signer,\n        bytes32 digest,\n        bytes memory signature\n    ) internal view returns (bool) {\n        if (signature.length == 65) {\n            bytes32 r;\n            bytes32 s;\n            uint8 v;\n            assembly {\n                r := mload(add(signature, 0x20))\n                s := mload(add(signature, 0x40))\n                v := byte(0, mload(add(signature, 0x60)))\n            }\n            if (signer == ecrecover(digest, v, r, s)) {\n                return true;\n            }\n        }\n\n        (bool success, bytes memory result) = signer.staticcall(\n            abi.encodeWithSelector(IERC1271.isValidSignature.selector, digest, signature)\n        );\n        return (success &&\n            result.length == 32 &&\n            abi.decode(result, (bytes4)) == IERC1271.isValidSignature.selector);\n    }\n\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        bytes memory signature\n    ) public {\n        require(block.timestamp <= deadline, \"SavingsUsdd/permit-expired\");\n        require(owner != address(0), \"SavingsUsdd/invalid-owner\");\n\n        uint256 nonce;\n        unchecked { nonce = nonces[owner]++; }\n\n        bytes32 digest =\n            keccak256(abi.encodePacked(\n                \"\\x19\\x01\",\n                block.chainid == deploymentChainId ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(block.chainid),\n                keccak256(abi.encode(\n                    PERMIT_TYPEHASH,\n                    owner,\n                    spender,\n                    value,\n                    nonce,\n                    deadline\n                ))\n            ));\n\n        require(_isValidSignature(owner, digest, signature), \"SavingsUsdd/invalid-permit\");\n\n        allowance[owner][spender] = value;\n        emit Approval(owner, spender, value);\n    }\n\n    function permit(\n        address owner,\n        address spender,\n        uint256 value,\n        uint256 deadline,\n        uint8 v,\n        bytes32 r,\n        bytes32 s\n    ) external {\n        permit(owner, spender, value, deadline, abi.encodePacked(r, s, v));\n    }\n\n}\n","deployed_bytecode":"0x608060405234801561000f575f5ffd5b506004361061023f575f3560e01c806370a0823111610135578063ba087652116100b4578063ce96cb7711610079578063ce96cb77146105d3578063d505accf146105e6578063d905777e146105f9578063dd62ed3e14610621578063ef8b30f71461064b575f5ffd5b8063ba0876521461055f578063c63d75b6146103f5578063c6e6f59214610572578063c78d6d2114610585578063cd0d0096146105ac575f5ffd5b80639fd5a6cf116100fa5780639fd5a6cf146104fe578063a457c2d714610513578063a9059cbb14610526578063b3d7f6b914610539578063b460af941461054c575f5ffd5b806370a08231146104765780637ecebe001461049557806394bf804d146104b457806395d89b41146104c75780639b8d6d38146104eb575f5ffd5b8063313ce567116101c1578063402d267d11610186578063402d267d146103f55780634ba2363a146104095780634cdad5061461043057806354fd4d50146104435780636e553f6514610463575f5ffd5b8063313ce567146103735780633644e5151461038d57806336569e771461039557806338d52e0f146103bc57806339509351146103e2575f5ffd5b80630c30bc02116102075780630c30bc02146102df57806318160ddd1461031e578063216740a01461032657806323b872dd1461033957806330adf81f1461034c575f5ffd5b806301e1d1141461024357806306fdde031461025e57806307a2d13a14610296578063095ea7b3146102a95780630a28a477146102cc575b5f5ffd5b61024b61065e565b6040519081526020015b60405180910390f35b6102896040518060400160405280600c81526020016b14d85d9a5b99dcc8155cd91960a21b81525081565b6040516102559190612626565b61024b6102a4366004612638565b61066e565b6102bc6102b736600461266a565b6108db565b6040519015158152602001610255565b61024b6102da366004612638565b610934565b6103067f0000000000000000000000004f8e5de400de08b164e7421b3ee387f461becd1a81565b6040516001600160a01b039091168152602001610255565b61024b5f5481565b61024b610334366004612692565b610b64565b6102bc6103473660046126d5565b610bc9565b61024b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61037b601281565b60405160ff9091168152602001610255565b61024b610d2e565b6103067f000000000000000000000000ff77f6209239deb2c076179499f2346b0032097f81565b7f0000000000000000000000004f8e5de400de08b164e7421b3ee387f461becd1a610306565b6102bc6103f036600461266a565b610d84565b61024b61040336600461270f565b505f1990565b6103067f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca50081565b61024b61043e366004612638565b610e08565b610289604051806040016040528060018152602001603160f81b81525081565b61024b610471366004612728565b610e12565b61024b61048436600461270f565b60016020525f908152604090205481565b61024b6104a336600461270f565b60036020525f908152604090205481565b61024b6104c2366004612728565b610fd6565b610289604051806040016040528060058152602001641cd554d11160da1b81525081565b61024b6104f9366004612692565b611191565b61051161050c366004612766565b6111e7565b005b6102bc61052136600461266a565b61145e565b6102bc61053436600461266a565b6114ea565b61024b610547366004612638565b6115a0565b61024b61055a36600461284c565b6117bf565b61024b61056d36600461284c565b61197d565b61024b610580366004612638565b611b3b565b6103067f000000000000000000000000983dfef6d71862d809e239845da5a959492f63b881565b61024b7f000000000000000000000000000000000000000000000000000000000000000181565b61024b6105e136600461270f565b611d63565b6105116105f4366004612885565b611d84565b61024b61060736600461270f565b6001600160a01b03165f9081526001602052604090205490565b61024b61062f3660046128f2565b600260209081525f928352604080842090915290825290205481565b61024b610659366004612638565b611ddb565b5f6106695f5461066e565b905090565b5f5f7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061291a565b90505f81421161077f577f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610756573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077a919061291a565b6108b1565b676765c793fa10079d601b1b7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080b919061291a565b61089d7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088e919061291a565b6108988642612945565b611de5565b6108a79190612958565b6108b19190612983565b9050676765c793fa10079d601b1b6108c98286612958565b6108d39190612983565b949350505050565b335f8181526002602090815260408083206001600160a01b038716808552925280832085905551919290915f516020612af85f395f51905f52906109229086815260200190565b60405180910390a35060015b92915050565b5f5f7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610992573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b6919061291a565b90505f814211610a45577f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a1c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a40919061291a565b610b44565b676765c793fa10079d601b1b7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aad573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad1919061291a565b610b307f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d5f5f3e3d5ffd5b610b3a9190612958565b610b449190612983565b90506108d3610b5e676765c793fa10079d601b1b86612958565b82611ed0565b5f610b6f8484610fd6565b9050826001600160a01b03168261ffff167fb30a03a0e2a407f18ae0e83491331dc069d1521e292feffb071e61c8f7f406368387604051610bba929190918252602082015260400190565b60405180910390a39392505050565b5f6001600160a01b03831615801590610beb57506001600160a01b0383163014155b610c105760405162461bcd60e51b8152600401610c07906129a2565b60405180910390fd5b6001600160a01b0384165f9081526001602052604090205482811015610c485760405162461bcd60e51b8152600401610c07906129d9565b6001600160a01b0385163314610ccd576001600160a01b0385165f9081526002602090815260408083203384529091529020545f198114610ccb5783811015610ca35760405162461bcd60e51b8152600401610c0790612a0e565b6001600160a01b0386165f908152600260209081526040808320338452909152902084820390555b505b6001600160a01b038086165f8181526001602052604080822087860390559287168082529083902080548701905591515f516020612ad85f395f51905f5290610d199087815260200190565b60405180910390a360019150505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000014614610d5f5761066946611efb565b507ff23e5de26f0a3165c57f379f00307e9c590d5c306c0d3441f6ce96b70a83ed2c90565b335f9081526002602090815260408083206001600160a01b03861684529091528120548190610db4908490612a50565b335f8181526002602090815260408083206001600160a01b038a16808552908352928190208590555184815293945090925f516020612af85f395f51905f5291015b60405180910390a35060019392505050565b5f61092e8261066e565b5f5f7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e70573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e94919061291a565b4211610f1f577f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1a919061291a565b610fa0565b7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610f7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa0919061291a565b905080610fb8676765c793fa10079d601b1b86612958565b610fc29190612983565b9150610fcf848385611fd0565b5092915050565b5f5f7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611034573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611058919061291a565b42116110e3577f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110de919061291a565b611164565b7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611140573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611164919061291a565b90506111846111738286612958565b676765c793fa10079d601b1b611ed0565b9150610fcf828585611fd0565b5f61119c8484610e12565b9050826001600160a01b03168261ffff167fb30a03a0e2a407f18ae0e83491331dc069d1521e292feffb071e61c8f7f406368684604051610bba929190918252602082015260400190565b814211156112375760405162461bcd60e51b815260206004820152601a60248201527f536176696e6773557364642f7065726d69742d657870697265640000000000006044820152606401610c07565b6001600160a01b03851661128d5760405162461bcd60e51b815260206004820152601960248201527f536176696e6773557364642f696e76616c69642d6f776e6572000000000000006044820152606401610c07565b6001600160a01b0385165f90815260036020526040812080546001810190915590467f0000000000000000000000000000000000000000000000000000000000000001146112e3576112de46611efb565b611305565b7ff23e5de26f0a3165c57f379f00307e9c590d5c306c0d3441f6ce96b70a83ed2c5b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808b169282019290925290881660608201526080810187905260a0810184905260c0810186905260e0016040516020818303038152906040528051906020012060405160200161139e92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506113c1878285612223565b61140d5760405162461bcd60e51b815260206004820152601a60248201527f536176696e6773557364642f696e76616c69642d7065726d69740000000000006044820152606401610c07565b6001600160a01b038781165f818152600260209081526040808320948b168084529482529182902089905590518881525f516020612af85f395f51905f52910160405180910390a350505050505050565b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156114a15760405162461bcd60e51b8152600401610c0790612a0e565b335f8181526002602090815260408083206001600160a01b038916808552908352928190209487900394859055518481529192915f516020612af85f395f51905f529101610df6565b5f6001600160a01b0383161580159061150c57506001600160a01b0383163014155b6115285760405162461bcd60e51b8152600401610c07906129a2565b335f90815260016020526040902054828110156115575760405162461bcd60e51b8152600401610c07906129d9565b335f81815260016020908152604080832087860390556001600160a01b03881680845292819020805488019055518681529192915f516020612ad85f395f51905f529101610df6565b5f5f7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611622919061291a565b90505f8142116116b1577f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611688573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ac919061291a565b6117b0565b676765c793fa10079d601b1b7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611719573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173d919061291a565b61179c7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d5f5f3e3d5ffd5b6117a69190612958565b6117b09190612983565b90506108d36111738286612958565b5f5f7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611841919061291a565b42116118cc577f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c7919061291a565b61194d565b7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611929573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194d919061291a565b9050611967610b5e676765c793fa10079d601b1b87612958565b9150611975858386866123ac565b509392505050565b5f5f7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff919061291a565b4211611a8a577f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a61573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a85919061291a565b611b0b565b7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611ae7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0b919061291a565b9050676765c793fa10079d601b1b611b238287612958565b611b2d9190612983565b9150611975828686866123ac565b5f5f7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbd919061291a565b90505f814211611c4c577f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c47919061291a565b611d4b565b676765c793fa10079d601b1b7f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd8919061291a565b611d377f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d5f5f3e3d5ffd5b611d419190612958565b611d4b9190612983565b9050806108c9676765c793fa10079d601b1b86612958565b6001600160a01b0381165f9081526001602052604081205461092e9061066e565b611dd287878787868689604051602001611dbe93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b6040516020818303038152906040526111e7565b50505050505050565b5f61092e82611b3b565b5f828015611eaa57600183168015611dff57849250611e0e565b676765c793fa10079d601b1b92505b506002909204916b019d971e4fe8401e740000005b8315611ea4578485028586820414611e39575f5ffd5b81810181811015611e48575f5ffd5b676765c793fa10079d601b1b90049550506001841615611e99578483028386820414158615151615611e78575f5ffd5b81810181811015611e87575f5ffd5b676765c793fa10079d601b1b90049350505b600284049350611e23565b50610fcf565b828015611eb9575f9250611ec8565b676765c793fa10079d601b1b92505b505092915050565b5f825f03611ede575f610d27565b816001840381611ef057611ef061296f565b046001019392505050565b604080518082018252600c81526b14d85d9a5b99dcc8155cd91960a21b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fd8187624be2f1af878d75953ca9c210ff856e4a346d04ec98490f6344034d7c4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b6001600160a01b03811615801590611ff157506001600160a01b0381163014155b61200d5760405162461bcd60e51b8152600401610c07906129a2565b6040516323b872dd60e01b8152336004820152306024820152604481018490527f0000000000000000000000004f8e5de400de08b164e7421b3ee387f461becd1a6001600160a01b0316906323b872dd906064016020604051808303815f875af115801561207d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a19190612a63565b50604051633b4da69f60e01b8152306004820152602481018490527f000000000000000000000000983dfef6d71862d809e239845da5a959492f63b86001600160a01b031690633b4da69f906044015f604051808303815f87803b158015612107575f5ffd5b505af1158015612119573d5f5f3e3d5ffd5b505060405163049878f360e01b8152600481018590527f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca5006001600160a01b0316925063049878f391506024015f604051808303815f87803b15801561217c575f5ffd5b505af115801561218e573d5f5f3e3d5ffd5b505050506001600160a01b0381165f81815260016020908152604080832080548701905582548601909255815186815290810185905233917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36040518281526001600160a01b038216905f905f516020612ad85f395f51905f529060200160405180910390a3505050565b5f81516041036122bc5760208281015160408085015160608087015183515f8082529681018086528a9052951a928501839052840183905260808401819052919260019060a0016020604051602081039080840390855afa15801561228a573d5f5f3e3d5ffd5b505050602060405103516001600160a01b0316876001600160a01b0316036122b85760019350505050610d27565b5050505b5f5f856001600160a01b0316631626ba7e60e01b86866040516024016122e3929190612a82565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516123219190612a9a565b5f60405180830381855afa9150503d805f8114612359576040519150601f19603f3d011682016040523d82523d5f602084013e61235e565b606091505b5091509150818015612371575080516020145b80156123a257508051630b135d3f60e11b906123969083016020908101908401612ab0565b6001600160e01b031916145b9695505050505050565b6001600160a01b0381165f90815260016020526040902054838110156123e45760405162461bcd60e51b8152600401610c07906129d9565b6001600160a01b0382163314612469576001600160a01b0382165f9081526002602090815260408083203384529091529020545f198114612467578481101561243f5760405162461bcd60e51b8152600401610c0790612a0e565b6001600160a01b0383165f908152600260209081526040808320338452909152902085820390555b505b6001600160a01b038281165f908152600160205260408082208785039055815487900390915551637f8661a160e01b8152600481018690527f000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca50090911690637f8661a1906024015f604051808303815f87803b1580156124e6575f5ffd5b505af11580156124f8573d5f5f3e3d5ffd5b505060405163ef693bed60e01b81526001600160a01b038681166004830152602482018990527f000000000000000000000000983dfef6d71862d809e239845da5a959492f63b816925063ef693bed91506044015f604051808303815f87803b158015612563575f5ffd5b505af1158015612575573d5f5f3e3d5ffd5b50506040518681525f92506001600160a01b03851691505f516020612ad85f395f51905f529060200160405180910390a360408051868152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a45050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610d2760208301846125f8565b5f60208284031215612648575f5ffd5b5035919050565b80356001600160a01b0381168114612665575f5ffd5b919050565b5f5f6040838503121561267b575f5ffd5b6126848361264f565b946020939093013593505050565b5f5f5f606084860312156126a4575f5ffd5b833592506126b46020850161264f565b9150604084013561ffff811681146126ca575f5ffd5b809150509250925092565b5f5f5f606084860312156126e7575f5ffd5b6126f08461264f565b92506126fe6020850161264f565b929592945050506040919091013590565b5f6020828403121561271f575f5ffd5b610d278261264f565b5f5f60408385031215612739575f5ffd5b823591506127496020840161264f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f60a0868803121561277a575f5ffd5b6127838661264f565b94506127916020870161264f565b93506040860135925060608601359150608086013567ffffffffffffffff8111156127ba575f5ffd5b8601601f810188136127ca575f5ffd5b803567ffffffffffffffff8111156127e4576127e4612752565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561281357612813612752565b6040528181528282016020018a101561282a575f5ffd5b816020840160208301375f602083830101528093505050509295509295909350565b5f5f5f6060848603121561285e575f5ffd5b8335925061286e6020850161264f565b915061287c6040850161264f565b90509250925092565b5f5f5f5f5f5f5f60e0888a03121561289b575f5ffd5b6128a48861264f565b96506128b26020890161264f565b95506040880135945060608801359350608088013560ff811681146128d5575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215612903575f5ffd5b61290c8361264f565b91506127496020840161264f565b5f6020828403121561292a575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561092e5761092e612931565b808202811582820484141761092e5761092e612931565b634e487b7160e01b5f52601260045260245ffd5b5f8261299d57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252601b908201527f536176696e6773557364642f696e76616c69642d616464726573730000000000604082015260600190565b6020808252818101527f536176696e6773557364642f696e73756666696369656e742d62616c616e6365604082015260600190565b60208082526022908201527f536176696e6773557364642f696e73756666696369656e742d616c6c6f77616e604082015261636560f01b606082015260800190565b8082018082111561092e5761092e612931565b5f60208284031215612a73575f5ffd5b81518015158114610d27575f5ffd5b828152604060208201525f6108d360408301846125f8565b5f82518060208501845e5f920191825250919050565b5f60208284031215612ac0575f5ffd5b81516001600160e01b031981168114610d27575f5ffdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122078a6aa2ba4fbad9cf9377b874fcb1e957f57ce689aef8c21cfefe8d1534fda4a64736f6c634300081e0033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[":ds-auth/=lib/ds-auth/src/",":ds-math/=lib/ds-token/lib/ds-math/src/",":ds-note/=lib/ds-value/lib/ds-thing/lib/ds-note/src/",":ds-test/=lib/ds-auth/lib/ds-test/src/",":ds-thing/=lib/ds-value/lib/ds-thing/src/",":ds-token/=lib/ds-token/src/",":ds-value/=lib/ds-value/src/",":erc4626-tests/=lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":psm/=lib/psm/src/",":usddv2/=lib/psm/lib/usddv2/src/"]},"optimization_runs":200,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/full_match/1/0xC5d6A7B61d18AfA11435a889557b068BB9f29930/","decoded_constructor_args":[["0x983DFef6d71862d809e239845Da5A959492f63b8",{"internalType":"address","name":"_usddJoin","type":"address"}],["0xE789578252Cc026FfB3413a1104bA223fDeca500",{"internalType":"address","name":"_pot","type":"address"}]],"compiler_version":"0.8.30+commit.73712a01","is_verified_via_verifier_alliance":false,"verified_at":"2025-10-27T20:20:21.920924Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x610140604052348015610010575f5ffd5b5060405161306538038061306583398101604081905261002f9161035e565b6001600160a01b03821660a0819052604080516336569e7760e01b815290516336569e77916004808201926020929091908290030181865afa158015610077573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061009b919061038f565b6001600160a01b03166080816001600160a01b03168152505060a0516001600160a01b0316630c30bc026040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100f2573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610116919061038f565b6001600160a01b0390811660c052811660e0524661010081905261020990604080518082018252600c81526b14d85d9a5b99dcc8155cd91960a21b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fd8187624be2f1af878d75953ca9c210ff856e4a346d04ec98490f6344034d7c4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b6101205260805160a0516040516328ec8bf160e21b81526001600160a01b03918216600482015291169063a3b22fc4906024015f604051808303815f87803b158015610253575f5ffd5b505af1158015610265573d5f5f3e3d5ffd5b505060805160e0516040516328ec8bf160e21b81526001600160a01b0391821660048201529116925063a3b22fc491506024015f604051808303815f87803b1580156102af575f5ffd5b505af11580156102c1573d5f5f3e3d5ffd5b505060c05160a05160405163095ea7b360e01b81526001600160a01b0391821660048201525f1960248201529116925063095ea7b391506044016020604051808303815f875af1158015610317573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061033b91906103af565b5050506103ce565b80516001600160a01b0381168114610359575f5ffd5b919050565b5f5f6040838503121561036f575f5ffd5b61037883610343565b915061038660208401610343565b90509250929050565b5f6020828403121561039f575f5ffd5b6103a882610343565b9392505050565b5f602082840312156103bf575f5ffd5b815180151581146103a8575f5ffd5b60805160a05160c05160e0516101005161012051612b4d6105185f395f8181610d6201526112e501525f81816105b101528181610d3101526112b101525f818161040e01528181610672015281816106fc0152818161078d0152818161081001528181610938015281816109c201528181610a5301528181610ad601528181610e1601528181610e9c01528181610f2101528181610fda01528181611060015281816110e5015281816115a40152818161162e015281816116bf01528181611742015281816117c301528181611849015281816118ce0152818161198101528181611a0701528181611a8c01528181611b3f01528181611bc901528181611c5a01528181611cdd0152818161213101526124a301525f81816102e4015281816103be015261202f01525f818161058a015281816120be015261252001525f61039a0152612b4d5ff3fe608060405234801561000f575f5ffd5b506004361061023f575f3560e01c806370a0823111610135578063ba087652116100b4578063ce96cb7711610079578063ce96cb77146105d3578063d505accf146105e6578063d905777e146105f9578063dd62ed3e14610621578063ef8b30f71461064b575f5ffd5b8063ba0876521461055f578063c63d75b6146103f5578063c6e6f59214610572578063c78d6d2114610585578063cd0d0096146105ac575f5ffd5b80639fd5a6cf116100fa5780639fd5a6cf146104fe578063a457c2d714610513578063a9059cbb14610526578063b3d7f6b914610539578063b460af941461054c575f5ffd5b806370a08231146104765780637ecebe001461049557806394bf804d146104b457806395d89b41146104c75780639b8d6d38146104eb575f5ffd5b8063313ce567116101c1578063402d267d11610186578063402d267d146103f55780634ba2363a146104095780634cdad5061461043057806354fd4d50146104435780636e553f6514610463575f5ffd5b8063313ce567146103735780633644e5151461038d57806336569e771461039557806338d52e0f146103bc57806339509351146103e2575f5ffd5b80630c30bc02116102075780630c30bc02146102df57806318160ddd1461031e578063216740a01461032657806323b872dd1461033957806330adf81f1461034c575f5ffd5b806301e1d1141461024357806306fdde031461025e57806307a2d13a14610296578063095ea7b3146102a95780630a28a477146102cc575b5f5ffd5b61024b61065e565b6040519081526020015b60405180910390f35b6102896040518060400160405280600c81526020016b14d85d9a5b99dcc8155cd91960a21b81525081565b6040516102559190612626565b61024b6102a4366004612638565b61066e565b6102bc6102b736600461266a565b6108db565b6040519015158152602001610255565b61024b6102da366004612638565b610934565b6103067f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610255565b61024b5f5481565b61024b610334366004612692565b610b64565b6102bc6103473660046126d5565b610bc9565b61024b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61037b601281565b60405160ff9091168152602001610255565b61024b610d2e565b6103067f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000000000000000000000000000000000000000000000610306565b6102bc6103f036600461266a565b610d84565b61024b61040336600461270f565b505f1990565b6103067f000000000000000000000000000000000000000000000000000000000000000081565b61024b61043e366004612638565b610e08565b610289604051806040016040528060018152602001603160f81b81525081565b61024b610471366004612728565b610e12565b61024b61048436600461270f565b60016020525f908152604090205481565b61024b6104a336600461270f565b60036020525f908152604090205481565b61024b6104c2366004612728565b610fd6565b610289604051806040016040528060058152602001641cd554d11160da1b81525081565b61024b6104f9366004612692565b611191565b61051161050c366004612766565b6111e7565b005b6102bc61052136600461266a565b61145e565b6102bc61053436600461266a565b6114ea565b61024b610547366004612638565b6115a0565b61024b61055a36600461284c565b6117bf565b61024b61056d36600461284c565b61197d565b61024b610580366004612638565b611b3b565b6103067f000000000000000000000000000000000000000000000000000000000000000081565b61024b7f000000000000000000000000000000000000000000000000000000000000000081565b61024b6105e136600461270f565b611d63565b6105116105f4366004612885565b611d84565b61024b61060736600461270f565b6001600160a01b03165f9081526001602052604090205490565b61024b61062f3660046128f2565b600260209081525f928352604080842090915290825290205481565b61024b610659366004612638565b611ddb565b5f6106695f5461066e565b905090565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106cc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f0919061291a565b90505f81421161077f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610756573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077a919061291a565b6108b1565b676765c793fa10079d601b1b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080b919061291a565b61089d7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088e919061291a565b6108988642612945565b611de5565b6108a79190612958565b6108b19190612983565b9050676765c793fa10079d601b1b6108c98286612958565b6108d39190612983565b949350505050565b335f8181526002602090815260408083206001600160a01b038716808552925280832085905551919290915f516020612af85f395f51905f52906109229086815260200190565b60405180910390a35060015b92915050565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610992573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b6919061291a565b90505f814211610a45577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a1c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a40919061291a565b610b44565b676765c793fa10079d601b1b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610aad573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ad1919061291a565b610b307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d5f5f3e3d5ffd5b610b3a9190612958565b610b449190612983565b90506108d3610b5e676765c793fa10079d601b1b86612958565b82611ed0565b5f610b6f8484610fd6565b9050826001600160a01b03168261ffff167fb30a03a0e2a407f18ae0e83491331dc069d1521e292feffb071e61c8f7f406368387604051610bba929190918252602082015260400190565b60405180910390a39392505050565b5f6001600160a01b03831615801590610beb57506001600160a01b0383163014155b610c105760405162461bcd60e51b8152600401610c07906129a2565b60405180910390fd5b6001600160a01b0384165f9081526001602052604090205482811015610c485760405162461bcd60e51b8152600401610c07906129d9565b6001600160a01b0385163314610ccd576001600160a01b0385165f9081526002602090815260408083203384529091529020545f198114610ccb5783811015610ca35760405162461bcd60e51b8152600401610c0790612a0e565b6001600160a01b0386165f908152600260209081526040808320338452909152902084820390555b505b6001600160a01b038086165f8181526001602052604080822087860390559287168082529083902080548701905591515f516020612ad85f395f51905f5290610d199087815260200190565b60405180910390a360019150505b9392505050565b5f7f00000000000000000000000000000000000000000000000000000000000000004614610d5f5761066946611efb565b507f000000000000000000000000000000000000000000000000000000000000000090565b335f9081526002602090815260408083206001600160a01b03861684529091528120548190610db4908490612a50565b335f8181526002602090815260408083206001600160a01b038a16808552908352928190208590555184815293945090925f516020612af85f395f51905f5291015b60405180910390a35060019392505050565b5f61092e8261066e565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e70573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e94919061291a565b4211610f1f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1a919061291a565b610fa0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015610f7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa0919061291a565b905080610fb8676765c793fa10079d601b1b86612958565b610fc29190612983565b9150610fcf848385611fd0565b5092915050565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611034573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611058919061291a565b42116110e3577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110de919061291a565b611164565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611140573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611164919061291a565b90506111846111738286612958565b676765c793fa10079d601b1b611ed0565b9150610fcf828585611fd0565b5f61119c8484610e12565b9050826001600160a01b03168261ffff167fb30a03a0e2a407f18ae0e83491331dc069d1521e292feffb071e61c8f7f406368684604051610bba929190918252602082015260400190565b814211156112375760405162461bcd60e51b815260206004820152601a60248201527f536176696e6773557364642f7065726d69742d657870697265640000000000006044820152606401610c07565b6001600160a01b03851661128d5760405162461bcd60e51b815260206004820152601960248201527f536176696e6773557364642f696e76616c69642d6f776e6572000000000000006044820152606401610c07565b6001600160a01b0385165f90815260036020526040812080546001810190915590467f0000000000000000000000000000000000000000000000000000000000000000146112e3576112de46611efb565b611305565b7f00000000000000000000000000000000000000000000000000000000000000005b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808b169282019290925290881660608201526080810187905260a0810184905260c0810186905260e0016040516020818303038152906040528051906020012060405160200161139e92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090506113c1878285612223565b61140d5760405162461bcd60e51b815260206004820152601a60248201527f536176696e6773557364642f696e76616c69642d7065726d69740000000000006044820152606401610c07565b6001600160a01b038781165f818152600260209081526040808320948b168084529482529182902089905590518881525f516020612af85f395f51905f52910160405180910390a350505050505050565b335f9081526002602090815260408083206001600160a01b0386168452909152812054828110156114a15760405162461bcd60e51b8152600401610c0790612a0e565b335f8181526002602090815260408083206001600160a01b038916808552908352928190209487900394859055518481529192915f516020612af85f395f51905f529101610df6565b5f6001600160a01b0383161580159061150c57506001600160a01b0383163014155b6115285760405162461bcd60e51b8152600401610c07906129a2565b335f90815260016020526040902054828110156115575760405162461bcd60e51b8152600401610c07906129d9565b335f81815260016020908152604080832087860390556001600160a01b03881680845292819020805488019055518681529192915f516020612ad85f395f51905f529101610df6565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fe573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611622919061291a565b90505f8142116116b1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611688573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ac919061291a565b6117b0565b676765c793fa10079d601b1b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611719573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061173d919061291a565b61179c7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d5f5f3e3d5ffd5b6117a69190612958565b6117b09190612983565b90506108d36111738286612958565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561181d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611841919061291a565b42116118cc577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118a3573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c7919061291a565b61194d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611929573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194d919061291a565b9050611967610b5e676765c793fa10079d601b1b87612958565b9150611975858386866123ac565b509392505050565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119db573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119ff919061291a565b4211611a8a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a61573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a85919061291a565b611b0b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303815f875af1158015611ae7573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0b919061291a565b9050676765c793fa10079d601b1b611b238287612958565b611b2d9190612983565b9150611975828686866123ac565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b99573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbd919061291a565b90505f814211611c4c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c23573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c47919061291a565b611d4b565b676765c793fa10079d601b1b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cb4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cd8919061291a565b611d377f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa15801561086a573d5f5f3e3d5ffd5b611d419190612958565b611d4b9190612983565b9050806108c9676765c793fa10079d601b1b86612958565b6001600160a01b0381165f9081526001602052604081205461092e9061066e565b611dd287878787868689604051602001611dbe93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b6040516020818303038152906040526111e7565b50505050505050565b5f61092e82611b3b565b5f828015611eaa57600183168015611dff57849250611e0e565b676765c793fa10079d601b1b92505b506002909204916b019d971e4fe8401e740000005b8315611ea4578485028586820414611e39575f5ffd5b81810181811015611e48575f5ffd5b676765c793fa10079d601b1b90049550506001841615611e99578483028386820414158615151615611e78575f5ffd5b81810181811015611e87575f5ffd5b676765c793fa10079d601b1b90049350505b600284049350611e23565b50610fcf565b828015611eb9575f9250611ec8565b676765c793fa10079d601b1b92505b505092915050565b5f825f03611ede575f610d27565b816001840381611ef057611ef061296f565b046001019392505050565b604080518082018252600c81526b14d85d9a5b99dcc8155cd91960a21b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fd8187624be2f1af878d75953ca9c210ff856e4a346d04ec98490f6344034d7c4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b6001600160a01b03811615801590611ff157506001600160a01b0381163014155b61200d5760405162461bcd60e51b8152600401610c07906129a2565b6040516323b872dd60e01b8152336004820152306024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af115801561207d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a19190612a63565b50604051633b4da69f60e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633b4da69f906044015f604051808303815f87803b158015612107575f5ffd5b505af1158015612119573d5f5f3e3d5ffd5b505060405163049878f360e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316925063049878f391506024015f604051808303815f87803b15801561217c575f5ffd5b505af115801561218e573d5f5f3e3d5ffd5b505050506001600160a01b0381165f81815260016020908152604080832080548701905582548601909255815186815290810185905233917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a36040518281526001600160a01b038216905f905f516020612ad85f395f51905f529060200160405180910390a3505050565b5f81516041036122bc5760208281015160408085015160608087015183515f8082529681018086528a9052951a928501839052840183905260808401819052919260019060a0016020604051602081039080840390855afa15801561228a573d5f5f3e3d5ffd5b505050602060405103516001600160a01b0316876001600160a01b0316036122b85760019350505050610d27565b5050505b5f5f856001600160a01b0316631626ba7e60e01b86866040516024016122e3929190612a82565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516123219190612a9a565b5f60405180830381855afa9150503d805f8114612359576040519150601f19603f3d011682016040523d82523d5f602084013e61235e565b606091505b5091509150818015612371575080516020145b80156123a257508051630b135d3f60e11b906123969083016020908101908401612ab0565b6001600160e01b031916145b9695505050505050565b6001600160a01b0381165f90815260016020526040902054838110156123e45760405162461bcd60e51b8152600401610c07906129d9565b6001600160a01b0382163314612469576001600160a01b0382165f9081526002602090815260408083203384529091529020545f198114612467578481101561243f5760405162461bcd60e51b8152600401610c0790612a0e565b6001600160a01b0383165f908152600260209081526040808320338452909152902085820390555b505b6001600160a01b038281165f908152600160205260408082208785039055815487900390915551637f8661a160e01b8152600481018690527f000000000000000000000000000000000000000000000000000000000000000090911690637f8661a1906024015f604051808303815f87803b1580156124e6575f5ffd5b505af11580156124f8573d5f5f3e3d5ffd5b505060405163ef693bed60e01b81526001600160a01b038681166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016925063ef693bed91506044015f604051808303815f87803b158015612563575f5ffd5b505af1158015612575573d5f5f3e3d5ffd5b50506040518681525f92506001600160a01b03851691505f516020612ad85f395f51905f529060200160405180910390a360408051868152602081018690526001600160a01b03808516929086169133917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a45050505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610d2760208301846125f8565b5f60208284031215612648575f5ffd5b5035919050565b80356001600160a01b0381168114612665575f5ffd5b919050565b5f5f6040838503121561267b575f5ffd5b6126848361264f565b946020939093013593505050565b5f5f5f606084860312156126a4575f5ffd5b833592506126b46020850161264f565b9150604084013561ffff811681146126ca575f5ffd5b809150509250925092565b5f5f5f606084860312156126e7575f5ffd5b6126f08461264f565b92506126fe6020850161264f565b929592945050506040919091013590565b5f6020828403121561271f575f5ffd5b610d278261264f565b5f5f60408385031215612739575f5ffd5b823591506127496020840161264f565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f5f60a0868803121561277a575f5ffd5b6127838661264f565b94506127916020870161264f565b93506040860135925060608601359150608086013567ffffffffffffffff8111156127ba575f5ffd5b8601601f810188136127ca575f5ffd5b803567ffffffffffffffff8111156127e4576127e4612752565b604051601f8201601f19908116603f0116810167ffffffffffffffff8111828210171561281357612813612752565b6040528181528282016020018a101561282a575f5ffd5b816020840160208301375f602083830101528093505050509295509295909350565b5f5f5f6060848603121561285e575f5ffd5b8335925061286e6020850161264f565b915061287c6040850161264f565b90509250925092565b5f5f5f5f5f5f5f60e0888a03121561289b575f5ffd5b6128a48861264f565b96506128b26020890161264f565b95506040880135945060608801359350608088013560ff811681146128d5575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215612903575f5ffd5b61290c8361264f565b91506127496020840161264f565b5f6020828403121561292a575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561092e5761092e612931565b808202811582820484141761092e5761092e612931565b634e487b7160e01b5f52601260045260245ffd5b5f8261299d57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252601b908201527f536176696e6773557364642f696e76616c69642d616464726573730000000000604082015260600190565b6020808252818101527f536176696e6773557364642f696e73756666696369656e742d62616c616e6365604082015260600190565b60208082526022908201527f536176696e6773557364642f696e73756666696369656e742d616c6c6f77616e604082015261636560f01b606082015260800190565b8082018082111561092e5761092e612931565b5f60208284031215612a73575f5ffd5b81518015158114610d27575f5ffd5b828152604060208201525f6108d360408301846125f8565b5f82518060208501845e5f920191825250919050565b5f60208284031215612ac0575f5ffd5b81516001600160e01b031981168114610d27575f5ffdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122078a6aa2ba4fbad9cf9377b874fcb1e957f57ce689aef8c21cfefe8d1534fda4a64736f6c634300081e0033000000000000000000000000983dfef6d71862d809e239845da5a959492f63b8000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca500","name":"SavingsUsdd","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"cancun","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_usddJoin","type":"address"},{"internalType":"address","name":"_pot","type":"address"}],"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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","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":"uint16","name":"referral","type":"uint16"},{"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":"Referral","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","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"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","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":"uint256","name":"shares","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"","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":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deploymentChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint16","name":"referral","type":"uint16"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint16","name":"referral","type":"uint16"}],"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"}],"name":"mint","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":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","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":[],"name":"pot","outputs":[{"internalType":"contract PotLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdd","outputs":[{"internalType":"contract UsddLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usddJoin","outputs":[{"internalType":"contract UsddJoinLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vat","outputs":[{"internalType":"contract VatLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"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":false,"constructor_args":"0x000000000000000000000000983dfef6d71862d809e239845da5a959492f63b8000000000000000000000000e789578252cc026ffb3413a1104ba223fdeca500"}