ETH Price: $2,517.59 (+3.38%)

Contract

0x8eF11c51a666C53Aeeec504f120cd1435E451342
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw205668872024-08-20 2:35:1114 days ago1724121311IN
0x8eF11c51...35E451342
0 ETH0.000608092.8196129
Withdraw204366202024-08-01 22:15:5932 days ago1722550559IN
0x8eF11c51...35E451342
0 ETH0.001930128.84133265
Withdraw204310582024-08-01 3:37:5933 days ago1722483479IN
0x8eF11c51...35E451342
0 ETH0.001964769
Withdraw203375732024-07-19 2:25:2346 days ago1721355923IN
0x8eF11c51...35E451342
0 ETH0.001613247.47961945
Withdraw201501542024-06-22 22:15:1172 days ago1719094511IN
0x8eF11c51...35E451342
0 ETH0.000403291.87
Withdraw201501272024-06-22 22:09:4772 days ago1719094187IN
0x8eF11c51...35E451342
0 ETH0.000409761.9
Withdraw198529592024-05-12 9:10:47113 days ago1715505047IN
0x8eF11c51...35E451342
0 ETH0.000894984.1
Withdraw198529292024-05-12 9:04:47113 days ago1715504687IN
0x8eF11c51...35E451342
0 ETH0.000894984.1
Withdraw198289692024-05-09 0:39:59117 days ago1715215199IN
0x8eF11c51...35E451342
0 ETH0.000827633.79149945
Withdraw197927192024-05-03 22:58:59122 days ago1714777139IN
0x8eF11c51...35E451342
0 ETH0.001004124.6
Withdraw197850472024-05-02 21:14:23123 days ago1714684463IN
0x8eF11c51...35E451342
0 ETH0.001408326.53008785
Withdraw197699652024-04-30 18:38:23125 days ago1714502303IN
0x8eF11c51...35E451342
0 ETH0.0028377413
Withdraw197698222024-04-30 18:09:35125 days ago1714500575IN
0x8eF11c51...35E451342
0 ETH0.0030445713.94749282
Withdraw196565132024-04-14 21:40:23141 days ago1713130823IN
0x8eF11c51...35E451342
0 ETH0.00195769.07617487
Withdraw193523862024-03-03 4:54:23184 days ago1709441663IN
0x8eF11c51...35E451342
0 ETH0.0073131133.90628872
Withdraw192364482024-02-15 22:57:11200 days ago1708037831IN
0x8eF11c51...35E451342
0 ETH0.0062255928.8666789
Withdraw192057812024-02-11 15:42:23204 days ago1707666143IN
0x8eF11c51...35E451342
0 ETH0.0052168323.89884369
Withdraw192057412024-02-11 15:34:23204 days ago1707665663IN
0x8eF11c51...35E451342
0 ETH0.0058436926.7705791
Withdraw191486392024-02-03 15:11:47212 days ago1706973107IN
0x8eF11c51...35E451342
0 ETH0.0052431324.31125415
Withdraw191486322024-02-03 15:10:23212 days ago1706973023IN
0x8eF11c51...35E451342
0 ETH0.0055671525.81368187
Withdraw190734482024-01-24 2:13:23223 days ago1706062403IN
0x8eF11c51...35E451342
0 ETH0.0021566710
Withdraw189968272024-01-13 8:37:59233 days ago1705135079IN
0x8eF11c51...35E451342
0 ETH0.0036828817.07671648
Withdraw189857092024-01-11 19:17:23235 days ago1705000643IN
0x8eF11c51...35E451342
0 ETH0.0066856731
Withdraw189118182024-01-01 9:52:23245 days ago1704102743IN
0x8eF11c51...35E451342
0 ETH0.002393911.1
Withdraw189117932024-01-01 9:47:23245 days ago1704102443IN
0x8eF11c51...35E451342
0 ETH0.0023401410.85072642
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
205668872024-08-20 2:35:1114 days ago1724121311
0x8eF11c51...35E451342
0.00541 ETH
205668872024-08-20 2:35:1114 days ago1724121311
0x8eF11c51...35E451342
0.00541 ETH
204366202024-08-01 22:15:5932 days ago1722550559
0x8eF11c51...35E451342
0.108505 ETH
204366202024-08-01 22:15:5932 days ago1722550559
0x8eF11c51...35E451342
0.108505 ETH
204310582024-08-01 3:37:5933 days ago1722483479
0x8eF11c51...35E451342
0.108505 ETH
204310582024-08-01 3:37:5933 days ago1722483479
0x8eF11c51...35E451342
0.108505 ETH
203375732024-07-19 2:25:2346 days ago1721355923
0x8eF11c51...35E451342
0.10115 ETH
203375732024-07-19 2:25:2346 days ago1721355923
0x8eF11c51...35E451342
0.10115 ETH
201501542024-06-22 22:15:1172 days ago1719094511
0x8eF11c51...35E451342
0.002184 ETH
201501542024-06-22 22:15:1172 days ago1719094511
0x8eF11c51...35E451342
0.002184 ETH
201501272024-06-22 22:09:4772 days ago1719094187
0x8eF11c51...35E451342
0.001091 ETH
201501272024-06-22 22:09:4772 days ago1719094187
0x8eF11c51...35E451342
0.001091 ETH
198529592024-05-12 9:10:47113 days ago1715505047
0x8eF11c51...35E451342
0.00537016 ETH
198529592024-05-12 9:10:47113 days ago1715505047
0x8eF11c51...35E451342
0.00537016 ETH
198529292024-05-12 9:04:47113 days ago1715504687
0x8eF11c51...35E451342
0.0036065 ETH
198529292024-05-12 9:04:47113 days ago1715504687
0x8eF11c51...35E451342
0.0036065 ETH
198289692024-05-09 0:39:59117 days ago1715215199
0x8eF11c51...35E451342
0.00532301 ETH
198289692024-05-09 0:39:59117 days ago1715215199
0x8eF11c51...35E451342
0.00532301 ETH
197927192024-05-03 22:58:59122 days ago1714777139
0x8eF11c51...35E451342
0.00159242 ETH
197927192024-05-03 22:58:59122 days ago1714777139
0x8eF11c51...35E451342
0.00159242 ETH
197850472024-05-02 21:14:23123 days ago1714684463
0x8eF11c51...35E451342
0.01068415 ETH
197850472024-05-02 21:14:23123 days ago1714684463
0x8eF11c51...35E451342
0.01068415 ETH
197699652024-04-30 18:38:23125 days ago1714502303
0x8eF11c51...35E451342
0.02782198 ETH
197699652024-04-30 18:38:23125 days ago1714502303
0x8eF11c51...35E451342
0.02782198 ETH
197698222024-04-30 18:09:35125 days ago1714500575
0x8eF11c51...35E451342
0.05350381 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.12

Optimization Enabled:
N/A

Other Settings:
GNU AGPLv3 license

Contract Source Code (Vyper language format)

# @version 0.2.12

"""
@title Unagii EthVault V2 0.1.1
@author stakewith.us
@license AGPL-3.0-or-later
"""

from vyper.interfaces import ERC20


interface UnagiiToken:
    def minter() -> address: view
    def token() -> address: view
    def decimals() -> uint256: view
    def totalSupply() -> uint256: view
    def balanceOf(owner: address) -> uint256: view
    def mint(receiver: address, amount: uint256): nonpayable
    def burn(spender: address, amount: uint256): nonpayable
    def lastBlock(owner: address) -> uint256: view


# used for migrating to new Vault contract
interface Vault:
    def oldVault() -> address: view
    def token() -> address: view
    def uToken() -> address: view
    def fundManager() -> address: view
    def initialize(): payable
    def balanceOfVault() -> uint256: view
    def debt() -> uint256: view
    def lockedProfit() -> uint256: view
    def lastReport() -> uint256: view


interface FundManager:
    def vault() -> address: view
    def token() -> address: view
    # returns loss = debt - total assets in fund manager
    def withdraw(amount: uint256) -> uint256: nonpayable


event Migrate:
    vault: address
    balanceOfVault: uint256
    debt: uint256
    lockedProfit: uint256


event SetNextTimeLock:
    nextTimeLock: address


event AcceptTimeLock:
    timeLock: address


event SetGuardian:
    guardian: address


event SetAdmin:
    admin: address


event SetFundManager:
    fundManager: address


event SetPause:
    paused: bool


event SetWhitelist:
    addr: indexed(address)
    approved: bool


event ReceiveEth:
    sender: indexed(address)
    amount: uint256


event Deposit:
    sender: indexed(address)
    amount: uint256
    shares: uint256


event Withdraw:
    owner: indexed(address)
    shares: uint256
    amount: uint256


event Borrow:
    fundManager: indexed(address)
    amount: uint256
    borrowed: uint256


event Repay:
    fundManager: indexed(address)
    amount: uint256
    repaid: uint256


event Report:
    fundManager: indexed(address)
    balanceOfVault: uint256
    debt: uint256
    gain: uint256
    loss: uint256
    diff: uint256
    lockedProfit: uint256


event ForceUpdateBalanceOfVault:
    balanceOfVault: uint256


initialized: public(bool)
paused: public(bool)

ETH: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
uToken: public(UnagiiToken)
fundManager: public(FundManager)
# privileges: time lock >= admin >= guardian
timeLock: public(address)
nextTimeLock: public(address)
guardian: public(address)
admin: public(address)

depositLimit: public(uint256)
# ETH balance of vault tracked internally to protect against share dilution
# from sending ETH directly to this contract
balanceOfVault: public(uint256)
debt: public(uint256)  # debt to users (amount borrowed by fund manager)
# minimum amount of ETH to be kept in this vault for cheap withdraw
minReserve: public(uint256)
MAX_MIN_RESERVE: constant(uint256) = 10000
# timestamp of last report
lastReport: public(uint256)
# profit locked from report, released over time at a rate set by lockedProfitDegradation
lockedProfit: public(uint256)
MAX_DEGRADATION: constant(uint256) = 10 ** 18
# rate at which locked profit is released
# 0 = forever, MAX_DEGREDATION = 100% of profit is released 1 block after report
lockedProfitDegradation: public(uint256)
# minimum number of block to wait before deposit / withdraw
# used to protect agains flash attacks
blockDelay: public(uint256)
# whitelisted address can bypass block delay check
whitelist: public(HashMap[address, bool])

# address of old Vault contract, used for migration
oldVault: public(Vault)


@external
def __init__(uToken: address, guardian: address, oldVault: address):
    self.timeLock = msg.sender
    self.admin = msg.sender
    self.guardian = guardian
    self.uToken = UnagiiToken(uToken)

    assert self.uToken.token() == ETH, "uToken token != ETH"

    self.paused = True
    self.blockDelay = 1
    self.minReserve = 500  # 5% of free funds
    # 6 hours
    self.lockedProfitDegradation = convert(MAX_DEGRADATION / 21600, uint256)

    if oldVault != ZERO_ADDRESS:
        self.oldVault = Vault(oldVault)
        assert self.oldVault.token() == ETH, "old vault token != ETH"
        assert self.oldVault.uToken() == uToken, "old vault uToken != uToken"


@external
@payable
def __default__():
    """
    @dev Prevent users from accidentally sending ETH to this vault
    """
    assert msg.sender == self.fundManager.address, "!fund manager"
    log ReceiveEth(msg.sender, msg.value)


@external
@view
def token() -> address:
    return ETH


@internal
def _sendEth(to: address, amount: uint256):
    assert to != ZERO_ADDRESS, "to = 0 address"
    raw_call(to, b"", value=amount)


@internal
def _safeTransfer(token: address, receiver: address, amount: uint256):
    res: Bytes[32] = raw_call(
        token,
        concat(
            method_id("transfer(address,uint256)"),
            convert(receiver, bytes32),
            convert(amount, bytes32),
        ),
        max_outsize=32,
    )
    if len(res) > 0:
        assert convert(res, bool), "transfer failed"


@external
@payable
def initialize():
    """
    @notice Initialize vault. Transfer ETH and copy states if old vault is set.
    """
    assert not self.initialized, "initialized"

    if self.oldVault.address == ZERO_ADDRESS:
        assert msg.sender in [self.timeLock, self.admin], "!auth"
        self.lastReport = block.timestamp
    else:
        assert msg.sender == self.oldVault.address, "!old vault"

        assert self.uToken.minter() == self, "minter != self"

        assert (
            self.fundManager.address == self.oldVault.fundManager()
        ), "fund manager != old vault fund manager"
        if self.fundManager.address != ZERO_ADDRESS:
            assert self.fundManager.vault() == self, "fund manager vault != self"

        # check ETH sent from old vault >= old balanceOfVault
        balOfVault: uint256 = self.oldVault.balanceOfVault()
        assert msg.value >= balOfVault, "value < vault"

        self.balanceOfVault = min(balOfVault, msg.value)
        self.debt = self.oldVault.debt()
        self.lockedProfit = self.oldVault.lockedProfit()
        self.lastReport = self.oldVault.lastReport()

    self.initialized = True


# Migration steps from this vault to new vault
#
# ut = unagi token
# v1 = vault 1
# v2 = vault 2
# f = fund manager
#
# action                         | caller
# ----------------------------------------
# 1. v2.setPause(true)           | admin
# 2. v1.setPause(true)           | admin
# 3. ut.setMinter(v2)            | time lock
# 4. f.setVault(v2)              | time lock
# 5. v2.setFundManager(f)        | time lock
# 6. transfer ETH                | v1
# 7. v2 copy states from v1      | v2
#    - balanceOfVault            |
#    - debt                      |
#    - locked profit             |
#    - last report               |
# 8. v1 set state = 0            | v1
#    - balanceOfVault            |
#    - debt                      |
#    - locked profit             |


@external
def migrate(vault: address):
    """
    @notice Migrate to new vault
    @param vault Address of new vault
    """
    assert msg.sender == self.timeLock, "!time lock"
    assert self.initialized, "!initialized"
    assert self.paused, "!paused"

    assert Vault(vault).token() == ETH, "new vault token != ETH"
    assert Vault(vault).uToken() == self.uToken.address, "new vault uToken != uToken"
    # minter is set to new vault
    assert self.uToken.minter() == vault, "minter != new vault"
    # new vault's fund manager is set to current fund manager
    assert (
        Vault(vault).fundManager() == self.fundManager.address
    ), "new vault fund manager != fund manager"
    if self.fundManager.address != ZERO_ADDRESS:
        # fund manager's vault is set to new vault
        assert self.fundManager.vault() == vault, "fund manager vault != new vault"

    # check balance of vault >= balanceOfVault
    bal: uint256 = self.balance
    assert bal >= self.balanceOfVault, "bal < vault"

    assert Vault(vault).oldVault() == self, "old vault != self"

    Vault(vault).initialize(value=bal)

    log Migrate(vault, self.balanceOfVault, self.debt, self.lockedProfit)

    # reset state
    self.balanceOfVault = 0
    self.debt = 0
    self.lockedProfit = 0


@external
def setNextTimeLock(nextTimeLock: address):
    """
    @notice Set next time lock
    @param nextTimeLock Address of next time lock
    """
    assert msg.sender == self.timeLock, "!time lock"
    self.nextTimeLock = nextTimeLock
    log SetNextTimeLock(nextTimeLock)


@external
def acceptTimeLock():
    """
    @notice Accept time lock
    @dev Only `nextTimeLock` can claim time lock
    """
    assert msg.sender == self.nextTimeLock, "!next time lock"
    self.timeLock = msg.sender
    self.nextTimeLock = ZERO_ADDRESS
    log AcceptTimeLock(msg.sender)


@external
def setAdmin(admin: address):
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self.admin = admin
    log SetAdmin(admin)


@external
def setGuardian(guardian: address):
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self.guardian = guardian
    log SetGuardian(guardian)


@external
def setFundManager(fundManager: address):
    """
    @notice Set fund manager
    @param fundManager Address of new fund manager
    """
    assert msg.sender == self.timeLock, "!time lock"

    assert FundManager(fundManager).vault() == self, "fund manager vault != self"
    assert FundManager(fundManager).token() == ETH, "fund manager token != ETH"

    self.fundManager = FundManager(fundManager)
    log SetFundManager(fundManager)


@external
def setPause(paused: bool):
    assert msg.sender in [self.timeLock, self.admin, self.guardian], "!auth"
    self.paused = paused
    log SetPause(paused)


@external
def setMinReserve(minReserve: uint256):
    """
    @notice Set minimum amount of ETH reserved in this vault for cheap
            withdrawn by user
    @param minReserve Numerator to calculate min reserve
           0 = all funds can be transferred to fund manager
           MAX_MIN_RESERVE = 0 ETH can be transferred to fund manager
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    assert minReserve <= MAX_MIN_RESERVE, "min reserve > max"
    self.minReserve = minReserve


@external
def setLockedProfitDegradation(degradation: uint256):
    """
    @notice Set locked profit degradation (rate locked profit is released)
    @param degradation Rate of degradation
                 0 = profit is locked forever
                 MAX_DEGRADATION = 100% of profit is released 1 block after report
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    assert degradation <= MAX_DEGRADATION, "degradation > max"
    self.lockedProfitDegradation = degradation


@external
def setDepositLimit(limit: uint256):
    """
    @notice Set limit to total deposit
    @param limit Limit for total deposit
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self.depositLimit = limit


@external
def setBlockDelay(delay: uint256):
    """
    @notice Set block delay, used to protect against flash attacks
    @param delay Number of blocks to delay before user can deposit / withdraw
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    assert delay >= 1, "delay = 0"
    self.blockDelay = delay


@external
def setWhitelist(addr: address, approved: bool):
    """
    @notice Approve or disapprove address to skip check on block delay.
            Approved address can deposit, withdraw and transfer uToken in
            a single transaction
    @param approved Boolean True = approve
                             False = disapprove
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self.whitelist[addr] = approved
    log SetWhitelist(addr, approved)


@internal
@view
def _totalAssets() -> uint256:
    """
    @notice Total amount of ETH in this vault + amount in fund manager
    @dev State variable `balanceOfVault` is used to track balance of ETH in
         this contract instead of `self.balance`. This is done to
         protect against uToken shares being diluted by directly sending ETH
         to this contract.
    @dev Returns total amount of ETH in this contract
    """
    return self.balanceOfVault + self.debt


@external
@view
def totalAssets() -> uint256:
    return self._totalAssets()


@internal
@view
def _calcLockedProfit() -> uint256:
    """
    @notice Calculated locked profit
    @dev Returns amount of profit locked from last report. Profit is released
         over time, depending on the release rate `lockedProfitDegradation`.
         Profit is locked after `report` to protect against sandwich attack.
    """
    lockedFundsRatio: uint256 = (
        block.timestamp - self.lastReport
    ) * self.lockedProfitDegradation

    if lockedFundsRatio < MAX_DEGRADATION:
        lockedProfit: uint256 = self.lockedProfit
        return lockedProfit - lockedFundsRatio * lockedProfit / MAX_DEGRADATION
    else:
        return 0


@external
@view
def calcLockedProfit() -> uint256:
    return self._calcLockedProfit()


@internal
@view
def _calcFreeFunds() -> uint256:
    """
    @notice Calculate free funds (total assets - locked profit)
    @dev Returns total amount of ETH that can be withdrawn
    """
    return self._totalAssets() - self._calcLockedProfit()


@external
@view
def calcFreeFunds() -> uint256:
    return self._calcFreeFunds()


@internal
@pure
def _calcSharesToMint(
    amount: uint256, totalSupply: uint256, freeFunds: uint256
) -> uint256:
    """
    @notice Calculate uToken shares to mint
    @param amount Amount of ETH to deposit
    @param totalSupply Total amount of shares
    @param freeFunds Free funds before deposit
    @dev Returns amount of uToken to mint. Input must be numbers before deposit
    @dev Calculated with `freeFunds`, not `totalAssets`
    """
    # s = shares to mint
    # T = total shares before mint
    # a = deposit amount
    # P = total amount of ETH in vault + fund manager before deposit
    # s / (T + s) = a / (P + a)
    # sP = aT
    # a = 0               | mint s = 0
    # a > 0, T = 0, P = 0 | mint s = a
    # a > 0, T = 0, P > 0 | mint s = a as if P = 0
    # a > 0, T > 0, P = 0 | invalid, equation cannot be true for any s
    # a > 0, T > 0, P > 0 | mint s = aT / P
    if amount == 0:
        return 0
    if totalSupply == 0:
        return amount
    # reverts if free funds = 0
    return amount * totalSupply / freeFunds


@external
@view
def calcSharesToMint(amount: uint256) -> uint256:
    return self._calcSharesToMint(
        amount, self.uToken.totalSupply(), self._calcFreeFunds()
    )


@internal
@pure
def _calcWithdraw(shares: uint256, totalSupply: uint256, freeFunds: uint256) -> uint256:
    """
    @notice Calculate amount of ETH to withdraw
    @param shares Amount of uToken shares to burn
    @param totalSupply Total amount of shares before burn
    @param freeFunds Free funds
    @dev Returns amount of ETH to withdraw
    @dev Calculated with `freeFunds`, not `totalAssets`
    """
    # s = shares
    # T = total supply of shares
    # a = amount to withdraw
    # P = total amount of ETH in vault + fund manager
    # s / T = a / P (constraints T >= s, P >= a)
    # sP = aT
    # s = 0               | a = 0
    # s > 0, T = 0, P = 0 | invalid (violates constraint T >= s)
    # s > 0, T = 0, P > 0 | invalid (violates constraint T >= s)
    # s > 0, T > 0, P = 0 | a = 0
    # s > 0, T > 0, P > 0 | a = sP / T
    if shares == 0:
        return 0
    # invalid if total supply = 0
    return shares * freeFunds / totalSupply


@external
@view
def calcWithdraw(shares: uint256) -> uint256:
    return self._calcWithdraw(shares, self.uToken.totalSupply(), self._calcFreeFunds())


@external
@payable
@nonreentrant("lock")
def deposit(amount: uint256, _min: uint256) -> uint256:
    """
    @notice Deposit ETH into vault
    @param amount Amount of ETH to deposit
    @param _min Minimum amount of uToken to be minted
    @dev Returns actual amount of uToken minted
    """
    assert self.initialized, "!initialized"
    assert not self.paused, "paused"
    # check block delay or whitelisted
    assert (
        block.number >= self.uToken.lastBlock(msg.sender) + self.blockDelay
        or self.whitelist[msg.sender]
    ), "block < delay"

    assert amount == msg.value, "amount != msg.value"
    assert amount > 0, "deposit = 0"

    # check deposit limit
    assert self._totalAssets() + amount <= self.depositLimit, "deposit limit"

    # calculate with free funds before deposit (msg.value is not included in freeFunds)
    shares: uint256 = self._calcSharesToMint(
        amount, self.uToken.totalSupply(), self._calcFreeFunds()
    )
    assert shares >= _min, "shares < min"

    self.balanceOfVault += amount
    self.uToken.mint(msg.sender, shares)

    # check ETH balance >= balanceOfVault
    assert self.balance >= self.balanceOfVault, "bal < vault"

    log Deposit(msg.sender, amount, shares)

    return shares


@external
@nonreentrant("lock")
def withdraw(shares: uint256, _min: uint256) -> uint256:
    """
    @notice Withdraw ETH from vault
    @param shares Amount of uToken to burn
    @param _min Minimum amount of ETH that msg.sender will receive
    @dev Returns actual amount of ETH transferred to msg.sender
    """
    assert self.initialized, "!initialized"
    # check block delay or whitelisted
    assert (
        block.number >= self.uToken.lastBlock(msg.sender) + self.blockDelay
        or self.whitelist[msg.sender]
    ), "block < delay"

    _shares: uint256 = min(shares, self.uToken.balanceOf(msg.sender))
    assert _shares > 0, "shares = 0"

    amount: uint256 = self._calcWithdraw(
        _shares, self.uToken.totalSupply(), self._calcFreeFunds()
    )

    # withdraw from fund manager if amount to withdraw > balance of vault
    if amount > self.balanceOfVault:
        diff: uint256 = self.balance
        # loss = debt - total assets in fund manager + any loss from strategies
        # ETH received by __default__
        loss: uint256 = self.fundManager.withdraw(amount - self.balanceOfVault)
        diff = self.balance - diff

        # diff + loss may be >= amount
        if loss > 0:
            # msg.sender must cover all of loss
            amount -= loss
            self.debt -= loss

        self.debt -= diff
        self.balanceOfVault += diff

        if amount > self.balanceOfVault:
            amount = self.balanceOfVault

    self.uToken.burn(msg.sender, _shares)

    assert amount >= _min, "amount < min"
    self.balanceOfVault -= amount

    self._sendEth(msg.sender, amount)

    # check ETH balance >= balanceOfVault
    assert self.balance >= self.balanceOfVault, "bal < vault"

    log Withdraw(msg.sender, _shares, amount)

    return amount


@internal
@view
def _calcMinReserve() -> uint256:
    """
    @notice Calculate minimum amount of ETH that is reserved in vault for
            cheap withdraw by users
    @dev Returns min reserve
    """
    freeFunds: uint256 = self._calcFreeFunds()
    return freeFunds * self.minReserve / MAX_MIN_RESERVE


@external
def calcMinReserve() -> uint256:
    return self._calcMinReserve()


@internal
@view
def _calcMaxBorrow() -> uint256:
    """
    @notice Calculate amount of ETH available for fund manager to borrow
    @dev Returns amount of ETH fund manager can borrow
    """
    if (
        (not self.initialized)
        or self.paused
        or self.fundManager.address == ZERO_ADDRESS
    ):
        return 0

    minBal: uint256 = self._calcMinReserve()

    if self.balanceOfVault > minBal:
        return self.balanceOfVault - minBal
    return 0


@external
@view
def calcMaxBorrow() -> uint256:
    return self._calcMaxBorrow()


@external
def borrow(amount: uint256) -> uint256:
    """
    @notice Borrow ETH from vault
    @dev Only fund manager can borrow
    @dev Returns actual amount that was given to fund manager
    """
    assert self.initialized, "!initialized"
    assert not self.paused, "paused"
    assert msg.sender == self.fundManager.address, "!fund manager"

    available: uint256 = self._calcMaxBorrow()
    _amount: uint256 = min(amount, available)
    assert _amount > 0, "borrow = 0"

    self._sendEth(msg.sender, _amount)

    self.balanceOfVault -= _amount
    self.debt += _amount

    # check ETH balance >= balanceOfVault
    assert self.balance >= self.balanceOfVault, "bal < vault"

    log Borrow(msg.sender, amount, _amount)

    return _amount


@external
@payable
def repay(amount: uint256) -> uint256:
    """
    @notice Repay ETH to vault
    @dev Only fund manager can borrow
    @dev Returns actual amount that was repaid by fund manager
    """
    assert self.initialized, "!initialized"
    assert msg.sender == self.fundManager.address, "!fund manager"

    assert amount == msg.value, "amount != msg.value"
    assert amount > 0, "repay = 0"

    self.balanceOfVault += amount
    self.debt -= amount

    # check ETH balance >= balanceOfVault
    assert self.balance >= self.balanceOfVault, "bal < vault"

    log Repay(msg.sender, amount, amount)

    return amount


@external
@payable
def report(gain: uint256, loss: uint256):
    """
    @notice Report profit or loss
    @param gain Profit since last report
    @param loss Loss since last report
    @dev Only fund manager can call
    @dev Locks profit to be release over time
    """
    assert self.initialized, "!initialized"
    assert msg.sender == self.fundManager.address, "!fund manager"
    # can't have both gain and loss > 0
    assert (gain >= 0 and loss == 0) or (gain == 0 and loss >= 0), "gain and loss > 0"
    assert gain == msg.value, "gain != msg.value"

    # calculate current locked profit
    lockedProfit: uint256 = self._calcLockedProfit()
    diff: uint256 = msg.value  # actual amount transferred if gain > 0

    if gain > 0:
        # free funds = bal + diff + debt - (locked profit + diff)
        self.balanceOfVault += diff
        self.lockedProfit = lockedProfit + diff
    elif loss > 0:
        # free funds = bal + debt - loss - (locked profit - loss)
        self.debt -= loss
        # deduct locked profit
        if lockedProfit > loss:
            self.lockedProfit -= loss
        else:
            # no locked profit to be released
            self.lockedProfit = 0

    self.lastReport = block.timestamp

    # check ETH balance >= balanceOfVault
    assert self.balance >= self.balanceOfVault, "bal < vault"

    # log updated debt and lockedProfit
    log Report(
        msg.sender, self.balanceOfVault, self.debt, gain, loss, diff, self.lockedProfit
    )


@external
def forceUpdateBalanceOfVault():
    """
    @notice Force `balanceOfVault` to equal `self.balance`
    @dev Only use in case of emergency if `balanceOfVault` is > actual balance
    """
    assert self.initialized, "!initialized"
    assert msg.sender in [self.timeLock, self.admin], "!auth"

    bal: uint256 = self.balance
    assert bal < self.balanceOfVault, "bal >= vault"

    self.balanceOfVault = bal
    log ForceUpdateBalanceOfVault(bal)


@external
def skim():
    """
    @notice Transfer excess ETH sent to this contract to admin or time lock
    @dev actual ETH balance must be >= `balanceOfVault`
    """
    assert msg.sender == self.timeLock, "!time lock"
    self._sendEth(msg.sender, self.balance - self.balanceOfVault)


@external
def sweep(token: address):
    """
    @notice Transfer any token accidentally sent to this contract
            to admin or time lock
    """
    assert msg.sender in [self.timeLock, self.admin], "!auth"
    self._safeTransfer(token, msg.sender, ERC20(token).balanceOf(self))

Contract Security Audit

Contract ABI

[{"name":"Migrate","inputs":[{"name":"vault","type":"address","indexed":false},{"name":"balanceOfVault","type":"uint256","indexed":false},{"name":"debt","type":"uint256","indexed":false},{"name":"lockedProfit","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetNextTimeLock","inputs":[{"name":"nextTimeLock","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"AcceptTimeLock","inputs":[{"name":"timeLock","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetGuardian","inputs":[{"name":"guardian","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetAdmin","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetFundManager","inputs":[{"name":"fundManager","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetPause","inputs":[{"name":"paused","type":"bool","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetWhitelist","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"approved","type":"bool","indexed":false}],"anonymous":false,"type":"event"},{"name":"ReceiveEth","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Deposit","inputs":[{"name":"sender","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"shares","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Withdraw","inputs":[{"name":"owner","type":"address","indexed":true},{"name":"shares","type":"uint256","indexed":false},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Borrow","inputs":[{"name":"fundManager","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"borrowed","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Repay","inputs":[{"name":"fundManager","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"repaid","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Report","inputs":[{"name":"fundManager","type":"address","indexed":true},{"name":"balanceOfVault","type":"uint256","indexed":false},{"name":"debt","type":"uint256","indexed":false},{"name":"gain","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false},{"name":"diff","type":"uint256","indexed":false},{"name":"lockedProfit","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ForceUpdateBalanceOfVault","inputs":[{"name":"balanceOfVault","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"uToken","type":"address"},{"name":"guardian","type":"address"},{"name":"oldVault","type":"address"}],"outputs":[]},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":378},{"stateMutability":"payable","type":"function","name":"initialize","inputs":[],"outputs":[],"gas":217951},{"stateMutability":"nonpayable","type":"function","name":"migrate","inputs":[{"name":"vault","type":"address"}],"outputs":[],"gas":143188},{"stateMutability":"nonpayable","type":"function","name":"setNextTimeLock","inputs":[{"name":"nextTimeLock","type":"address"}],"outputs":[],"gas":39101},{"stateMutability":"nonpayable","type":"function","name":"acceptTimeLock","inputs":[],"outputs":[],"gas":59029},{"stateMutability":"nonpayable","type":"function","name":"setAdmin","inputs":[{"name":"admin","type":"address"}],"outputs":[],"gas":41682},{"stateMutability":"nonpayable","type":"function","name":"setGuardian","inputs":[{"name":"guardian","type":"address"}],"outputs":[],"gas":41712},{"stateMutability":"nonpayable","type":"function","name":"setFundManager","inputs":[{"name":"fundManager","type":"address"}],"outputs":[],"gas":44198},{"stateMutability":"nonpayable","type":"function","name":"setPause","inputs":[{"name":"paused","type":"bool"}],"outputs":[],"gas":44040},{"stateMutability":"nonpayable","type":"function","name":"setMinReserve","inputs":[{"name":"minReserve","type":"uint256"}],"outputs":[],"gas":40473},{"stateMutability":"nonpayable","type":"function","name":"setLockedProfitDegradation","inputs":[{"name":"degradation","type":"uint256"}],"outputs":[],"gas":40503},{"stateMutability":"nonpayable","type":"function","name":"setDepositLimit","inputs":[{"name":"limit","type":"uint256"}],"outputs":[],"gas":40415},{"stateMutability":"nonpayable","type":"function","name":"setBlockDelay","inputs":[{"name":"delay","type":"uint256"}],"outputs":[],"gas":40563},{"stateMutability":"nonpayable","type":"function","name":"setWhitelist","inputs":[{"name":"addr","type":"address"},{"name":"approved","type":"bool"}],"outputs":[],"gas":42518},{"stateMutability":"view","type":"function","name":"totalAssets","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":5973},{"stateMutability":"view","type":"function","name":"calcLockedProfit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":8919},{"stateMutability":"view","type":"function","name":"calcFreeFunds","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":28343},{"stateMutability":"view","type":"function","name":"calcSharesToMint","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":34671},{"stateMutability":"view","type":"function","name":"calcWithdraw","inputs":[{"name":"shares","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":34576},{"stateMutability":"payable","type":"function","name":"deposit","inputs":[{"name":"amount","type":"uint256"},{"name":"_min","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":184302},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"shares","type":"uint256"},{"name":"_min","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":343643},{"stateMutability":"nonpayable","type":"function","name":"calcMinReserve","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":59332},{"stateMutability":"view","type":"function","name":"calcMaxBorrow","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":129729},{"stateMutability":"nonpayable","type":"function","name":"borrow","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":254849},{"stateMutability":"payable","type":"function","name":"repay","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":84773},{"stateMutability":"payable","type":"function","name":"report","inputs":[{"name":"gain","type":"uint256"},{"name":"loss","type":"uint256"}],"outputs":[],"gas":136768},{"stateMutability":"nonpayable","type":"function","name":"forceUpdateBalanceOfVault","inputs":[],"outputs":[],"gas":46636},{"stateMutability":"nonpayable","type":"function","name":"skim","inputs":[],"outputs":[],"gas":44754},{"stateMutability":"nonpayable","type":"function","name":"sweep","inputs":[{"name":"token","type":"address"}],"outputs":[],"gas":18697},{"stateMutability":"view","type":"function","name":"initialized","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3348},{"stateMutability":"view","type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3378},{"stateMutability":"view","type":"function","name":"uToken","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3408},{"stateMutability":"view","type":"function","name":"fundManager","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3438},{"stateMutability":"view","type":"function","name":"timeLock","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3468},{"stateMutability":"view","type":"function","name":"nextTimeLock","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3498},{"stateMutability":"view","type":"function","name":"guardian","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3528},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3558},{"stateMutability":"view","type":"function","name":"depositLimit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3588},{"stateMutability":"view","type":"function","name":"balanceOfVault","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"debt","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"minReserve","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3678},{"stateMutability":"view","type":"function","name":"lastReport","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3708},{"stateMutability":"view","type":"function","name":"lockedProfit","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3738},{"stateMutability":"view","type":"function","name":"lockedProfitDegradation","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3768},{"stateMutability":"view","type":"function","name":"blockDelay","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3798},{"stateMutability":"view","type":"function","name":"whitelist","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"bool"}],"gas":4043},{"stateMutability":"view","type":"function","name":"oldVault","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3858}]

60606138c66101403960206138c660c03960c05160a01c1561002057600080fd5b602060206138c60160c03960c05160a01c1561003b57600080fd5b602060406138c60160c03960c05160a01c1561005657600080fd5b3360045533600755610160516006556101405160025573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6020610200600463fc0c546a6101a0526101bc6002545afa6100a257600080fd5b601f3d116100af57600080fd5b60005061020051141515610102576308c379a0610220526020610240526013610260527f75546f6b656e20746f6b656e20213d20455448000000000000000000000000006102805261026050606461023cfd5b60016001556001600f556101f4600b55652a1b324b8f68600e55600061018051181561024a576101805160115573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6020610200600463fc0c546a6101a0526101bc6011545afa61016557600080fd5b601f3d1161017257600080fd5b600050610200511415156101c5576308c379a0610220526020610240526016610260527f6f6c64207661756c7420746f6b656e20213d20455448000000000000000000006102805261026050606461023cfd5b610140516020610200600463633156376101a0526101bc6011545afa6101ea57600080fd5b601f3d116101f757600080fd5b6000506102005114151561024a576308c379a061022052602061024052601a610260527f6f6c64207661756c742075546f6b656e20213d2075546f6b656e0000000000006102805261026050606461023cfd5b6138ae56600436101561000d5761305c565b600035601c52600051638129fc1c81141561048357600054151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b601154151561012457600454610160526007546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b42600c5561047c565b60115433141515610174576308c379a061014052602061016052600a610180527f216f6c64207661756c74000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a0600463075461726101405261015c6002545afa61019657600080fd5b601f3d116101a357600080fd5b6000506101a0511415156101f6576308c379a06101c05260206101e052600e610200527f6d696e74657220213d2073656c66000000000000000000000000000000000000610220526102005060646101dcfd5b60206101a06004636209ec2d6101405261015c6011545afa61021757600080fd5b601f3d1161022457600080fd5b6000506101a05160035414151561029f576308c379a06101c05260206101e0526026610200527f66756e64206d616e6167657220213d206f6c64207661756c742066756e64206d610220527f616e616765720000000000000000000000000000000000000000000000000000610240526102005060846101dcfd5b6000600354181561032c573060206101a0600463fbfa77cf6101405261015c6003545afa6102cc57600080fd5b601f3d116102d957600080fd5b6000506101a05114151561032c576308c379a06101c05260206101e052601a610200527f66756e64206d616e61676572207661756c7420213d2073656c66000000000000610220526102005060646101dcfd5b60206101c06004639994673d6101605261017c6011545afa61034d57600080fd5b601f3d1161035a57600080fd5b6000506101c051610140526101405134101515156103b7576308c379a061016052602061018052600d6101a0527f76616c7565203c207661756c74000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405134808211156103ca57806103cc565b815b9050905060095560206101c06004630dca59c16101605261017c6011545afa6103f457600080fd5b601f3d1161040157600080fd5b6000506101c051600a5560206101c060046344b813966101605261017c6011545afa61042c57600080fd5b601f3d1161043957600080fd5b6000506101c051600d5560206101c0600463c3535b526101605261017c6011545afa61046457600080fd5b601f3d1161047157600080fd5b6000506101c051600c555b6001600055005b63e2bbb158811415610956576012541561049c57600080fd5b600160125560005415156104ef576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60015415151561053e576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6020610260602463952ca92c6101e05233610200526101fc6002545afa61056457600080fd5b601f3d1161057157600080fd5b60005061026051600f5481818301101561058a57600080fd5b80820190509050431015156105a05760016105b0565b60103360e05260c052604060c020545b15156105fb576308c379a06102805260206102a052600d6102c0527f626c6f636b203c2064656c6179000000000000000000000000000000000000006102e0526102c050606461029cfd5b3460043514151561064b576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b600060043511151561069c576308c379a061014052602061016052600b610180527f6465706f736974203d20300000000000000000000000000000000000000000006101a05261018050606461015cfd5b6008546006580161331d565b61014052610140516004358181830110156106c257600080fd5b8082019050905011151515610716576308c379a061016052602061018052600d6101a0527f6465706f736974206c696d6974000000000000000000000000000000000000006101c0526101a050606461017cfd5b60206101c060046318160ddd6101605261017c6002545afa61073757600080fd5b601f3d1161074457600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516006580161340c565b610200526101e0526101c0526101a05261018052610160526101405261020051610220526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526101e0516102605261022051610280526102805161026051610240516006580161346a565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051610140526024356101405110151515610860576308c379a061016052602061018052600c6101a0527f736861726573203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6009805460043581818301101561087657600080fd5b808201905090508155506002543b61088d57600080fd5b6000600060446340c10f19610160523361018052610140516101a05261017c60006002545af16108bc57600080fd5b600954471015151561090d576308c379a061016052602061018052600b6101a0527f62616c203c207661756c740000000000000000000000000000000000000000006101c0526101a050606461017cfd5b600435610160526101405161018052337f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a156040610160a261014051600052600060125560206000f35b63371fd8e6811415610b725760005415156109b0576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035433141515610a00576308c379a061014052602061016052600d610180527f2166756e64206d616e61676572000000000000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610a50576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610aa1576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60098054600435818183011015610ab757600080fd5b80820190509050815550600a805460043580821015610ad557600080fd5b808203905090508155506009544710151515610b30576308c379a061014052602061016052600b610180527f62616c203c207661756c740000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c0985811415610e6a576000541515610bcc576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035433141515610c1c576308c379a061014052602061016052600d610180527f2166756e64206d616e61676572000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600435101515610c315760243515610c34565b60005b15610c40576001610c58565b6004351515610c555760006024351015610c58565b60005b1515610ca3576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610cf3576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b6101405160065801613349565b61016052610140526101605161014052346101605260006004351115610d67576009805461016051818183011015610d3757600080fd5b808201905090508155506101405161016051818183011015610d5857600080fd5b80820190509050600d55610dc6565b60006024351115610dc657600a805460243580821015610d8657600080fd5b80820390509050815550602435610140511115610dc057600d805460243580821015610db157600080fd5b80820390509050815550610dc6565b6000600d555b42600c556009544710151515610e1b576308c379a06101805260206101a052600b6101c0527f62616c203c207661756c740000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60095461018052600a546101a052604060046101c0376101605161020052600d5461022052337f7c7d4c274383cf61f46bee82092136a188e27c566b0857a2d68d01ae1814cdac60c0610180a2005b63fc0c546a811415610e9f573415610e8157600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb8114156113e8573415610eb657600080fd5b60043560a01c15610ec657600080fd5b60045433141515610f16576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610f64576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610fb2576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610fe857600080fd5b601f3d11610ff557600080fd5b6000506101a051141515611048576308c379a06101c05260206101e0526016610200527f6e6577207661756c7420746f6b656e20213d2045544800000000000000000000610220526102005060646101dcfd5b60025460206101a0600463633156376101405261015c6004355afa61106c57600080fd5b601f3d1161107957600080fd5b6000506101a0511415156110cc576308c379a06101c05260206101e052601a610200527f6e6577207661756c742075546f6b656e20213d2075546f6b656e000000000000610220526102005060646101dcfd5b60043560206101a0600463075461726101405261015c6002545afa6110f057600080fd5b601f3d116110fd57600080fd5b6000506101a051141515611150576308c379a06101c05260206101e0526013610200527f6d696e74657220213d206e6577207661756c7400000000000000000000000000610220526102005060646101dcfd5b60035460206101a06004636209ec2d6101405261015c6004355afa61117457600080fd5b601f3d1161118157600080fd5b6000506101a0511415156111f9576308c379a06101c05260206101e0526026610200527f6e6577207661756c742066756e64206d616e6167657220213d2066756e64206d610220527f616e616765720000000000000000000000000000000000000000000000000000610240526102005060846101dcfd5b600060035418156112885760043560206101a0600463fbfa77cf6101405261015c6003545afa61122857600080fd5b601f3d1161123557600080fd5b6000506101a051141515611288576308c379a06101c05260206101e052601f610200527f66756e64206d616e61676572207661756c7420213d206e6577207661756c7400610220526102005060646101dcfd5b476101405260095461014051101515156112e1576308c379a061016052602061018052600b6101a0527f62616c203c207661756c740000000000000000000000000000000000000000006101c0526101a050606461017cfd5b3060206101c060046392f73fc06101605261017c6004355afa61130357600080fd5b601f3d1161131057600080fd5b6000506101c051141515611363576308c379a06101e0526020610200526011610220527f6f6c64207661756c7420213d2073656c66000000000000000000000000000000610240526102205060646101fcfd5b6004353b61137057600080fd5b600060006004638129fc1c6101605261017c610140516004355af161139457600080fd5b6004356101605260095461018052600a546101a052600d546101c0527fc47a839c70aa320457c80c5abd38ce8b516c72e37be119b7962f67f1f8eb7ac26080610160a160006009556000600a556000600d55005b6347a02a448114156114955734156113ff57600080fd5b60043560a01c1561140f57600080fd5b6004543314151561145f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600555600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e8114156115335734156114ac57600080fd5b600554331415156114fc576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b33600455600060055533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c0281141561163157341561154a57600080fd5b60043560a01c1561155a57600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b61012051602002610160015133141561159957600183526115a9565b815160010180835281141561157d575b5050506101405115156115fb576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561172f57341561164857600080fd5b60043560a01c1561165857600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b61012051602002610160015133141561169757600183526116a7565b815160010180835281141561167b575b5050506101405115156116f9576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63232a30608114156118f457341561174657600080fd5b60043560a01c1561175657600080fd5b600454331415156117a6576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a0600463fbfa77cf6101405261015c6004355afa6117c857600080fd5b601f3d116117d557600080fd5b6000506101a051141515611828576308c379a06101c05260206101e052601a610200527f66756e64206d616e61676572207661756c7420213d2073656c66000000000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61185e57600080fd5b601f3d1161186b57600080fd5b6000506101a0511415156118be576308c379a06101c05260206101e0526019610200527f66756e64206d616e6167657220746f6b656e20213d2045544800000000000000610220526102005060646101dcfd5b600435600355600435610140527f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f56020610140a1005b63bedb86fb8114156119f957341561190b57600080fd5b60043560011c1561191b57600080fd5b60045461016052600754610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156119615760018352611971565b8151600101808352811415611945575b5050506101405115156119c3576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600155600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b633deb91c7811415611b0c573415611a1057600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611a4f5760018352611a5f565b8151600101808352811415611a33575b505050610140511515611ab1576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61271060043511151515611b04576308c379a0610140526020610160526011610180527f6d696e2072657365727665203e206d61780000000000000000000000000000006101a05261018050606461015cfd5b600435600b55005b637a550365811415611c25573415611b2357600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611b625760018352611b72565b8151600101808352811415611b46575b505050610140511515611bc4576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b670de0b6b3a764000060043511151515611c1d576308c379a0610140526020610160526011610180527f6465677261646174696f6e203e206d61780000000000000000000000000000006101a05261018050606461015cfd5b600435600e55005b63bdc8144b811415611ce5573415611c3c57600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611c7b5760018352611c8b565b8151600101808352811415611c5f575b505050610140511515611cdd576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600855005b63fa67ae5a811415611df7573415611cfc57600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611d3b5760018352611d4b565b8151600101808352811415611d1f575b505050610140511515611d9d576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600160043510151515611def576308c379a0610140526020610160526009610180527f64656c6179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600f55005b6353d6fd59811415611f16573415611e0e57600080fd5b60043560a01c15611e1e57600080fd5b60243560011c15611e2e57600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611e6d5760018352611e7d565b8151600101808352811415611e51575b505050610140511515611ecf576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b602435601060043560e05260c052604060c02055602435610140526004357ff6019ec0a78d156d249a1ec7579e2321f6ac7521d6e1d2eacf90ba4a184dcceb6020610140a2005b6301e1d114811415611f47573415611f2d57600080fd5b6006580161331d565b610140526101405160005260206000f35b630f73cea6811415611f78573415611f5e57600080fd5b60065801613349565b610140526101405160005260206000f35b63d13e56f1811415611fa9573415611f8f57600080fd5b6006580161340c565b610140526101405160005260206000f35b63ae074a098114156120ab573415611fc057600080fd5b60206101a060046318160ddd6101405261015c6002545afa611fe157600080fd5b601f3d11611fee57600080fd5b6000506101a0516101c0526101405161016051610180516101a0516101c0516006580161340c565b6101e0526101c0526101a0526101805261016052610140526101e051610200526101405161016051610180516101a0516101c0516101e05161020051600435610220526101c0516102405261020051610260526102605161024051610220516006580161346a565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05160005260206000f35b639b05f5e48114156121ad5734156120c257600080fd5b60206101a060046318160ddd6101405261015c6002545afa6120e357600080fd5b601f3d116120f057600080fd5b6000506101a0516101c0526101405161016051610180516101a0516101c0516006580161340c565b6101e0526101c0526101a0526101805261016052610140526101e051610200526101405161016051610180516101a0516101c0516101e05161020051600435610220526101c051610240526102005161026052610260516102405161022051600658016134f0565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05160005260206000f35b63441a3e7081141561273457601254156121c657600080fd5b600160125534156121d657600080fd5b6000541515612224576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6020610260602463952ca92c6101e05233610200526101fc6002545afa61224a57600080fd5b601f3d1161225757600080fd5b60005061026051600f5481818301101561227057600080fd5b8082019050905043101515612286576001612296565b60103360e05260c052604060c020545b15156122e1576308c379a06102805260206102a052600d6102c0527f626c6f636b203c2064656c6179000000000000000000000000000000000000006102e0526102c050606461029cfd5b60043560206101e060246370a0823161016052336101805261017c6002545afa61230a57600080fd5b601f3d1161231757600080fd5b6000506101e0518082111561232c578061232e565b815b9050905061014052600061014051111515612388576308c379a061016052602061018052600a6101a0527f736861726573203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60206101e060046318160ddd6101805261019c6002545afa6123a957600080fd5b601f3d116123b657600080fd5b6000506101e051610200526101405161016051610180516101a0516101c0516101e051610200516006580161340c565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161014051610260526102005161028052610240516102a0526102a0516102805161026051600658016134f0565b610300526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051610160526009546101605111156125b957476101805260206102406024632e1a7d4d6101c05261016051600954808210156124c557600080fd5b808203905090506101e0526101dc60006003545af16124e357600080fd5b601f3d116124f057600080fd5b600050610240516101a05247610180518082101561250d57600080fd5b808203905090506101805260006101a05111156125645761016080516101a0518082101561253a57600080fd5b80820390509050815250600a80546101a0518082101561255957600080fd5b808203905090508155505b600a8054610180518082101561257957600080fd5b80820390509050815550600980546101805181818301101561259a57600080fd5b808201905090508155506009546101605111156125b957600954610160525b6002543b6125c657600080fd5b600060006044639dc29fac61018052336101a052610140516101c05261019c60006002545af16125f557600080fd5b6024356101605110151515612649576308c379a06101805260206101a052600c6101c0527f616d6f756e74203c206d696e00000000000000000000000000000000000000006101e0526101c050606461019cfd5b60098054610160518082101561265e57600080fd5b8082039050905081555061014051610160513361018052610160516101a0526101a05161018051600658016130db565b610160526101405260005060095447101515156126ea576308c379a06101805260206101a052600b6101c0527f62616c203c207661756c740000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101405161018052610160516101a052337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686040610180a261016051600052600060125560206000f35b633347b9b281141561276557341561274b57600080fd5b6006580161355c565b610140526101405160005260206000f35b6367ff0b0681141561279657341561277c57600080fd5b600658016135bd565b610140526101405160005260206000f35b63c5ebeaec811415612a2e5734156127ad57600080fd5b60005415156127fb576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60015415151561284a576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6003543314151561289a576308c379a061014052602061016052600d610180527f2166756e64206d616e61676572000000000000000000000000000000000000006101a05261018050606461015cfd5b61014051600658016135bd565b6101605261014052610160516101405260043561014051808211156128cc57806128ce565b815b9050905061016052600061016051111515612928576308c379a06101805260206101a052600a6101c0527f626f72726f77203d2030000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b61014051610160513361018052610160516101a0526101a05161018051600658016130db565b610160526101405260005060098054610160518082101561296e57600080fd5b80820390509050815550600a80546101605181818301101561298f57600080fd5b8082019050905081555060095447101515156129ea576308c379a06101805260206101a052600b6101c0527f62616c203c207661756c740000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60043561018052610160516101a052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610180a26101605160005260206000f35b63d8dad962811415612bc4573415612a4557600080fd5b6000541515612a93576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415612ad25760018352612ae2565b8151600101808352811415612ab6575b505050610140511515612b34576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b476101405260095461014051101515612b8c576308c379a061016052602061018052600c6101a0527f62616c203e3d207661756c7400000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405160095561014051610160527f83a5bfe8bda9655fa2e9a9b551f1adb479366b2ee2f537d890c05e9f565837856020610160a1005b631dd19cb4811415612c62573415612bdb57600080fd5b60045433141515612c2b576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b33610140524760095480821015612c4157600080fd5b80820390509050610160526101605161014051600658016130db565b600050005b6301681a62811415612dc6573415612c7957600080fd5b60043560a01c15612c8957600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415612cc85760018352612cd8565b8151600101808352811415612cac575b505050610140511515612d2a576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa612d5057600080fd5b601f3d11612d5d57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613183565b6101e0526101c0526101a052610180526101605261014052600050005b63158ef93e811415612de9573415612ddd57600080fd5b60005460005260206000f35b635c975abb811415612e0c573415612e0057600080fd5b60015460005260206000f35b6363315637811415612e2f573415612e2357600080fd5b60025460005260206000f35b636209ec2d811415612e52573415612e4657600080fd5b60035460005260206000f35b63d085835a811415612e75573415612e6957600080fd5b60045460005260206000f35b63b127df87811415612e98573415612e8c57600080fd5b60055460005260206000f35b63452a9320811415612ebb573415612eaf57600080fd5b60065460005260206000f35b63f851a440811415612ede573415612ed257600080fd5b60075460005260206000f35b63ecf70858811415612f01573415612ef557600080fd5b60085460005260206000f35b639994673d811415612f24573415612f1857600080fd5b60095460005260206000f35b630dca59c1811415612f47573415612f3b57600080fd5b600a5460005260206000f35b631b4a2001811415612f6a573415612f5e57600080fd5b600b5460005260206000f35b63c3535b52811415612f8d573415612f8157600080fd5b600c5460005260206000f35b6344b81396811415612fb0573415612fa457600080fd5b600d5460005260206000f35b6342232716811415612fd3573415612fc757600080fd5b600e5460005260206000f35b63d98f6088811415612ff6573415612fea57600080fd5b600f5460005260206000f35b639b19251a81141561303757341561300d57600080fd5b60043560a01c1561301d57600080fd5b601060043560e05260c052604060c0205460005260206000f35b6392f73fc081141561305a57341561304e57600080fd5b60115460005260206000f35b505b600354331415156130ac576308c379a061014052602061016052600d610180527f2166756e64206d616e61676572000000000000000000000000000000000000006101a05261018050606461015cfd5b3461014052337fefc0288202e432ade6bf71491d0001d7e389ad4f8e4e9c7aa038dd1a563efc606020610140a2005b6101805261014052610160526000610140511415151561313a576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af161315d57600080fd5b5050600060006101e05161020061016051610140515af161317d57600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af161322c57600080fd5b505060206103e0610320516103406000610140515af161324b57600080fd5b60203d8082111561325c578061325e565b815b905090506103c0526103c08051602001806101c08284600060045af161328357600080fd5b505060006101c0511115613317576101c08060200151600082518060209013156132ac57600080fd5b80919012156132ba57600080fd5b806020036101000a820490509050905015151515613317576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b61014052600954600a5481818301101561333657600080fd5b8082019050905060005260005161014051565b6101405242600c548082101561335e57600080fd5b80820390509050600e54808202821582848304141761337c57600080fd5b8090509050905061016052670de0b6b3a76400006101605110156133fc57600d546101805261018051610160516101805180820282158284830414176133c157600080fd5b80905090509050670de0b6b3a764000080820490509050808210156133e557600080fd5b80820390509050600052600051610140515661340a565b600060005260005161014051565b005b61014052610140516006580161331d565b610160526101405261016051610140516101605160065801613349565b610180526101605261014052610180518082101561345757600080fd5b8082039050905060005260005161014051565b6101a0526101405261016052610180526101405115156134925760006000526000516101a051565b6101605115156134ac57610140516000526000516101a051565b610140516101605180820282158284830414176134c857600080fd5b809050905090506101805180806134de57600080fd5b8204905090506000526000516101a051565b6101a0526101405261016052610180526101405115156135185760006000526000516101a051565b6101405161018051808202821582848304141761353457600080fd5b8090509050905061016051808061354a57600080fd5b8204905090506000526000516101a051565b6101405261014051610160516006580161340c565b610180526101605261014052610180516101605261016051600b5480820282158284830414176135a057600080fd5b809050905090506127108082049050905060005260005161014051565b6101405260005415156135d15760016135e5565b600154156135e05760016135e5565b600354155b156135f857600060005260005161014051565b61014051610160516006580161355c565b610180526101605261014052610180516101605261016051600954111561365157600954610160518082101561363e57600080fd5b8082039050905060005260005161014051565b600060005260005161014051565b61024f6138ae0361024f60003961024f6138ae036000f3000000000000000000000000de07f45688cb6cfaac398c1485860e186d55996d00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x600436101561000d5761305c565b600035601c52600051638129fc1c81141561048357600054151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b601154151561012457600454610160526007546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b42600c5561047c565b60115433141515610174576308c379a061014052602061016052600a610180527f216f6c64207661756c74000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a0600463075461726101405261015c6002545afa61019657600080fd5b601f3d116101a357600080fd5b6000506101a0511415156101f6576308c379a06101c05260206101e052600e610200527f6d696e74657220213d2073656c66000000000000000000000000000000000000610220526102005060646101dcfd5b60206101a06004636209ec2d6101405261015c6011545afa61021757600080fd5b601f3d1161022457600080fd5b6000506101a05160035414151561029f576308c379a06101c05260206101e0526026610200527f66756e64206d616e6167657220213d206f6c64207661756c742066756e64206d610220527f616e616765720000000000000000000000000000000000000000000000000000610240526102005060846101dcfd5b6000600354181561032c573060206101a0600463fbfa77cf6101405261015c6003545afa6102cc57600080fd5b601f3d116102d957600080fd5b6000506101a05114151561032c576308c379a06101c05260206101e052601a610200527f66756e64206d616e61676572207661756c7420213d2073656c66000000000000610220526102005060646101dcfd5b60206101c06004639994673d6101605261017c6011545afa61034d57600080fd5b601f3d1161035a57600080fd5b6000506101c051610140526101405134101515156103b7576308c379a061016052602061018052600d6101a0527f76616c7565203c207661756c74000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405134808211156103ca57806103cc565b815b9050905060095560206101c06004630dca59c16101605261017c6011545afa6103f457600080fd5b601f3d1161040157600080fd5b6000506101c051600a5560206101c060046344b813966101605261017c6011545afa61042c57600080fd5b601f3d1161043957600080fd5b6000506101c051600d5560206101c0600463c3535b526101605261017c6011545afa61046457600080fd5b601f3d1161047157600080fd5b6000506101c051600c555b6001600055005b63e2bbb158811415610956576012541561049c57600080fd5b600160125560005415156104ef576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60015415151561053e576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6020610260602463952ca92c6101e05233610200526101fc6002545afa61056457600080fd5b601f3d1161057157600080fd5b60005061026051600f5481818301101561058a57600080fd5b80820190509050431015156105a05760016105b0565b60103360e05260c052604060c020545b15156105fb576308c379a06102805260206102a052600d6102c0527f626c6f636b203c2064656c6179000000000000000000000000000000000000006102e0526102c050606461029cfd5b3460043514151561064b576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b600060043511151561069c576308c379a061014052602061016052600b610180527f6465706f736974203d20300000000000000000000000000000000000000000006101a05261018050606461015cfd5b6008546006580161331d565b61014052610140516004358181830110156106c257600080fd5b8082019050905011151515610716576308c379a061016052602061018052600d6101a0527f6465706f736974206c696d6974000000000000000000000000000000000000006101c0526101a050606461017cfd5b60206101c060046318160ddd6101605261017c6002545afa61073757600080fd5b601f3d1161074457600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516006580161340c565b610200526101e0526101c0526101a05261018052610160526101405261020051610220526101405161016051610180516101a0516101c0516101e0516102005161022051600435610240526101e0516102605261022051610280526102805161026051610240516006580161346a565b6102e05261022052610200526101e0526101c0526101a0526101805261016052610140526102e051610140526024356101405110151515610860576308c379a061016052602061018052600c6101a0527f736861726573203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6009805460043581818301101561087657600080fd5b808201905090508155506002543b61088d57600080fd5b6000600060446340c10f19610160523361018052610140516101a05261017c60006002545af16108bc57600080fd5b600954471015151561090d576308c379a061016052602061018052600b6101a0527f62616c203c207661756c740000000000000000000000000000000000000000006101c0526101a050606461017cfd5b600435610160526101405161018052337f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a156040610160a261014051600052600060125560206000f35b63371fd8e6811415610b725760005415156109b0576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035433141515610a00576308c379a061014052602061016052600d610180527f2166756e64206d616e61676572000000000000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610a50576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610aa1576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60098054600435818183011015610ab757600080fd5b80820190509050815550600a805460043580821015610ad557600080fd5b808203905090508155506009544710151515610b30576308c379a061014052602061016052600b610180527f62616c203c207661756c740000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c0985811415610e6a576000541515610bcc576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035433141515610c1c576308c379a061014052602061016052600d610180527f2166756e64206d616e61676572000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600435101515610c315760243515610c34565b60005b15610c40576001610c58565b6004351515610c555760006024351015610c58565b60005b1515610ca3576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610cf3576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b6101405160065801613349565b61016052610140526101605161014052346101605260006004351115610d67576009805461016051818183011015610d3757600080fd5b808201905090508155506101405161016051818183011015610d5857600080fd5b80820190509050600d55610dc6565b60006024351115610dc657600a805460243580821015610d8657600080fd5b80820390509050815550602435610140511115610dc057600d805460243580821015610db157600080fd5b80820390509050815550610dc6565b6000600d555b42600c556009544710151515610e1b576308c379a06101805260206101a052600b6101c0527f62616c203c207661756c740000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60095461018052600a546101a052604060046101c0376101605161020052600d5461022052337f7c7d4c274383cf61f46bee82092136a188e27c566b0857a2d68d01ae1814cdac60c0610180a2005b63fc0c546a811415610e9f573415610e8157600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb8114156113e8573415610eb657600080fd5b60043560a01c15610ec657600080fd5b60045433141515610f16576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610f64576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610fb2576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610fe857600080fd5b601f3d11610ff557600080fd5b6000506101a051141515611048576308c379a06101c05260206101e0526016610200527f6e6577207661756c7420746f6b656e20213d2045544800000000000000000000610220526102005060646101dcfd5b60025460206101a0600463633156376101405261015c6004355afa61106c57600080fd5b601f3d1161107957600080fd5b6000506101a0511415156110cc576308c379a06101c05260206101e052601a610200527f6e6577207661756c742075546f6b656e20213d2075546f6b656e000000000000610220526102005060646101dcfd5b60043560206101a0600463075461726101405261015c6002545afa6110f057600080fd5b601f3d116110fd57600080fd5b6000506101a051141515611150576308c379a06101c05260206101e0526013610200527f6d696e74657220213d206e6577207661756c7400000000000000000000000000610220526102005060646101dcfd5b60035460206101a06004636209ec2d6101405261015c6004355afa61117457600080fd5b601f3d1161118157600080fd5b6000506101a0511415156111f9576308c379a06101c05260206101e0526026610200527f6e6577207661756c742066756e64206d616e6167657220213d2066756e64206d610220527f616e616765720000000000000000000000000000000000000000000000000000610240526102005060846101dcfd5b600060035418156112885760043560206101a0600463fbfa77cf6101405261015c6003545afa61122857600080fd5b601f3d1161123557600080fd5b6000506101a051141515611288576308c379a06101c05260206101e052601f610200527f66756e64206d616e61676572207661756c7420213d206e6577207661756c7400610220526102005060646101dcfd5b476101405260095461014051101515156112e1576308c379a061016052602061018052600b6101a0527f62616c203c207661756c740000000000000000000000000000000000000000006101c0526101a050606461017cfd5b3060206101c060046392f73fc06101605261017c6004355afa61130357600080fd5b601f3d1161131057600080fd5b6000506101c051141515611363576308c379a06101e0526020610200526011610220527f6f6c64207661756c7420213d2073656c66000000000000000000000000000000610240526102205060646101fcfd5b6004353b61137057600080fd5b600060006004638129fc1c6101605261017c610140516004355af161139457600080fd5b6004356101605260095461018052600a546101a052600d546101c0527fc47a839c70aa320457c80c5abd38ce8b516c72e37be119b7962f67f1f8eb7ac26080610160a160006009556000600a556000600d55005b6347a02a448114156114955734156113ff57600080fd5b60043560a01c1561140f57600080fd5b6004543314151561145f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600555600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e8114156115335734156114ac57600080fd5b600554331415156114fc576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b33600455600060055533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c0281141561163157341561154a57600080fd5b60043560a01c1561155a57600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b61012051602002610160015133141561159957600183526115a9565b815160010180835281141561157d575b5050506101405115156115fb576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561172f57341561164857600080fd5b60043560a01c1561165857600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b61012051602002610160015133141561169757600183526116a7565b815160010180835281141561167b575b5050506101405115156116f9576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63232a30608114156118f457341561174657600080fd5b60043560a01c1561175657600080fd5b600454331415156117a6576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a0600463fbfa77cf6101405261015c6004355afa6117c857600080fd5b601f3d116117d557600080fd5b6000506101a051141515611828576308c379a06101c05260206101e052601a610200527f66756e64206d616e61676572207661756c7420213d2073656c66000000000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61185e57600080fd5b601f3d1161186b57600080fd5b6000506101a0511415156118be576308c379a06101c05260206101e0526019610200527f66756e64206d616e6167657220746f6b656e20213d2045544800000000000000610220526102005060646101dcfd5b600435600355600435610140527f5b94aba958ab93884b4020c8f52abddc2584e61c0adf58c3ab88acb28480e6f56020610140a1005b63bedb86fb8114156119f957341561190b57600080fd5b60043560011c1561191b57600080fd5b60045461016052600754610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156119615760018352611971565b8151600101808352811415611945575b5050506101405115156119c3576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600155600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b633deb91c7811415611b0c573415611a1057600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611a4f5760018352611a5f565b8151600101808352811415611a33575b505050610140511515611ab1576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61271060043511151515611b04576308c379a0610140526020610160526011610180527f6d696e2072657365727665203e206d61780000000000000000000000000000006101a05261018050606461015cfd5b600435600b55005b637a550365811415611c25573415611b2357600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611b625760018352611b72565b8151600101808352811415611b46575b505050610140511515611bc4576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b670de0b6b3a764000060043511151515611c1d576308c379a0610140526020610160526011610180527f6465677261646174696f6e203e206d61780000000000000000000000000000006101a05261018050606461015cfd5b600435600e55005b63bdc8144b811415611ce5573415611c3c57600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611c7b5760018352611c8b565b8151600101808352811415611c5f575b505050610140511515611cdd576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600855005b63fa67ae5a811415611df7573415611cfc57600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611d3b5760018352611d4b565b8151600101808352811415611d1f575b505050610140511515611d9d576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600160043510151515611def576308c379a0610140526020610160526009610180527f64656c6179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600f55005b6353d6fd59811415611f16573415611e0e57600080fd5b60043560a01c15611e1e57600080fd5b60243560011c15611e2e57600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415611e6d5760018352611e7d565b8151600101808352811415611e51575b505050610140511515611ecf576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b602435601060043560e05260c052604060c02055602435610140526004357ff6019ec0a78d156d249a1ec7579e2321f6ac7521d6e1d2eacf90ba4a184dcceb6020610140a2005b6301e1d114811415611f47573415611f2d57600080fd5b6006580161331d565b610140526101405160005260206000f35b630f73cea6811415611f78573415611f5e57600080fd5b60065801613349565b610140526101405160005260206000f35b63d13e56f1811415611fa9573415611f8f57600080fd5b6006580161340c565b610140526101405160005260206000f35b63ae074a098114156120ab573415611fc057600080fd5b60206101a060046318160ddd6101405261015c6002545afa611fe157600080fd5b601f3d11611fee57600080fd5b6000506101a0516101c0526101405161016051610180516101a0516101c0516006580161340c565b6101e0526101c0526101a0526101805261016052610140526101e051610200526101405161016051610180516101a0516101c0516101e05161020051600435610220526101c0516102405261020051610260526102605161024051610220516006580161346a565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05160005260206000f35b639b05f5e48114156121ad5734156120c257600080fd5b60206101a060046318160ddd6101405261015c6002545afa6120e357600080fd5b601f3d116120f057600080fd5b6000506101a0516101c0526101405161016051610180516101a0516101c0516006580161340c565b6101e0526101c0526101a0526101805261016052610140526101e051610200526101405161016051610180516101a0516101c0516101e05161020051600435610220526101c051610240526102005161026052610260516102405161022051600658016134f0565b6102c052610200526101e0526101c0526101a0526101805261016052610140526102c05160005260206000f35b63441a3e7081141561273457601254156121c657600080fd5b600160125534156121d657600080fd5b6000541515612224576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6020610260602463952ca92c6101e05233610200526101fc6002545afa61224a57600080fd5b601f3d1161225757600080fd5b60005061026051600f5481818301101561227057600080fd5b8082019050905043101515612286576001612296565b60103360e05260c052604060c020545b15156122e1576308c379a06102805260206102a052600d6102c0527f626c6f636b203c2064656c6179000000000000000000000000000000000000006102e0526102c050606461029cfd5b60043560206101e060246370a0823161016052336101805261017c6002545afa61230a57600080fd5b601f3d1161231757600080fd5b6000506101e0518082111561232c578061232e565b815b9050905061014052600061014051111515612388576308c379a061016052602061018052600a6101a0527f736861726573203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60206101e060046318160ddd6101805261019c6002545afa6123a957600080fd5b601f3d116123b657600080fd5b6000506101e051610200526101405161016051610180516101a0516101c0516101e051610200516006580161340c565b61022052610200526101e0526101c0526101a05261018052610160526101405261022051610240526101405161016051610180516101a0516101c0516101e05161020051610220516102405161014051610260526102005161028052610240516102a0526102a0516102805161026051600658016134f0565b610300526102405261022052610200526101e0526101c0526101a05261018052610160526101405261030051610160526009546101605111156125b957476101805260206102406024632e1a7d4d6101c05261016051600954808210156124c557600080fd5b808203905090506101e0526101dc60006003545af16124e357600080fd5b601f3d116124f057600080fd5b600050610240516101a05247610180518082101561250d57600080fd5b808203905090506101805260006101a05111156125645761016080516101a0518082101561253a57600080fd5b80820390509050815250600a80546101a0518082101561255957600080fd5b808203905090508155505b600a8054610180518082101561257957600080fd5b80820390509050815550600980546101805181818301101561259a57600080fd5b808201905090508155506009546101605111156125b957600954610160525b6002543b6125c657600080fd5b600060006044639dc29fac61018052336101a052610140516101c05261019c60006002545af16125f557600080fd5b6024356101605110151515612649576308c379a06101805260206101a052600c6101c0527f616d6f756e74203c206d696e00000000000000000000000000000000000000006101e0526101c050606461019cfd5b60098054610160518082101561265e57600080fd5b8082039050905081555061014051610160513361018052610160516101a0526101a05161018051600658016130db565b610160526101405260005060095447101515156126ea576308c379a06101805260206101a052600b6101c0527f62616c203c207661756c740000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101405161018052610160516101a052337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686040610180a261016051600052600060125560206000f35b633347b9b281141561276557341561274b57600080fd5b6006580161355c565b610140526101405160005260206000f35b6367ff0b0681141561279657341561277c57600080fd5b600658016135bd565b610140526101405160005260206000f35b63c5ebeaec811415612a2e5734156127ad57600080fd5b60005415156127fb576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60015415151561284a576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6003543314151561289a576308c379a061014052602061016052600d610180527f2166756e64206d616e61676572000000000000000000000000000000000000006101a05261018050606461015cfd5b61014051600658016135bd565b6101605261014052610160516101405260043561014051808211156128cc57806128ce565b815b9050905061016052600061016051111515612928576308c379a06101805260206101a052600a6101c0527f626f72726f77203d2030000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b61014051610160513361018052610160516101a0526101a05161018051600658016130db565b610160526101405260005060098054610160518082101561296e57600080fd5b80820390509050815550600a80546101605181818301101561298f57600080fd5b8082019050905081555060095447101515156129ea576308c379a06101805260206101a052600b6101c0527f62616c203c207661756c740000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60043561018052610160516101a052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610180a26101605160005260206000f35b63d8dad962811415612bc4573415612a4557600080fd5b6000541515612a93576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415612ad25760018352612ae2565b8151600101808352811415612ab6575b505050610140511515612b34576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b476101405260095461014051101515612b8c576308c379a061016052602061018052600c6101a0527f62616c203e3d207661756c7400000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405160095561014051610160527f83a5bfe8bda9655fa2e9a9b551f1adb479366b2ee2f537d890c05e9f565837856020610160a1005b631dd19cb4811415612c62573415612bdb57600080fd5b60045433141515612c2b576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b33610140524760095480821015612c4157600080fd5b80820390509050610160526101605161014051600658016130db565b600050005b6301681a62811415612dc6573415612c7957600080fd5b60043560a01c15612c8957600080fd5b600454610160526007546101805260006101405261014061012060006002818352015b610120516020026101600151331415612cc85760018352612cd8565b8151600101808352811415612cac575b505050610140511515612d2a576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa612d5057600080fd5b601f3d11612d5d57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613183565b6101e0526101c0526101a052610180526101605261014052600050005b63158ef93e811415612de9573415612ddd57600080fd5b60005460005260206000f35b635c975abb811415612e0c573415612e0057600080fd5b60015460005260206000f35b6363315637811415612e2f573415612e2357600080fd5b60025460005260206000f35b636209ec2d811415612e52573415612e4657600080fd5b60035460005260206000f35b63d085835a811415612e75573415612e6957600080fd5b60045460005260206000f35b63b127df87811415612e98573415612e8c57600080fd5b60055460005260206000f35b63452a9320811415612ebb573415612eaf57600080fd5b60065460005260206000f35b63f851a440811415612ede573415612ed257600080fd5b60075460005260206000f35b63ecf70858811415612f01573415612ef557600080fd5b60085460005260206000f35b639994673d811415612f24573415612f1857600080fd5b60095460005260206000f35b630dca59c1811415612f47573415612f3b57600080fd5b600a5460005260206000f35b631b4a2001811415612f6a573415612f5e57600080fd5b600b5460005260206000f35b63c3535b52811415612f8d573415612f8157600080fd5b600c5460005260206000f35b6344b81396811415612fb0573415612fa457600080fd5b600d5460005260206000f35b6342232716811415612fd3573415612fc757600080fd5b600e5460005260206000f35b63d98f6088811415612ff6573415612fea57600080fd5b600f5460005260206000f35b639b19251a81141561303757341561300d57600080fd5b60043560a01c1561301d57600080fd5b601060043560e05260c052604060c0205460005260206000f35b6392f73fc081141561305a57341561304e57600080fd5b60115460005260206000f35b505b600354331415156130ac576308c379a061014052602061016052600d610180527f2166756e64206d616e61676572000000000000000000000000000000000000006101a05261018050606461015cfd5b3461014052337fefc0288202e432ade6bf71491d0001d7e389ad4f8e4e9c7aa038dd1a563efc606020610140a2005b6101805261014052610160526000610140511415151561313a576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af161315d57600080fd5b5050600060006101e05161020061016051610140515af161317d57600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af161322c57600080fd5b505060206103e0610320516103406000610140515af161324b57600080fd5b60203d8082111561325c578061325e565b815b905090506103c0526103c08051602001806101c08284600060045af161328357600080fd5b505060006101c0511115613317576101c08060200151600082518060209013156132ac57600080fd5b80919012156132ba57600080fd5b806020036101000a820490509050905015151515613317576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b61014052600954600a5481818301101561333657600080fd5b8082019050905060005260005161014051565b6101405242600c548082101561335e57600080fd5b80820390509050600e54808202821582848304141761337c57600080fd5b8090509050905061016052670de0b6b3a76400006101605110156133fc57600d546101805261018051610160516101805180820282158284830414176133c157600080fd5b80905090509050670de0b6b3a764000080820490509050808210156133e557600080fd5b80820390509050600052600051610140515661340a565b600060005260005161014051565b005b61014052610140516006580161331d565b610160526101405261016051610140516101605160065801613349565b610180526101605261014052610180518082101561345757600080fd5b8082039050905060005260005161014051565b6101a0526101405261016052610180526101405115156134925760006000526000516101a051565b6101605115156134ac57610140516000526000516101a051565b610140516101605180820282158284830414176134c857600080fd5b809050905090506101805180806134de57600080fd5b8204905090506000526000516101a051565b6101a0526101405261016052610180526101405115156135185760006000526000516101a051565b6101405161018051808202821582848304141761353457600080fd5b8090509050905061016051808061354a57600080fd5b8204905090506000526000516101a051565b6101405261014051610160516006580161340c565b610180526101605261014052610180516101605261016051600b5480820282158284830414176135a057600080fd5b809050905090506127108082049050905060005260005161014051565b6101405260005415156135d15760016135e5565b600154156135e05760016135e5565b600354155b156135f857600060005260005161014051565b61014051610160516006580161355c565b610180526101605261014052610180516101605261016051600954111561365157600954610160518082101561363e57600080fd5b8082039050905060005260005161014051565b60006000526000516101405156

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000de07f45688cb6cfaac398c1485860e186d55996d00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : uToken (address): 0xDe07f45688cb6CfAaC398c1485860e186D55996D
Arg [1] : guardian (address): 0x86d10751B18F3fE331C146546868a07224A8598B
Arg [2] : oldVault (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000de07f45688cb6cfaac398c1485860e186d55996d
Arg [1] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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.