{"file_path":"main.sol","creation_status":"success","source_code":"// This contract is part of Zellic’s smart contract dataset, which is a collection of publicly available contract code gathered as of March 2023.\n\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\n/// SavingsDai.sol -- A tokenized representation DAI 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 DaiJoinLike {\n    function vat() external view returns (address);\n    function dai() external view returns (address);\n    function join(address, uint256) external;\n    function exit(address, uint256) external;\n}\n\ninterface DaiLike {\n    function transferFrom(address, address, uint256) external returns (bool);\n    function approve(address, uint256) external returns (bool);\n}\n\ncontract SavingsDai {\n\n    // --- ERC20 Data ---\n    string  public constant name     = \"Savings Dai\";\n    string  public constant symbol   = \"sDAI\";\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    DaiJoinLike public immutable daiJoin;\n    DaiLike     public immutable dai;\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\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 _daiJoin, address _pot) {\n        daiJoin = DaiJoinLike(_daiJoin);\n        vat = VatLike(daiJoin.vat());\n        dai = DaiLike(daiJoin.dai());\n        pot = PotLike(_pot);\n\n        deploymentChainId = block.chainid;\n        _DOMAIN_SEPARATOR = _calculateDomainSeparator(block.chainid);\n\n        vat.hope(address(daiJoin));\n        vat.hope(address(pot));\n\n        dai.approve(address(daiJoin), 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), \"SavingsDai/invalid-address\");\n        uint256 balance = balanceOf[msg.sender];\n        require(balance >= value, \"SavingsDai/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), \"SavingsDai/invalid-address\");\n        uint256 balance = balanceOf[from];\n        require(balance >= value, \"SavingsDai/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, \"SavingsDai/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, \"SavingsDai/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), \"SavingsDai/invalid-address\");\n\n        dai.transferFrom(msg.sender, address(this), assets);\n        daiJoin.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 <= dai totalSupply\n        unchecked {\n            balanceOf[receiver] = balanceOf[receiver] + shares;\n            totalSupply = totalSupply + shares;\n        }\n\n        emit Deposit(msg.sender, receiver, assets, shares);\n    }\n\n    function _burn(uint256 assets, uint256 shares, address receiver, address owner) internal {\n        uint256 balance = balanceOf[owner];\n        require(balance >= shares, \"SavingsDai/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, \"SavingsDai/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        daiJoin.exit(receiver, assets);\n\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(dai);\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) external 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 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) external 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 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, \"SavingsDai/permit-expired\");\n        require(owner != address(0), \"SavingsDai/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), \"SavingsDai/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}","deployed_bytecode":"0x608060405234801561001057600080fd5b50600436106102325760003560e01c80637ecebe0011610130578063c11645bc116100b8578063d505accf1161007c578063d505accf1461058f578063d905777e146105a2578063dd62ed3e146105cb578063ef8b30f7146105f6578063f4b9fa751461060957600080fd5b8063c11645bc1461051b578063c63d75b6146103af578063c6e6f59214610542578063cd0d009614610555578063ce96cb771461057c57600080fd5b8063a457c2d7116100ff578063a457c2d7146104bc578063a9059cbb146104cf578063b3d7f6b9146104e2578063b460af94146104f5578063ba0876521461050857600080fd5b80637ecebe001461045157806394bf804d1461047157806395d89b41146104845780639fd5a6cf146104a757600080fd5b80633644e515116101be5780634ba2363a116101825780634ba2363a146103c45780634cdad506146103eb57806354fd4d50146103fe5780636e553f651461041e57806370a082311461043157600080fd5b80633644e5151461032f57806336569e771461033757806338d52e0f14610376578063395093511461039c578063402d267d146103af57600080fd5b80630a28a477116102055780630a28a477146102bf57806318160ddd146102d257806323b872dd146102db57806330adf81f146102ee578063313ce5671461031557600080fd5b806301e1d1141461023757806306fdde031461025257806307a2d13a14610289578063095ea7b31461029c575b600080fd5b61023f610630565b6040519081526020015b60405180910390f35b61027c6040518060400160405280600b81526020016a536176696e67732044616960a81b81525081565b60405161024991906125b9565b61023f6102973660046125cc565b610642565b6102af6102aa366004612601565b6108b9565b6040519015158152602001610249565b61023f6102cd3660046125cc565b610914565b61023f60005481565b6102af6102e936600461262b565b610b4e565b61023f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61031d601281565b60405160ff9091168152602001610249565b61023f610ccc565b61035e7f00000000000000000000000035d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b6040516001600160a01b039091168152602001610249565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f61035e565b6102af6103aa366004612601565b610d23565b61023f6103bd366004612667565b5060001990565b61035e7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf781565b61023f6103f93660046125cc565b610daa565b61027c604051806040016040528060018152602001603160f81b81525081565b61023f61042c366004612682565b610db5565b61023f61043f366004612667565b60016020526000908152604090205481565b61023f61045f366004612667565b60036020526000908152604090205481565b61023f61047f366004612682565b610f81565b61027c604051806040016040528060048152602001637344414960e01b81525081565b6104ba6104b53660046126c4565b611144565b005b6102af6104ca366004612601565b6113be565b6102af6104dd366004612601565b61144d565b61023f6104f03660046125cc565b611519565b61023f6105033660046127aa565b611742565b61023f6105163660046127aa565b611908565b61035e7f0000000000000000000000009759a6ac90977b93b58547b4a71c78317f391a2881565b61023f6105503660046125cc565b611ace565b61023f7f000000000000000000000000000000000000000000000000000000000000000181565b61023f61058a366004612667565b611d00565b6104ba61059d3660046127e6565b611d22565b61023f6105b0366004612667565b6001600160a01b031660009081526001602052604090205490565b61023f6105d9366004612859565b600260209081526000928352604080842090915290825290205481565b61023f6106043660046125cc565b611d79565b61035e7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b600061063d600054610642565b905090565b6000807f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c79190612883565b90506000814211610759577f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612883565b61088f565b676765c793fa10079d601b1b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e79190612883565b61087b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c9190612883565b61087686426128b2565b611d84565b61088591906128c5565b61088f91906128f2565b9050676765c793fa10079d601b1b6108a782866128c5565b6108b191906128f2565b949350505050565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020612a58833981519152906109029086815260200190565b60405180910390a35060015b92915050565b6000807f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109999190612883565b90506000814211610a2b577f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a269190612883565b610b2e565b676765c793fa10079d601b1b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab99190612883565b610b1a7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b610b2491906128c5565b610b2e91906128f2565b90506108b1610b48676765c793fa10079d601b1b866128c5565b82611e75565b60006001600160a01b03831615801590610b7157506001600160a01b0383163014155b610b965760405162461bcd60e51b8152600401610b8d90612914565b60405180910390fd5b6001600160a01b03841660009081526001602052604090205482811015610bcf5760405162461bcd60e51b8152600401610b8d9061294b565b6001600160a01b0385163314610c57576001600160a01b03851660009081526002602090815260408083203384529091529020546000198114610c555783811015610c2c5760405162461bcd60e51b8152600401610b8d90612982565b6001600160a01b0386166000908152600260209081526040808320338452909152902084820390555b505b6001600160a01b0380861660008181526001602052604080822087860390559287168082529083902080548701905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610cb79087815260200190565b60405180910390a360019150505b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000014614610cfe5761063d46611ea3565b507fb9b66c6658faaf7d181a8532a21ea61d221439b542335af9f2d4b741965a5e2c90565b3360009081526002602090815260408083206001600160a01b03861684529091528120548190610d549084906129c3565b3360008181526002602090815260408083206001600160a01b038a1680855290835292819020859055518481529394509092600080516020612a5883398151915291015b60405180910390a35060019392505050565b600061090e82610642565b6000807f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3a9190612883565b4211610ec7577f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec29190612883565b610f4b565b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4b9190612883565b905080610f63676765c793fa10079d601b1b866128c5565b610f6d91906128f2565b9150610f7a848385611f77565b5092915050565b6000807f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fe2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110069190612883565b4211611093577f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561106a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108e9190612883565b611117565b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156110f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111179190612883565b905061113761112682866128c5565b676765c793fa10079d601b1b611e75565b9150610f7a828585611f77565b814211156111945760405162461bcd60e51b815260206004820152601960248201527f536176696e67734461692f7065726d69742d65787069726564000000000000006044820152606401610b8d565b6001600160a01b0385166111ea5760405162461bcd60e51b815260206004820152601860248201527f536176696e67734461692f696e76616c69642d6f776e657200000000000000006044820152606401610b8d565b6001600160a01b038516600090815260036020526040812080546001810190915590467f0000000000000000000000000000000000000000000000000000000000000001146112415761123c46611ea3565b611263565b7fb9b66c6658faaf7d181a8532a21ea61d221439b542335af9f2d4b741965a5e2c5b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808b169282019290925290881660608201526080810187905260a0810184905260c0810186905260e001604051602081830303815290604052805190602001206040516020016112fc92919061190160f01b81526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905061131f8782856121ab565b61136b5760405162461bcd60e51b815260206004820152601960248201527f536176696e67734461692f696e76616c69642d7065726d6974000000000000006044820152606401610b8d565b6001600160a01b038781166000818152600260209081526040808320948b16808452948252918290208990559051888152600080516020612a58833981519152910160405180910390a350505050505050565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156114025760405162461bcd60e51b8152600401610b8d90612982565b3360008181526002602090815260408083206001600160a01b03891680855290835292819020948790039485905551848152919291600080516020612a588339815191529101610d98565b60006001600160a01b0383161580159061147057506001600160a01b0383163014155b61148c5760405162461bcd60e51b8152600401610b8d90612914565b33600090815260016020526040902054828110156114bc5760405162461bcd60e51b8152600401610b8d9061294b565b33600081815260016020908152604080832087860390556001600160a01b03881680845292819020805488019055518681529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d98565b6000807f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159e9190612883565b90506000814211611630577f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162b9190612883565b611733565b676765c793fa10079d601b1b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561169a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116be9190612883565b61171f7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b61172991906128c5565b61173391906128f2565b90506108b161112682866128c5565b6000807f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c79190612883565b4211611854577f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561182b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184f9190612883565b6118d8565b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d89190612883565b90506118f2610b48676765c793fa10079d601b1b876128c5565b91506119008583868661233c565b509392505050565b6000807f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198d9190612883565b4211611a1a577f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a159190612883565b611a9e565b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190612883565b9050676765c793fa10079d601b1b611ab682876128c5565b611ac091906128f2565b91506119008286868661233c565b6000807f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b539190612883565b90506000814211611be5577f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be09190612883565b611ce8565b676765c793fa10079d601b1b7f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c739190612883565b611cd47f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b611cde91906128c5565b611ce891906128f2565b9050806108a7676765c793fa10079d601b1b866128c5565b6001600160a01b03811660009081526001602052604081205461090e90610642565b611d7087878787868689604051602001611d5c93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052611144565b50505050505050565b600061090e82611ace565b6000828015611e4e57600183168015611d9f57849250611dae565b676765c793fa10079d601b1b92505b506002909204916b019d971e4fe8401e740000005b8315611e48578485028586820414611dda57600080fd5b81810181811015611dea57600080fd5b676765c793fa10079d601b1b90049550506001841615611e3d578483028386820414158615151615611e1b57600080fd5b81810181811015611e2b57600080fd5b676765c793fa10079d601b1b90049350505b600284049350611dc3565b50610f7a565b828015611e5e5760009250611e6d565b676765c793fa10079d601b1b92505b505092915050565b600082600003611e86576000610cc5565b816001840381611e9857611e986128dc565b046001019392505050565b604080518082018252600b81526a536176696e67732044616960a81b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc3f7aa5322e176c1c6e3195712ea57f43ea5d4428bc4005b44d51d1c8b188bbe818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b6001600160a01b03811615801590611f9857506001600160a01b0381163014155b611fb45760405162461bcd60e51b8152600401610b8d90612914565b6040516323b872dd60e01b8152336004820152306024820152604481018490527f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f6001600160a01b0316906323b872dd906064016020604051808303816000875af1158015612027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204b91906129d6565b50604051633b4da69f60e01b8152306004820152602481018490527f0000000000000000000000009759a6ac90977b93b58547b4a71c78317f391a286001600160a01b031690633b4da69f90604401600060405180830381600087803b1580156120b457600080fd5b505af11580156120c8573d6000803e3d6000fd5b505060405163049878f360e01b8152600481018590527f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf76001600160a01b0316925063049878f39150602401600060405180830381600087803b15801561212e57600080fd5b505af1158015612142573d6000803e3d6000fd5b505050506001600160a01b038116600081815260016020908152604080832080548701905582548601909255815186815290810185905233917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a3505050565b6000815160410361224857602082810151604080850151606080870151835160008082529681018086528a9052951a928501839052840183905260808401819052919260019060a0016020604051602081039080840390855afa158015612216573d6000803e3d6000fd5b505050602060405103516001600160a01b0316876001600160a01b0316036122445760019350505050610cc5565b5050505b600080856001600160a01b0316631626ba7e60e01b86866040516024016122709291906129f8565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516122ae9190612a11565b600060405180830381855afa9150503d80600081146122e9576040519150601f19603f3d011682016040523d82523d6000602084013e6122ee565b606091505b5091509150818015612301575080516020145b801561233257508051630b135d3f60e11b906123269083016020908101908401612a2d565b6001600160e01b031916145b9695505050505050565b6001600160a01b038116600090815260016020526040902054838110156123755760405162461bcd60e51b8152600401610b8d9061294b565b6001600160a01b03821633146123fd576001600160a01b038216600090815260026020908152604080832033845290915290205460001981146123fb57848110156123d25760405162461bcd60e51b8152600401610b8d90612982565b6001600160a01b0383166000908152600260209081526040808320338452909152902085820390555b505b6001600160a01b038281166000908152600160205260408082208785039055815487900390915551637f8661a160e01b8152600481018690527f000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf790911690637f8661a190602401600060405180830381600087803b15801561247e57600080fd5b505af1158015612492573d6000803e3d6000fd5b505060405163ef693bed60e01b81526001600160a01b038681166004830152602482018990527f0000000000000000000000009759a6ac90977b93b58547b4a71c78317f391a2816925063ef693bed9150604401600060405180830381600087803b15801561250057600080fd5b505af1158015612514573d6000803e3d6000fd5b505060408051888152602081018890526001600160a01b0380871694508716925033917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a45050505050565b60005b8381101561258457818101518382015260200161256c565b50506000910152565b600081518084526125a5816020860160208601612569565b601f01601f19169290920160200192915050565b602081526000610cc5602083018461258d565b6000602082840312156125de57600080fd5b5035919050565b80356001600160a01b03811681146125fc57600080fd5b919050565b6000806040838503121561261457600080fd5b61261d836125e5565b946020939093013593505050565b60008060006060848603121561264057600080fd5b612649846125e5565b9250612657602085016125e5565b9150604084013590509250925092565b60006020828403121561267957600080fd5b610cc5826125e5565b6000806040838503121561269557600080fd5b823591506126a5602084016125e5565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080600060a086880312156126dc57600080fd5b6126e5866125e5565b94506126f3602087016125e5565b93506040860135925060608601359150608086013567ffffffffffffffff8082111561271e57600080fd5b818801915088601f83011261273257600080fd5b813581811115612744576127446126ae565b604051601f8201601f19908116603f0116810190838211818310171561276c5761276c6126ae565b816040528281528b602084870101111561278557600080fd5b8260208601602083013760006020848301015280955050505050509295509295909350565b6000806000606084860312156127bf57600080fd5b833592506127cf602085016125e5565b91506127dd604085016125e5565b90509250925092565b600080600080600080600060e0888a03121561280157600080fd5b61280a886125e5565b9650612818602089016125e5565b95506040880135945060608801359350608088013560ff8116811461283c57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561286c57600080fd5b612875836125e5565b91506126a5602084016125e5565b60006020828403121561289557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561090e5761090e61289c565b808202811582820484141761090e5761090e61289c565b634e487b7160e01b600052601260045260246000fd5b60008261290f57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601a908201527f536176696e67734461692f696e76616c69642d61646472657373000000000000604082015260600190565b6020808252601f908201527f536176696e67734461692f696e73756666696369656e742d62616c616e636500604082015260600190565b60208082526021908201527f536176696e67734461692f696e73756666696369656e742d616c6c6f77616e636040820152606560f81b606082015260800190565b8082018082111561090e5761090e61289c565b6000602082840312156129e857600080fd5b81518015158114610cc557600080fd5b8281526040602082015260006108b1604083018461258d565b60008251612a23818460208701612569565b9190910192915050565b600060208284031215612a3f57600080fd5b81516001600160e01b031981168114610cc557600080fdfe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220293e4440d9b8d809025462018f9cf991307dc9c59175e4bef40a39bc9e54670964736f6c63430008110033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"libraries":{"main.sol":{}},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}}},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":[["0x9759A6Ac90977b93B58547b4A71c78317f391A28",{"internalType":"address","name":"_daiJoin","type":"address"}],["0x197E90f9FAD81970bA7976f33CbD77088E5D7cf7",{"internalType":"address","name":"_pot","type":"address"}]],"compiler_version":"v0.8.17+commit.8df45f5f","is_verified_via_verifier_alliance":true,"verified_at":"2023-08-30T12:46:03.684357Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x6101406040523480156200001257600080fd5b506040516200300738038062003007833981016040819052620000359162000386565b6001600160a01b03821660a0819052604080516336569e7760e01b815290516336569e77916004808201926020929091908290030181865afa15801562000080573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a69190620003be565b6001600160a01b03166080816001600160a01b03168152505060a0516001600160a01b031663f4b9fa756040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000100573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001269190620003be565b6001600160a01b0390811660c052811660e052466101008190526200021990604080518082018252600b81526a536176696e67732044616960a81b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc3f7aa5322e176c1c6e3195712ea57f43ea5d4428bc4005b44d51d1c8b188bbe818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b6101205260805160a0516040516328ec8bf160e21b81526001600160a01b03918216600482015291169063a3b22fc490602401600060405180830381600087803b1580156200026757600080fd5b505af11580156200027c573d6000803e3d6000fd5b505060805160e0516040516328ec8bf160e21b81526001600160a01b0391821660048201529116925063a3b22fc49150602401600060405180830381600087803b158015620002ca57600080fd5b505af1158015620002df573d6000803e3d6000fd5b505060c05160a05160405163095ea7b360e01b81526001600160a01b03918216600482015260001960248201529116925063095ea7b391506044016020604051808303816000875af11580156200033a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003609190620003e3565b50505062000407565b80516001600160a01b03811681146200038157600080fd5b919050565b600080604083850312156200039a57600080fd5b620003a58362000369565b9150620003b56020840162000369565b90509250929050565b600060208284031215620003d157600080fd5b620003dc8262000369565b9392505050565b600060208284031215620003f657600080fd5b81518015158114620003dc57600080fd5b60805160a05160c05160e0516101005161012051612aad6200055a60003960008181610d01015261124301526000818161055a01528181610cd0015261120f0152600081816103c901528181610647015281816106d401528181610767015281816107ec01528181610919015281816109a601528181610a3901528181610abe01528181610dba01528181610e4201528181610ec901528181610f860152818161100e015281816110950152818161151e015281816115ab0152818161163e015281816116c301528181611747015281816117cf015281816118560152818161190d0152818161199501528181611a1c01528181611ad301528181611b6001528181611bf301528181611c78015281816120e001526124380152600081816103780152818161060e0152611fd60152600081816105200152818161206801526124ba0152600061033c0152612aad6000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c80637ecebe0011610130578063c11645bc116100b8578063d505accf1161007c578063d505accf1461058f578063d905777e146105a2578063dd62ed3e146105cb578063ef8b30f7146105f6578063f4b9fa751461060957600080fd5b8063c11645bc1461051b578063c63d75b6146103af578063c6e6f59214610542578063cd0d009614610555578063ce96cb771461057c57600080fd5b8063a457c2d7116100ff578063a457c2d7146104bc578063a9059cbb146104cf578063b3d7f6b9146104e2578063b460af94146104f5578063ba0876521461050857600080fd5b80637ecebe001461045157806394bf804d1461047157806395d89b41146104845780639fd5a6cf146104a757600080fd5b80633644e515116101be5780634ba2363a116101825780634ba2363a146103c45780634cdad506146103eb57806354fd4d50146103fe5780636e553f651461041e57806370a082311461043157600080fd5b80633644e5151461032f57806336569e771461033757806338d52e0f14610376578063395093511461039c578063402d267d146103af57600080fd5b80630a28a477116102055780630a28a477146102bf57806318160ddd146102d257806323b872dd146102db57806330adf81f146102ee578063313ce5671461031557600080fd5b806301e1d1141461023757806306fdde031461025257806307a2d13a14610289578063095ea7b31461029c575b600080fd5b61023f610630565b6040519081526020015b60405180910390f35b61027c6040518060400160405280600b81526020016a536176696e67732044616960a81b81525081565b60405161024991906125b9565b61023f6102973660046125cc565b610642565b6102af6102aa366004612601565b6108b9565b6040519015158152602001610249565b61023f6102cd3660046125cc565b610914565b61023f60005481565b6102af6102e936600461262b565b610b4e565b61023f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61031d601281565b60405160ff9091168152602001610249565b61023f610ccc565b61035e7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610249565b7f000000000000000000000000000000000000000000000000000000000000000061035e565b6102af6103aa366004612601565b610d23565b61023f6103bd366004612667565b5060001990565b61035e7f000000000000000000000000000000000000000000000000000000000000000081565b61023f6103f93660046125cc565b610daa565b61027c604051806040016040528060018152602001603160f81b81525081565b61023f61042c366004612682565b610db5565b61023f61043f366004612667565b60016020526000908152604090205481565b61023f61045f366004612667565b60036020526000908152604090205481565b61023f61047f366004612682565b610f81565b61027c604051806040016040528060048152602001637344414960e01b81525081565b6104ba6104b53660046126c4565b611144565b005b6102af6104ca366004612601565b6113be565b6102af6104dd366004612601565b61144d565b61023f6104f03660046125cc565b611519565b61023f6105033660046127aa565b611742565b61023f6105163660046127aa565b611908565b61035e7f000000000000000000000000000000000000000000000000000000000000000081565b61023f6105503660046125cc565b611ace565b61023f7f000000000000000000000000000000000000000000000000000000000000000081565b61023f61058a366004612667565b611d00565b6104ba61059d3660046127e6565b611d22565b61023f6105b0366004612667565b6001600160a01b031660009081526001602052604090205490565b61023f6105d9366004612859565b600260209081526000928352604080842090915290825290205481565b61023f6106043660046125cc565b611d79565b61035e7f000000000000000000000000000000000000000000000000000000000000000081565b600061063d600054610642565b905090565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c79190612883565b90506000814211610759577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610730573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107549190612883565b61088f565b676765c793fa10079d601b1b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107e79190612883565b61087b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086c9190612883565b61087686426128b2565b611d84565b61088591906128c5565b61088f91906128f2565b9050676765c793fa10079d601b1b6108a782866128c5565b6108b191906128f2565b949350505050565b3360008181526002602090815260408083206001600160a01b03871680855292528083208590555191929091600080516020612a58833981519152906109029086815260200190565b60405180910390a35060015b92915050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109999190612883565b90506000814211610a2b577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a269190612883565b610b2e565b676765c793fa10079d601b1b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab99190612883565b610b1a7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b610b2491906128c5565b610b2e91906128f2565b90506108b1610b48676765c793fa10079d601b1b866128c5565b82611e75565b60006001600160a01b03831615801590610b7157506001600160a01b0383163014155b610b965760405162461bcd60e51b8152600401610b8d90612914565b60405180910390fd5b6001600160a01b03841660009081526001602052604090205482811015610bcf5760405162461bcd60e51b8152600401610b8d9061294b565b6001600160a01b0385163314610c57576001600160a01b03851660009081526002602090815260408083203384529091529020546000198114610c555783811015610c2c5760405162461bcd60e51b8152600401610b8d90612982565b6001600160a01b0386166000908152600260209081526040808320338452909152902084820390555b505b6001600160a01b0380861660008181526001602052604080822087860390559287168082529083902080548701905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610cb79087815260200190565b60405180910390a360019150505b9392505050565b60007f00000000000000000000000000000000000000000000000000000000000000004614610cfe5761063d46611ea3565b507f000000000000000000000000000000000000000000000000000000000000000090565b3360009081526002602090815260408083206001600160a01b03861684529091528120548190610d549084906129c3565b3360008181526002602090815260408083206001600160a01b038a1680855290835292819020859055518481529394509092600080516020612a5883398151915291015b60405180910390a35060019392505050565b600061090e82610642565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3a9190612883565b4211610ec7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec29190612883565b610f4b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015610f27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4b9190612883565b905080610f63676765c793fa10079d601b1b866128c5565b610f6d91906128f2565b9150610f7a848385611f77565b5092915050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fe2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110069190612883565b4211611093577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561106a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108e9190612883565b611117565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156110f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111179190612883565b905061113761112682866128c5565b676765c793fa10079d601b1b611e75565b9150610f7a828585611f77565b814211156111945760405162461bcd60e51b815260206004820152601960248201527f536176696e67734461692f7065726d69742d65787069726564000000000000006044820152606401610b8d565b6001600160a01b0385166111ea5760405162461bcd60e51b815260206004820152601860248201527f536176696e67734461692f696e76616c69642d6f776e657200000000000000006044820152606401610b8d565b6001600160a01b038516600090815260036020526040812080546001810190915590467f0000000000000000000000000000000000000000000000000000000000000000146112415761123c46611ea3565b611263565b7f00000000000000000000000000000000000000000000000000000000000000005b604080517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c960208201526001600160a01b03808b169282019290925290881660608201526080810187905260a0810184905260c0810186905260e001604051602081830303815290604052805190602001206040516020016112fc92919061190160f01b81526002810192909252602282015260420190565b60405160208183030381529060405280519060200120905061131f8782856121ab565b61136b5760405162461bcd60e51b815260206004820152601960248201527f536176696e67734461692f696e76616c69642d7065726d6974000000000000006044820152606401610b8d565b6001600160a01b038781166000818152600260209081526040808320948b16808452948252918290208990559051888152600080516020612a58833981519152910160405180910390a350505050505050565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156114025760405162461bcd60e51b8152600401610b8d90612982565b3360008181526002602090815260408083206001600160a01b03891680855290835292819020948790039485905551848152919291600080516020612a588339815191529101610d98565b60006001600160a01b0383161580159061147057506001600160a01b0383163014155b61148c5760405162461bcd60e51b8152600401610b8d90612914565b33600090815260016020526040902054828110156114bc5760405162461bcd60e51b8152600401610b8d9061294b565b33600081815260016020908152604080832087860390556001600160a01b03881680845292819020805488019055518681529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d98565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159e9190612883565b90506000814211611630577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162b9190612883565b611733565b676765c793fa10079d601b1b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561169a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116be9190612883565b61171f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b61172991906128c5565b61173391906128f2565b90506108b161112682866128c5565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c79190612883565b4211611854577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561182b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184f9190612883565b6118d8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156118b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d89190612883565b90506118f2610b48676765c793fa10079d601b1b876128c5565b91506119008583868661233c565b509392505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198d9190612883565b4211611a1a577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a159190612883565b611a9e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639f678cca6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190612883565b9050676765c793fa10079d601b1b611ab682876128c5565b611ac091906128f2565b91506119008286868661233c565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166320aba08b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b539190612883565b90506000814211611be5577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611be09190612883565b611ce8565b676765c793fa10079d601b1b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c92aecc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c739190612883565b611cd47f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663487bf0826040518163ffffffff1660e01b8152600401602060405180830381865afa158015610848573d6000803e3d6000fd5b611cde91906128c5565b611ce891906128f2565b9050806108a7676765c793fa10079d601b1b866128c5565b6001600160a01b03811660009081526001602052604081205461090e90610642565b611d7087878787868689604051602001611d5c93929190928352602083019190915260f81b6001600160f81b031916604082015260410190565b604051602081830303815290604052611144565b50505050505050565b600061090e82611ace565b6000828015611e4e57600183168015611d9f57849250611dae565b676765c793fa10079d601b1b92505b506002909204916b019d971e4fe8401e740000005b8315611e48578485028586820414611dda57600080fd5b81810181811015611dea57600080fd5b676765c793fa10079d601b1b90049550506001841615611e3d578483028386820414158615151615611e1b57600080fd5b81810181811015611e2b57600080fd5b676765c793fa10079d601b1b90049350505b600284049350611dc3565b50610f7a565b828015611e5e5760009250611e6d565b676765c793fa10079d601b1b92505b505092915050565b600082600003611e86576000610cc5565b816001840381611e9857611e986128dc565b046001019392505050565b604080518082018252600b81526a536176696e67732044616960a81b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527fc3f7aa5322e176c1c6e3195712ea57f43ea5d4428bc4005b44d51d1c8b188bbe818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606082015260808101939093523060a0808501919091528251808503909101815260c0909301909152815191012090565b6001600160a01b03811615801590611f9857506001600160a01b0381163014155b611fb45760405162461bcd60e51b8152600401610b8d90612914565b6040516323b872dd60e01b8152336004820152306024820152604481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015612027573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204b91906129d6565b50604051633b4da69f60e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633b4da69f90604401600060405180830381600087803b1580156120b457600080fd5b505af11580156120c8573d6000803e3d6000fd5b505060405163049878f360e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316925063049878f39150602401600060405180830381600087803b15801561212e57600080fd5b505af1158015612142573d6000803e3d6000fd5b505050506001600160a01b038116600081815260016020908152604080832080548701905582548601909255815186815290810185905233917fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7910160405180910390a3505050565b6000815160410361224857602082810151604080850151606080870151835160008082529681018086528a9052951a928501839052840183905260808401819052919260019060a0016020604051602081039080840390855afa158015612216573d6000803e3d6000fd5b505050602060405103516001600160a01b0316876001600160a01b0316036122445760019350505050610cc5565b5050505b600080856001600160a01b0316631626ba7e60e01b86866040516024016122709291906129f8565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516122ae9190612a11565b600060405180830381855afa9150503d80600081146122e9576040519150601f19603f3d011682016040523d82523d6000602084013e6122ee565b606091505b5091509150818015612301575080516020145b801561233257508051630b135d3f60e11b906123269083016020908101908401612a2d565b6001600160e01b031916145b9695505050505050565b6001600160a01b038116600090815260016020526040902054838110156123755760405162461bcd60e51b8152600401610b8d9061294b565b6001600160a01b03821633146123fd576001600160a01b038216600090815260026020908152604080832033845290915290205460001981146123fb57848110156123d25760405162461bcd60e51b8152600401610b8d90612982565b6001600160a01b0383166000908152600260209081526040808320338452909152902085820390555b505b6001600160a01b038281166000908152600160205260408082208785039055815487900390915551637f8661a160e01b8152600481018690527f000000000000000000000000000000000000000000000000000000000000000090911690637f8661a190602401600060405180830381600087803b15801561247e57600080fd5b505af1158015612492573d6000803e3d6000fd5b505060405163ef693bed60e01b81526001600160a01b038681166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016925063ef693bed9150604401600060405180830381600087803b15801561250057600080fd5b505af1158015612514573d6000803e3d6000fd5b505060408051888152602081018890526001600160a01b0380871694508716925033917ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db910160405180910390a45050505050565b60005b8381101561258457818101518382015260200161256c565b50506000910152565b600081518084526125a5816020860160208601612569565b601f01601f19169290920160200192915050565b602081526000610cc5602083018461258d565b6000602082840312156125de57600080fd5b5035919050565b80356001600160a01b03811681146125fc57600080fd5b919050565b6000806040838503121561261457600080fd5b61261d836125e5565b946020939093013593505050565b60008060006060848603121561264057600080fd5b612649846125e5565b9250612657602085016125e5565b9150604084013590509250925092565b60006020828403121561267957600080fd5b610cc5826125e5565b6000806040838503121561269557600080fd5b823591506126a5602084016125e5565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080600060a086880312156126dc57600080fd5b6126e5866125e5565b94506126f3602087016125e5565b93506040860135925060608601359150608086013567ffffffffffffffff8082111561271e57600080fd5b818801915088601f83011261273257600080fd5b813581811115612744576127446126ae565b604051601f8201601f19908116603f0116810190838211818310171561276c5761276c6126ae565b816040528281528b602084870101111561278557600080fd5b8260208601602083013760006020848301015280955050505050509295509295909350565b6000806000606084860312156127bf57600080fd5b833592506127cf602085016125e5565b91506127dd604085016125e5565b90509250925092565b600080600080600080600060e0888a03121561280157600080fd5b61280a886125e5565b9650612818602089016125e5565b95506040880135945060608801359350608088013560ff8116811461283c57600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561286c57600080fd5b612875836125e5565b91506126a5602084016125e5565b60006020828403121561289557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561090e5761090e61289c565b808202811582820484141761090e5761090e61289c565b634e487b7160e01b600052601260045260246000fd5b60008261290f57634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601a908201527f536176696e67734461692f696e76616c69642d61646472657373000000000000604082015260600190565b6020808252601f908201527f536176696e67734461692f696e73756666696369656e742d62616c616e636500604082015260600190565b60208082526021908201527f536176696e67734461692f696e73756666696369656e742d616c6c6f77616e636040820152606560f81b606082015260800190565b8082018082111561090e5761090e61289c565b6000602082840312156129e857600080fd5b81518015158114610cc557600080fd5b8281526040602082015260006108b1604083018461258d565b60008251612a23818460208701612569565b9190910192915050565b600060208284031215612a3f57600080fd5b81516001600160e01b031981168114610cc557600080fdfe8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220293e4440d9b8d809025462018f9cf991307dc9c59175e4bef40a39bc9e54670964736f6c634300081100330000000000000000000000009759a6ac90977b93b58547b4a71c78317f391a28000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf7","name":"SavingsDai","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"default","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"address","name":"_daiJoin","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":"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":"dai","outputs":[{"internalType":"contract DaiLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daiJoin","outputs":[{"internalType":"contract DaiJoinLike","name":"","type":"address"}],"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":"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"}],"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":"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":true,"constructor_args":"0x0000000000000000000000009759a6ac90977b93b58547b4a71c78317f391a28000000000000000000000000197e90f9fad81970ba7976f33cbd77088e5d7cf7"}