Overview
ETH Balance
0 ETH
ETH Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
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
"""
@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
Contract ABI
API[{"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
3461001b576001600155612a7c61001f61000039612a7c610000f35b5f80fd5f3560e01c60026037820660011b612a0e01601e395f51565b63765337b681186123fe5734612a0a5760015460405260206040f36123fe565b632621db2f81186100545734612a0a5760025460405260206040f35b63f77c479181186123fe5734612a0a5760055460405260206040f36123fe565b6386fc88d381186100905734612a0a5760035460405260206040f35b63c63d75b681186123fe57602436103417612a0a576004358060a01c612a0a576101a0526007546101c0526101c051196100d25760206101c061014a5661014a565b6100dd610200612593565b610200516101e05260206101c0516101e051808281188284110218905090506101e051808203828111612a0a579050905060c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052610146610200612646565b6102005bf36123fe565b632a943945811861016c5734612a0a5760045460405260206040f35b6307a2d13a81186123fe57602436103417612a0a575f54600214612a0a57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526101c76101a0612745565b6101a0f36123fe565b63c45a015581186123fe5734612a0a5760065460405260206040f36123fe565b63d5abeb0181186123fe5734612a0a5760075460405260206040f36123fe565b63313ce56781186123fe5734612a0a57601260405260206040f36123fe565b6306fdde0381186102aa5734612a0a57602080604052806040016020600854015f81601f0160051c60038111612a0a57801561027e57905b80600801548160051b850152600101818118610267575b5050508051806020830101601f825f03163682375050601f19601f825160200101169050810190506040f35b63b460af9481186123fe57606436103417612a0a576024358060a01c612a0a576101a0526044358060a01c612a0a576101c0525b5f54600214612a0a5760025f556102f6610200612593565b610200516101e0526127106101e051600435808203828111612a0a5790509050101561032a576004356101e051181561032d565b60015b610396576010610200527f4e656564206d6f726520617373657473000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b60043560c0525f60e0526101e051610100526103b3610220612646565b6102205161020052336101c0511461043c57600e6101c0516020525f5260405f2080336020525f5260405f20905054610220527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610220511461043c576101c051604052336060526102205161020051808203828111612a0a579050905060805261043c6128b1565b600554610220526101c05160405261020051606052610459612906565b6001546323b872dd6102405261022051610260526101a051610280526004356102a0526020610240606461025c5f855af1610496573d5f5f3e3d5ffd5b3d6104ad57803b15612a0a5760016102c0526104c6565b60203d10612a0a57610240518060011c612a0a576102c0525b6102c090505115612a0a57610220516369c6804e61024052803b15612a0a575f610240600461025c5f855af16104fe573d5f5f3e3d5ffd5b506101c0516101a051337ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db6004356102405261020051610260526040610240a4602061020060035f55f36123fe565b6395d89b4181186105c85734612a0a57602080604052806040016020600b54015f81601f0160051c60038111612a0a57801561059c57905b80600b01548160051b850152600101818118610585575b5050508051806020830101601f825f03163682375050601f19601f825160200101169050810190506040f35b6338d52e0f81186123fe5734612a0a5760015460405260206040f36123fe565b63dd62ed3e811861064057604436103417612a0a576004358060a01c612a0a576040526024358060a01c612a0a57606052600e6040516020525f5260405f20806060516020525f5260405f2090505460805260206080f35b63ef8b30f781186123fe57602436103417612a0a575f54600214612a0a57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101005261069b6101a0612646565b6101a0f36123fe565b6370a0823181186123fe57602436103417612a0a576004358060a01c612a0a57604052600f6040516020525f5260405f205460605260206060f36123fe565b6318160ddd81186123fe5734612a0a5760105460405260206040f36123fe565b6343687bba81186123fe5761014436103417612a0a576004358060a01c612a0a57610100526024358060a01c612a0a57610120526044358060a01c612a0a57610140526064358060a01c612a0a576101605260c4358060a01c612a0a576101805260e4358060a01c612a0a576101a052600154612a0a57610140516001556101605160025561018051600355600260843510156107a0575f6107a9565b61271060843511155b6108125760076101c0527f57726f6e672041000000000000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b67016345785d8a000060a435111561088957600c6101c0527f46656520746f6f206869676800000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b620f424060a43510156108fb57600b6101c0527f46656520746f6f206c6f770000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b662386f26fc1000061012435101561097257601c6101c0527f4c69717569646174696f6e20646973636f756e7420746f6f206c6f77000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6706f05b59d3b200006101043511156109ea5760166101c0527f4c6f616e20646973636f756e7420746f6f2068696768000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b610124356101043511610a815760276101c0527f6e656564206c6f616e5f646973636f756e743e6c69717569646174696f6e5f646101e0527f6973636f756e7400000000000000000000000000000000000000000000000000610200526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6101805163a035b1fe6101e05260206101e060046101fc845afa610aa7573d5f5f3e3d5ffd5b60203d10612a0a576101e09050516101c0526101c05115612a0a576101c0516101805163ceb7f7596101e05260206101e060046101fc5f855af1610aed573d5f5f3e3d5ffd5b60203d10612a0a576101e090505118612a0a57608435670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a57905060843560018103818111612a0a5790508015612a0a57808204905090506101e0526101405163313ce567610220526020610220600461023c845afa610b68573d5f5f3e3d5ffd5b60203d10612a0a576102209050518060120360128111612a0a579050604d8111612a0a5780600a0a90506102005261010051610140516102a0526102a05161040052610200516102c0526102c05161042052610160516102e0526102e051610440526101605163313ce567610240526020610240600461025c845afa610bf0573d5f5f3e3d5ffd5b60203d10612a0a576102409050518060120360128111612a0a579050604d8111612a0a5780600a0a90506103005261030051610460526084356103205261032051610480526101e051670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a5790508060b5710100000000000000000000000000000000008210610c80578160801c91508060401b90505b69010000000000000000008210610c9e578160401c91508060201b90505b650100000000008210610cb8578160201c91508060101b90505b63010000008210610cd0578160101c91508060081b90505b620100008201810260121c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808304808281188284100218905090509050905061034052610340516104a0526101e051604052610d55610280612402565b6102805161036052610360516104c0526101c05161038052610380516104e05260a4356103a0526103a051610500525f6103c0526103c05161052052610180516103e0526103e051610540526101606003823b035960018212612a0a5781600382863c81810183818561040060045afa5050828201815ff08015612a0a57905090509050905061022052610120515f6102605261026051610300526101a051610280526102805161032052610104356102a0526102a05161034052610124356102c0526102c05161036052610220516102e0526102e0516103805260a06003823b035960018212612a0a5781600382863c81810183818561030060045afa5050828201815ff08015612a0a579050905090509050610240526102205163e9333fab610260526102405161028052803b15612a0a575f610260602461027c5f855af1610ea2573d5f5f3e3d5ffd5b5061022051600455610240516005553360065561020051601155610140516395d89b416102a05260606102a060046102bc845afa610ee2573d5f5f3e3d5ffd5b60403d10612a0a576102a0516102a0016020815111612a0a57805161032052602081015161034052506103209050805161026052602081015161028052505f60106102a0527f4375727665205661756c7420666f7220000000000000000000000000000000006102c0526102a080516020820183610300018151815250508083019250505061026051816103000161028051815250808201915050806102e0526102e0905060208151015f81601f0160051c60038111612a0a578015610fbb57905b8060051b8401518160080155600101818118610fa4575b505050505f60026102a0527f63760000000000000000000000000000000000000000000000000000000000006102c0526102a080516020820183610300018151815250508083019250505061026051816103000161028051815250808201915050806102e0526102e0905060208151015f81601f0160051c60038111612a0a57801561105a57905b8060051b84015181600b0155600101818118611043575b505050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600755610240516102a052610220516102c05260406102a0f36123fe565b638a938f2f81186123fe57602436103417612a0a5760065463f851a440604052602060406004605c845afa6110d4573d5f5f3e3d5ffd5b60203d10612a0a576040518060a01c612a0a57608052608090505133186110fc576001611103565b6006543318155b15612a0a576004356007557f3f8118fc46e72ecde0c5e090803cad8c88e817b2f1e93e820aa9bfbf51f2468d60043560405260206040a1006123fe565b63bac4daa281186111a75734612a0a575f54600214612a0a57600454632c4e722e604052602060406004605c845afa61117b573d5f5f3e3d5ffd5b60203d10612a0a5760409050516301e133808102816301e13380820418612a0a57905060805260206080f35b63db006a7581186123fe57602436103417612a0a57336101a052336101c052611f22566123fe565b63a980497e81186123fe5734612a0a575f54600214612a0a576005546331dc3ca860e052602060e0600460fc845afa61120a573d5f5f3e3d5ffd5b60203d10612a0a5760e090505160c05260c051611232575f60e052602060e06112b4566112b4565b600454632c4e722e60e052602060e0600460fc845afa611254573d5f5f3e3d5ffd5b60203d10612a0a5760e09050516301e133808102816301e13380820418612a0a57905060c051808202811583838304141715612a0a5790509050611299610120612593565b610120518015612a0a57808204905090506101405260206101405bf36123fe565b6301e1d11481186123fe5734612a0a575f54600214612a0a5760206112df60c0612593565b60c0f36123fe565b6399530b0681186123fe5734612a0a57600160c052611329566123fe565b6328c06203811861143f57602436103417612a0a576004358060011c612a0a5760c0525b5f54600214612a0a5760105460e05260e0516113595766038d7ea4c6800061010052602061010061143d5661143d565b6011546101005261136b610140612593565b6101405161010051808202811583838304141715612a0a579050905060018101818110612a0a579050670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a5790506101205260e0516103e88101818110612a0a579050610140525f6101605260c051611414576101205161014051808201828110612a0a579050905060018103818111612a0a579050610140518015612a0a57808204905090506101605261142e565b61012051610140518015612a0a5780820490509050610160525b6101605115612a0a5760206101605bf35b62f714ce81186123fe57604436103417612a0a576024358060a01c612a0a576101a052336101c0526102de566123fe565b63c6e6f59281186114d057602436103417612a0a575f54600214612a0a57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526114cb6101a0612646565b6101a0f35b632e1a7d4d81186123fe57602436103417612a0a57336101a052336101c0526102de566123fe565b63402d267d811861157b57602436103417612a0a576004358060a01c612a0a5760c05260075460e05260e0511961153657602060e061157956611579565b611541610120612593565b610120516101005260e051610100518082811882841102189050905061010051808203828111612a0a57905090506101205260206101205bf35b63d905777e81186123fe57602436103417612a0a576004358060a01c612a0a576101a0525f54600214612a0a576001546370a082316101c0526005546101e05260206101c060246101dc845afa6115d4573d5f5f3e3d5ffd5b60203d10612a0a576101c090505160c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611619610200612646565b61020051600f6101a0516020525f5260405f205480828118828410021890509050610220526020610220f36123fe565b63b6b55f2581186123fe57602436103417612a0a57336101a052611691566123fe565b636e553f6581186123fe57604436103417612a0a576024358060a01c612a0a576101a0525b5f54600214612a0a5760025f556005546101c0526116b0610200612593565b610200516101e0526127106101e051600435808201828110612a0a5790509050101561173b576010610200527f4e656564206d6f726520617373657473000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b6007546101e051600435808201828110612a0a579050905011156117be57600c610200527f537570706c79206c696d697400000000000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b60043560c052600160e0526101e051610100526117dc610220612646565b61022051610200526001546323b872dd6102205233610240526101c05161026052600435610280526020610220606461023c5f855af161181e573d5f5f3e3d5ffd5b3d61183557803b15612a0a5760016102a05261184e565b60203d10612a0a57610220518060011c612a0a576102a0525b6102a090505115612a0a576101a0516040526102005160605261186f612844565b6101c0516369c6804e61022052803b15612a0a575f610220600461023c5f855af161189c573d5f5f3e3d5ffd5b506101a051337fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d76004356102205261020051610240526040610220a3602061020060035f55f36123fe565b63b3d7f6b9811861194657602436103417612a0a575f54600214612a0a57602060043560c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526119416101a0612745565b6101a0f35b63a457c2d781186123fe57604436103417612a0a576004358060a01c612a0a5760c052600e336020525f5260405f208060c0516020525f5260405f2090505460e05260243560e05103610100526101005160e05110156119a6575f610100525b60e05161010051146119cb573360405260c051606052610100516080526119cb6128b1565b6001610120526020610120f36123fe565b63a0712d6881186123fe57602436103417612a0a57336101a052611a24566123fe565b6394bf804d81186123fe57604436103417612a0a576024358060a01c612a0a576101a0525b5f54600214612a0a5760025f556005546101c052611a43610200612593565b610200516101e05260043560c0525f60e0526101e05161010052611a68610220612745565b61022051610200526127106101e05161020051808201828110612a0a57905090501015611af4576010610220527f4e656564206d6f726520617373657473000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6007546101e05161020051808201828110612a0a57905090501115611b7857600c610220527f537570706c79206c696d697400000000000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6001546323b872dd6102205233610240526101c0516102605261020051610280526020610220606461023c5f855af1611bb3573d5f5f3e3d5ffd5b3d611bca57803b15612a0a5760016102a052611be3565b60203d10612a0a57610220518060011c612a0a576102a0525b6102a090505115612a0a576101a051604052600435606052611c03612844565b6101c0516369c6804e61022052803b15612a0a575f610220600461023c5f855af1611c30573d5f5f3e3d5ffd5b506101a051337fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d76102005161022052600435610240526040610220a3602061020060035f55f36123fe565b63ce96cb778118611d4657602436103417612a0a576004358060a01c612a0a576101a0525f54600214612a0a57600f6101a0516020525f5260405f205460c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611cf06101c0612745565b6101c0516001546370a082316101e0526005546102005260206101e060246101fc845afa611d20573d5f5f3e3d5ffd5b60203d10612a0a576101e090505180828118828410021890509050610220526020610220f35b634cdad50681186123fe57602436103417612a0a575f54600214612a0a57601054611d8557600435612a0a575f6101a05260206101a0611e1156611e11565b60043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611dc06101c0612745565b6101c0516101a0526001546370a082316101c0526005546101e05260206101c060246101dc845afa611df4573d5f5f3e3d5ffd5b60203d10612a0a576101c09050516101a05111612a0a5760206101a05bf36123fe565b630a28a47781186123fe57602436103417612a0a575f54600214612a0a576001546370a082316101a0526005546101c05260206101a060246101bc845afa611e61573d5f5f3e3d5ffd5b60203d10612a0a576101a090505160043511612a0a57602060043560c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611eb36101a0612646565b6101a0f36123fe565b637bde82f281186123fe57604436103417612a0a576024358060a01c612a0a576101a052336101c052611f22566123fe565b63ba08765281186123fe57606436103417612a0a576024358060a01c612a0a576101a0526044358060a01c612a0a576101c0525b5f54600214612a0a5760025f55336101c05114611faf57600e6101c0516020525f5260405f2080336020525f5260405f209050546101e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e05114611faf576101c051604052336060526101e051600435808203828111612a0a5790509050608052611faf6128b1565b611fba610200612593565b610200516101e05260043560c052600160e0526101e05161010052611fe0610220612745565b610220516102005261270f6101e05161020051808203828111612a0a579050905011612083576010546004351861201e576101e05161020052612083565b6010610220527f4e656564206d6f726520617373657473000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6101c051604052600435606052612098612906565b600554610220526001546323b872dd6102405261022051610260526101a05161028052610200516102a0526020610240606461025c5f855af16120dd573d5f5f3e3d5ffd5b3d6120f457803b15612a0a5760016102c05261210d565b60203d10612a0a57610240518060011c612a0a576102c0525b6102c090505115612a0a57610220516369c6804e61024052803b15612a0a575f610240600461025c5f855af1612145573d5f5f3e3d5ffd5b506101c0516101a051337ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db6102005161024052600435610260526040610240a4602061020060035f55f36123fe565b6323b872dd81186123fe57606436103417612a0a576004358060a01c612a0a5760c0526024358060a01c612a0a5760e052600e60c0516020525f5260405f2080336020525f5260405f20905054610100527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010051146122395760c0516040523360605261010051604435808203828111612a0a57905090506080526122396128b1565b60c05160405260e051606052604435608052612253612973565b6001610120526020610120f36123fe565b63a9059cbb81186123fe57604436103417612a0a576004358060a01c612a0a5760c0523360405260c05160605260243560805261229f612973565b600160e052602060e0f36123fe565b63095ea7b381186123fe57604436103417612a0a576004358060a01c612a0a5760c0523360405260c0516060526024356080526122e96128b1565b600160e052602060e0f36123fe565b633950935181186123fe57604436103417612a0a576004358060a01c612a0a5760c052600e336020525f5260405f208060c0516020525f5260405f2090505460e05260243560e051016101005260e051610100511015612378577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100525b60e051610100511461239d573360405260c0516060526101005160805261239d6128b1565b6001610120526020610120f36123fe565b63f851a44081186123fe5734612a0a57602060065463f851a440604052602060406004605c845afa6123e2573d5f5f3e3d5ffd5b60203d10612a0a576040518060a01c612a0a5760805260809050f35b5f5ffd5b6040516060525f6080525f6008905b8060a05260a0518060070360078111612a0a57905060ff8111612a0a578060020a905060c05260c05160ff8111612a0a578060020a905060e05260e051670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a579050606051106124c05760605160e0518015612a0a578082049050905060605260805160c051670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a579050808201828110612a0a57905090506080525b600101818118612411575050670de0b6b3a764000060a0525f603b905b8060c052671bc16d674ec80000606051106125165760805160a051808201828110612a0a57905090506080526060518060011c90506060525b606051606051808202811583838304141715612a0a5790509050670de0b6b3a76400008104905060605260a0518060011c905060a0526001018181186124dd575050608051670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a5790506714057b7ef7678100810490508060ff1c612a0a57815250565b60055463d0c581bf604052602060406004605c845afa6125b5573d5f5f3e3d5ffd5b60203d10612a0a576040518060011c612a0a57608052608050506001546370a08231604052600554606052602060406024605c845afa6125f7573d5f5f3e3d5ffd5b60203d10612a0a5760409050516005546331dc3ca8608052602060806004609c845afa612626573d5f5f3e3d5ffd5b60203d10612a0a576080905051808201828110612a0a5790509050815250565b6101005161012052610120511961266b57612662610140612593565b61014051610120525b601154610140526010546103e88101818110612a0a57905060c051808202811583838304141715612a0a579050905061014051808202811583838304141715612a0a5790509050610160526101205161014051808202811583838304141715612a0a579050905060018101818110612a0a5790506101805260e05161272a576101605161018051808201828110612a0a579050905060018103818111612a0a579050610180518015612a0a578082049050905081525061274356612743565b61016051610180518015612a0a57808204905090508152505b565b6101005161012052610120511961276a57612761610140612593565b61014051610120525b6011546101405260c0516101205161014051808202811583838304141715612a0a579050905060018101818110612a0a579050808202811583838304141715612a0a5790509050610160526010546103e88101818110612a0a57905061014051808202811583838304141715612a0a57905090506101805260e051612829576101605161018051808201828110612a0a579050905060018103818111612a0a579050610180518015612a0a578082049050905081525061284256612842565b61016051610180518015612a0a57808204905090508152505b565b600f6040516020525f5260405f208054606051808201828110612a0a5790509050815550601054606051808201828110612a0a57905090506010556040515f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60605160805260206080a3565b608051600e6040516020525f5260405f20806060516020525f5260405f209050556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560805160a052602060a0a3565b600f6040516020525f5260405f208054606051808203828111612a0a5790509050815550601054606051808203828111612a0a57905090506010555f6040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60605160805260206080a3565b60605130811461298557801515612987565b5f5b905015612a0a57600f6040516020525f5260405f208054608051808203828111612a0a5790509050815550600f6060516020525f5260405f208054608051808201828110612a0a57905090508155506060516040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60805160a052602060a0a3565b5f80fd070323fe23fe130523fe23fe23fe14f823fe22ae01f00150114023fe147012ba23fe23ae23fe1eee22f811cf1ebc001823fe109d23fe22641c7b219423fe23fe19dc12e723fe18e723fe23fe23fe022f054d06a423fe05e823fe164902100038007419ff06e323fe01d01e17166c84192a7c81186e00a16576797065728300030a0015
Deployed Bytecode
0x5f3560e01c60026037820660011b612a0e01601e395f51565b63765337b681186123fe5734612a0a5760015460405260206040f36123fe565b632621db2f81186100545734612a0a5760025460405260206040f35b63f77c479181186123fe5734612a0a5760055460405260206040f36123fe565b6386fc88d381186100905734612a0a5760035460405260206040f35b63c63d75b681186123fe57602436103417612a0a576004358060a01c612a0a576101a0526007546101c0526101c051196100d25760206101c061014a5661014a565b6100dd610200612593565b610200516101e05260206101c0516101e051808281188284110218905090506101e051808203828111612a0a579050905060c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052610146610200612646565b6102005bf36123fe565b632a943945811861016c5734612a0a5760045460405260206040f35b6307a2d13a81186123fe57602436103417612a0a575f54600214612a0a57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526101c76101a0612745565b6101a0f36123fe565b63c45a015581186123fe5734612a0a5760065460405260206040f36123fe565b63d5abeb0181186123fe5734612a0a5760075460405260206040f36123fe565b63313ce56781186123fe5734612a0a57601260405260206040f36123fe565b6306fdde0381186102aa5734612a0a57602080604052806040016020600854015f81601f0160051c60038111612a0a57801561027e57905b80600801548160051b850152600101818118610267575b5050508051806020830101601f825f03163682375050601f19601f825160200101169050810190506040f35b63b460af9481186123fe57606436103417612a0a576024358060a01c612a0a576101a0526044358060a01c612a0a576101c0525b5f54600214612a0a5760025f556102f6610200612593565b610200516101e0526127106101e051600435808203828111612a0a5790509050101561032a576004356101e051181561032d565b60015b610396576010610200527f4e656564206d6f726520617373657473000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b60043560c0525f60e0526101e051610100526103b3610220612646565b6102205161020052336101c0511461043c57600e6101c0516020525f5260405f2080336020525f5260405f20905054610220527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610220511461043c576101c051604052336060526102205161020051808203828111612a0a579050905060805261043c6128b1565b600554610220526101c05160405261020051606052610459612906565b6001546323b872dd6102405261022051610260526101a051610280526004356102a0526020610240606461025c5f855af1610496573d5f5f3e3d5ffd5b3d6104ad57803b15612a0a5760016102c0526104c6565b60203d10612a0a57610240518060011c612a0a576102c0525b6102c090505115612a0a57610220516369c6804e61024052803b15612a0a575f610240600461025c5f855af16104fe573d5f5f3e3d5ffd5b506101c0516101a051337ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db6004356102405261020051610260526040610240a4602061020060035f55f36123fe565b6395d89b4181186105c85734612a0a57602080604052806040016020600b54015f81601f0160051c60038111612a0a57801561059c57905b80600b01548160051b850152600101818118610585575b5050508051806020830101601f825f03163682375050601f19601f825160200101169050810190506040f35b6338d52e0f81186123fe5734612a0a5760015460405260206040f36123fe565b63dd62ed3e811861064057604436103417612a0a576004358060a01c612a0a576040526024358060a01c612a0a57606052600e6040516020525f5260405f20806060516020525f5260405f2090505460805260206080f35b63ef8b30f781186123fe57602436103417612a0a575f54600214612a0a57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101005261069b6101a0612646565b6101a0f36123fe565b6370a0823181186123fe57602436103417612a0a576004358060a01c612a0a57604052600f6040516020525f5260405f205460605260206060f36123fe565b6318160ddd81186123fe5734612a0a5760105460405260206040f36123fe565b6343687bba81186123fe5761014436103417612a0a576004358060a01c612a0a57610100526024358060a01c612a0a57610120526044358060a01c612a0a57610140526064358060a01c612a0a576101605260c4358060a01c612a0a576101805260e4358060a01c612a0a576101a052600154612a0a57610140516001556101605160025561018051600355600260843510156107a0575f6107a9565b61271060843511155b6108125760076101c0527f57726f6e672041000000000000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b67016345785d8a000060a435111561088957600c6101c0527f46656520746f6f206869676800000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b620f424060a43510156108fb57600b6101c0527f46656520746f6f206c6f770000000000000000000000000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b662386f26fc1000061012435101561097257601c6101c0527f4c69717569646174696f6e20646973636f756e7420746f6f206c6f77000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6706f05b59d3b200006101043511156109ea5760166101c0527f4c6f616e20646973636f756e7420746f6f2068696768000000000000000000006101e0526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b610124356101043511610a815760276101c0527f6e656564206c6f616e5f646973636f756e743e6c69717569646174696f6e5f646101e0527f6973636f756e7400000000000000000000000000000000000000000000000000610200526101c0506101c051806101e001601f825f031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b6101805163a035b1fe6101e05260206101e060046101fc845afa610aa7573d5f5f3e3d5ffd5b60203d10612a0a576101e09050516101c0526101c05115612a0a576101c0516101805163ceb7f7596101e05260206101e060046101fc5f855af1610aed573d5f5f3e3d5ffd5b60203d10612a0a576101e090505118612a0a57608435670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a57905060843560018103818111612a0a5790508015612a0a57808204905090506101e0526101405163313ce567610220526020610220600461023c845afa610b68573d5f5f3e3d5ffd5b60203d10612a0a576102209050518060120360128111612a0a579050604d8111612a0a5780600a0a90506102005261010051610140516102a0526102a05161040052610200516102c0526102c05161042052610160516102e0526102e051610440526101605163313ce567610240526020610240600461025c845afa610bf0573d5f5f3e3d5ffd5b60203d10612a0a576102409050518060120360128111612a0a579050604d8111612a0a5780600a0a90506103005261030051610460526084356103205261032051610480526101e051670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a5790508060b5710100000000000000000000000000000000008210610c80578160801c91508060401b90505b69010000000000000000008210610c9e578160401c91508060201b90505b650100000000008210610cb8578160201c91508060101b90505b63010000008210610cd0578160101c91508060081b90505b620100008201810260121c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808184040160011c9050808304808281188284100218905090509050905061034052610340516104a0526101e051604052610d55610280612402565b6102805161036052610360516104c0526101c05161038052610380516104e05260a4356103a0526103a051610500525f6103c0526103c05161052052610180516103e0526103e051610540526101606003823b035960018212612a0a5781600382863c81810183818561040060045afa5050828201815ff08015612a0a57905090509050905061022052610120515f6102605261026051610300526101a051610280526102805161032052610104356102a0526102a05161034052610124356102c0526102c05161036052610220516102e0526102e0516103805260a06003823b035960018212612a0a5781600382863c81810183818561030060045afa5050828201815ff08015612a0a579050905090509050610240526102205163e9333fab610260526102405161028052803b15612a0a575f610260602461027c5f855af1610ea2573d5f5f3e3d5ffd5b5061022051600455610240516005553360065561020051601155610140516395d89b416102a05260606102a060046102bc845afa610ee2573d5f5f3e3d5ffd5b60403d10612a0a576102a0516102a0016020815111612a0a57805161032052602081015161034052506103209050805161026052602081015161028052505f60106102a0527f4375727665205661756c7420666f7220000000000000000000000000000000006102c0526102a080516020820183610300018151815250508083019250505061026051816103000161028051815250808201915050806102e0526102e0905060208151015f81601f0160051c60038111612a0a578015610fbb57905b8060051b8401518160080155600101818118610fa4575b505050505f60026102a0527f63760000000000000000000000000000000000000000000000000000000000006102c0526102a080516020820183610300018151815250508083019250505061026051816103000161028051815250808201915050806102e0526102e0905060208151015f81601f0160051c60038111612a0a57801561105a57905b8060051b84015181600b0155600101818118611043575b505050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600755610240516102a052610220516102c05260406102a0f36123fe565b638a938f2f81186123fe57602436103417612a0a5760065463f851a440604052602060406004605c845afa6110d4573d5f5f3e3d5ffd5b60203d10612a0a576040518060a01c612a0a57608052608090505133186110fc576001611103565b6006543318155b15612a0a576004356007557f3f8118fc46e72ecde0c5e090803cad8c88e817b2f1e93e820aa9bfbf51f2468d60043560405260206040a1006123fe565b63bac4daa281186111a75734612a0a575f54600214612a0a57600454632c4e722e604052602060406004605c845afa61117b573d5f5f3e3d5ffd5b60203d10612a0a5760409050516301e133808102816301e13380820418612a0a57905060805260206080f35b63db006a7581186123fe57602436103417612a0a57336101a052336101c052611f22566123fe565b63a980497e81186123fe5734612a0a575f54600214612a0a576005546331dc3ca860e052602060e0600460fc845afa61120a573d5f5f3e3d5ffd5b60203d10612a0a5760e090505160c05260c051611232575f60e052602060e06112b4566112b4565b600454632c4e722e60e052602060e0600460fc845afa611254573d5f5f3e3d5ffd5b60203d10612a0a5760e09050516301e133808102816301e13380820418612a0a57905060c051808202811583838304141715612a0a5790509050611299610120612593565b610120518015612a0a57808204905090506101405260206101405bf36123fe565b6301e1d11481186123fe5734612a0a575f54600214612a0a5760206112df60c0612593565b60c0f36123fe565b6399530b0681186123fe5734612a0a57600160c052611329566123fe565b6328c06203811861143f57602436103417612a0a576004358060011c612a0a5760c0525b5f54600214612a0a5760105460e05260e0516113595766038d7ea4c6800061010052602061010061143d5661143d565b6011546101005261136b610140612593565b6101405161010051808202811583838304141715612a0a579050905060018101818110612a0a579050670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a5790506101205260e0516103e88101818110612a0a579050610140525f6101605260c051611414576101205161014051808201828110612a0a579050905060018103818111612a0a579050610140518015612a0a57808204905090506101605261142e565b61012051610140518015612a0a5780820490509050610160525b6101605115612a0a5760206101605bf35b62f714ce81186123fe57604436103417612a0a576024358060a01c612a0a576101a052336101c0526102de566123fe565b63c6e6f59281186114d057602436103417612a0a575f54600214612a0a57602060043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526114cb6101a0612646565b6101a0f35b632e1a7d4d81186123fe57602436103417612a0a57336101a052336101c0526102de566123fe565b63402d267d811861157b57602436103417612a0a576004358060a01c612a0a5760c05260075460e05260e0511961153657602060e061157956611579565b611541610120612593565b610120516101005260e051610100518082811882841102189050905061010051808203828111612a0a57905090506101205260206101205bf35b63d905777e81186123fe57602436103417612a0a576004358060a01c612a0a576101a0525f54600214612a0a576001546370a082316101c0526005546101e05260206101c060246101dc845afa6115d4573d5f5f3e3d5ffd5b60203d10612a0a576101c090505160c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611619610200612646565b61020051600f6101a0516020525f5260405f205480828118828410021890509050610220526020610220f36123fe565b63b6b55f2581186123fe57602436103417612a0a57336101a052611691566123fe565b636e553f6581186123fe57604436103417612a0a576024358060a01c612a0a576101a0525b5f54600214612a0a5760025f556005546101c0526116b0610200612593565b610200516101e0526127106101e051600435808201828110612a0a5790509050101561173b576010610200527f4e656564206d6f726520617373657473000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b6007546101e051600435808201828110612a0a579050905011156117be57600c610200527f537570706c79206c696d697400000000000000000000000000000000000000006102205261020050610200518061022001601f825f031636823750506308c379a06101c05260206101e052601f19601f6102005101166044016101dcfd5b60043560c052600160e0526101e051610100526117dc610220612646565b61022051610200526001546323b872dd6102205233610240526101c05161026052600435610280526020610220606461023c5f855af161181e573d5f5f3e3d5ffd5b3d61183557803b15612a0a5760016102a05261184e565b60203d10612a0a57610220518060011c612a0a576102a0525b6102a090505115612a0a576101a0516040526102005160605261186f612844565b6101c0516369c6804e61022052803b15612a0a575f610220600461023c5f855af161189c573d5f5f3e3d5ffd5b506101a051337fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d76004356102205261020051610240526040610220a3602061020060035f55f36123fe565b63b3d7f6b9811861194657602436103417612a0a575f54600214612a0a57602060043560c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100526119416101a0612745565b6101a0f35b63a457c2d781186123fe57604436103417612a0a576004358060a01c612a0a5760c052600e336020525f5260405f208060c0516020525f5260405f2090505460e05260243560e05103610100526101005160e05110156119a6575f610100525b60e05161010051146119cb573360405260c051606052610100516080526119cb6128b1565b6001610120526020610120f36123fe565b63a0712d6881186123fe57602436103417612a0a57336101a052611a24566123fe565b6394bf804d81186123fe57604436103417612a0a576024358060a01c612a0a576101a0525b5f54600214612a0a5760025f556005546101c052611a43610200612593565b610200516101e05260043560c0525f60e0526101e05161010052611a68610220612745565b61022051610200526127106101e05161020051808201828110612a0a57905090501015611af4576010610220527f4e656564206d6f726520617373657473000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6007546101e05161020051808201828110612a0a57905090501115611b7857600c610220527f537570706c79206c696d697400000000000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6001546323b872dd6102205233610240526101c0516102605261020051610280526020610220606461023c5f855af1611bb3573d5f5f3e3d5ffd5b3d611bca57803b15612a0a5760016102a052611be3565b60203d10612a0a57610220518060011c612a0a576102a0525b6102a090505115612a0a576101a051604052600435606052611c03612844565b6101c0516369c6804e61022052803b15612a0a575f610220600461023c5f855af1611c30573d5f5f3e3d5ffd5b506101a051337fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d76102005161022052600435610240526040610220a3602061020060035f55f36123fe565b63ce96cb778118611d4657602436103417612a0a576004358060a01c612a0a576101a0525f54600214612a0a57600f6101a0516020525f5260405f205460c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611cf06101c0612745565b6101c0516001546370a082316101e0526005546102005260206101e060246101fc845afa611d20573d5f5f3e3d5ffd5b60203d10612a0a576101e090505180828118828410021890509050610220526020610220f35b634cdad50681186123fe57602436103417612a0a575f54600214612a0a57601054611d8557600435612a0a575f6101a05260206101a0611e1156611e11565b60043560c052600160e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611dc06101c0612745565b6101c0516101a0526001546370a082316101c0526005546101e05260206101c060246101dc845afa611df4573d5f5f3e3d5ffd5b60203d10612a0a576101c09050516101a05111612a0a5760206101a05bf36123fe565b630a28a47781186123fe57602436103417612a0a575f54600214612a0a576001546370a082316101a0526005546101c05260206101a060246101bc845afa611e61573d5f5f3e3d5ffd5b60203d10612a0a576101a090505160043511612a0a57602060043560c0525f60e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010052611eb36101a0612646565b6101a0f36123fe565b637bde82f281186123fe57604436103417612a0a576024358060a01c612a0a576101a052336101c052611f22566123fe565b63ba08765281186123fe57606436103417612a0a576024358060a01c612a0a576101a0526044358060a01c612a0a576101c0525b5f54600214612a0a5760025f55336101c05114611faf57600e6101c0516020525f5260405f2080336020525f5260405f209050546101e0527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101e05114611faf576101c051604052336060526101e051600435808203828111612a0a5790509050608052611faf6128b1565b611fba610200612593565b610200516101e05260043560c052600160e0526101e05161010052611fe0610220612745565b610220516102005261270f6101e05161020051808203828111612a0a579050905011612083576010546004351861201e576101e05161020052612083565b6010610220527f4e656564206d6f726520617373657473000000000000000000000000000000006102405261022050610220518061024001601f825f031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b6101c051604052600435606052612098612906565b600554610220526001546323b872dd6102405261022051610260526101a05161028052610200516102a0526020610240606461025c5f855af16120dd573d5f5f3e3d5ffd5b3d6120f457803b15612a0a5760016102c05261210d565b60203d10612a0a57610240518060011c612a0a576102c0525b6102c090505115612a0a57610220516369c6804e61024052803b15612a0a575f610240600461025c5f855af1612145573d5f5f3e3d5ffd5b506101c0516101a051337ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db6102005161024052600435610260526040610240a4602061020060035f55f36123fe565b6323b872dd81186123fe57606436103417612a0a576004358060a01c612a0a5760c0526024358060a01c612a0a5760e052600e60c0516020525f5260405f2080336020525f5260405f20905054610100527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010051146122395760c0516040523360605261010051604435808203828111612a0a57905090506080526122396128b1565b60c05160405260e051606052604435608052612253612973565b6001610120526020610120f36123fe565b63a9059cbb81186123fe57604436103417612a0a576004358060a01c612a0a5760c0523360405260c05160605260243560805261229f612973565b600160e052602060e0f36123fe565b63095ea7b381186123fe57604436103417612a0a576004358060a01c612a0a5760c0523360405260c0516060526024356080526122e96128b1565b600160e052602060e0f36123fe565b633950935181186123fe57604436103417612a0a576004358060a01c612a0a5760c052600e336020525f5260405f208060c0516020525f5260405f2090505460e05260243560e051016101005260e051610100511015612378577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff610100525b60e051610100511461239d573360405260c0516060526101005160805261239d6128b1565b6001610120526020610120f36123fe565b63f851a44081186123fe5734612a0a57602060065463f851a440604052602060406004605c845afa6123e2573d5f5f3e3d5ffd5b60203d10612a0a576040518060a01c612a0a5760805260809050f35b5f5ffd5b6040516060525f6080525f6008905b8060a05260a0518060070360078111612a0a57905060ff8111612a0a578060020a905060c05260c05160ff8111612a0a578060020a905060e05260e051670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a579050606051106124c05760605160e0518015612a0a578082049050905060605260805160c051670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a579050808201828110612a0a57905090506080525b600101818118612411575050670de0b6b3a764000060a0525f603b905b8060c052671bc16d674ec80000606051106125165760805160a051808201828110612a0a57905090506080526060518060011c90506060525b606051606051808202811583838304141715612a0a5790509050670de0b6b3a76400008104905060605260a0518060011c905060a0526001018181186124dd575050608051670de0b6b3a7640000810281670de0b6b3a7640000820418612a0a5790506714057b7ef7678100810490508060ff1c612a0a57815250565b60055463d0c581bf604052602060406004605c845afa6125b5573d5f5f3e3d5ffd5b60203d10612a0a576040518060011c612a0a57608052608050506001546370a08231604052600554606052602060406024605c845afa6125f7573d5f5f3e3d5ffd5b60203d10612a0a5760409050516005546331dc3ca8608052602060806004609c845afa612626573d5f5f3e3d5ffd5b60203d10612a0a576080905051808201828110612a0a5790509050815250565b6101005161012052610120511961266b57612662610140612593565b61014051610120525b601154610140526010546103e88101818110612a0a57905060c051808202811583838304141715612a0a579050905061014051808202811583838304141715612a0a5790509050610160526101205161014051808202811583838304141715612a0a579050905060018101818110612a0a5790506101805260e05161272a576101605161018051808201828110612a0a579050905060018103818111612a0a579050610180518015612a0a578082049050905081525061274356612743565b61016051610180518015612a0a57808204905090508152505b565b6101005161012052610120511961276a57612761610140612593565b61014051610120525b6011546101405260c0516101205161014051808202811583838304141715612a0a579050905060018101818110612a0a579050808202811583838304141715612a0a5790509050610160526010546103e88101818110612a0a57905061014051808202811583838304141715612a0a57905090506101805260e051612829576101605161018051808201828110612a0a579050905060018103818111612a0a579050610180518015612a0a578082049050905081525061284256612842565b61016051610180518015612a0a57808204905090508152505b565b600f6040516020525f5260405f208054606051808201828110612a0a5790509050815550601054606051808201828110612a0a57905090506010556040515f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60605160805260206080a3565b608051600e6040516020525f5260405f20806060516020525f5260405f209050556060516040517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560805160a052602060a0a3565b600f6040516020525f5260405f208054606051808203828111612a0a5790509050815550601054606051808203828111612a0a57905090506010555f6040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60605160805260206080a3565b60605130811461298557801515612987565b5f5b905015612a0a57600f6040516020525f5260405f208054608051808203828111612a0a5790509050815550600f6060516020525f5260405f208054608051808201828110612a0a57905090508155506060516040517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60805160a052602060a0a3565b5f80fd070323fe23fe130523fe23fe23fe14f823fe22ae01f00150114023fe147012ba23fe23ae23fe1eee22f811cf1ebc001823fe109d23fe22641c7b219423fe23fe19dc12e723fe18e723fe23fe23fe022f054d06a423fe05e823fe164902100038007419ff06e323fe01d01e17166c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.