Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vault
Compiler Version
vyper:0.3.10
Contract Source Code (Vyper language format)
# @version 0.3.10 # pragma optimize codesize # pragma evm-version shanghai """ @title Vault @notice ERC4626+ Vault for lending with crvUSD using LLAMMA algorithm @author Curve.Fi @license Copyright (c) Curve.Fi, 2020-2024 - all rights reserved """ from vyper.interfaces import ERC20 as ERC20Spec from vyper.interfaces import ERC20Detailed implements: ERC20Spec implements: ERC20Detailed interface ERC20: def transferFrom(_from: address, _to: address, _value: uint256) -> bool: nonpayable def transfer(_to: address, _value: uint256) -> bool: nonpayable def decimals() -> uint256: view def balanceOf(_from: address) -> uint256: view def symbol() -> String[32]: view def name() -> String[64]: view interface AMM: def set_admin(_admin: address): nonpayable def rate() -> uint256: view interface Controller: def total_debt() -> uint256: view def monetary_policy() -> address: view def check_lock() -> bool: view def save_rate(): nonpayable interface PriceOracle: def price() -> uint256: view def price_w() -> uint256: nonpayable interface Factory: def admin() -> address: view # ERC20 events event Approval: owner: indexed(address) spender: indexed(address) value: uint256 event Transfer: sender: indexed(address) receiver: indexed(address) value: uint256 # ERC4626 events event Deposit: sender: indexed(address) owner: indexed(address) assets: uint256 shares: uint256 event Withdraw: sender: indexed(address) receiver: indexed(address) owner: indexed(address) assets: uint256 shares: uint256 event SetMaxSupply: max_supply: uint256 # Limits MIN_A: constant(uint256) = 2 MAX_A: constant(uint256) = 10000 MIN_FEE: constant(uint256) = 10**6 # 1e-12, still needs to be above 0 MAX_FEE: constant(uint256) = 10**17 # 10% MAX_LOAN_DISCOUNT: constant(uint256) = 5 * 10**17 MIN_LIQUIDATION_DISCOUNT: constant(uint256) = 10**16 ADMIN_FEE: constant(uint256) = 0 # These are virtual shares from method proposed by OpenZeppelin # see: https://blog.openzeppelin.com/a-novel-defense-against-erc4626-inflation-attacks # and # https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/extensions/ERC4626.sol DEAD_SHARES: constant(uint256) = 1000 MIN_ASSETS: constant(uint256) = 10000 borrowed_token: public(ERC20) collateral_token: public(ERC20) price_oracle: public(PriceOracle) amm: public(AMM) controller: public(Controller) factory: public(Factory) maxSupply: public(uint256) # ERC20 publics decimals: public(constant(uint8)) = 18 name: public(String[64]) symbol: public(String[34]) NAME_PREFIX: constant(String[16]) = 'Curve Vault for ' SYMBOL_PREFIX: constant(String[2]) = 'cv' allowance: public(HashMap[address, HashMap[address, uint256]]) balanceOf: public(HashMap[address, uint256]) totalSupply: public(uint256) precision: uint256 @external def __init__(): """ @notice Template for Vault implementation """ # The contract is made a "normal" template (not blueprint) so that we can get contract address before init # This is needed if we want to create a rehypothecation dual-market with two vaults # where vaults are collaterals of each other self.borrowed_token = ERC20(0x0000000000000000000000000000000000000001) @internal @pure def ln_int(_x: uint256) -> int256: """ @notice Logarithm ln() function based on log2. Not very gas-efficient but brief """ # adapted from: https://medium.com/coinmonks/9aef8515136e # and vyper log implementation # This can be much more optimal but that's not important here x: uint256 = _x res: uint256 = 0 for i in range(8): t: uint256 = 2**(7 - i) p: uint256 = 2**t if x >= p * 10**18: x /= p res += t * 10**18 d: uint256 = 10**18 for i in range(59): # 18 decimals: math.log2(10**10) == 59.7 if (x >= 2 * 10**18): res += d x /= 2 x = x * x / 10**18 d /= 2 # Now res = log2(x) # ln(x) = log2(x) / log2(e) return convert(res * 10**18 / 1442695040888963328, int256) @external def initialize( amm_impl: address, controller_impl: address, borrowed_token: ERC20, collateral_token: ERC20, A: uint256, fee: uint256, price_oracle: PriceOracle, # Factory makes from template if needed, deploying with a from_pool() monetary_policy: address, # Standard monetary policy set in factory loan_discount: uint256, liquidation_discount: uint256 ) -> (address, address): """ @notice Initializer for vaults @param amm_impl AMM implementation (blueprint) @param controller_impl Controller implementation (blueprint) @param borrowed_token Token which is being borrowed @param collateral_token Token used for collateral @param A Amplification coefficient: band size is ~1/A @param fee Fee for swaps in AMM (for ETH markets found to be 0.6%) @param price_oracle Already initialized price oracle @param monetary_policy Already initialized monetary policy @param loan_discount Maximum discount. LTV = sqrt(((A - 1) / A) ** 4) - loan_discount @param liquidation_discount Liquidation discount. LT = sqrt(((A - 1) / A) ** 4) - liquidation_discount """ assert self.borrowed_token.address == empty(address) self.borrowed_token = borrowed_token self.collateral_token = collateral_token self.price_oracle = price_oracle assert A >= MIN_A and A <= MAX_A, "Wrong A" assert fee <= MAX_FEE, "Fee too high" assert fee >= MIN_FEE, "Fee too low" assert liquidation_discount >= MIN_LIQUIDATION_DISCOUNT, "Liquidation discount too low" assert loan_discount <= MAX_LOAN_DISCOUNT, "Loan discount too high" assert loan_discount > liquidation_discount, "need loan_discount>liquidation_discount" p: uint256 = price_oracle.price() # This also validates price oracle ABI assert p > 0 assert price_oracle.price_w() == p A_ratio: uint256 = 10**18 * A / (A - 1) borrowed_precision: uint256 = 10**(18 - borrowed_token.decimals()) amm: address = create_from_blueprint( amm_impl, borrowed_token.address, borrowed_precision, collateral_token.address, 10**(18 - collateral_token.decimals()), A, isqrt(A_ratio * 10**18), self.ln_int(A_ratio), p, fee, ADMIN_FEE, price_oracle.address, code_offset=3) controller: address = create_from_blueprint( controller_impl, empty(address), monetary_policy, loan_discount, liquidation_discount, amm, code_offset=3) AMM(amm).set_admin(controller) self.amm = AMM(amm) self.controller = Controller(controller) self.factory = Factory(msg.sender) # ERC20 set up self.precision = borrowed_precision borrowed_symbol: String[32] = borrowed_token.symbol() self.name = concat(NAME_PREFIX, borrowed_symbol) # Symbol must be String[32], but we do String[34]. It doesn't affect contracts which read it (they will truncate) # However this will be changed as soon as Vyper can *properly* manipulate strings self.symbol = concat(SYMBOL_PREFIX, borrowed_symbol) self.maxSupply = max_value(uint256) # No events because it's the only market we would ever create in this contract return controller, amm @external def set_max_supply(max_supply: uint256): """ @notice Set maximum depositable supply """ assert msg.sender == self.factory.admin() or msg.sender == self.factory.address self.maxSupply = max_supply log SetMaxSupply(max_supply) @external @view @nonreentrant('lock') def borrow_apr() -> uint256: """ @notice Borrow APR (annualized and 1e18-based) """ return self.amm.rate() * (365 * 86400) @external @view @nonreentrant('lock') def lend_apr() -> uint256: """ @notice Lending APR (annualized and 1e18-based) """ debt: uint256 = self.controller.total_debt() if debt == 0: return 0 else: return self.amm.rate() * (365 * 86400) * debt / self._total_assets() @external @view def asset() -> ERC20: """ @notice Asset which is the same as borrowed_token """ return self.borrowed_token @internal @view def _total_assets() -> uint256: # admin fee should be accounted for here when enabled self.controller.check_lock() return self.borrowed_token.balanceOf(self.controller.address) + self.controller.total_debt() @external @view @nonreentrant('lock') def totalAssets() -> uint256: """ @notice Total assets which can be lent out or be in reserve """ return self._total_assets() @internal @view def _convert_to_shares(assets: uint256, is_floor: bool = True, _total_assets: uint256 = max_value(uint256)) -> uint256: total_assets: uint256 = _total_assets if total_assets == max_value(uint256): total_assets = self._total_assets() precision: uint256 = self.precision numerator: uint256 = (self.totalSupply + DEAD_SHARES) * assets * precision denominator: uint256 = (total_assets * precision + 1) if is_floor: return numerator / denominator else: return (numerator + denominator - 1) / denominator @internal @view def _convert_to_assets(shares: uint256, is_floor: bool = True, _total_assets: uint256 = max_value(uint256)) -> uint256: total_assets: uint256 = _total_assets if total_assets == max_value(uint256): total_assets = self._total_assets() precision: uint256 = self.precision numerator: uint256 = shares * (total_assets * precision + 1) denominator: uint256 = (self.totalSupply + DEAD_SHARES) * precision if is_floor: return numerator / denominator else: return (numerator + denominator - 1) / denominator @external @view @nonreentrant('lock') def pricePerShare(is_floor: bool = True) -> uint256: """ @notice Method which shows how much one pool share costs in asset tokens if they are normalized to 18 decimals """ supply: uint256 = self.totalSupply if supply == 0: return 10**18 / DEAD_SHARES else: precision: uint256 = self.precision numerator: uint256 = 10**18 * (self._total_assets() * precision + 1) denominator: uint256 = (supply + DEAD_SHARES) pps: uint256 = 0 if is_floor: pps = numerator / denominator else: pps = (numerator + denominator - 1) / denominator assert pps > 0 return pps @external @view @nonreentrant('lock') def convertToShares(assets: uint256) -> uint256: """ @notice Returns the amount of shares which the Vault would exchange for the given amount of shares provided """ return self._convert_to_shares(assets) @external @view @nonreentrant('lock') def convertToAssets(shares: uint256) -> uint256: """ @notice Returns the amount of assets that the Vault would exchange for the amount of shares provided """ return self._convert_to_assets(shares) @external @view def maxDeposit(receiver: address) -> uint256: """ @notice Maximum amount of assets which a given user can deposit (inf) """ max_supply: uint256 = self.maxSupply if max_supply == max_value(uint256): return max_supply else: assets: uint256 = self._total_assets() return max(max_supply, assets) - assets @external @view @nonreentrant('lock') def previewDeposit(assets: uint256) -> uint256: """ @notice Returns the amount of shares which can be obtained upon depositing assets """ return self._convert_to_shares(assets) @external @nonreentrant('lock') def deposit(assets: uint256, receiver: address = msg.sender) -> uint256: """ @notice Deposit assets in return for whatever number of shares corresponds to the current conditions @param assets Amount of assets to deposit @param receiver Receiver of the shares who is optional. If not specified - receiver is the sender """ controller: Controller = self.controller total_assets: uint256 = self._total_assets() assert total_assets + assets >= MIN_ASSETS, "Need more assets" assert total_assets + assets <= self.maxSupply, "Supply limit" to_mint: uint256 = self._convert_to_shares(assets, True, total_assets) assert self.borrowed_token.transferFrom(msg.sender, controller.address, assets, default_return_value=True) self._mint(receiver, to_mint) controller.save_rate() log Deposit(msg.sender, receiver, assets, to_mint) return to_mint @external @view def maxMint(receiver: address) -> uint256: """ @notice Return maximum amount of shares which a given user can mint (inf) """ max_supply: uint256 = self.maxSupply if max_supply == max_value(uint256): return max_supply else: assets: uint256 = self._total_assets() return self._convert_to_shares(max(max_supply, assets) - assets) @external @view @nonreentrant('lock') def previewMint(shares: uint256) -> uint256: """ @notice Calculate the amount of assets which is needed to exactly mint the given amount of shares """ return self._convert_to_assets(shares, False) @external @nonreentrant('lock') def mint(shares: uint256, receiver: address = msg.sender) -> uint256: """ @notice Mint given amount of shares taking whatever number of assets it requires @param shares Number of sharess to mint @param receiver Optional receiver for the shares. If not specified - it's the sender """ controller: Controller = self.controller total_assets: uint256 = self._total_assets() assets: uint256 = self._convert_to_assets(shares, False, total_assets) assert total_assets + assets >= MIN_ASSETS, "Need more assets" assert total_assets + assets <= self.maxSupply, "Supply limit" assert self.borrowed_token.transferFrom(msg.sender, controller.address, assets, default_return_value=True) self._mint(receiver, shares) controller.save_rate() log Deposit(msg.sender, receiver, assets, shares) return assets @external @view @nonreentrant('lock') def maxWithdraw(owner: address) -> uint256: """ @notice Maximum amount of assets which a given user can withdraw. Aware of both user's balance and available liquidity """ return min( self._convert_to_assets(self.balanceOf[owner]), self.borrowed_token.balanceOf(self.controller.address)) @external @view @nonreentrant('lock') def previewWithdraw(assets: uint256) -> uint256: """ @notice Calculate number of shares which gets burned when withdrawing given amount of asset """ assert assets <= self.borrowed_token.balanceOf(self.controller.address) return self._convert_to_shares(assets, False) @external @nonreentrant('lock') def withdraw(assets: uint256, receiver: address = msg.sender, owner: address = msg.sender) -> uint256: """ @notice Withdraw given amount of asset and burn the corresponding amount of vault shares @param assets Amount of assets to withdraw @param receiver Receiver of the assets (optional, sender if not specified) @param owner Owner who's shares the caller takes. Only can take those if owner gave the approval to the sender. Optional """ total_assets: uint256 = self._total_assets() assert total_assets - assets >= MIN_ASSETS or total_assets == assets, "Need more assets" shares: uint256 = self._convert_to_shares(assets, False, total_assets) if owner != msg.sender: allowance: uint256 = self.allowance[owner][msg.sender] if allowance != max_value(uint256): self._approve(owner, msg.sender, allowance - shares) controller: Controller = self.controller self._burn(owner, shares) assert self.borrowed_token.transferFrom(controller.address, receiver, assets, default_return_value=True) controller.save_rate() log Withdraw(msg.sender, receiver, owner, assets, shares) return shares @external @view @nonreentrant('lock') def maxRedeem(owner: address) -> uint256: """ @notice Calculate maximum amount of shares which a given user can redeem """ return min( self._convert_to_shares(self.borrowed_token.balanceOf(self.controller.address), False), self.balanceOf[owner]) @external @view @nonreentrant('lock') def previewRedeem(shares: uint256) -> uint256: """ @notice Calculate the amount of assets which can be obtained by redeeming the given amount of shares """ if self.totalSupply == 0: assert shares == 0 return 0 else: assets_to_redeem: uint256 = self._convert_to_assets(shares) assert assets_to_redeem <= self.borrowed_token.balanceOf(self.controller.address) return assets_to_redeem @external @nonreentrant('lock') def redeem(shares: uint256, receiver: address = msg.sender, owner: address = msg.sender) -> uint256: """ @notice Burn given amount of shares and give corresponding assets to the user @param shares Amount of shares to burn @param receiver Optional receiver of the assets @param owner Optional owner of the shares. Can only redeem if owner gave approval to the sender """ if owner != msg.sender: allowance: uint256 = self.allowance[owner][msg.sender] if allowance != max_value(uint256): self._approve(owner, msg.sender, allowance - shares) total_assets: uint256 = self._total_assets() assets_to_redeem: uint256 = self._convert_to_assets(shares, True, total_assets) if total_assets - assets_to_redeem < MIN_ASSETS: if shares == self.totalSupply: # This is the last withdrawal, so we can take everything assets_to_redeem = total_assets else: raise "Need more assets" self._burn(owner, shares) controller: Controller = self.controller assert self.borrowed_token.transferFrom(controller.address, receiver, assets_to_redeem, default_return_value=True) controller.save_rate() log Withdraw(msg.sender, receiver, owner, assets_to_redeem, shares) return assets_to_redeem # ERC20 methods @internal def _approve(_owner: address, _spender: address, _value: uint256): self.allowance[_owner][_spender] = _value log Approval(_owner, _spender, _value) @internal def _burn(_from: address, _value: uint256): self.balanceOf[_from] -= _value self.totalSupply -= _value log Transfer(_from, empty(address), _value) @internal def _mint(_to: address, _value: uint256): self.balanceOf[_to] += _value self.totalSupply += _value log Transfer(empty(address), _to, _value) @internal def _transfer(_from: address, _to: address, _value: uint256): assert _to not in [self, empty(address)] self.balanceOf[_from] -= _value self.balanceOf[_to] += _value log Transfer(_from, _to, _value) @external def transferFrom(_from: address, _to: address, _value: uint256) -> bool: """ @notice Transfer tokens from one account to another. @dev The caller needs to have an allowance from account `_from` greater than or equal to the value being transferred. An allowance equal to the uint256 type's maximum, is considered infinite and does not decrease. @param _from The account which tokens will be spent from. @param _to The account which tokens will be sent to. @param _value The amount of tokens to be transferred. """ allowance: uint256 = self.allowance[_from][msg.sender] if allowance != max_value(uint256): self._approve(_from, msg.sender, allowance - _value) self._transfer(_from, _to, _value) return True @external def transfer(_to: address, _value: uint256) -> bool: """ @notice Transfer tokens to `_to`. @param _to The account to transfer tokens to. @param _value The amount of tokens to transfer. """ self._transfer(msg.sender, _to, _value) return True @external def approve(_spender: address, _value: uint256) -> bool: """ @notice Allow `_spender` to transfer up to `_value` amount of tokens from the caller's account. @dev Non-zero to non-zero approvals are allowed, but should be used cautiously. The methods increaseAllowance + decreaseAllowance are available to prevent any front-running that may occur. @param _spender The account permitted to spend up to `_value` amount of caller's funds. @param _value The amount of tokens `_spender` is allowed to spend. """ self._approve(msg.sender, _spender, _value) return True @external def increaseAllowance(_spender: address, _add_value: uint256) -> bool: """ @notice Increase the allowance granted to `_spender`. @dev This function will never overflow, and instead will bound allowance to MAX_UINT256. This has the potential to grant an infinite approval. @param _spender The account to increase the allowance of. @param _add_value The amount to increase the allowance by. """ cached_allowance: uint256 = self.allowance[msg.sender][_spender] allowance: uint256 = unsafe_add(cached_allowance, _add_value) # check for an overflow if allowance < cached_allowance: allowance = max_value(uint256) if allowance != cached_allowance: self._approve(msg.sender, _spender, allowance) return True @external def decreaseAllowance(_spender: address, _sub_value: uint256) -> bool: """ @notice Decrease the allowance granted to `_spender`. @dev This function will never underflow, and instead will bound allowance to 0. @param _spender The account to decrease the allowance of. @param _sub_value The amount to decrease the allowance by. """ cached_allowance: uint256 = self.allowance[msg.sender][_spender] allowance: uint256 = unsafe_sub(cached_allowance, _sub_value) # check for an underflow if cached_allowance < allowance: allowance = 0 if allowance != cached_allowance: self._approve(msg.sender, _spender, allowance) return True @external @view def admin() -> address: return self.factory.admin()
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"Approval","inputs":[{"name":"owner","type":"address","indexed":true},{"name":"spender","type":"address","indexed":true},{"name":"value","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Transfer","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"value","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Deposit","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"owner","type":"address","indexed":true},{"name":"assets","type":"uint256","indexed":false},{"name":"shares","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Withdraw","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"receiver","type":"address","indexed":true},{"name":"owner","type":"address","indexed":true},{"name":"assets","type":"uint256","indexed":false},{"name":"shares","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetMaxSupply","inputs":[{"name":"max_supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"initialize","inputs":[{"name":"amm_impl","type":"address"},{"name":"controller_impl","type":"address"},{"name":"borrowed_token","type":"address"},{"name":"collateral_token","type":"address"},{"name":"A","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"price_oracle","type":"address"},{"name":"monetary_policy","type":"address"},{"name":"loan_discount","type":"uint256"},{"name":"liquidation_discount","type":"uint256"}],"outputs":[{"name":"","type":"address"},{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"set_max_supply","inputs":[{"name":"max_supply","type":"uint256"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"borrow_apr","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"lend_apr","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"asset","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"totalAssets","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"pricePerShare","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"pricePerShare","inputs":[{"name":"is_floor","type":"bool"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"convertToShares","inputs":[{"name":"assets","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"convertToAssets","inputs":[{"name":"shares","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"maxDeposit","inputs":[{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"previewDeposit","inputs":[{"name":"assets","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"deposit","inputs":[{"name":"assets","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"deposit","inputs":[{"name":"assets","type":"uint256"},{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"maxMint","inputs":[{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"previewMint","inputs":[{"name":"shares","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"mint","inputs":[{"name":"shares","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"mint","inputs":[{"name":"shares","type":"uint256"},{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"maxWithdraw","inputs":[{"name":"owner","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"previewWithdraw","inputs":[{"name":"assets","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"assets","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"assets","type":"uint256"},{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"assets","type":"uint256"},{"name":"receiver","type":"address"},{"name":"owner","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"maxRedeem","inputs":[{"name":"owner","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"previewRedeem","inputs":[{"name":"shares","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"redeem","inputs":[{"name":"shares","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"redeem","inputs":[{"name":"shares","type":"uint256"},{"name":"receiver","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"redeem","inputs":[{"name":"shares","type":"uint256"},{"name":"receiver","type":"address"},{"name":"owner","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"transferFrom","inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"transfer","inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"approve","inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"increaseAllowance","inputs":[{"name":"_spender","type":"address"},{"name":"_add_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"nonpayable","type":"function","name":"decreaseAllowance","inputs":[{"name":"_spender","type":"address"},{"name":"_sub_value","type":"uint256"}],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"borrowed_token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"collateral_token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"price_oracle","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"amm","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"controller","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"factory","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"maxSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint8"}]},{"stateMutability":"view","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"allowance","inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}]}]
Contract Creation Code
3461001b5760016001556127e161001f610000396127e1610000f35b5f80fd5f3560e01c60056005600583060261265001601b395f5160088160ff16838360181c0260181c0660031b8260081c61ffff1601601839505f51818160201c14600336111661004c57612040565b8061fffe1636103482600116021761264c578060101c61ffff16565b60015460405260206040f35b60025460405260206040f35b60035460405260206040f35b60045460405260206040f35b60055460405260206040f35b60065460405260206040f35b60075460405260206040f35b601260405260206040f35b602080604052806040016020600854015f81601f0160051c6003811161264c57801561010657905b80600801548160051b8501526001018181186100ef575b5050508051806020830101601f825f03163682375050601f19601f825160200101169050810190506040f35b602080604052806040016020600b54015f81601f0160051c6003811161264c57801561017157905b80600b01548160051b85015260010181811861015a575b5050508051806020830101601f825f03163682375050601f19601f825160200101169050810190506040f35b6004358060a01c61264c576040526024358060a01c61264c57606052600e6040516020525f5260405f20806060516020525f5260405f2090505460805260206080f35b6004358060a01c61264c57604052600f6040516020525f5260405f205460605260206060f35b60105460405260206040f35b6004358060a01c61264c57610100526024358060a01c61264c57610120526044358060a01c61264c57610140526064358060a01c61264c576101605260c4358060a01c61264c576101805260e4358060a01c61264c576101a05260015461264c5761014051600155610160516002556101805160035560026084351015610299575f6102a2565b61271060843511155b61030b5760076101c0527f57726f6e672041000000000000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b67016345785d8a000060a435111561038257600c6101c0527f46656520746f6f206869676800000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b620f424060a43510156103f457600b6101c0527f46656520746f6f206c6f770000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b662386f26fc1000061012435101561046b57601c6101c0527f4c69717569646174696f6e20646973636f756e7420746f6f206c6f77000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6706f05b59d3b200006101043511156104e35760166101c0527f4c6f616e20646973636f756e7420746f6f2068696768000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b61012435610104351161057a5760276101c0527f6e656564206c6f616e5f646973636f756e743e6c69717569646174696f6e5f646101e0527f6973636f756e7400000000000000000000000000000000000000000000000000610200526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6101805163a035b1fe6101e05260206101e060046101fc845afa6105a0573d5f5f3e3d5ffd5b60203d1061264c576101e09050516101c0526101c0511561264c576101c0516101805163ceb7f7596101e05260206101e060046101fc5f855af16105e6573d5f5f3e3d5ffd5b60203d1061264c576101e09050511861264c57608435670de0b6b3a7640000810281670de0b6b3a764000082041861264c5790506084356001810381811161264c579050801561264c57808204905090506101e0526101405163313ce567610220526020610220600461023c845afa610661573d5f5f3e3d5ffd5b60203d1061264c57610220905051806012036012811161264c579050604d811161264c5780600a0a90506102005261010051610140516102a0526102a05161040052610200516102c0526102c05161042052610160516102e0526102e051610440526101605163313ce567610240526020610240600461025c845afa6106e9573d5f5f3e3d5ffd5b60203d1061264c57610240905051806012036012811161264c579050604d811161264c5780600a0a90506103005261030051610460526084356103205261032051610480526101e051670de0b6b3a7640000810281670de0b6b3a764000082041861264c5790508060b5710100000000000000000000000000000000008210610779578160801c91508060401b90505b69010000000000000000008210610797578160401c91508060201b90505b6501000000000082106107b1578160201c91508060101b90505b630100000082106107c9578160101c91508060081b90505b620100008201810260121c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808304808281188284100218905090509050905061034052610340516104a0526101e05160405261084e610280612044565b6102805161036052610360516104c0526101c05161038052610380516104e05260a4356103a0526103a051610500525f6103c0526103c05161052052610180516103e0526103e051610540526101606003823b03596001821261264c5781600382863c81810183818561040060045afa5050828201815ff0801561264c57905090509050905061022052610120515f6102605261026051610300526101a051610280526102805161032052610104356102a0526102a05161034052610124356102c0526102c05161036052610220516102e0526102e0516103805260a06003823b03596001821261264c5781600382863c81810183818561030060045afa5050828201815ff0801561264c579050905090509050610240526102205163e9333fab610260526102405161028052803b1561264c575f610260602461027c5f855af161099b573d5f5f3e3d5ffd5b5061022051600455610240516005553360065561020051601155610140516395d89b416102a05260606102a060046102bc845afa6109db573d5f5f3e3d5ffd5b60403d1061264c576102a0516102a001602081511161264c57805161032052602081015161034052506103209050805161026052602081015161028052505f60106102a0527f4375727665205661756c7420666f7220000000000000000000000000000000006102c0526102a080516020820183610300018151815250508083019250505061026051816103000161028051815250808201915050806102e0526102e0905060208151015f81601f0160051c6003811161264c578015610ab457905b8060051b8401518160080155600101818118610a9d575b505050505f60026102a0527f63760000000000000000000000000000000000000000000000000000000000006102c0526102a080516020820183610300018151815250508083019250505061026051816103000161028051815250808201915050806102e0526102e0905060208151015f81601f0160051c6003811161264c578015610b5357905b8060051b84015181600b0155600101818118610b3c575b505050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600755610240516102a052610220516102c05260406102a0f35b60065463f851a440604052602060406004605c845afa610bb4573d5f5f3e3d5ffd5b60203d1061264c576040518060a01c61264c5760805260809050513318610bdc576001610be3565b6006543318155b1561264c576004356007557f3f8118fc46e72ecde0c5e090803cad8c88e817b2f1e93e820aa9bfbf51f2468d60043560405260206040a1005b5f5460021461264c57600454632c4e722e604052602060406004605c845afa610c47573d5f5f3e3d5ffd5b60203d1061264c5760409050516301e133808102816301e1338082041861264c57905060805260206080f35b5f5460021461264c576005546331dc3ca860e052602060e0600460fc845afa610c9e573d5f5f3e3d5ffd5b60203d1061264c5760e090505160c05260c051610cc6575f60e052602060e0610d4856610d48565b600454632c4e722e60e052602060e0600460fc845afa610ce8573d5f5f3e3d5ffd5b60203d1061264c5760e09050516301e133808102816301e1338082041861264c57905060c05180820281158383830414171561264c5790509050610d2d6101206121d5565b61012051801561264c57808204905090506101405260206101405bf35b60015460405260206040f35b5f5460021461264c576020610d6b60c06121d5565b60c0f35b600160c052610d88565b6004358060011c61264c5760c0525b5f5460021461264c5760105460e05260e051610db85766038d7ea4c68000610100526020610100610e9c56610e9c565b60115461010052610dca6101406121d5565b610140516101005180820281158383830414171561264c57905090506001810181811061264c579050670de0b6b3a7640000810281670de0b6b3a764000082041861264c5790506101205260e0516103e8810181811061264c579050610140525f6101605260c051610e7357610120516101405180820182811061264c57905090506001810381811161264c57905061014051801561264c578082049050905061016052610e8d565b6101205161014051801561264c5780820490509050610160525b610160511561264c5760206101605bf35b5f5460021461264c57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052610ee46101a0612288565b6101a0f35b5f5460021461264c57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052610f2f6101a0612387565b6101a0f35b6004358060a01c61264c5760c05260075460e05260e05119610f5d57602060e0610fa056610fa0565b610f686101206121d5565b610120516101005260e05161010051808281188284110218905090506101005180820382811161264c57905090506101205260206101205bf35b5f5460021461264c57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052610fe86101a0612288565b6101a0f35b336101a052611007565b6024358060a01c61264c576101a0525b5f5460021461264c5760025f556005546101c0526110266102006121d5565b610200516101e0526127106101e05160043580820182811061264c579050905010156110b1576010610200527f4e656564206d6f726520617373657473000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b6007546101e05160043580820182811061264c5790509050111561113457600c610200527f537570706c79206c696d697400000000000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b60043560c052600160e0526101e05161010052611152610220612288565b61022051610200526001546323b872dd6102205233610240526101c05161026052600435610280526020610220606461023c5f855af1611194573d5f5f3e3d5ffd5b3d6111ab57803b1561264c5760016102a0526111c4565b60203d1061264c57610220518060011c61264c576102a0525b6102a09050511561264c576101a051604052610200516060526111e5612486565b6101c0516369c6804e61022052803b1561264c575f610220600461023c5f855af1611212573d5f5f3e3d5ffd5b506101a051337fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d76004356102205261020051610240526040610220a3602061020060035f55f35b6004358060a01c61264c576101a0526007546101c0526101c051196112865760206101c06112fe566112fe565b6112916102006121d5565b610200516101e05260206101c0516101e051808281188284110218905090506101e05180820382811161264c579050905060c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526112fa610200612288565b6102005bf35b5f5460021461264c57602060043560c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526113456101a0612387565b6101a0f35b336101a052611364565b6024358060a01c61264c576101a0525b5f5460021461264c5760025f556005546101c0526113836102006121d5565b610200516101e05260043560c0525f60e0526101e051610100526113a8610220612387565b61022051610200526127106101e0516102005180820182811061264c57905090501015611434576010610220527f4e656564206d6f726520617373657473000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6007546101e0516102005180820182811061264c579050905011156114b857600c610220527f537570706c79206c696d697400000000000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6001546323b872dd6102205233610240526101c0516102605261020051610280526020610220606461023c5f855af16114f3573d5f5f3e3d5ffd5b3d61150a57803b1561264c5760016102a052611523565b60203d1061264c57610220518060011c61264c576102a0525b6102a09050511561264c576101a051604052600435606052611543612486565b6101c0516369c6804e61022052803b1561264c575f610220600461023c5f855af1611570573d5f5f3e3d5ffd5b506101a051337fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d76102005161022052600435610240526040610220a3602061020060035f55f35b6004358060a01c61264c576101a0525f5460021461264c57600f6101a0516020525f5260405f205460c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526116176101c0612387565b6101c0516001546370a082316101e0526005546102005260206101e060246101fc845afa611647573d5f5f3e3d5ffd5b60203d1061264c576101e090505180828118828410021890509050610220526020610220f35b5f5460021461264c576001546370a082316101a0526005546101c05260206101a060246101bc845afa6116a2573d5f5f3e3d5ffd5b60203d1061264c576101a09050516004351161264c57602060043560c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526116f46101a0612288565b6101a0f35b336101a052336101c052611740565b6024358060a01c61264c576101a052336101c052611740565b6024358060a01c61264c576101a0526044358060a01c61264c576101c0525b5f5460021461264c5760025f556117586102006121d5565b610200516101e0526127106101e05160043580820382811161264c5790509050101561178c576004356101e051181561178f565b60015b6117f8576010610200527f4e656564206d6f726520617373657473000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b60043560c0525f60e0526101e05161010052611815610220612288565b6102205161020052336101c0511461189e57600e6101c0516020525f5260405f2080336020525f5260405f20905054610220527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610220511461189e576101c05160405233606052610220516102005180820382811161264c579050905060805261189e6124f3565b600554610220526101c051604052610200516060526118bb612548565b6001546323b872dd6102405261022051610260526101a051610280526004356102a0526020610240606461025c5f855af16118f8573d5f5f3e3d5ffd5b3d61190f57803b1561264c5760016102c052611928565b60203d1061264c57610240518060011c61264c576102c0525b6102c09050511561264c57610220516369c6804e61024052803b1561264c575f610240600461025c5f855af1611960573d5f5f3e3d5ffd5b506101c0516101a051337ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db6004356102405261020051610260526040610240a4602061020060035f55f35b6004358060a01c61264c576101a0525f5460021461264c576001546370a082316101c0526005546101e05260206101c060246101dc845afa6119ef573d5f5f3e3d5ffd5b60203d1061264c576101c090505160c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611a34610200612288565b61020051600f6101a0516020525f5260405f205480828118828410021890509050610220526020610220f35b5f5460021461264c57601054611a8a5760043561264c575f6101a05260206101a0611b1656611b16565b60043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611ac56101c0612387565b6101c0516101a0526001546370a082316101c0526005546101e05260206101c060246101dc845afa611af9573d5f5f3e3d5ffd5b60203d1061264c576101c09050516101a0511161264c5760206101a05bf35b336101a052336101c052611b5f565b6024358060a01c61264c576101a052336101c052611b5f565b6024358060a01c61264c576101a0526044358060a01c61264c576101c0525b5f5460021461264c5760025f55336101c05114611bec57600e6101c0516020525f5260405f2080336020525f5260405f209050546101e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e05114611bec576101c051604052336060526101e05160043580820382811161264c5790509050608052611bec6124f3565b611bf76102006121d5565b610200516101e05260043560c052600160e0526101e05161010052611c1d610220612387565b610220516102005261270f6101e0516102005180820382811161264c579050905011611cc05760105460043518611c5b576101e05161020052611cc0565b6010610220527f4e656564206d6f726520617373657473000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6101c051604052600435606052611cd5612548565b600554610220526001546323b872dd6102405261022051610260526101a05161028052610200516102a0526020610240606461025c5f855af1611d1a573d5f5f3e3d5ffd5b3d611d3157803b1561264c5760016102c052611d4a565b60203d1061264c57610240518060011c61264c576102c0525b6102c09050511561264c57610220516369c6804e61024052803b1561264c575f610240600461025c5f855af1611d82573d5f5f3e3d5ffd5b506101c0516101a051337ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db6102005161024052600435610260526040610240a4602061020060035f55f35b6004358060a01c61264c5760c0526024358060a01c61264c5760e052600e60c0516020525f5260405f2080336020525f5260405f20905054610100527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101005114611e5d5760c051604052336060526101005160443580820382811161264c5790509050608052611e5d6124f3565b60c05160405260e051606052604435608052611e776125b5565b6001610120526020610120f35b6004358060a01c61264c5760c0523360405260c051606052602435608052611eaa6125b5565b600160e052602060e0f35b6004358060a01c61264c5760c0523360405260c051606052602435608052611edb6124f3565b600160e052602060e0f35b6004358060a01c61264c5760c052600e336020525f5260405f208060c0516020525f5260405f2090505460e05260243560e051016101005260e051610100511015611f51577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100525b60e0516101005114611f76573360405260c05160605261010051608052611f766124f3565b6001610120526020610120f35b6004358060a01c61264c5760c052600e336020525f5260405f208060c0516020525f5260405f2090505460e05260243560e05103610100526101005160e0511015611fce575f610100525b60e0516101005114611ff3573360405260c05160605261010051608052611ff36124f3565b6001610120526020610120f35b602060065463f851a440604052602060406004605c845afa612024573d5f5f3e3d5ffd5b60203d1061264c576040518060a01c61264c5760805260809050f35b5f5ffd5b6040516060525f6080525f6008905b8060a05260a051806007036007811161264c57905060ff811161264c578060020a905060c05260c05160ff811161264c578060020a905060e05260e051670de0b6b3a7640000810281670de0b6b3a764000082041861264c579050606051106121025760605160e051801561264c578082049050905060605260805160c051670de0b6b3a7640000810281670de0b6b3a764000082041861264c57905080820182811061264c57905090506080525b600101818118612053575050670de0b6b3a764000060a0525f603b905b8060c052671bc16d674ec80000606051106121585760805160a05180820182811061264c57905090506080526060518060011c90506060525b60605160605180820281158383830414171561264c5790509050670de0b6b3a76400008104905060605260a0518060011c905060a05260010181811861211f575050608051670de0b6b3a7640000810281670de0b6b3a764000082041861264c5790506714057b7ef7678100810490508060ff1c61264c57815250565b60055463d0c581bf604052602060406004605c845afa6121f7573d5f5f3e3d5ffd5b60203d1061264c576040518060011c61264c57608052608050506001546370a08231604052600554606052602060406024605c845afa612239573d5f5f3e3d5ffd5b60203d1061264c5760409050516005546331dc3ca8608052602060806004609c845afa612268573d5f5f3e3d5ffd5b60203d1061264c57608090505180820182811061264c5790509050815250565b610100516101205261012051196122ad576122a46101406121d5565b61014051610120525b601154610140526010546103e8810181811061264c57905060c05180820281158383830414171561264c57905090506101405180820281158383830414171561264c579050905061016052610120516101405180820281158383830414171561264c57905090506001810181811061264c5790506101805260e05161236c57610160516101805180820182811061264c57905090506001810381811161264c57905061018051801561264c578082049050905081525061238556612385565b6101605161018051801561264c57808204905090508152505b565b610100516101205261012051196123ac576123a36101406121d5565b61014051610120525b6011546101405260c051610120516101405180820281158383830414171561264c57905090506001810181811061264c57905080820281158383830414171561264c5790509050610160526010546103e8810181811061264c5790506101405180820281158383830414171561264c57905090506101805260e05161246b57610160516101805180820182811061264c57905090506001810381811161264c57905061018051801561264c578082049050905081525061248456612484565b6101605161018051801561264c57808204905090508152505b565b600f6040516020525f5260405f20805460605180820182811061264c579050905081555060105460605180820182811061264c57905090506010556040515f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60605160805260206080a3565b608051600e6040516020525f5260405f20806060516020525f5260405f209050556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560805160a052602060a0a3565b600f6040516020525f5260405f20805460605180820382811161264c579050905081555060105460605180820382811161264c57905090506010555f6040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60605160805260206080a3565b6060513081146125c7578015156125c9565b5f5b90501561264c57600f6040516020525f5260405f20805460805180820382811161264c5790509050815550600f6060516020525f5260405f20805460805180820182811061264c57905090508155506060516040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60805160a052602060a0a3565b5f80fd182e27410b002e2719050e0926c10b109626690b082c27990928c062030d790025dd62ed3e019d004599530b060d6f00050a28a477166d0025ce96cb7715b70025765337b60068000500f714ce17080045c63d75b61259002586fc88d300800005ef8b30f70fa200254cdad5061a600025d905777e19ab00257bde82f21b270045a0712d68134a0025402d267d0f3400252621db2f00740005bac4daa20c1c0005c45a015500a40005a9059cbb1e840045f77c479100980005db006a751b180025f851a4402000000570a0823101e0002507a2d13a0ee90025a980497e0c7300052a943945008c0005313ce56700bc0005b6b55f250fed002501e1d1140d560005a457c2d71f83004538d52e0f0d4a000543687bba0212014595d89b4101320005395093511ee600458a938f2f0b920025d5abeb0100b00005b3d7f6b91300002518160ddd0206000523b872dd1dcd006506fdde0300c700056e553f650ff70045ba0876521b4000652e1a7d4d16f9002594bf804d13540045c6e6f5920e9e0025b460af9417210065095ea7b31eb50045841927e18618191858185818281858184800a16576797065728300030a001f
Deployed Bytecode
0x5f3560e01c60056005600583060261265001601b395f5160088160ff16838360181c0260181c0660031b8260081c61ffff1601601839505f51818160201c14600336111661004c57612040565b8061fffe1636103482600116021761264c578060101c61ffff16565b60015460405260206040f35b60025460405260206040f35b60035460405260206040f35b60045460405260206040f35b60055460405260206040f35b60065460405260206040f35b60075460405260206040f35b601260405260206040f35b602080604052806040016020600854015f81601f0160051c6003811161264c57801561010657905b80600801548160051b8501526001018181186100ef575b5050508051806020830101601f825f03163682375050601f19601f825160200101169050810190506040f35b602080604052806040016020600b54015f81601f0160051c6003811161264c57801561017157905b80600b01548160051b85015260010181811861015a575b5050508051806020830101601f825f03163682375050601f19601f825160200101169050810190506040f35b6004358060a01c61264c576040526024358060a01c61264c57606052600e6040516020525f5260405f20806060516020525f5260405f2090505460805260206080f35b6004358060a01c61264c57604052600f6040516020525f5260405f205460605260206060f35b60105460405260206040f35b6004358060a01c61264c57610100526024358060a01c61264c57610120526044358060a01c61264c57610140526064358060a01c61264c576101605260c4358060a01c61264c576101805260e4358060a01c61264c576101a05260015461264c5761014051600155610160516002556101805160035560026084351015610299575f6102a2565b61271060843511155b61030b5760076101c0527f57726f6e672041000000000000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b67016345785d8a000060a435111561038257600c6101c0527f46656520746f6f206869676800000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b620f424060a43510156103f457600b6101c0527f46656520746f6f206c6f770000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b662386f26fc1000061012435101561046b57601c6101c0527f4c69717569646174696f6e20646973636f756e7420746f6f206c6f77000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6706f05b59d3b200006101043511156104e35760166101c0527f4c6f616e20646973636f756e7420746f6f2068696768000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b61012435610104351161057a5760276101c0527f6e656564206c6f616e5f646973636f756e743e6c69717569646174696f6e5f646101e0527f6973636f756e7400000000000000000000000000000000000000000000000000610200526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6101805163a035b1fe6101e05260206101e060046101fc845afa6105a0573d5f5f3e3d5ffd5b60203d1061264c576101e09050516101c0526101c0511561264c576101c0516101805163ceb7f7596101e05260206101e060046101fc5f855af16105e6573d5f5f3e3d5ffd5b60203d1061264c576101e09050511861264c57608435670de0b6b3a7640000810281670de0b6b3a764000082041861264c5790506084356001810381811161264c579050801561264c57808204905090506101e0526101405163313ce567610220526020610220600461023c845afa610661573d5f5f3e3d5ffd5b60203d1061264c57610220905051806012036012811161264c579050604d811161264c5780600a0a90506102005261010051610140516102a0526102a05161040052610200516102c0526102c05161042052610160516102e0526102e051610440526101605163313ce567610240526020610240600461025c845afa6106e9573d5f5f3e3d5ffd5b60203d1061264c57610240905051806012036012811161264c579050604d811161264c5780600a0a90506103005261030051610460526084356103205261032051610480526101e051670de0b6b3a7640000810281670de0b6b3a764000082041861264c5790508060b5710100000000000000000000000000000000008210610779578160801c91508060401b90505b69010000000000000000008210610797578160401c91508060201b90505b6501000000000082106107b1578160201c91508060101b90505b630100000082106107c9578160101c91508060081b90505b620100008201810260121c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808304808281188284100218905090509050905061034052610340516104a0526101e05160405261084e610280612044565b6102805161036052610360516104c0526101c05161038052610380516104e05260a4356103a0526103a051610500525f6103c0526103c05161052052610180516103e0526103e051610540526101606003823b03596001821261264c5781600382863c81810183818561040060045afa5050828201815ff0801561264c57905090509050905061022052610120515f6102605261026051610300526101a051610280526102805161032052610104356102a0526102a05161034052610124356102c0526102c05161036052610220516102e0526102e0516103805260a06003823b03596001821261264c5781600382863c81810183818561030060045afa5050828201815ff0801561264c579050905090509050610240526102205163e9333fab610260526102405161028052803b1561264c575f610260602461027c5f855af161099b573d5f5f3e3d5ffd5b5061022051600455610240516005553360065561020051601155610140516395d89b416102a05260606102a060046102bc845afa6109db573d5f5f3e3d5ffd5b60403d1061264c576102a0516102a001602081511161264c57805161032052602081015161034052506103209050805161026052602081015161028052505f60106102a0527f4375727665205661756c7420666f7220000000000000000000000000000000006102c0526102a080516020820183610300018151815250508083019250505061026051816103000161028051815250808201915050806102e0526102e0905060208151015f81601f0160051c6003811161264c578015610ab457905b8060051b8401518160080155600101818118610a9d575b505050505f60026102a0527f63760000000000000000000000000000000000000000000000000000000000006102c0526102a080516020820183610300018151815250508083019250505061026051816103000161028051815250808201915050806102e0526102e0905060208151015f81601f0160051c6003811161264c578015610b5357905b8060051b84015181600b0155600101818118610b3c575b505050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600755610240516102a052610220516102c05260406102a0f35b60065463f851a440604052602060406004605c845afa610bb4573d5f5f3e3d5ffd5b60203d1061264c576040518060a01c61264c5760805260809050513318610bdc576001610be3565b6006543318155b1561264c576004356007557f3f8118fc46e72ecde0c5e090803cad8c88e817b2f1e93e820aa9bfbf51f2468d60043560405260206040a1005b5f5460021461264c57600454632c4e722e604052602060406004605c845afa610c47573d5f5f3e3d5ffd5b60203d1061264c5760409050516301e133808102816301e1338082041861264c57905060805260206080f35b5f5460021461264c576005546331dc3ca860e052602060e0600460fc845afa610c9e573d5f5f3e3d5ffd5b60203d1061264c5760e090505160c05260c051610cc6575f60e052602060e0610d4856610d48565b600454632c4e722e60e052602060e0600460fc845afa610ce8573d5f5f3e3d5ffd5b60203d1061264c5760e09050516301e133808102816301e1338082041861264c57905060c05180820281158383830414171561264c5790509050610d2d6101206121d5565b61012051801561264c57808204905090506101405260206101405bf35b60015460405260206040f35b5f5460021461264c576020610d6b60c06121d5565b60c0f35b600160c052610d88565b6004358060011c61264c5760c0525b5f5460021461264c5760105460e05260e051610db85766038d7ea4c68000610100526020610100610e9c56610e9c565b60115461010052610dca6101406121d5565b610140516101005180820281158383830414171561264c57905090506001810181811061264c579050670de0b6b3a7640000810281670de0b6b3a764000082041861264c5790506101205260e0516103e8810181811061264c579050610140525f6101605260c051610e7357610120516101405180820182811061264c57905090506001810381811161264c57905061014051801561264c578082049050905061016052610e8d565b6101205161014051801561264c5780820490509050610160525b610160511561264c5760206101605bf35b5f5460021461264c57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052610ee46101a0612288565b6101a0f35b5f5460021461264c57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052610f2f6101a0612387565b6101a0f35b6004358060a01c61264c5760c05260075460e05260e05119610f5d57602060e0610fa056610fa0565b610f686101206121d5565b610120516101005260e05161010051808281188284110218905090506101005180820382811161264c57905090506101205260206101205bf35b5f5460021461264c57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052610fe86101a0612288565b6101a0f35b336101a052611007565b6024358060a01c61264c576101a0525b5f5460021461264c5760025f556005546101c0526110266102006121d5565b610200516101e0526127106101e05160043580820182811061264c579050905010156110b1576010610200527f4e656564206d6f726520617373657473000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b6007546101e05160043580820182811061264c5790509050111561113457600c610200527f537570706c79206c696d697400000000000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b60043560c052600160e0526101e05161010052611152610220612288565b61022051610200526001546323b872dd6102205233610240526101c05161026052600435610280526020610220606461023c5f855af1611194573d5f5f3e3d5ffd5b3d6111ab57803b1561264c5760016102a0526111c4565b60203d1061264c57610220518060011c61264c576102a0525b6102a09050511561264c576101a051604052610200516060526111e5612486565b6101c0516369c6804e61022052803b1561264c575f610220600461023c5f855af1611212573d5f5f3e3d5ffd5b506101a051337fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d76004356102205261020051610240526040610220a3602061020060035f55f35b6004358060a01c61264c576101a0526007546101c0526101c051196112865760206101c06112fe566112fe565b6112916102006121d5565b610200516101e05260206101c0516101e051808281188284110218905090506101e05180820382811161264c579050905060c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526112fa610200612288565b6102005bf35b5f5460021461264c57602060043560c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526113456101a0612387565b6101a0f35b336101a052611364565b6024358060a01c61264c576101a0525b5f5460021461264c5760025f556005546101c0526113836102006121d5565b610200516101e05260043560c0525f60e0526101e051610100526113a8610220612387565b61022051610200526127106101e0516102005180820182811061264c57905090501015611434576010610220527f4e656564206d6f726520617373657473000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6007546101e0516102005180820182811061264c579050905011156114b857600c610220527f537570706c79206c696d697400000000000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6001546323b872dd6102205233610240526101c0516102605261020051610280526020610220606461023c5f855af16114f3573d5f5f3e3d5ffd5b3d61150a57803b1561264c5760016102a052611523565b60203d1061264c57610220518060011c61264c576102a0525b6102a09050511561264c576101a051604052600435606052611543612486565b6101c0516369c6804e61022052803b1561264c575f610220600461023c5f855af1611570573d5f5f3e3d5ffd5b506101a051337fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d76102005161022052600435610240526040610220a3602061020060035f55f35b6004358060a01c61264c576101a0525f5460021461264c57600f6101a0516020525f5260405f205460c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526116176101c0612387565b6101c0516001546370a082316101e0526005546102005260206101e060246101fc845afa611647573d5f5f3e3d5ffd5b60203d1061264c576101e090505180828118828410021890509050610220526020610220f35b5f5460021461264c576001546370a082316101a0526005546101c05260206101a060246101bc845afa6116a2573d5f5f3e3d5ffd5b60203d1061264c576101a09050516004351161264c57602060043560c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526116f46101a0612288565b6101a0f35b336101a052336101c052611740565b6024358060a01c61264c576101a052336101c052611740565b6024358060a01c61264c576101a0526044358060a01c61264c576101c0525b5f5460021461264c5760025f556117586102006121d5565b610200516101e0526127106101e05160043580820382811161264c5790509050101561178c576004356101e051181561178f565b60015b6117f8576010610200527f4e656564206d6f726520617373657473000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b60043560c0525f60e0526101e05161010052611815610220612288565b6102205161020052336101c0511461189e57600e6101c0516020525f5260405f2080336020525f5260405f20905054610220527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610220511461189e576101c05160405233606052610220516102005180820382811161264c579050905060805261189e6124f3565b600554610220526101c051604052610200516060526118bb612548565b6001546323b872dd6102405261022051610260526101a051610280526004356102a0526020610240606461025c5f855af16118f8573d5f5f3e3d5ffd5b3d61190f57803b1561264c5760016102c052611928565b60203d1061264c57610240518060011c61264c576102c0525b6102c09050511561264c57610220516369c6804e61024052803b1561264c575f610240600461025c5f855af1611960573d5f5f3e3d5ffd5b506101c0516101a051337ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db6004356102405261020051610260526040610240a4602061020060035f55f35b6004358060a01c61264c576101a0525f5460021461264c576001546370a082316101c0526005546101e05260206101c060246101dc845afa6119ef573d5f5f3e3d5ffd5b60203d1061264c576101c090505160c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611a34610200612288565b61020051600f6101a0516020525f5260405f205480828118828410021890509050610220526020610220f35b5f5460021461264c57601054611a8a5760043561264c575f6101a05260206101a0611b1656611b16565b60043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611ac56101c0612387565b6101c0516101a0526001546370a082316101c0526005546101e05260206101c060246101dc845afa611af9573d5f5f3e3d5ffd5b60203d1061264c576101c09050516101a0511161264c5760206101a05bf35b336101a052336101c052611b5f565b6024358060a01c61264c576101a052336101c052611b5f565b6024358060a01c61264c576101a0526044358060a01c61264c576101c0525b5f5460021461264c5760025f55336101c05114611bec57600e6101c0516020525f5260405f2080336020525f5260405f209050546101e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e05114611bec576101c051604052336060526101e05160043580820382811161264c5790509050608052611bec6124f3565b611bf76102006121d5565b610200516101e05260043560c052600160e0526101e05161010052611c1d610220612387565b610220516102005261270f6101e0516102005180820382811161264c579050905011611cc05760105460043518611c5b576101e05161020052611cc0565b6010610220527f4e656564206d6f726520617373657473000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6101c051604052600435606052611cd5612548565b600554610220526001546323b872dd6102405261022051610260526101a05161028052610200516102a0526020610240606461025c5f855af1611d1a573d5f5f3e3d5ffd5b3d611d3157803b1561264c5760016102c052611d4a565b60203d1061264c57610240518060011c61264c576102c0525b6102c09050511561264c57610220516369c6804e61024052803b1561264c575f610240600461025c5f855af1611d82573d5f5f3e3d5ffd5b506101c0516101a051337ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db6102005161024052600435610260526040610240a4602061020060035f55f35b6004358060a01c61264c5760c0526024358060a01c61264c5760e052600e60c0516020525f5260405f2080336020525f5260405f20905054610100527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101005114611e5d5760c051604052336060526101005160443580820382811161264c5790509050608052611e5d6124f3565b60c05160405260e051606052604435608052611e776125b5565b6001610120526020610120f35b6004358060a01c61264c5760c0523360405260c051606052602435608052611eaa6125b5565b600160e052602060e0f35b6004358060a01c61264c5760c0523360405260c051606052602435608052611edb6124f3565b600160e052602060e0f35b6004358060a01c61264c5760c052600e336020525f5260405f208060c0516020525f5260405f2090505460e05260243560e051016101005260e051610100511015611f51577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100525b60e0516101005114611f76573360405260c05160605261010051608052611f766124f3565b6001610120526020610120f35b6004358060a01c61264c5760c052600e336020525f5260405f208060c0516020525f5260405f2090505460e05260243560e05103610100526101005160e0511015611fce575f610100525b60e0516101005114611ff3573360405260c05160605261010051608052611ff36124f3565b6001610120526020610120f35b602060065463f851a440604052602060406004605c845afa612024573d5f5f3e3d5ffd5b60203d1061264c576040518060a01c61264c5760805260809050f35b5f5ffd5b6040516060525f6080525f6008905b8060a05260a051806007036007811161264c57905060ff811161264c578060020a905060c05260c05160ff811161264c578060020a905060e05260e051670de0b6b3a7640000810281670de0b6b3a764000082041861264c579050606051106121025760605160e051801561264c578082049050905060605260805160c051670de0b6b3a7640000810281670de0b6b3a764000082041861264c57905080820182811061264c57905090506080525b600101818118612053575050670de0b6b3a764000060a0525f603b905b8060c052671bc16d674ec80000606051106121585760805160a05180820182811061264c57905090506080526060518060011c90506060525b60605160605180820281158383830414171561264c5790509050670de0b6b3a76400008104905060605260a0518060011c905060a05260010181811861211f575050608051670de0b6b3a7640000810281670de0b6b3a764000082041861264c5790506714057b7ef7678100810490508060ff1c61264c57815250565b60055463d0c581bf604052602060406004605c845afa6121f7573d5f5f3e3d5ffd5b60203d1061264c576040518060011c61264c57608052608050506001546370a08231604052600554606052602060406024605c845afa612239573d5f5f3e3d5ffd5b60203d1061264c5760409050516005546331dc3ca8608052602060806004609c845afa612268573d5f5f3e3d5ffd5b60203d1061264c57608090505180820182811061264c5790509050815250565b610100516101205261012051196122ad576122a46101406121d5565b61014051610120525b601154610140526010546103e8810181811061264c57905060c05180820281158383830414171561264c57905090506101405180820281158383830414171561264c579050905061016052610120516101405180820281158383830414171561264c57905090506001810181811061264c5790506101805260e05161236c57610160516101805180820182811061264c57905090506001810381811161264c57905061018051801561264c578082049050905081525061238556612385565b6101605161018051801561264c57808204905090508152505b565b610100516101205261012051196123ac576123a36101406121d5565b61014051610120525b6011546101405260c051610120516101405180820281158383830414171561264c57905090506001810181811061264c57905080820281158383830414171561264c5790509050610160526010546103e8810181811061264c5790506101405180820281158383830414171561264c57905090506101805260e05161246b57610160516101805180820182811061264c57905090506001810381811161264c57905061018051801561264c578082049050905081525061248456612484565b6101605161018051801561264c57808204905090508152505b565b600f6040516020525f5260405f20805460605180820182811061264c579050905081555060105460605180820182811061264c57905090506010556040515f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60605160805260206080a3565b608051600e6040516020525f5260405f20806060516020525f5260405f209050556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560805160a052602060a0a3565b600f6040516020525f5260405f20805460605180820382811161264c579050905081555060105460605180820382811161264c57905090506010555f6040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60605160805260206080a3565b6060513081146125c7578015156125c9565b5f5b90501561264c57600f6040516020525f5260405f20805460805180820382811161264c5790509050815550600f6060516020525f5260405f20805460805180820182811061264c57905090508155506060516040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60805160a052602060a0a3565b5f80fd182e27410b002e2719050e0926c10b109626690b082c27990928c062030d790025dd62ed3e019d004599530b060d6f00050a28a477166d0025ce96cb7715b70025765337b60068000500f714ce17080045c63d75b61259002586fc88d300800005ef8b30f70fa200254cdad5061a600025d905777e19ab00257bde82f21b270045a0712d68134a0025402d267d0f3400252621db2f00740005bac4daa20c1c0005c45a015500a40005a9059cbb1e840045f77c479100980005db006a751b180025f851a4402000000570a0823101e0002507a2d13a0ee90025a980497e0c7300052a943945008c0005313ce56700bc0005b6b55f250fed002501e1d1140d560005a457c2d71f83004538d52e0f0d4a000543687bba0212014595d89b4101320005395093511ee600458a938f2f0b920025d5abeb0100b00005b3d7f6b91300002518160ddd0206000523b872dd1dcd006506fdde0300c700056e553f650ff70045ba0876521b4000652e1a7d4d16f9002594bf804d13540045c6e6f5920e9e0025b460af9417210065095ea7b31eb50045
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.