Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 13 from a total of 13 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Borrow From Vaul... | 12962265 | 1695 days ago | IN | 0 ETH | 0.00310657 | ||||
| Report To Vault | 12962248 | 1695 days ago | IN | 0 ETH | 0.00319762 | ||||
| Borrow From Vaul... | 12950095 | 1697 days ago | IN | 0 ETH | 0.00337284 | ||||
| Report To Vault | 12950079 | 1697 days ago | IN | 0 ETH | 0.00356307 | ||||
| Report To Vault | 12944285 | 1698 days ago | IN | 0 ETH | 0.00219265 | ||||
| Report To Vault | 12931158 | 1700 days ago | IN | 0 ETH | 0.00239365 | ||||
| Borrow From Vaul... | 12854125 | 1712 days ago | IN | 0 ETH | 0.00100706 | ||||
| Report To Vault | 12834863 | 1715 days ago | IN | 0 ETH | 0.00233565 | ||||
| Borrow From Vaul... | 12823145 | 1717 days ago | IN | 0 ETH | 0.00411332 | ||||
| Add Strategy To ... | 12816946 | 1718 days ago | IN | 0 ETH | 0.00553479 | ||||
| Approve Strategy | 12816402 | 1718 days ago | IN | 0 ETH | 0.00172822 | ||||
| Initialize | 12816324 | 1718 days ago | IN | 0 ETH | 0.00129443 | ||||
| Set Vault | 12816274 | 1718 days ago | IN | 0 ETH | 0.00125135 |
Latest 21 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 13079567 | 1677 days ago | 0.87208852 ETH | ||||
| - | 13079567 | 1677 days ago | 0.87208852 ETH | ||||
| - | 12962281 | 1695 days ago | 0.00058932 ETH | ||||
| - | 12962265 | 1695 days ago | 0.00058932 ETH | ||||
| - | 12962248 | 1695 days ago | 0.00060193 ETH | ||||
| - | 12962233 | 1695 days ago | 0.00060193 ETH | ||||
| - | 12950105 | 1697 days ago | 0.00451252 ETH | ||||
| - | 12950095 | 1697 days ago | 0.00404414 ETH | ||||
| - | 12950079 | 1697 days ago | 0.00024782 ETH | ||||
| - | 12950063 | 1697 days ago | 0.00024782 ETH | ||||
| - | 12944285 | 1698 days ago | 0.00057865 ETH | ||||
| - | 12944268 | 1698 days ago | 0.00057865 ETH | ||||
| - | 12931158 | 1700 days ago | 0.00341758 ETH | ||||
| - | 12931147 | 1700 days ago | 0.00263945 ETH | ||||
| - | 12854125 | 1712 days ago | 0.00046837 ETH | ||||
| - | 12854105 | 1712 days ago | 0.00077812 ETH | ||||
| - | 12834863 | 1715 days ago | 0.00049302 ETH | ||||
| - | 12828669 | 1716 days ago | 0 ETH | ||||
| - | 12828482 | 1716 days ago | 0.00049302 ETH | ||||
| - | 12823223 | 1717 days ago | 1.06806523 ETH | ||||
| - | 12823145 | 1717 days ago | 1.06806523 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.12
Contract Source Code (Vyper language format)
# @version 0.2.12
"""
@title Unagii EthFundManager
@author stakewith.us
@license AGPL-3.0-or-later
"""
from vyper.interfaces import ERC20
interface Vault:
def token() -> address: view
def debt() -> uint256: view
def borrow(amount: uint256) -> uint256: nonpayable
def repay(amount: uint256) -> uint256: payable
def report(gain: uint256, loss: uint256): payable
interface IStrategy:
def fundManager() -> address: view
def token() -> address: view
def withdraw(amount: uint256) -> uint256: nonpayable
def migrate(newVersion: address): nonpayable
# interface to new version of FundManager used for migration
interface FundManager:
def token() -> address: view
def vault() -> address: view
def totalDebt() -> uint256: view
def totalDebtRatio() -> uint256: view
def queue(i: uint256) -> address: view
def strategies(
addr: address,
) -> (bool, bool, bool, uint256, uint256, uint256, uint256): view
def initialize(): payable
# maximum number of active strategies
MAX_QUEUE: constant(uint256) = 20
struct Strategy:
approved: bool
active: bool
activated: bool # sent to True once after strategy is active
debtRatio: uint256 # ratio of total assets this strategy can borrow
debt: uint256 # current amount borrowed
minBorrow: uint256 # minimum amount to borrow per call to borrow()
maxBorrow: uint256 # maximum amount to borrow per call to borrow()
event SetNextTimeLock:
nextTimeLock: address
event AcceptTimeLock:
timeLock: address
event SetAdmin:
admin: address
event SetGuardian:
guardian: address
event SetWorker:
worker: address
event SetPause:
paused: bool
event SetVault:
vault: address
event ApproveStrategy:
strategy: indexed(address)
event RevokeStrategy:
strategy: indexed(address)
event AddStrategyToQueue:
strategy: indexed(address)
event RemoveStrategyFromQueue:
strategy: indexed(address)
event SetQueue:
queue: address[MAX_QUEUE]
event SetDebtRatios:
debtRatios: uint256[MAX_QUEUE]
event SetMinMaxBorrow:
strategy: indexed(address)
minBorrow: uint256
maxBorrow: uint256
event ReceiveEth:
sender: indexed(address)
amount: uint256
event BorrowFromVault:
vault: indexed(address)
amount: uint256
borrowed: uint256
event RepayVault:
vault: indexed(address)
amount: uint256
repaid: uint256
event ReportToVault:
vault: indexed(address)
total: uint256
debt: uint256
gain: uint256
loss: uint256
event Withdraw:
vault: indexed(address)
amount: uint256
actual: uint256
loss: uint256
event WithdrawStrategy:
strategy: indexed(address)
debt: uint256
need: uint256
loss: uint256
diff: uint256
event Borrow:
strategy: indexed(address)
amount: uint256
borrowed: uint256
event Repay:
strategy: indexed(address)
amount: uint256
repaid: uint256
event Report:
strategy: indexed(address)
gain: uint256
loss: uint256
debt: uint256
event MigrateStrategy:
oldStrategy: indexed(address)
newStrategy: indexed(address)
event Migrate:
fundManager: address
bal: uint256
totalDebt: uint256
paused: public(bool)
initialized: public(bool)
vault: public(Vault)
ETH: constant(address) = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
# privileges - time lock >= admin >= guardian, worker
timeLock: public(address)
nextTimeLock: public(address)
admin: public(address)
guardian: public(address)
worker: public(address)
totalDebt: public(uint256) # sum of all debts of strategies
MAX_TOTAL_DEBT_RATIO: constant(uint256) = 10000
totalDebtRatio: public(uint256) # sum of all debtRatios of strategies
strategies: public(HashMap[address, Strategy]) # all strategies
queue: public(address[MAX_QUEUE]) # list of active strategies
# migration
OLD_MAX_QUEUE: constant(uint256) = 20 # must be <= MAX_QUEUE
oldFundManager: public(FundManager)
@external
def __init__(guardian: address, worker: address, oldFundManager: address):
self.timeLock = msg.sender
self.admin = msg.sender
self.guardian = guardian
self.worker = worker
if oldFundManager != ZERO_ADDRESS:
self.oldFundManager = FundManager(oldFundManager)
assert self.oldFundManager.token() == ETH, "old fund manager token != ETH"
@external
@payable
def __default__():
pass
# 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 fund manager. Transfer ETH and copy states if
old fund manager is set.
"""
assert not self.initialized, "initialized"
if self.oldFundManager.address == ZERO_ADDRESS:
assert msg.sender in [self.timeLock, self.admin], "!auth"
else:
assert msg.sender == self.oldFundManager.address, "!old fund manager"
assert (
self.vault.address == self.oldFundManager.vault()
), "old fund manager vault != vault"
self.totalDebt = self.oldFundManager.totalDebt()
self.totalDebtRatio = self.oldFundManager.totalDebtRatio()
for i in range(OLD_MAX_QUEUE):
addr: address = self.oldFundManager.queue(i)
if addr == ZERO_ADDRESS:
break
assert (
IStrategy(addr).fundManager() == self
), "strategy fund manager != self"
approved: bool = False
active: bool = False
activated: bool = False
debtRatio: uint256 = 0
debt: uint256 = 0
minBorrow: uint256 = 0
maxBorrow: uint256 = 0
(
approved,
active,
activated,
debtRatio,
debt,
minBorrow,
maxBorrow,
) = self.oldFundManager.strategies(addr)
assert approved, "!approved"
assert active, "!active"
assert activated, "!activated"
self.queue[i] = addr
self.strategies[addr] = Strategy(
{
approved: True,
active: True,
activated: True,
debtRatio: debtRatio,
debt: debt,
minBorrow: minBorrow,
maxBorrow: maxBorrow,
}
)
self.initialized = True
# Migration steps to new fund manager
#
# v = vault
# f1 = fund manager 1
# f2 = fund manager 2
# strats = active strategies of f1
#
# action | caller
# ----------------------------------------
# 1. f2.setVault(v) | time lock
# 2. f1.setPause(true) | admin
# 3. for s in strats |
# s.setFundManager(f2) | time lock
# 4. send ETH to f2 | f1
# 5. f2 copy states from f1 | f2
# - totalDebt |
# - totalDebtRatio |
# - queue |
# - active strategy params |
# 6. f1 reset state | f1
# - totalDebt |
# - active strategy debt |
# 7. v.setFundManager(f2) | time lock
@external
def migrate(fundManager: address):
"""
@notice Migrate to new fund manager
@param fundManager Address of new fund manager
"""
assert msg.sender == self.timeLock, "!time lock"
assert self.initialized, "!initialized"
assert self.paused, "!paused"
assert FundManager(fundManager).token() == ETH, "new fund manager token != ETH"
assert (
FundManager(fundManager).vault() == self.vault.address
), "new fund manager vault != vault"
for strat in self.queue:
if strat == ZERO_ADDRESS:
break
assert (
IStrategy(strat).fundManager() == fundManager
), "strategy fund manager != new fund manager"
bal: uint256 = self.balance
FundManager(fundManager).initialize(value=bal)
log Migrate(fundManager, bal, self.totalDebt)
self.totalDebt = 0
for strat in self.queue:
if strat == ZERO_ADDRESS:
break
self.strategies[strat].debt = 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
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 setWorker(worker: address):
assert msg.sender in [self.timeLock, self.admin], "!auth"
self.worker = worker
log SetWorker(worker)
@external
def setPause(paused: bool):
assert msg.sender in [self.timeLock, self.admin, self.guardian], "!auth"
self.paused = paused
log SetPause(paused)
@external
def setVault(vault: address):
"""
@notice Set vault
@param vault Address of vault
"""
assert msg.sender == self.timeLock, "!time lock"
assert Vault(vault).token() == ETH, "vault token != ETH"
self.vault = Vault(vault)
log SetVault(vault)
@internal
@view
def _totalAssets() -> uint256:
"""
@notice Total amount of ETH in this fund manager + total amount borrowed
by strategies
@dev Returns total amount of ETH managed by this contract
"""
return self.balance + self.totalDebt
@external
@view
def totalAssets() -> uint256:
return self._totalAssets()
# array functions tested in test/Array.vy
@internal
def _pack():
arr: address[MAX_QUEUE] = empty(address[MAX_QUEUE])
i: uint256 = 0
for strat in self.queue:
if strat != ZERO_ADDRESS:
arr[i] = strat
i += 1
self.queue = arr
@internal
def _append(strategy: address):
assert self.queue[MAX_QUEUE - 1] == ZERO_ADDRESS, "queue > max"
self.queue[MAX_QUEUE - 1] = strategy
self._pack()
@internal
def _remove(i: uint256):
assert i < MAX_QUEUE, "i >= max"
assert self.queue[i] != ZERO_ADDRESS, "!zero address"
self.queue[i] = ZERO_ADDRESS
self._pack()
@internal
@view
def _find(strategy: address) -> uint256:
for i in range(MAX_QUEUE):
if self.queue[i] == strategy:
return i
raise "not found"
@external
def approveStrategy(strategy: address):
"""
@notice Approve strategy
@param strategy Address of strategy
"""
assert msg.sender == self.timeLock, "!time lock"
assert not self.strategies[strategy].approved, "approved"
assert IStrategy(strategy).fundManager() == self, "strategy fund manager != this"
assert IStrategy(strategy).token() == ETH, "strategy token != ETH"
self.strategies[strategy] = Strategy(
{
approved: True,
active: False,
activated: False,
debtRatio: 0,
debt: 0,
minBorrow: 0,
maxBorrow: 0,
}
)
log ApproveStrategy(strategy)
@external
def revokeStrategy(strategy: address):
"""
@notice Disapprove strategy
@param strategy Address of strategy
"""
assert msg.sender in [self.timeLock, self.admin], "!auth"
assert self.strategies[strategy].approved, "!approved"
assert not self.strategies[strategy].active, "active"
self.strategies[strategy].approved = False
log RevokeStrategy(strategy)
@external
def addStrategyToQueue(
strategy: address, debtRatio: uint256, minBorrow: uint256, maxBorrow: uint256
):
"""
@notice Activate strategy
@param strategy Address of strategy
@param debtRatio Ratio of total assets this strategy can borrow
@param minBorrow Minimum amount to borrow per call to borrow()
@param maxBorrow Maximum amount to borrow per call to borrow()
"""
assert msg.sender in [self.timeLock, self.admin], "!auth"
assert self.strategies[strategy].approved, "!approved"
assert not self.strategies[strategy].active, "active"
assert self.totalDebtRatio + debtRatio <= MAX_TOTAL_DEBT_RATIO, "ratio > max"
assert minBorrow <= maxBorrow, "min borrow > max borrow"
self._append(strategy)
self.strategies[strategy].active = True
self.strategies[strategy].activated = True
self.strategies[strategy].debtRatio = debtRatio
self.strategies[strategy].minBorrow = minBorrow
self.strategies[strategy].maxBorrow = maxBorrow
self.totalDebtRatio += debtRatio
log AddStrategyToQueue(strategy)
@external
def removeStrategyFromQueue(strategy: address):
"""
@notice Deactivate strategy
@param strategy Addres of strategy
"""
assert msg.sender in [self.timeLock, self.admin, self.guardian], "!auth"
assert self.strategies[strategy].active, "!active"
self._remove(self._find(strategy))
self.strategies[strategy].active = False
self.totalDebtRatio -= self.strategies[strategy].debtRatio
self.strategies[strategy].debtRatio = 0
log RemoveStrategyFromQueue(strategy)
@external
def setQueue(queue: address[MAX_QUEUE]):
"""
@notice Reorder queue
@param queue Array of active strategies
"""
assert msg.sender in [self.timeLock, self.admin], "!auth"
# check no gaps in new queue
zero: bool = False
for i in range(MAX_QUEUE):
strat: address = queue[i]
if strat == ZERO_ADDRESS:
if not zero:
zero = True
else:
assert not zero, "gap"
# Check old and new queue counts of non zero strategies are equal
for i in range(MAX_QUEUE):
oldStrat: address = self.queue[i]
newStrat: address = queue[i]
if oldStrat == ZERO_ADDRESS:
assert newStrat == ZERO_ADDRESS, "new != 0"
else:
assert newStrat != ZERO_ADDRESS, "new = 0"
# Check new strategy is active and no duplicate
for i in range(MAX_QUEUE):
strat: address = queue[i]
if strat == ZERO_ADDRESS:
break
# code below will fail if duplicate strategy in new queue
assert self.strategies[strat].active, "!active"
self.strategies[strat].active = False
# update queue
for i in range(MAX_QUEUE):
strat: address = queue[i]
if strat == ZERO_ADDRESS:
break
self.strategies[strat].active = True
self.queue[i] = strat
log SetQueue(queue)
@external
def setDebtRatios(debtRatios: uint256[MAX_QUEUE]):
"""
@notice Update debt ratios of active strategies
@param debtRatios Array of debt ratios
"""
assert msg.sender in [self.timeLock, self.admin], "!auth"
# check that we're only setting debt ratio on active strategy
for i in range(MAX_QUEUE):
if self.queue[i] == ZERO_ADDRESS:
assert debtRatios[i] == 0, "debt ratio != 0"
# use memory to save gas
totalDebtRatio: uint256 = 0
for i in range(MAX_QUEUE):
addr: address = self.queue[i]
if addr == ZERO_ADDRESS:
break
debtRatio: uint256 = debtRatios[i]
self.strategies[addr].debtRatio = debtRatio
totalDebtRatio += debtRatio
self.totalDebtRatio = totalDebtRatio
assert self.totalDebtRatio <= MAX_TOTAL_DEBT_RATIO, "total > max"
log SetDebtRatios(debtRatios)
@external
def setMinMaxBorrow(strategy: address, minBorrow: uint256, maxBorrow: uint256):
"""
@notice Update `minBorrow` and `maxBorrow` of approved strategy
@param minBorrow Minimum amount to borrow per call to borrow()
@param maxBorrow Maximum amount to borrow per call to borrow()
"""
assert msg.sender in [self.timeLock, self.admin], "!auth"
assert self.strategies[strategy].approved, "!approved"
assert minBorrow <= maxBorrow, "min borrow > max borrow"
self.strategies[strategy].minBorrow = minBorrow
self.strategies[strategy].maxBorrow = maxBorrow
log SetMinMaxBorrow(strategy, minBorrow, maxBorrow)
# functions between Vault and this contract #
@external
def borrowFromVault(amount: uint256, _min: uint256):
"""
@notice Borrow ETH from vault
@param amount Amount of ETH to borrow
@param _min Minimum amount to borrow
"""
assert self.initialized, "!initialized"
assert msg.sender in [self.timeLock, self.admin, self.worker], "!auth"
# fails if vault not set
borrowed: uint256 = self.vault.borrow(amount)
assert borrowed >= _min, "borrowed < min"
log BorrowFromVault(self.vault.address, amount, borrowed)
@external
def repayVault(amount: uint256, _min: uint256):
"""
@notice Repay ETH to vault
@param amount Amount to repay
@param _min Minimum amount to repay
"""
assert self.initialized, "!initialized"
assert msg.sender in [self.timeLock, self.admin, self.worker], "!auth"
# fails if vault not set
repaid: uint256 = self.vault.repay(amount, value=amount)
assert repaid >= _min, "repaid < min"
log RepayVault(self.vault.address, amount, repaid)
@external
def reportToVault(_minTotal: uint256, _maxTotal: uint256):
"""
@notice Report gain and loss to vault
@param _minTotal Minumum of total assets
@param _maxTotal Maximum of total assets
@dev `_minTotal` and `_maxTotal` is used to check that totalAssets is
within a reasonable range before this function is called
"""
assert self.initialized, "!initialized"
assert msg.sender in [self.timeLock, self.admin, self.worker], "!auth"
total: uint256 = self._totalAssets()
assert total >= _minTotal and total <= _maxTotal, "total not in range"
debt: uint256 = self.vault.debt()
gain: uint256 = 0
loss: uint256 = 0
if total > debt:
gain = min(total - debt, self.balance)
else:
loss = debt - total
if gain > 0 or loss > 0:
self.vault.report(gain, loss, value=gain)
log ReportToVault(self.vault.address, total, debt, gain, loss)
# functions between vault -> this contract -> strategies #
@internal
def _withdraw(amount: uint256) -> uint256:
"""
@notice Withdraw ETH from active strategies
@param amount Amount of ETH to withdraw
@dev Returns sum of losses from active strategies that were withdrawn.
"""
_amount: uint256 = amount
totalLoss: uint256 = 0
for strategy in self.queue:
if strategy == ZERO_ADDRESS:
break
bal: uint256 = self.balance
if bal >= _amount:
break
debt: uint256 = self.strategies[strategy].debt
need: uint256 = min(_amount - bal, debt)
if need == 0:
continue
# loss must be <= debt
loss: uint256 = IStrategy(strategy).withdraw(need)
diff: uint256 = self.balance - bal
if loss > 0:
_amount -= loss
totalLoss += loss
self.strategies[strategy].debt -= loss
self.totalDebt -= loss
self.strategies[strategy].debt -= diff
self.totalDebt -= diff
log WithdrawStrategy(strategy, debt, need, loss, diff)
return totalLoss
@external
def withdraw(amount: uint256) -> uint256:
"""
@notice Withdraw ETH from fund manager back to vault
@param amount Amount of ETH to withdraw
@dev Returns sum of losses from active strategies that were withdrawn.
"""
assert self.initialized, "!initialized"
assert msg.sender == self.vault.address, "!vault"
total: uint256 = self._totalAssets()
_amount: uint256 = min(amount, total)
assert _amount > 0, "withdraw = 0"
debt: uint256 = self.vault.debt()
loss: uint256 = 0
if debt > total:
# debt > total can occur when strategies reported losses to this contract
# but this contract has not reported losses back to vault
loss = debt - total
bal: uint256 = self.balance
if _amount > bal:
# try to withdraw until balance of fund manager >= _amount
loss += self._withdraw(_amount)
_amount = min(_amount, self.balance)
if _amount > 0:
self._sendEth(msg.sender, _amount)
log Withdraw(msg.sender, amount, _amount, loss)
return loss
# functions between this contract and strategies #
@internal
@view
def _calcMaxBorrow(strategy: address) -> uint256:
"""
@notice Calculate how much ETH strategy can borrow
@param strategy Address of strategy
@dev Returns amount of ETH that `strategy` can borrow
"""
if (not self.initialized) or self.paused or self.totalDebtRatio == 0:
return 0
# strategy debtRatio > 0 only if strategy is active
limit: uint256 = (
self.strategies[strategy].debtRatio * self._totalAssets() / self.totalDebtRatio
)
debt: uint256 = self.strategies[strategy].debt
if debt >= limit:
return 0
available: uint256 = min(limit - debt, self.balance)
if available < self.strategies[strategy].minBorrow:
return 0
else:
return min(available, self.strategies[strategy].maxBorrow)
@external
@view
def calcMaxBorrow(strategy: address) -> uint256:
return self._calcMaxBorrow(strategy)
@internal
@view
def _calcOutstandingDebt(strategy: address) -> uint256:
"""
@notice Calculate amount of ETH that `strategy` should pay back to fund manager
@param strategy Address of strategy
@dev Returns minimum amount of ETH strategy should repay
"""
if not self.initialized:
return 0
if self.totalDebtRatio == 0:
return self.strategies[strategy].debt
limit: uint256 = (
self.strategies[strategy].debtRatio * self.totalDebt / self.totalDebtRatio
)
debt: uint256 = self.strategies[strategy].debt
if self.paused:
return debt
elif debt <= limit:
return 0
else:
return debt - limit
@external
@view
def calcOutstandingDebt(strategy: address) -> uint256:
return self._calcOutstandingDebt(strategy)
@external
@view
def getDebt(strategy: address) -> uint256:
"""
@notice Return debt of strategy
@param strategy Address of strategy
@dev Returns current debt of strategy
"""
return self.strategies[strategy].debt
@external
def borrow(amount: uint256) -> uint256:
"""
@notice Borrow ETH from fund manager
@param amount Amount of ETH to borrow
@dev Returns actual amount sent
@dev Only active strategy can borrow
"""
assert self.initialized, "!initialized"
assert not self.paused, "paused"
assert self.strategies[msg.sender].active, "!active"
_amount: uint256 = min(amount, self._calcMaxBorrow(msg.sender))
assert _amount > 0, "borrow = 0"
self._sendEth(msg.sender, _amount)
# include any fee on transfer to debt
self.strategies[msg.sender].debt += _amount
self.totalDebt += _amount
log Borrow(msg.sender, amount, _amount)
return _amount
@external
@payable
def repay(amount: uint256) -> uint256:
"""
@notice Repay debt to fund manager
@param amount Amount of ETH to repay
@dev Returns actual amount repaid
@dev Only approved strategy can repay
"""
assert self.initialized, "!initialized"
assert self.strategies[msg.sender].approved, "!approved"
assert amount == msg.value, "amount != msg.value"
assert amount > 0, "repay = 0"
self.strategies[msg.sender].debt -= amount
self.totalDebt -= amount
log Repay(msg.sender, amount, amount)
return amount
@external
@payable
def report(gain: uint256, loss: uint256):
"""
@notice Report gain and loss from strategy
@param gain Amount of profit
@param loss Amount of loss
"""
assert self.initialized, "!initialized"
assert self.strategies[msg.sender].active, "!active"
# 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"
if gain > 0:
pass
elif loss > 0:
self.strategies[msg.sender].debt -= loss
self.totalDebt -= loss
log Report(msg.sender, gain, loss, self.strategies[msg.sender].debt)
@external
def migrateStrategy(oldStrat: address, newStrat: address):
"""
@notice Migrate strategy
@param oldStrat Address of current strategy
@param newStrat Address of strategy to migrate to
"""
assert self.initialized, "!initialized"
assert msg.sender in [self.timeLock, self.admin], "!auth"
assert self.strategies[oldStrat].active, "old !active"
assert self.strategies[newStrat].approved, "new !approved"
assert not self.strategies[newStrat].activated, "activated"
strat: Strategy = self.strategies[oldStrat]
self.strategies[newStrat] = Strategy(
{
approved: True,
active: True,
activated: True,
debtRatio: strat.debtRatio,
debt: strat.debt,
minBorrow: strat.minBorrow,
maxBorrow: strat.maxBorrow,
}
)
self.strategies[oldStrat].active = False
self.strategies[oldStrat].debtRatio = 0
self.strategies[oldStrat].debt = 0
self.strategies[oldStrat].minBorrow = 0
self.strategies[oldStrat].maxBorrow = 0
# find and replace strategy
i: uint256 = self._find(oldStrat)
self.queue[i] = newStrat
IStrategy(oldStrat).migrate(newStrat)
log MigrateStrategy(oldStrat, newStrat)
@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
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"SetAdmin","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetGuardian","inputs":[{"name":"guardian","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetWorker","inputs":[{"name":"worker","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetPause","inputs":[{"name":"paused","type":"bool","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetVault","inputs":[{"name":"vault","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ApproveStrategy","inputs":[{"name":"strategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"RevokeStrategy","inputs":[{"name":"strategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"AddStrategyToQueue","inputs":[{"name":"strategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"RemoveStrategyFromQueue","inputs":[{"name":"strategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"SetQueue","inputs":[{"name":"queue","type":"address[20]","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetDebtRatios","inputs":[{"name":"debtRatios","type":"uint256[20]","indexed":false}],"anonymous":false,"type":"event"},{"name":"SetMinMaxBorrow","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"minBorrow","type":"uint256","indexed":false},{"name":"maxBorrow","type":"uint256","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":"BorrowFromVault","inputs":[{"name":"vault","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"borrowed","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RepayVault","inputs":[{"name":"vault","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"repaid","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"ReportToVault","inputs":[{"name":"vault","type":"address","indexed":true},{"name":"total","type":"uint256","indexed":false},{"name":"debt","type":"uint256","indexed":false},{"name":"gain","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Withdraw","inputs":[{"name":"vault","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"actual","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"WithdrawStrategy","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"debt","type":"uint256","indexed":false},{"name":"need","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false},{"name":"diff","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Borrow","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"borrowed","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Repay","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false},{"name":"repaid","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Report","inputs":[{"name":"strategy","type":"address","indexed":true},{"name":"gain","type":"uint256","indexed":false},{"name":"loss","type":"uint256","indexed":false},{"name":"debt","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"MigrateStrategy","inputs":[{"name":"oldStrategy","type":"address","indexed":true},{"name":"newStrategy","type":"address","indexed":true}],"anonymous":false,"type":"event"},{"name":"Migrate","inputs":[{"name":"fundManager","type":"address","indexed":false},{"name":"bal","type":"uint256","indexed":false},{"name":"totalDebt","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"guardian","type":"address"},{"name":"worker","type":"address"},{"name":"oldFundManager","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":5994021},{"stateMutability":"nonpayable","type":"function","name":"migrate","inputs":[{"name":"fundManager","type":"address"}],"outputs":[],"gas":625644},{"stateMutability":"nonpayable","type":"function","name":"setNextTimeLock","inputs":[{"name":"nextTimeLock","type":"address"}],"outputs":[],"gas":39101},{"stateMutability":"nonpayable","type":"function","name":"acceptTimeLock","inputs":[],"outputs":[],"gas":39023},{"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":"setWorker","inputs":[{"name":"worker","type":"address"}],"outputs":[],"gas":41742},{"stateMutability":"nonpayable","type":"function","name":"setPause","inputs":[{"name":"paused","type":"bool"}],"outputs":[],"gas":44040},{"stateMutability":"nonpayable","type":"function","name":"setVault","inputs":[{"name":"vault","type":"address"}],"outputs":[],"gas":41776},{"stateMutability":"view","type":"function","name":"totalAssets","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3635},{"stateMutability":"nonpayable","type":"function","name":"approveStrategy","inputs":[{"name":"strategy","type":"address"}],"outputs":[],"gas":166804},{"stateMutability":"nonpayable","type":"function","name":"revokeStrategy","inputs":[{"name":"strategy","type":"address"}],"outputs":[],"gas":31656},{"stateMutability":"nonpayable","type":"function","name":"addStrategyToQueue","inputs":[{"name":"strategy","type":"address"},{"name":"debtRatio","type":"uint256"},{"name":"minBorrow","type":"uint256"},{"name":"maxBorrow","type":"uint256"}],"outputs":[],"gas":1773871},{"stateMutability":"nonpayable","type":"function","name":"removeStrategyFromQueue","inputs":[{"name":"strategy","type":"address"}],"outputs":[],"gas":1673031},{"stateMutability":"nonpayable","type":"function","name":"setQueue","inputs":[{"name":"queue","type":"address[20]"}],"outputs":[],"gas":1941256},{"stateMutability":"nonpayable","type":"function","name":"setDebtRatios","inputs":[{"name":"debtRatios","type":"uint256[20]"}],"outputs":[],"gas":862108},{"stateMutability":"nonpayable","type":"function","name":"setMinMaxBorrow","inputs":[{"name":"strategy","type":"address"},{"name":"minBorrow","type":"uint256"},{"name":"maxBorrow","type":"uint256"}],"outputs":[],"gas":80916},{"stateMutability":"nonpayable","type":"function","name":"borrowFromVault","inputs":[{"name":"amount","type":"uint256"},{"name":"_min","type":"uint256"}],"outputs":[],"gas":19116},{"stateMutability":"nonpayable","type":"function","name":"repayVault","inputs":[{"name":"amount","type":"uint256"},{"name":"_min","type":"uint256"}],"outputs":[],"gas":53149},{"stateMutability":"nonpayable","type":"function","name":"reportToVault","inputs":[{"name":"_minTotal","type":"uint256"},{"name":"_maxTotal","type":"uint256"}],"outputs":[],"gas":66905},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":3286612},{"stateMutability":"view","type":"function","name":"calcMaxBorrow","inputs":[{"name":"strategy","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":26763},{"stateMutability":"view","type":"function","name":"calcOutstandingDebt","inputs":[{"name":"strategy","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":20613},{"stateMutability":"view","type":"function","name":"getDebt","inputs":[{"name":"strategy","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3491},{"stateMutability":"nonpayable","type":"function","name":"borrow","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":149965},{"stateMutability":"payable","type":"function","name":"repay","inputs":[{"name":"amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":82977},{"stateMutability":"payable","type":"function","name":"report","inputs":[{"name":"gain","type":"uint256"},{"name":"loss","type":"uint256"}],"outputs":[],"gas":86034},{"stateMutability":"nonpayable","type":"function","name":"migrateStrategy","inputs":[{"name":"oldStrat","type":"address"},{"name":"newStrat","type":"address"}],"outputs":[],"gas":468847},{"stateMutability":"nonpayable","type":"function","name":"sweep","inputs":[{"name":"token","type":"address"}],"outputs":[],"gas":18727},{"stateMutability":"view","type":"function","name":"paused","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3378},{"stateMutability":"view","type":"function","name":"initialized","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3408},{"stateMutability":"view","type":"function","name":"vault","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":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3528},{"stateMutability":"view","type":"function","name":"guardian","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3558},{"stateMutability":"view","type":"function","name":"worker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3588},{"stateMutability":"view","type":"function","name":"totalDebt","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3618},{"stateMutability":"view","type":"function","name":"totalDebtRatio","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3648},{"stateMutability":"view","type":"function","name":"strategies","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"approved","type":"bool"},{"name":"active","type":"bool"},{"name":"activated","type":"bool"},{"name":"debtRatio","type":"uint256"},{"name":"debt","type":"uint256"},{"name":"minBorrow","type":"uint256"},{"name":"maxBorrow","type":"uint256"}],"gas":17837},{"stateMutability":"view","type":"function","name":"queue","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"address"}],"gas":3817},{"stateMutability":"view","type":"function","name":"oldFundManager","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3738}]Contract Creation Code
6060614abb610140396020614abb60c03960c05160a01c1561002057600080fd5b60206020614abb0160c03960c05160a01c1561003b57600080fd5b60206040614abb0160c03960c05160a01c1561005657600080fd5b3360035533600555610140516006556101605160075560006101805118156101155761018051600c5573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6020610200600463fc0c546a6101a0526101bc600c545afa6100b557600080fd5b601f3d116100c257600080fd5b60005061020051141515610115576308c379a061022052602061024052601d610260527f6f6c642066756e64206d616e6167657220746f6b656e20213d204554480000006102805261026050606461023cfd5b614aa356600436101561000d57613e29565b600035601c52600051638129fc1c8114156105ac57600154151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b600c54151561012057600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6105a5565b600c5433141515610170576308c379a0610140526020610160526011610180527f216f6c642066756e64206d616e616765720000000000000000000000000000006101a05261018050606461015cfd5b60206101a0600463fbfa77cf6101405261015c600c545afa61019157600080fd5b601f3d1161019e57600080fd5b6000506101a0516002541415156101f4576308c379a06101c05260206101e052601f610200527f6f6c642066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b60206101a0600463fc7b9c186101405261015c600c545afa61021557600080fd5b601f3d1161022257600080fd5b6000506101a05160085560206101a06004632df9eab96101405261015c600c545afa61024d57600080fd5b601f3d1161025a57600080fd5b6000506101a05160095561014060006014818352015b6020610200602463ddf0b00961018052610140516101a05261019c600c545afa61029957600080fd5b601f3d116102a657600080fd5b60005061020051610160526101605115156102c0576105a2565b3060206101e06004636209ec2d6101805261019c610160515afa6102e357600080fd5b601f3d116102f057600080fd5b6000506101e051141515610343576308c379a061020052602061022052601d610240527f73747261746567792066756e64206d616e6167657220213d2073656c660000006102605261024050606461021cfd5b60e0366101803760e06102e060246339ebf82361026052610160516102805261027c600c545afa61037357600080fd5b60df3d1161038057600080fd5b6102e080808080516103c0525050602081019050808080516103e0525050602081019050808080516104005250506020810190508080805161042052505060208101905080808051610440525050602081019050808080516104605250506020810190508080805161048052505050506000506103c080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c001516102405250610180511515610482576308c379a06102605260206102805260096102a0527f21617070726f76656400000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101a05115156104d1576308c379a06102605260206102805260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101c0511515610520576308c379a061026052602061028052600a6102a0527f21616374697661746564000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b61016051610140516014811061053557600080fd5b600b60c052602060c0200155600a6101605160e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101e0516003820155610200516004820155610220516005820155610240516006820155505b8151600101808352811415610270575b50505b6001600155005b63371fd8e681141561079e576001541515610606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600a3360e05260c052604060c02060c052602060c020541515610668576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b346004351415156106b8576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610709576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004600a3360e05260c052604060c02060c052602060c0200180546004358082101561073457600080fd5b80820390509050815550600880546004358082101561075257600080fd5b808203905090508155506004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c09858114156109f35760015415156107f8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c0200154151561085d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60006004351015156108725760243515610875565b60005b15610881576001610899565b60043515156108965760006024351015610899565b60005b15156108e4576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610934576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b60006004351115610944576109a3565b600060243511156109a3576004600a3360e05260c052604060c02060c052602060c0200180546024358082101561097a57600080fd5b80820390509050815550600880546024358082101561099857600080fd5b808203905090508155505b60406004610140376004600a3360e05260c052604060c02060c052602060c020015461018052337f36d8646df39e8831ab3926651692b6a0ea874e6cc807ea1c428fcf2ba32859f86060610140a2005b63fc0c546a811415610a28573415610a0a57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb811415610e1b573415610a3f57600080fd5b60043560a01c15610a4f57600080fd5b60035433141515610a9f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610aed576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610b3b576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610b7157600080fd5b601f3d11610b7e57600080fd5b6000506101a051141515610bd1576308c379a06101c05260206101e052601d610200527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000610220526102005060646101dcfd5b60025460206101a0600463fbfa77cf6101405261015c6004355afa610bf557600080fd5b601f3d11610c0257600080fd5b6000506101a051141515610c55576308c379a06101c05260206101e052601f610200527f6e65772066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b61016060006014818352015b61016051600b60c052602060c020015461014052610140511515610c8457610d3e565b60043560206101e06004636209ec2d6101805261019c610140515afa610ca957600080fd5b601f3d11610cb657600080fd5b6000506101e051141515610d2e576308c379a0610200526020610220526029610240527f73747261746567792066756e64206d616e6167657220213d206e65772066756e610260527f64206d616e6167657200000000000000000000000000000000000000000000006102805261024050608461021cfd5b8151600101808352811415610c61575b505047610140526004353b610d5257600080fd5b600060006004638129fc1c6101605261017c610140516004355af1610d7657600080fd5b6004356101605261014051610180526008546101a0527fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c6060610160a1600060085561018060006014818352015b61018051600b60c052602060c020015461016052610160511515610de757610e17565b60006004600a6101605160e05260c052604060c02060c052602060c02001555b8151600101808352811415610dc4575b5050005b6347a02a44811415610ec8573415610e3257600080fd5b60043560a01c15610e4257600080fd5b60035433141515610e92576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600455600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e811415610f61573415610edf57600080fd5b60045433141515610f2f576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b3360035533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c0281141561105f573415610f7857600080fd5b60043560a01c15610f8857600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415610fc75760018352610fd7565b8151600101808352811415610fab575b505050610140511515611029576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600555600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561115d57341561107657600080fd5b60043560a01c1561108657600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156110c557600183526110d5565b81516001018083528114156110a9575b505050610140511515611127576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63c26f6d4481141561125b57341561117457600080fd5b60043560a01c1561118457600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156111c357600183526111d3565b81516001018083528114156111a7575b505050610140511515611225576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527fcabc8521621c89fc973d8f1e8455da2ce64a666915af33e0ebaa69cd5215083b6020610140a1005b63bedb86fb81141561136057341561127257600080fd5b60043560011c1561128257600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156112c857600183526112d8565b81516001018083528114156112ac575b50505061014051151561132a576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600055600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b636817031b8114156114a357341561137757600080fd5b60043560a01c1561138757600080fd5b600354331415156113d7576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61140d57600080fd5b601f3d1161141a57600080fd5b6000506101a05114151561146d576308c379a06101c05260206101e0526012610200527f7661756c7420746f6b656e20213d204554480000000000000000000000000000610220526102005060646101dcfd5b600435600255600435610140527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f306020610140a1005b6301e1d1148114156114d45734156114ba57600080fd5b6006580161406d565b610140526101405160005260206000f35b633b8ae39781141561173a5734156114eb57600080fd5b60043560a01c156114fb57600080fd5b6003543314151561154b576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60043560e05260c052604060c02060c052602060c020541515156115b0576308c379a0610140526020610160526008610180527f617070726f7665640000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a06004636209ec2d6101405261015c6004355afa6115d257600080fd5b601f3d116115df57600080fd5b6000506101a051141515611632576308c379a06101c05260206101e052601d610200527f73747261746567792066756e64206d616e6167657220213d2074686973000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61166857600080fd5b601f3d1161167557600080fd5b6000506101a0511415156116c8576308c379a06101c05260206101e0526015610200527f737472617465677920746f6b656e20213d204554480000000000000000000000610220526102005060646101dcfd5b600a60043560e05260c052604060c02060c052602060c02060018155600060018201556000600282015560006003820155600060048201556000600582015560006006820155506004357f4c6d0fbb89373829bc56000a87d561331bca06f725fd8861d055215ed90f209b60006000a2005b63bb994d4881141561191457341561175157600080fd5b60043560a01c1561176157600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156117a057600183526117b0565b8151600101808352811415611784575b505050610140511515611802576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611866576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515156118ce576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600a60043560e05260c052604060c02060c052602060c020556004357f7d3e35e217272b8400fec8397b08eb8c60c4db9ae834af14ac0fc9c0bb914a8f60006000a2005b635f1ac310811415611c6257341561192b57600080fd5b60043560a01c1561193b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b61012051602002610160015133141561197a576001835261198a565b815160010180835281141561195e575b5050506101405115156119dc576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611a40576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151515611aa8576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b612710600954602435818183011015611ac057600080fd5b8082019050905011151515611b14576308c379a061014052602061016052600b610180527f726174696f203e206d61780000000000000000000000000000000000000000006101a05261018050606461015cfd5b60643560443511151515611b67576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6004356101405261014051600658016141e1565b60005060016001600a60043560e05260c052604060c02060c052602060c020015560016002600a60043560e05260c052604060c02060c052602060c02001556024356003600a60043560e05260c052604060c02060c052602060c02001556044356005600a60043560e05260c052604060c02060c052602060c02001556064356006600a60043560e05260c052604060c02060c052602060c020015560098054602435818183011015611c2d57600080fd5b808201905090508155506004357fa3cbd67e6583e6c7ef034e5f87b7b40b0a0e87182a8377dfb42e59aa414c6cd560006000a2005b63b22439f5811415611e96573415611c7957600080fd5b60043560a01c15611c8957600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b610120516020026101600151331415611ccf5760018352611cdf565b8151600101808352811415611cb3575b505050610140511515611d31576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515611d98576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014052610140516006580161437e565b6101a0526101a0516101c0526101405161016051610180516101a0516101c0516101c0516101e0526101e05160065801614277565b6101c0526101a05261018052610160526101405260005060006001600a60043560e05260c052604060c02060c052602060c0200155600980546003600a60043560e05260c052604060c02060c052602060c020015480821015611e4357600080fd5b8082039050905081555060006003600a60043560e05260c052604060c02060c052602060c02001556004357fff2f97c1f3529c6b02543b63f7efae22cdc885048adf65c679a1c5c4ea3b2fa860006000a2005b63c5cde90b811415612361573415611ead57600080fd5b6000610120525b610120516004013560a01c15611ec957600080fd5b6020610120510161012052610280610120511015611ee657611eb4565b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415611f255760018352611f35565b8151600101808352811415611f09575b505050610140511515611f87576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405261016060006014818352015b60046101605160148110611fac57600080fd5b602002013561018052610180511515611fd557610140511515611fd0576001610140525b612025565b61014051151515612025576308c379a06101a05260206101c05260036101e0527f6761700000000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b8151600101808352811415611f99575b505061016060006014818352015b610160516014811061205457600080fd5b600b60c052602060c0200154610180526004610160516014811061207757600080fd5b60200201356101a0526101805115156120df576101a0511515156120da576308c379a06101c05260206101e0526008610200527f6e657720213d2030000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b612132565b60006101a05114151515612132576308c379a06101c05260206101e0526007610200527f6e6577203d203000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b8151600101808352811415612043575b505061016060006014818352015b6004610160516014811061216357600080fd5b60200201356101805261018051151561217b57612213565b6001600a6101805160e05260c052604060c02060c052602060c020015415156121e3576308c379a06101a05260206101c05260076101e0527f2161637469766500000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006001600a6101805160e05260c052604060c02060c052602060c02001555b8151600101808352811415612150575b505061016060006014818352015b6004610160516014811061223457600080fd5b60200201356101805261018051151561224c5761229d565b60016001600a6101805160e05260c052604060c02060c052602060c020015561018051610160516014811061228057600080fd5b600b60c052602060c02001555b8151600101808352811415612221575b505060043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527fa03ab32749bdff946d914bdbc7fadedf2bdeb6a83f2b56effa25a0eae1012675610280610160a1005b63260829c081141561268e57341561237857600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156123b757600183526123c7565b815160010180835281141561239b575b505050610140511515612419576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61014060006014818352015b610140516014811061243657600080fd5b600b60c052602060c020015415156124ac576004610140516014811061245b57600080fd5b60200201351515156124ac576308c379a061016052602061018052600f6101a0527f6465627420726174696f20213d203000000000000000000000000000000000006101c0526101a050606461017cfd5b8151600101808352811415612425575b505060006101405261016060006014818352015b61016051601481106124e157600080fd5b600b60c052602060c02001546101805261018051151561250057612570565b6004610160516014811061251357600080fd5b60200201356101a0526101a0516003600a6101805160e05260c052604060c02060c052602060c020015561014080516101a05181818301101561255557600080fd5b808201905090508152505b81516001018083528114156124d0575b505061014051600955612710600954111515156125cc576308c379a061016052602061018052600b6101a0527f746f74616c203e206d61780000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527f8edb07c0d6dfa3d8e47f8faaeffa94a7c21b80ebb98ccf264581f64c8270a906610280610160a1005b63da1714318114156128855734156126a557600080fd5b60043560a01c156126b557600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156126f45760018352612704565b81516001018083528114156126d8575b505050610140511515612756576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c0205415156127ba576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6044356024351115151561280d576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6024356005600a60043560e05260c052604060c02060c052602060c02001556044356006600a60043560e05260c052604060c02060c052602060c020015560243561014052604435610160526004357ffedf8d30e937b57e4e95271e9f17cfab1a1315ac6d612ef72912405e9524f7d56040610140a2005b63505b6a76811415612a6357341561289c57600080fd5b60015415156128ea576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156129305760018352612940565b8151600101808352811415612914575b505050610140511515612992576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463c5ebeaec610160526004356101805261017c60006002545af16129bc57600080fd5b601f3d116129c957600080fd5b6000506101e051610140526024356101405110151515612a28576308c379a061016052602061018052600e6101a0527f626f72726f776564203c206d696e0000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547fb87de9931230544a0b3a00e753f5ab70f79a54e84e47bcad4239e1c1c97588d36040610160a2005b6348b8a1f9811415612c42573415612a7a57600080fd5b6001541515612ac8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612b0e5760018352612b1e565b8151600101808352811415612af2575b505050610140511515612b70576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463371fd8e6610160526004356101805261017c6004356002545af1612b9b57600080fd5b601f3d11612ba857600080fd5b6000506101e051610140526024356101405110151515612c07576308c379a061016052602061018052600c6101a0527f726570616964203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547f447949f39e7c140dbba1469e2e065abd8a278ac561449a4fcd1c51f5aadc91d86040610160a2005b63d5b6e219811415612f2c573415612c5957600080fd5b6001541515612ca7576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612ced5760018352612cfd565b8151600101808352811415612cd1575b505050610140511515612d4f576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b610140516006580161406d565b6101605261014052610160516101405260043561014051101515612d8857602435610140511115612d8b565b60005b1515612dd6576308c379a06101605260206101805260126101a0527f746f74616c206e6f7420696e2072616e676500000000000000000000000000006101c0526101a050606461017cfd5b60206101e06004630dca59c16101805261019c6002545afa612df757600080fd5b601f3d11612e0457600080fd5b6000506101e051610160526040366101803761016051610140511115612e5e57610140516101605180821015612e3957600080fd5b808203905090504780821115612e4f5780612e51565b815b9050905061018052612e7f565b610160516101405180821015612e7357600080fd5b808203905090506101a0525b6000610180511115612e92576001612e9a565b60006101a051115b15612ee0576002543b612eac57600080fd5b60006000604463753c09856101c052610180516101e0526101a051610200526101dc610180516002545af1612ee057600080fd5b610140516101c052610160516101e05261018051610200526101a051610220526002547fd94ac81cdb49ea558800854e3bfd1aedf2a0a02abc471047c34e382fd5137cbd60806101c0a2005b632e1a7d4d811415613213573415612f4357600080fd5b6001541515612f91576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60025433141515612fe1576308c379a0610140526020610160526006610180527f217661756c7400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140516006580161406d565b6101605261014052610160516101405260043561014051808211156130135780613015565b815b905090506101605260006101605111151561306f576308c379a06101805260206101a052600c6101c0527f7769746864726177203d203000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60206102006004630dca59c16101a0526101bc6002545afa61309057600080fd5b601f3d1161309d57600080fd5b600050610200516101805260006101a052610140516101805111156130dd576101805161014051808210156130d157600080fd5b808203905090506101a0525b476101c0526101c051610160511115613171576101a080516101405161016051610180516101a0516101c051610160516101e0526101e05160065801614422565b610240526101c0526101a0526101805261016052610140526102405181818301101561314957600080fd5b808201905090508152506101605147808211156131665780613168565b815b90509050610160525b60006101605111156131c7576101405161016051610180516101a0516101c051336101e0526101605161020052610200516101e05160065801613e2b565b6101c0526101a0526101805261016052610140526000505b6004356101e05261016051610200526101a05161022052337f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9460606101e0a26101a05160005260206000f35b63f19f054281141561325f57341561322a57600080fd5b60043560a01c1561323a57600080fd5b6004356101405261014051600658016146b6565b6101a0526101a05160005260206000f35b63c6f2be588114156132ab57341561327657600080fd5b60043560a01c1561328657600080fd5b60043561014052610140516006580161485d565b6101a0526101a05160005260206000f35b639a78e72e8114156132f75734156132c257600080fd5b60043560a01c156132d257600080fd5b6004600a60043560e05260c052604060c02060c052602060c020015460005260206000f35b63c5ebeaec81141561356557341561330e57600080fd5b600154151561335c576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515156133ab576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c02001541515613410576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014051336101605261016051600658016146b6565b6101c052610140526101c051808211156134435780613445565b815b905090506101405260006101405111151561349f576308c379a061016052602061018052600a6101a0527f626f72726f77203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405133610160526101405161018052610180516101605160065801613e2b565b610140526000506004600a3360e05260c052604060c02060c052602060c020018054610140518181830110156134f657600080fd5b80820190509050815550600880546101405181818301101561351757600080fd5b80820190509050815550600435610160526101405161018052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610160a26101405160005260206000f35b636cb56d19811415613a1457341561357c57600080fd5b60043560a01c1561358c57600080fd5b60243560a01c1561359c57600080fd5b60015415156135ea576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156136295760018352613639565b815160010180835281141561360d575b50505061014051151561368b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6001600a60043560e05260c052604060c02060c052602060c020015415156136f2576308c379a061014052602061016052600b610180527f6f6c6420216163746976650000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60243560e05260c052604060c02060c052602060c020541515613756576308c379a061014052602061016052600d610180527f6e65772021617070726f766564000000000000000000000000000000000000006101a05261018050606461015cfd5b6002600a60243560e05260c052604060c02060c052602060c02001541515156137be576308c379a0610140526020610160526009610180527f61637469766174656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140600a60043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015260048160c052602060c0200154826080015260058160c052602060c02001548260a0015260068160c052602060c02001548260c001525050600a60243560e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101a05160038201556101c05160048201556101e05160058201556102005160068201555060006001600a60043560e05260c052604060c02060c052602060c020015560006003600a60043560e05260c052604060c02060c052602060c020015560006004600a60043560e05260c052604060c02060c052602060c020015560006005600a60043560e05260c052604060c02060c052602060c020015560006006600a60043560e05260c052604060c02060c052602060c02001556101405161016051610180516101a0516101c0516101e051610200516102205160043561024052610240516006580161437e565b6102a05261022052610200526101e0526101c0526101a0526101805261016052610140526102a0516102205260243561022051601481106139a457600080fd5b600b60c052602060c02001556004353b6139bd57600080fd5b60006000602463ce5494bb610240526024356102605261025c60006004355af16139e657600080fd5b6024356004357f9249d6a64288c19c5be5f4f1bb9b763ad4afac803128f1ef65b88acb13df9aa460006000a3005b6301681a62811415613b78573415613a2b57600080fd5b60043560a01c15613a3b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415613a7a5760018352613a8a565b8151600101808352811415613a5e575b505050610140511515613adc576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa613b0257600080fd5b601f3d11613b0f57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613ed3565b6101e0526101c0526101a052610180526101605261014052600050005b635c975abb811415613b9b573415613b8f57600080fd5b60005460005260206000f35b63158ef93e811415613bbe573415613bb257600080fd5b60015460005260206000f35b63fbfa77cf811415613be1573415613bd557600080fd5b60025460005260206000f35b63d085835a811415613c04573415613bf857600080fd5b60035460005260206000f35b63b127df87811415613c27573415613c1b57600080fd5b60045460005260206000f35b63f851a440811415613c4a573415613c3e57600080fd5b60055460005260206000f35b63452a9320811415613c6d573415613c6157600080fd5b60065460005260206000f35b634d547ada811415613c90573415613c8457600080fd5b60075460005260206000f35b63fc7b9c18811415613cb3573415613ca757600080fd5b60085460005260206000f35b632df9eab9811415613cd6573415613cca57600080fd5b60095460005260206000f35b6339ebf823811415613dc8573415613ced57600080fd5b60043560a01c15613cfd57600080fd5b600a60043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c020015481525050602081019050808060048560c052602060c020015481525050602081019050808060058560c052602060c020015481525050602081019050808060068560c052602060c02001548152505060e09050905060c05260c051610140f35b63ddf0b009811415613e04573415613ddf57600080fd5b60043560148110613def57600080fd5b600b60c052602060c020015460005260206000f35b63a598adff811415613e27573415613e1b57600080fd5b600c5460005260206000f35b505b005b61018052610140526101605260006101405114151515613e8a576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af1613ead57600080fd5b5050600060006101e05161020061016051610140515af1613ecd57600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613f7c57600080fd5b505060206103e0610320516103406000610140515af1613f9b57600080fd5b60203d80821115613fac5780613fae565b815b905090506103c0526103c08051602001806101c08284600060045af1613fd357600080fd5b505060006101c0511115614067576101c0806020015160008251806020901315613ffc57600080fd5b809190121561400a57600080fd5b806020036101000a820490509050905015151515614067576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b610140524760085481818301101561408457600080fd5b8082019050905060005260005161014051565b610140526102a0366101603761042060006014818352015b61042051600b60c052602060c020015461040052600061040051181561410d57610400516101606103e051601481106140e757600080fd5b60200201526103e08051600181818301101561410257600080fd5b808201905090508152505b81516001018083528114156140af575b5050600b60c052602060c0206101605181556101805160018201556101a05160028201556101c05160038201556101e05160048201556102005160058201556102205160068201556102405160078201556102605160088201556102805160098201556102a051600a8201556102c051600b8201556102e051600c82015561030051600d82015561032051600e82015561034051600f8201556103605160108201556103805160118201556103a05160128201556103c05160138201555061014051565b61016052610140526013600b60c052602060c0200154151515614243576308c379a06101805260206101a052600b6101c0527f7175657565203e206d61780000000000000000000000000000000000000000006101e0526101c050606461019cfd5b610140516013600b60c052602060c0200155610140516101605160065801614097565b610160526101405260005061016051565b61016052610140526014610140511015156142d1576308c379a06101805260206101a05260086101c0527f69203e3d206d61780000000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b600061014051601481106142e457600080fd5b600b60c052602060c02001541415151561433d576308c379a06101805260206101a052600d6101c0527f217a65726f2061646472657373000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061435057600080fd5b600b60c052602060c0200155610140516101605160065801614097565b610160526101405260005061016051565b610160526101405261018060006014818352015b6101405161018051601481106143a757600080fd5b600b60c052602060c020015414156143cb5761018051600052505060005161016051565b8151600101808352811415614392575b50506308c379a06101805260206101a05260096101c0527f6e6f7420666f756e6400000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101605261014052610140516101805260006101a0526101e060006014818352015b6101e051600b60c052602060c02001546101c0526101c0511515614467576146a4565b47610200526101805161020051101515614480576146a4565b6004600a6101c05160e05260c052604060c02060c052602060c0200154610220526101805161020051808210156144b657600080fd5b8082039050905061022051808211156144cf57806144d1565b815b90509050610240526102405115156144e857614694565b60206103006024632e1a7d4d61028052610240516102a05261029c60006101c0515af161451457600080fd5b601f3d1161452157600080fd5b600050610300516102605247610200518082101561453e57600080fd5b808203905090506102805260006102605111156145f0576101808051610260518082101561456b57600080fd5b808203905090508152506101a080516102605181818301101561458d57600080fd5b808201905090508152506004600a6101c05160e05260c052604060c02060c052602060c02001805461026051808210156145c657600080fd5b808203905090508155506008805461026051808210156145e557600080fd5b808203905090508155505b6004600a6101c05160e05260c052604060c02060c052602060c020018054610280518082101561461f57600080fd5b8082039050905081555060088054610280518082101561463e57600080fd5b80820390509050815550610220516102a052610240516102c052610260516102e05261028051610300526101c0517fa1db2d4488a8004dde12ff73253859b508b0458878ea4086047bab6672f9f1d760806102a0a25b8151600101808352811415614444575b50506101a05160005260005161016051565b610160526101405260015415156146ce5760016146e2565b600054156146dd5760016146e2565b600954155b156146f557600060005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c02001546101405161016051610180516006580161406d565b6101a0526101805261016052610140526101a051808202821582848304141761474f57600080fd5b80905090509050600954808061476457600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a052610180516101a0511015156147ac57600060005260005161016051565b610180516101a051808210156147c157600080fd5b8082039050905047808211156147d757806147d9565b815b905090506101c0526005600a6101405160e05260c052604060c02060c052602060c02001546101c051101561481a576000600052600051610160515661485b565b6101c0516006600a6101405160e05260c052604060c02060c052602060c020015480821115614849578061484b565b815b9050905060005260005161016051565b005b6101605261014052600154151561487c57600060005260005161016051565b60095415156148ae576004600a6101405160e05260c052604060c02060c052602060c020015460005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c020015460085480820282158284830414176148e257600080fd5b8090509050905060095480806148f757600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a0526000541561493e576101a0516000526000516101605156614987565b610180516101a05111151561495f5760006000526000516101605156614987565b6101a051610180518082101561497457600080fd5b8082039050905060005260005161016051565b005b61011a614aa30361011a60003961011a614aa3036000f300000000000000000000000086d10751b18f3fe331c146546868a07224a8598b00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x600436101561000d57613e29565b600035601c52600051638129fc1c8114156105ac57600154151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b600c54151561012057600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6105a5565b600c5433141515610170576308c379a0610140526020610160526011610180527f216f6c642066756e64206d616e616765720000000000000000000000000000006101a05261018050606461015cfd5b60206101a0600463fbfa77cf6101405261015c600c545afa61019157600080fd5b601f3d1161019e57600080fd5b6000506101a0516002541415156101f4576308c379a06101c05260206101e052601f610200527f6f6c642066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b60206101a0600463fc7b9c186101405261015c600c545afa61021557600080fd5b601f3d1161022257600080fd5b6000506101a05160085560206101a06004632df9eab96101405261015c600c545afa61024d57600080fd5b601f3d1161025a57600080fd5b6000506101a05160095561014060006014818352015b6020610200602463ddf0b00961018052610140516101a05261019c600c545afa61029957600080fd5b601f3d116102a657600080fd5b60005061020051610160526101605115156102c0576105a2565b3060206101e06004636209ec2d6101805261019c610160515afa6102e357600080fd5b601f3d116102f057600080fd5b6000506101e051141515610343576308c379a061020052602061022052601d610240527f73747261746567792066756e64206d616e6167657220213d2073656c660000006102605261024050606461021cfd5b60e0366101803760e06102e060246339ebf82361026052610160516102805261027c600c545afa61037357600080fd5b60df3d1161038057600080fd5b6102e080808080516103c0525050602081019050808080516103e0525050602081019050808080516104005250506020810190508080805161042052505060208101905080808051610440525050602081019050808080516104605250506020810190508080805161048052505050506000506103c080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c001516102405250610180511515610482576308c379a06102605260206102805260096102a0527f21617070726f76656400000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101a05115156104d1576308c379a06102605260206102805260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101c0511515610520576308c379a061026052602061028052600a6102a0527f21616374697661746564000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b61016051610140516014811061053557600080fd5b600b60c052602060c0200155600a6101605160e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101e0516003820155610200516004820155610220516005820155610240516006820155505b8151600101808352811415610270575b50505b6001600155005b63371fd8e681141561079e576001541515610606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600a3360e05260c052604060c02060c052602060c020541515610668576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b346004351415156106b8576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610709576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004600a3360e05260c052604060c02060c052602060c0200180546004358082101561073457600080fd5b80820390509050815550600880546004358082101561075257600080fd5b808203905090508155506004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c09858114156109f35760015415156107f8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c0200154151561085d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60006004351015156108725760243515610875565b60005b15610881576001610899565b60043515156108965760006024351015610899565b60005b15156108e4576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610934576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b60006004351115610944576109a3565b600060243511156109a3576004600a3360e05260c052604060c02060c052602060c0200180546024358082101561097a57600080fd5b80820390509050815550600880546024358082101561099857600080fd5b808203905090508155505b60406004610140376004600a3360e05260c052604060c02060c052602060c020015461018052337f36d8646df39e8831ab3926651692b6a0ea874e6cc807ea1c428fcf2ba32859f86060610140a2005b63fc0c546a811415610a28573415610a0a57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb811415610e1b573415610a3f57600080fd5b60043560a01c15610a4f57600080fd5b60035433141515610a9f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610aed576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610b3b576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610b7157600080fd5b601f3d11610b7e57600080fd5b6000506101a051141515610bd1576308c379a06101c05260206101e052601d610200527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000610220526102005060646101dcfd5b60025460206101a0600463fbfa77cf6101405261015c6004355afa610bf557600080fd5b601f3d11610c0257600080fd5b6000506101a051141515610c55576308c379a06101c05260206101e052601f610200527f6e65772066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b61016060006014818352015b61016051600b60c052602060c020015461014052610140511515610c8457610d3e565b60043560206101e06004636209ec2d6101805261019c610140515afa610ca957600080fd5b601f3d11610cb657600080fd5b6000506101e051141515610d2e576308c379a0610200526020610220526029610240527f73747261746567792066756e64206d616e6167657220213d206e65772066756e610260527f64206d616e6167657200000000000000000000000000000000000000000000006102805261024050608461021cfd5b8151600101808352811415610c61575b505047610140526004353b610d5257600080fd5b600060006004638129fc1c6101605261017c610140516004355af1610d7657600080fd5b6004356101605261014051610180526008546101a0527fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c6060610160a1600060085561018060006014818352015b61018051600b60c052602060c020015461016052610160511515610de757610e17565b60006004600a6101605160e05260c052604060c02060c052602060c02001555b8151600101808352811415610dc4575b5050005b6347a02a44811415610ec8573415610e3257600080fd5b60043560a01c15610e4257600080fd5b60035433141515610e92576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600455600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e811415610f61573415610edf57600080fd5b60045433141515610f2f576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b3360035533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c0281141561105f573415610f7857600080fd5b60043560a01c15610f8857600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415610fc75760018352610fd7565b8151600101808352811415610fab575b505050610140511515611029576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600555600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561115d57341561107657600080fd5b60043560a01c1561108657600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156110c557600183526110d5565b81516001018083528114156110a9575b505050610140511515611127576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63c26f6d4481141561125b57341561117457600080fd5b60043560a01c1561118457600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156111c357600183526111d3565b81516001018083528114156111a7575b505050610140511515611225576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527fcabc8521621c89fc973d8f1e8455da2ce64a666915af33e0ebaa69cd5215083b6020610140a1005b63bedb86fb81141561136057341561127257600080fd5b60043560011c1561128257600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156112c857600183526112d8565b81516001018083528114156112ac575b50505061014051151561132a576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600055600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b636817031b8114156114a357341561137757600080fd5b60043560a01c1561138757600080fd5b600354331415156113d7576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61140d57600080fd5b601f3d1161141a57600080fd5b6000506101a05114151561146d576308c379a06101c05260206101e0526012610200527f7661756c7420746f6b656e20213d204554480000000000000000000000000000610220526102005060646101dcfd5b600435600255600435610140527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f306020610140a1005b6301e1d1148114156114d45734156114ba57600080fd5b6006580161406d565b610140526101405160005260206000f35b633b8ae39781141561173a5734156114eb57600080fd5b60043560a01c156114fb57600080fd5b6003543314151561154b576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60043560e05260c052604060c02060c052602060c020541515156115b0576308c379a0610140526020610160526008610180527f617070726f7665640000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a06004636209ec2d6101405261015c6004355afa6115d257600080fd5b601f3d116115df57600080fd5b6000506101a051141515611632576308c379a06101c05260206101e052601d610200527f73747261746567792066756e64206d616e6167657220213d2074686973000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61166857600080fd5b601f3d1161167557600080fd5b6000506101a0511415156116c8576308c379a06101c05260206101e0526015610200527f737472617465677920746f6b656e20213d204554480000000000000000000000610220526102005060646101dcfd5b600a60043560e05260c052604060c02060c052602060c02060018155600060018201556000600282015560006003820155600060048201556000600582015560006006820155506004357f4c6d0fbb89373829bc56000a87d561331bca06f725fd8861d055215ed90f209b60006000a2005b63bb994d4881141561191457341561175157600080fd5b60043560a01c1561176157600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156117a057600183526117b0565b8151600101808352811415611784575b505050610140511515611802576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611866576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515156118ce576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600a60043560e05260c052604060c02060c052602060c020556004357f7d3e35e217272b8400fec8397b08eb8c60c4db9ae834af14ac0fc9c0bb914a8f60006000a2005b635f1ac310811415611c6257341561192b57600080fd5b60043560a01c1561193b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b61012051602002610160015133141561197a576001835261198a565b815160010180835281141561195e575b5050506101405115156119dc576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611a40576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151515611aa8576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b612710600954602435818183011015611ac057600080fd5b8082019050905011151515611b14576308c379a061014052602061016052600b610180527f726174696f203e206d61780000000000000000000000000000000000000000006101a05261018050606461015cfd5b60643560443511151515611b67576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6004356101405261014051600658016141e1565b60005060016001600a60043560e05260c052604060c02060c052602060c020015560016002600a60043560e05260c052604060c02060c052602060c02001556024356003600a60043560e05260c052604060c02060c052602060c02001556044356005600a60043560e05260c052604060c02060c052602060c02001556064356006600a60043560e05260c052604060c02060c052602060c020015560098054602435818183011015611c2d57600080fd5b808201905090508155506004357fa3cbd67e6583e6c7ef034e5f87b7b40b0a0e87182a8377dfb42e59aa414c6cd560006000a2005b63b22439f5811415611e96573415611c7957600080fd5b60043560a01c15611c8957600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b610120516020026101600151331415611ccf5760018352611cdf565b8151600101808352811415611cb3575b505050610140511515611d31576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515611d98576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014052610140516006580161437e565b6101a0526101a0516101c0526101405161016051610180516101a0516101c0516101c0516101e0526101e05160065801614277565b6101c0526101a05261018052610160526101405260005060006001600a60043560e05260c052604060c02060c052602060c0200155600980546003600a60043560e05260c052604060c02060c052602060c020015480821015611e4357600080fd5b8082039050905081555060006003600a60043560e05260c052604060c02060c052602060c02001556004357fff2f97c1f3529c6b02543b63f7efae22cdc885048adf65c679a1c5c4ea3b2fa860006000a2005b63c5cde90b811415612361573415611ead57600080fd5b6000610120525b610120516004013560a01c15611ec957600080fd5b6020610120510161012052610280610120511015611ee657611eb4565b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415611f255760018352611f35565b8151600101808352811415611f09575b505050610140511515611f87576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405261016060006014818352015b60046101605160148110611fac57600080fd5b602002013561018052610180511515611fd557610140511515611fd0576001610140525b612025565b61014051151515612025576308c379a06101a05260206101c05260036101e0527f6761700000000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b8151600101808352811415611f99575b505061016060006014818352015b610160516014811061205457600080fd5b600b60c052602060c0200154610180526004610160516014811061207757600080fd5b60200201356101a0526101805115156120df576101a0511515156120da576308c379a06101c05260206101e0526008610200527f6e657720213d2030000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b612132565b60006101a05114151515612132576308c379a06101c05260206101e0526007610200527f6e6577203d203000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b8151600101808352811415612043575b505061016060006014818352015b6004610160516014811061216357600080fd5b60200201356101805261018051151561217b57612213565b6001600a6101805160e05260c052604060c02060c052602060c020015415156121e3576308c379a06101a05260206101c05260076101e0527f2161637469766500000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006001600a6101805160e05260c052604060c02060c052602060c02001555b8151600101808352811415612150575b505061016060006014818352015b6004610160516014811061223457600080fd5b60200201356101805261018051151561224c5761229d565b60016001600a6101805160e05260c052604060c02060c052602060c020015561018051610160516014811061228057600080fd5b600b60c052602060c02001555b8151600101808352811415612221575b505060043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527fa03ab32749bdff946d914bdbc7fadedf2bdeb6a83f2b56effa25a0eae1012675610280610160a1005b63260829c081141561268e57341561237857600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156123b757600183526123c7565b815160010180835281141561239b575b505050610140511515612419576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61014060006014818352015b610140516014811061243657600080fd5b600b60c052602060c020015415156124ac576004610140516014811061245b57600080fd5b60200201351515156124ac576308c379a061016052602061018052600f6101a0527f6465627420726174696f20213d203000000000000000000000000000000000006101c0526101a050606461017cfd5b8151600101808352811415612425575b505060006101405261016060006014818352015b61016051601481106124e157600080fd5b600b60c052602060c02001546101805261018051151561250057612570565b6004610160516014811061251357600080fd5b60200201356101a0526101a0516003600a6101805160e05260c052604060c02060c052602060c020015561014080516101a05181818301101561255557600080fd5b808201905090508152505b81516001018083528114156124d0575b505061014051600955612710600954111515156125cc576308c379a061016052602061018052600b6101a0527f746f74616c203e206d61780000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527f8edb07c0d6dfa3d8e47f8faaeffa94a7c21b80ebb98ccf264581f64c8270a906610280610160a1005b63da1714318114156128855734156126a557600080fd5b60043560a01c156126b557600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156126f45760018352612704565b81516001018083528114156126d8575b505050610140511515612756576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c0205415156127ba576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6044356024351115151561280d576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6024356005600a60043560e05260c052604060c02060c052602060c02001556044356006600a60043560e05260c052604060c02060c052602060c020015560243561014052604435610160526004357ffedf8d30e937b57e4e95271e9f17cfab1a1315ac6d612ef72912405e9524f7d56040610140a2005b63505b6a76811415612a6357341561289c57600080fd5b60015415156128ea576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156129305760018352612940565b8151600101808352811415612914575b505050610140511515612992576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463c5ebeaec610160526004356101805261017c60006002545af16129bc57600080fd5b601f3d116129c957600080fd5b6000506101e051610140526024356101405110151515612a28576308c379a061016052602061018052600e6101a0527f626f72726f776564203c206d696e0000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547fb87de9931230544a0b3a00e753f5ab70f79a54e84e47bcad4239e1c1c97588d36040610160a2005b6348b8a1f9811415612c42573415612a7a57600080fd5b6001541515612ac8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612b0e5760018352612b1e565b8151600101808352811415612af2575b505050610140511515612b70576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463371fd8e6610160526004356101805261017c6004356002545af1612b9b57600080fd5b601f3d11612ba857600080fd5b6000506101e051610140526024356101405110151515612c07576308c379a061016052602061018052600c6101a0527f726570616964203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547f447949f39e7c140dbba1469e2e065abd8a278ac561449a4fcd1c51f5aadc91d86040610160a2005b63d5b6e219811415612f2c573415612c5957600080fd5b6001541515612ca7576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612ced5760018352612cfd565b8151600101808352811415612cd1575b505050610140511515612d4f576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b610140516006580161406d565b6101605261014052610160516101405260043561014051101515612d8857602435610140511115612d8b565b60005b1515612dd6576308c379a06101605260206101805260126101a0527f746f74616c206e6f7420696e2072616e676500000000000000000000000000006101c0526101a050606461017cfd5b60206101e06004630dca59c16101805261019c6002545afa612df757600080fd5b601f3d11612e0457600080fd5b6000506101e051610160526040366101803761016051610140511115612e5e57610140516101605180821015612e3957600080fd5b808203905090504780821115612e4f5780612e51565b815b9050905061018052612e7f565b610160516101405180821015612e7357600080fd5b808203905090506101a0525b6000610180511115612e92576001612e9a565b60006101a051115b15612ee0576002543b612eac57600080fd5b60006000604463753c09856101c052610180516101e0526101a051610200526101dc610180516002545af1612ee057600080fd5b610140516101c052610160516101e05261018051610200526101a051610220526002547fd94ac81cdb49ea558800854e3bfd1aedf2a0a02abc471047c34e382fd5137cbd60806101c0a2005b632e1a7d4d811415613213573415612f4357600080fd5b6001541515612f91576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60025433141515612fe1576308c379a0610140526020610160526006610180527f217661756c7400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140516006580161406d565b6101605261014052610160516101405260043561014051808211156130135780613015565b815b905090506101605260006101605111151561306f576308c379a06101805260206101a052600c6101c0527f7769746864726177203d203000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60206102006004630dca59c16101a0526101bc6002545afa61309057600080fd5b601f3d1161309d57600080fd5b600050610200516101805260006101a052610140516101805111156130dd576101805161014051808210156130d157600080fd5b808203905090506101a0525b476101c0526101c051610160511115613171576101a080516101405161016051610180516101a0516101c051610160516101e0526101e05160065801614422565b610240526101c0526101a0526101805261016052610140526102405181818301101561314957600080fd5b808201905090508152506101605147808211156131665780613168565b815b90509050610160525b60006101605111156131c7576101405161016051610180516101a0516101c051336101e0526101605161020052610200516101e05160065801613e2b565b6101c0526101a0526101805261016052610140526000505b6004356101e05261016051610200526101a05161022052337f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9460606101e0a26101a05160005260206000f35b63f19f054281141561325f57341561322a57600080fd5b60043560a01c1561323a57600080fd5b6004356101405261014051600658016146b6565b6101a0526101a05160005260206000f35b63c6f2be588114156132ab57341561327657600080fd5b60043560a01c1561328657600080fd5b60043561014052610140516006580161485d565b6101a0526101a05160005260206000f35b639a78e72e8114156132f75734156132c257600080fd5b60043560a01c156132d257600080fd5b6004600a60043560e05260c052604060c02060c052602060c020015460005260206000f35b63c5ebeaec81141561356557341561330e57600080fd5b600154151561335c576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515156133ab576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c02001541515613410576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014051336101605261016051600658016146b6565b6101c052610140526101c051808211156134435780613445565b815b905090506101405260006101405111151561349f576308c379a061016052602061018052600a6101a0527f626f72726f77203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405133610160526101405161018052610180516101605160065801613e2b565b610140526000506004600a3360e05260c052604060c02060c052602060c020018054610140518181830110156134f657600080fd5b80820190509050815550600880546101405181818301101561351757600080fd5b80820190509050815550600435610160526101405161018052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610160a26101405160005260206000f35b636cb56d19811415613a1457341561357c57600080fd5b60043560a01c1561358c57600080fd5b60243560a01c1561359c57600080fd5b60015415156135ea576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156136295760018352613639565b815160010180835281141561360d575b50505061014051151561368b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6001600a60043560e05260c052604060c02060c052602060c020015415156136f2576308c379a061014052602061016052600b610180527f6f6c6420216163746976650000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60243560e05260c052604060c02060c052602060c020541515613756576308c379a061014052602061016052600d610180527f6e65772021617070726f766564000000000000000000000000000000000000006101a05261018050606461015cfd5b6002600a60243560e05260c052604060c02060c052602060c02001541515156137be576308c379a0610140526020610160526009610180527f61637469766174656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140600a60043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015260048160c052602060c0200154826080015260058160c052602060c02001548260a0015260068160c052602060c02001548260c001525050600a60243560e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101a05160038201556101c05160048201556101e05160058201556102005160068201555060006001600a60043560e05260c052604060c02060c052602060c020015560006003600a60043560e05260c052604060c02060c052602060c020015560006004600a60043560e05260c052604060c02060c052602060c020015560006005600a60043560e05260c052604060c02060c052602060c020015560006006600a60043560e05260c052604060c02060c052602060c02001556101405161016051610180516101a0516101c0516101e051610200516102205160043561024052610240516006580161437e565b6102a05261022052610200526101e0526101c0526101a0526101805261016052610140526102a0516102205260243561022051601481106139a457600080fd5b600b60c052602060c02001556004353b6139bd57600080fd5b60006000602463ce5494bb610240526024356102605261025c60006004355af16139e657600080fd5b6024356004357f9249d6a64288c19c5be5f4f1bb9b763ad4afac803128f1ef65b88acb13df9aa460006000a3005b6301681a62811415613b78573415613a2b57600080fd5b60043560a01c15613a3b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415613a7a5760018352613a8a565b8151600101808352811415613a5e575b505050610140511515613adc576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa613b0257600080fd5b601f3d11613b0f57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613ed3565b6101e0526101c0526101a052610180526101605261014052600050005b635c975abb811415613b9b573415613b8f57600080fd5b60005460005260206000f35b63158ef93e811415613bbe573415613bb257600080fd5b60015460005260206000f35b63fbfa77cf811415613be1573415613bd557600080fd5b60025460005260206000f35b63d085835a811415613c04573415613bf857600080fd5b60035460005260206000f35b63b127df87811415613c27573415613c1b57600080fd5b60045460005260206000f35b63f851a440811415613c4a573415613c3e57600080fd5b60055460005260206000f35b63452a9320811415613c6d573415613c6157600080fd5b60065460005260206000f35b634d547ada811415613c90573415613c8457600080fd5b60075460005260206000f35b63fc7b9c18811415613cb3573415613ca757600080fd5b60085460005260206000f35b632df9eab9811415613cd6573415613cca57600080fd5b60095460005260206000f35b6339ebf823811415613dc8573415613ced57600080fd5b60043560a01c15613cfd57600080fd5b600a60043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c020015481525050602081019050808060048560c052602060c020015481525050602081019050808060058560c052602060c020015481525050602081019050808060068560c052602060c02001548152505060e09050905060c05260c051610140f35b63ddf0b009811415613e04573415613ddf57600080fd5b60043560148110613def57600080fd5b600b60c052602060c020015460005260206000f35b63a598adff811415613e27573415613e1b57600080fd5b600c5460005260206000f35b505b005b61018052610140526101605260006101405114151515613e8a576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af1613ead57600080fd5b5050600060006101e05161020061016051610140515af1613ecd57600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613f7c57600080fd5b505060206103e0610320516103406000610140515af1613f9b57600080fd5b60203d80821115613fac5780613fae565b815b905090506103c0526103c08051602001806101c08284600060045af1613fd357600080fd5b505060006101c0511115614067576101c0806020015160008251806020901315613ffc57600080fd5b809190121561400a57600080fd5b806020036101000a820490509050905015151515614067576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b610140524760085481818301101561408457600080fd5b8082019050905060005260005161014051565b610140526102a0366101603761042060006014818352015b61042051600b60c052602060c020015461040052600061040051181561410d57610400516101606103e051601481106140e757600080fd5b60200201526103e08051600181818301101561410257600080fd5b808201905090508152505b81516001018083528114156140af575b5050600b60c052602060c0206101605181556101805160018201556101a05160028201556101c05160038201556101e05160048201556102005160058201556102205160068201556102405160078201556102605160088201556102805160098201556102a051600a8201556102c051600b8201556102e051600c82015561030051600d82015561032051600e82015561034051600f8201556103605160108201556103805160118201556103a05160128201556103c05160138201555061014051565b61016052610140526013600b60c052602060c0200154151515614243576308c379a06101805260206101a052600b6101c0527f7175657565203e206d61780000000000000000000000000000000000000000006101e0526101c050606461019cfd5b610140516013600b60c052602060c0200155610140516101605160065801614097565b610160526101405260005061016051565b61016052610140526014610140511015156142d1576308c379a06101805260206101a05260086101c0527f69203e3d206d61780000000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b600061014051601481106142e457600080fd5b600b60c052602060c02001541415151561433d576308c379a06101805260206101a052600d6101c0527f217a65726f2061646472657373000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061435057600080fd5b600b60c052602060c0200155610140516101605160065801614097565b610160526101405260005061016051565b610160526101405261018060006014818352015b6101405161018051601481106143a757600080fd5b600b60c052602060c020015414156143cb5761018051600052505060005161016051565b8151600101808352811415614392575b50506308c379a06101805260206101a05260096101c0527f6e6f7420666f756e6400000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101605261014052610140516101805260006101a0526101e060006014818352015b6101e051600b60c052602060c02001546101c0526101c0511515614467576146a4565b47610200526101805161020051101515614480576146a4565b6004600a6101c05160e05260c052604060c02060c052602060c0200154610220526101805161020051808210156144b657600080fd5b8082039050905061022051808211156144cf57806144d1565b815b90509050610240526102405115156144e857614694565b60206103006024632e1a7d4d61028052610240516102a05261029c60006101c0515af161451457600080fd5b601f3d1161452157600080fd5b600050610300516102605247610200518082101561453e57600080fd5b808203905090506102805260006102605111156145f0576101808051610260518082101561456b57600080fd5b808203905090508152506101a080516102605181818301101561458d57600080fd5b808201905090508152506004600a6101c05160e05260c052604060c02060c052602060c02001805461026051808210156145c657600080fd5b808203905090508155506008805461026051808210156145e557600080fd5b808203905090508155505b6004600a6101c05160e05260c052604060c02060c052602060c020018054610280518082101561461f57600080fd5b8082039050905081555060088054610280518082101561463e57600080fd5b80820390509050815550610220516102a052610240516102c052610260516102e05261028051610300526101c0517fa1db2d4488a8004dde12ff73253859b508b0458878ea4086047bab6672f9f1d760806102a0a25b8151600101808352811415614444575b50506101a05160005260005161016051565b610160526101405260015415156146ce5760016146e2565b600054156146dd5760016146e2565b600954155b156146f557600060005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c02001546101405161016051610180516006580161406d565b6101a0526101805261016052610140526101a051808202821582848304141761474f57600080fd5b80905090509050600954808061476457600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a052610180516101a0511015156147ac57600060005260005161016051565b610180516101a051808210156147c157600080fd5b8082039050905047808211156147d757806147d9565b815b905090506101c0526005600a6101405160e05260c052604060c02060c052602060c02001546101c051101561481a576000600052600051610160515661485b565b6101c0516006600a6101405160e05260c052604060c02060c052602060c020015480821115614849578061484b565b815b9050905060005260005161016051565b005b6101605261014052600154151561487c57600060005260005161016051565b60095415156148ae576004600a6101405160e05260c052604060c02060c052602060c020015460005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c020015460085480820282158284830414176148e257600080fd5b8090509050905060095480806148f757600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a0526000541561493e576101a0516000526000516101605156614987565b610180516101a05111151561495f5760006000526000516101605156614987565b6101a051610180518082101561497457600080fd5b8082039050905060005260005161016051565b00
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : guardian (address): 0x86d10751B18F3fE331C146546868a07224A8598B
Arg [1] : worker (address): 0x86d10751B18F3fE331C146546868a07224A8598B
Arg [2] : oldFundManager (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Arg [1] : 00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 32 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
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.