Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 513 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Repay Vault | 17802444 | 355 days ago | IN | 0 ETH | 0.00097313 | ||||
Report To Vault | 17802329 | 355 days ago | IN | 0 ETH | 0.00127941 | ||||
Repay Vault | 17695402 | 370 days ago | IN | 0 ETH | 0.00077935 | ||||
Report To Vault | 17695340 | 370 days ago | IN | 0 ETH | 0.00101773 | ||||
Repay Vault | 17588625 | 385 days ago | IN | 0 ETH | 0.00118617 | ||||
Report To Vault | 17588588 | 385 days ago | IN | 0 ETH | 0.00183037 | ||||
Report To Vault | 17481819 | 400 days ago | IN | 0 ETH | 0.00106907 | ||||
Repay Vault | 17375394 | 415 days ago | IN | 0 ETH | 0.00175148 | ||||
Report To Vault | 17375363 | 415 days ago | IN | 0 ETH | 0.00321254 | ||||
Repay Vault | 17241733 | 434 days ago | IN | 0 ETH | 0.00380203 | ||||
Report To Vault | 17241717 | 434 days ago | IN | 0 ETH | 0.00571155 | ||||
Repay Vault | 16965152 | 473 days ago | IN | 0 ETH | 0.00097503 | ||||
Report To Vault | 16965104 | 473 days ago | IN | 0 ETH | 0.0013027 | ||||
Repay Vault | 16943713 | 476 days ago | IN | 0 ETH | 0.0014908 | ||||
Report To Vault | 16943681 | 476 days ago | IN | 0 ETH | 0.00177851 | ||||
Borrow From Vaul... | 16925105 | 479 days ago | IN | 0 ETH | 0.00174762 | ||||
Repay Vault | 16922410 | 479 days ago | IN | 0 ETH | 0.00130563 | ||||
Report To Vault | 16922378 | 479 days ago | IN | 0 ETH | 0.00186068 | ||||
Borrow From Vaul... | 16901374 | 482 days ago | IN | 0 ETH | 0.00096161 | ||||
Repay Vault | 16901023 | 482 days ago | IN | 0 ETH | 0.00083221 | ||||
Report To Vault | 16900990 | 482 days ago | IN | 0 ETH | 0.0012354 | ||||
Repay Vault | 16879718 | 485 days ago | IN | 0 ETH | 0.00075661 | ||||
Report To Vault | 16879666 | 485 days ago | IN | 0 ETH | 0.0010173 | ||||
Borrow From Vaul... | 16858413 | 488 days ago | IN | 0 ETH | 0.00102144 | ||||
Report To Vault | 16858396 | 488 days ago | IN | 0 ETH | 0.00105871 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20337573 | 10 hrs ago | 0.10115 ETH | ||||
20337573 | 10 hrs ago | 0.10115 ETH | ||||
20150154 | 26 days ago | 0.002184 ETH | ||||
20150154 | 26 days ago | 0.002184 ETH | ||||
20150127 | 26 days ago | 0.001091 ETH | ||||
20150127 | 26 days ago | 0.001091 ETH | ||||
19852959 | 68 days ago | 0.00537016 ETH | ||||
19852959 | 68 days ago | 0.00537016 ETH | ||||
19852929 | 68 days ago | 0.0036065 ETH | ||||
19852929 | 68 days ago | 0.0036065 ETH | ||||
19828969 | 71 days ago | 0.00532301 ETH | ||||
19828969 | 71 days ago | 0.00532301 ETH | ||||
19792719 | 76 days ago | 0.00159242 ETH | ||||
19792719 | 76 days ago | 0.00159242 ETH | ||||
19785047 | 77 days ago | 0.01068415 ETH | ||||
19785047 | 77 days ago | 0.01068415 ETH | ||||
19769965 | 79 days ago | 0.02782198 ETH | ||||
19769965 | 79 days ago | 0.02782198 ETH | ||||
19769822 | 79 days ago | 0.05350381 ETH | ||||
19769822 | 79 days ago | 0.05350381 ETH | ||||
19656513 | 95 days ago | 0.10981514 ETH | ||||
19656513 | 95 days ago | 0.10981514 ETH | ||||
19352386 | 138 days ago | 0.1087257 ETH | ||||
19352386 | 138 days ago | 0.1087257 ETH | ||||
19236448 | 154 days ago | 0.03216455 ETH |
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 0.1.1 @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__(): 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 self.nextTimeLock = ZERO_ADDRESS log AcceptTimeLock(msg.sender) @external def setAdmin(admin: address): assert msg.sender in [self.timeLock, self.admin], "!auth" self.admin = admin log SetAdmin(admin) @external def setGuardian(guardian: address): assert msg.sender in [self.timeLock, self.admin], "!auth" self.guardian = guardian log SetGuardian(guardian) @external def 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 @nonreentrant("lock") 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
[{"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":59029},{"stateMutability":"nonpayable","type":"function","name":"setAdmin","inputs":[{"name":"admin","type":"address"}],"outputs":[],"gas":41682},{"stateMutability":"nonpayable","type":"function","name":"setGuardian","inputs":[{"name":"guardian","type":"address"}],"outputs":[],"gas":41712},{"stateMutability":"nonpayable","type":"function","name":"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":227174},{"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
6060614b04610140396020614b0460c03960c05160a01c1561002057600080fd5b60206020614b040160c03960c05160a01c1561003b57600080fd5b60206040614b040160c03960c05160a01c1561005657600080fd5b3360035533600555610140516006556101605160075560006101805118156101155761018051600c5573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6020610200600463fc0c546a6101a0526101bc600c545afa6100b557600080fd5b601f3d116100c257600080fd5b60005061020051141515610115576308c379a061022052602061024052601d610260527f6f6c642066756e64206d616e6167657220746f6b656e20213d204554480000006102805261026050606461023cfd5b614aec56600436101561000d57613e45565b600035601c52600051638129fc1c8114156105ac57600154151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b600c54151561012057600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6105a5565b600c5433141515610170576308c379a0610140526020610160526011610180527f216f6c642066756e64206d616e616765720000000000000000000000000000006101a05261018050606461015cfd5b60206101a0600463fbfa77cf6101405261015c600c545afa61019157600080fd5b601f3d1161019e57600080fd5b6000506101a0516002541415156101f4576308c379a06101c05260206101e052601f610200527f6f6c642066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b60206101a0600463fc7b9c186101405261015c600c545afa61021557600080fd5b601f3d1161022257600080fd5b6000506101a05160085560206101a06004632df9eab96101405261015c600c545afa61024d57600080fd5b601f3d1161025a57600080fd5b6000506101a05160095561014060006014818352015b6020610200602463ddf0b00961018052610140516101a05261019c600c545afa61029957600080fd5b601f3d116102a657600080fd5b60005061020051610160526101605115156102c0576105a2565b3060206101e06004636209ec2d6101805261019c610160515afa6102e357600080fd5b601f3d116102f057600080fd5b6000506101e051141515610343576308c379a061020052602061022052601d610240527f73747261746567792066756e64206d616e6167657220213d2073656c660000006102605261024050606461021cfd5b60e0366101803760e06102e060246339ebf82361026052610160516102805261027c600c545afa61037357600080fd5b60df3d1161038057600080fd5b6102e080808080516103c0525050602081019050808080516103e0525050602081019050808080516104005250506020810190508080805161042052505060208101905080808051610440525050602081019050808080516104605250506020810190508080805161048052505050506000506103c080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c001516102405250610180511515610482576308c379a06102605260206102805260096102a0527f21617070726f76656400000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101a05115156104d1576308c379a06102605260206102805260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101c0511515610520576308c379a061026052602061028052600a6102a0527f21616374697661746564000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b61016051610140516014811061053557600080fd5b600b60c052602060c0200155600a6101605160e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101e0516003820155610200516004820155610220516005820155610240516006820155505b8151600101808352811415610270575b50505b6001600155005b63371fd8e681141561079e576001541515610606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600a3360e05260c052604060c02060c052602060c020541515610668576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b346004351415156106b8576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610709576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004600a3360e05260c052604060c02060c052602060c0200180546004358082101561073457600080fd5b80820390509050815550600880546004358082101561075257600080fd5b808203905090508155506004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c09858114156109f35760015415156107f8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c0200154151561085d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60006004351015156108725760243515610875565b60005b15610881576001610899565b60043515156108965760006024351015610899565b60005b15156108e4576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610934576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b60006004351115610944576109a3565b600060243511156109a3576004600a3360e05260c052604060c02060c052602060c0200180546024358082101561097a57600080fd5b80820390509050815550600880546024358082101561099857600080fd5b808203905090508155505b60406004610140376004600a3360e05260c052604060c02060c052602060c020015461018052337f36d8646df39e8831ab3926651692b6a0ea874e6cc807ea1c428fcf2ba32859f86060610140a2005b63fc0c546a811415610a28573415610a0a57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb811415610e1b573415610a3f57600080fd5b60043560a01c15610a4f57600080fd5b60035433141515610a9f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610aed576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610b3b576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610b7157600080fd5b601f3d11610b7e57600080fd5b6000506101a051141515610bd1576308c379a06101c05260206101e052601d610200527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000610220526102005060646101dcfd5b60025460206101a0600463fbfa77cf6101405261015c6004355afa610bf557600080fd5b601f3d11610c0257600080fd5b6000506101a051141515610c55576308c379a06101c05260206101e052601f610200527f6e65772066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b61016060006014818352015b61016051600b60c052602060c020015461014052610140511515610c8457610d3e565b60043560206101e06004636209ec2d6101805261019c610140515afa610ca957600080fd5b601f3d11610cb657600080fd5b6000506101e051141515610d2e576308c379a0610200526020610220526029610240527f73747261746567792066756e64206d616e6167657220213d206e65772066756e610260527f64206d616e6167657200000000000000000000000000000000000000000000006102805261024050608461021cfd5b8151600101808352811415610c61575b505047610140526004353b610d5257600080fd5b600060006004638129fc1c6101605261017c610140516004355af1610d7657600080fd5b6004356101605261014051610180526008546101a0527fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c6060610160a1600060085561018060006014818352015b61018051600b60c052602060c020015461016052610160511515610de757610e17565b60006004600a6101605160e05260c052604060c02060c052602060c02001555b8151600101808352811415610dc4575b5050005b6347a02a44811415610ec8573415610e3257600080fd5b60043560a01c15610e4257600080fd5b60035433141515610e92576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600455600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e811415610f66573415610edf57600080fd5b60045433141515610f2f576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b33600355600060045533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c02811415611064573415610f7d57600080fd5b60043560a01c15610f8d57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415610fcc5760018352610fdc565b8151600101808352811415610fb0575b50505061014051151561102e576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600555600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561116257341561107b57600080fd5b60043560a01c1561108b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156110ca57600183526110da565b81516001018083528114156110ae575b50505061014051151561112c576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63c26f6d4481141561126057341561117957600080fd5b60043560a01c1561118957600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156111c857600183526111d8565b81516001018083528114156111ac575b50505061014051151561122a576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527fcabc8521621c89fc973d8f1e8455da2ce64a666915af33e0ebaa69cd5215083b6020610140a1005b63bedb86fb81141561136557341561127757600080fd5b60043560011c1561128757600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156112cd57600183526112dd565b81516001018083528114156112b1575b50505061014051151561132f576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600055600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b636817031b8114156114a857341561137c57600080fd5b60043560a01c1561138c57600080fd5b600354331415156113dc576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61141257600080fd5b601f3d1161141f57600080fd5b6000506101a051141515611472576308c379a06101c05260206101e0526012610200527f7661756c7420746f6b656e20213d204554480000000000000000000000000000610220526102005060646101dcfd5b600435600255600435610140527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f306020610140a1005b6301e1d1148114156114d95734156114bf57600080fd5b600658016140b6565b610140526101405160005260206000f35b633b8ae39781141561173f5734156114f057600080fd5b60043560a01c1561150057600080fd5b60035433141515611550576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60043560e05260c052604060c02060c052602060c020541515156115b5576308c379a0610140526020610160526008610180527f617070726f7665640000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a06004636209ec2d6101405261015c6004355afa6115d757600080fd5b601f3d116115e457600080fd5b6000506101a051141515611637576308c379a06101c05260206101e052601d610200527f73747261746567792066756e64206d616e6167657220213d2074686973000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61166d57600080fd5b601f3d1161167a57600080fd5b6000506101a0511415156116cd576308c379a06101c05260206101e0526015610200527f737472617465677920746f6b656e20213d204554480000000000000000000000610220526102005060646101dcfd5b600a60043560e05260c052604060c02060c052602060c02060018155600060018201556000600282015560006003820155600060048201556000600582015560006006820155506004357f4c6d0fbb89373829bc56000a87d561331bca06f725fd8861d055215ed90f209b60006000a2005b63bb994d4881141561191957341561175657600080fd5b60043560a01c1561176657600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156117a557600183526117b5565b8151600101808352811415611789575b505050610140511515611807576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c02054151561186b576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515156118d3576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600a60043560e05260c052604060c02060c052602060c020556004357f7d3e35e217272b8400fec8397b08eb8c60c4db9ae834af14ac0fc9c0bb914a8f60006000a2005b635f1ac310811415611c6757341561193057600080fd5b60043560a01c1561194057600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b61012051602002610160015133141561197f576001835261198f565b8151600101808352811415611963575b5050506101405115156119e1576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611a45576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151515611aad576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b612710600954602435818183011015611ac557600080fd5b8082019050905011151515611b19576308c379a061014052602061016052600b610180527f726174696f203e206d61780000000000000000000000000000000000000000006101a05261018050606461015cfd5b60643560443511151515611b6c576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b60043561014052610140516006580161422a565b60005060016001600a60043560e05260c052604060c02060c052602060c020015560016002600a60043560e05260c052604060c02060c052602060c02001556024356003600a60043560e05260c052604060c02060c052602060c02001556044356005600a60043560e05260c052604060c02060c052602060c02001556064356006600a60043560e05260c052604060c02060c052602060c020015560098054602435818183011015611c3257600080fd5b808201905090508155506004357fa3cbd67e6583e6c7ef034e5f87b7b40b0a0e87182a8377dfb42e59aa414c6cd560006000a2005b63b22439f5811415611e9b573415611c7e57600080fd5b60043560a01c15611c8e57600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b610120516020026101600151331415611cd45760018352611ce4565b8151600101808352811415611cb8575b505050610140511515611d36576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515611d9d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004356101405261014051600658016143c7565b6101a0526101a0516101c0526101405161016051610180516101a0516101c0516101c0516101e0526101e051600658016142c0565b6101c0526101a05261018052610160526101405260005060006001600a60043560e05260c052604060c02060c052602060c0200155600980546003600a60043560e05260c052604060c02060c052602060c020015480821015611e4857600080fd5b8082039050905081555060006003600a60043560e05260c052604060c02060c052602060c02001556004357fff2f97c1f3529c6b02543b63f7efae22cdc885048adf65c679a1c5c4ea3b2fa860006000a2005b63c5cde90b811415612366573415611eb257600080fd5b6000610120525b610120516004013560a01c15611ece57600080fd5b6020610120510161012052610280610120511015611eeb57611eb9565b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415611f2a5760018352611f3a565b8151600101808352811415611f0e575b505050610140511515611f8c576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405261016060006014818352015b60046101605160148110611fb157600080fd5b602002013561018052610180511515611fda57610140511515611fd5576001610140525b61202a565b6101405115151561202a576308c379a06101a05260206101c05260036101e0527f6761700000000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b8151600101808352811415611f9e575b505061016060006014818352015b610160516014811061205957600080fd5b600b60c052602060c0200154610180526004610160516014811061207c57600080fd5b60200201356101a0526101805115156120e4576101a0511515156120df576308c379a06101c05260206101e0526008610200527f6e657720213d2030000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b612137565b60006101a05114151515612137576308c379a06101c05260206101e0526007610200527f6e6577203d203000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b8151600101808352811415612048575b505061016060006014818352015b6004610160516014811061216857600080fd5b60200201356101805261018051151561218057612218565b6001600a6101805160e05260c052604060c02060c052602060c020015415156121e8576308c379a06101a05260206101c05260076101e0527f2161637469766500000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006001600a6101805160e05260c052604060c02060c052602060c02001555b8151600101808352811415612155575b505061016060006014818352015b6004610160516014811061223957600080fd5b602002013561018052610180511515612251576122a2565b60016001600a6101805160e05260c052604060c02060c052602060c020015561018051610160516014811061228557600080fd5b600b60c052602060c02001555b8151600101808352811415612226575b505060043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527fa03ab32749bdff946d914bdbc7fadedf2bdeb6a83f2b56effa25a0eae1012675610280610160a1005b63260829c081141561269357341561237d57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156123bc57600183526123cc565b81516001018083528114156123a0575b50505061014051151561241e576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61014060006014818352015b610140516014811061243b57600080fd5b600b60c052602060c020015415156124b1576004610140516014811061246057600080fd5b60200201351515156124b1576308c379a061016052602061018052600f6101a0527f6465627420726174696f20213d203000000000000000000000000000000000006101c0526101a050606461017cfd5b815160010180835281141561242a575b505060006101405261016060006014818352015b61016051601481106124e657600080fd5b600b60c052602060c02001546101805261018051151561250557612575565b6004610160516014811061251857600080fd5b60200201356101a0526101a0516003600a6101805160e05260c052604060c02060c052602060c020015561014080516101a05181818301101561255a57600080fd5b808201905090508152505b81516001018083528114156124d5575b505061014051600955612710600954111515156125d1576308c379a061016052602061018052600b6101a0527f746f74616c203e206d61780000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527f8edb07c0d6dfa3d8e47f8faaeffa94a7c21b80ebb98ccf264581f64c8270a906610280610160a1005b63da17143181141561288a5734156126aa57600080fd5b60043560a01c156126ba57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156126f95760018352612709565b81516001018083528114156126dd575b50505061014051151561275b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c0205415156127bf576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60443560243511151515612812576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6024356005600a60043560e05260c052604060c02060c052602060c02001556044356006600a60043560e05260c052604060c02060c052602060c020015560243561014052604435610160526004357ffedf8d30e937b57e4e95271e9f17cfab1a1315ac6d612ef72912405e9524f7d56040610140a2005b63505b6a76811415612a685734156128a157600080fd5b60015415156128ef576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156129355760018352612945565b8151600101808352811415612919575b505050610140511515612997576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463c5ebeaec610160526004356101805261017c60006002545af16129c157600080fd5b601f3d116129ce57600080fd5b6000506101e051610140526024356101405110151515612a2d576308c379a061016052602061018052600e6101a0527f626f72726f776564203c206d696e0000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547fb87de9931230544a0b3a00e753f5ab70f79a54e84e47bcad4239e1c1c97588d36040610160a2005b6348b8a1f9811415612c47573415612a7f57600080fd5b6001541515612acd576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612b135760018352612b23565b8151600101808352811415612af7575b505050610140511515612b75576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463371fd8e6610160526004356101805261017c6004356002545af1612ba057600080fd5b601f3d11612bad57600080fd5b6000506101e051610140526024356101405110151515612c0c576308c379a061016052602061018052600c6101a0527f726570616964203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547f447949f39e7c140dbba1469e2e065abd8a278ac561449a4fcd1c51f5aadc91d86040610160a2005b63d5b6e219811415612f31573415612c5e57600080fd5b6001541515612cac576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612cf25760018352612d02565b8151600101808352811415612cd6575b505050610140511515612d54576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b61014051600658016140b6565b6101605261014052610160516101405260043561014051101515612d8d57602435610140511115612d90565b60005b1515612ddb576308c379a06101605260206101805260126101a0527f746f74616c206e6f7420696e2072616e676500000000000000000000000000006101c0526101a050606461017cfd5b60206101e06004630dca59c16101805261019c6002545afa612dfc57600080fd5b601f3d11612e0957600080fd5b6000506101e051610160526040366101803761016051610140511115612e6357610140516101605180821015612e3e57600080fd5b808203905090504780821115612e545780612e56565b815b9050905061018052612e84565b610160516101405180821015612e7857600080fd5b808203905090506101a0525b6000610180511115612e97576001612e9f565b60006101a051115b15612ee5576002543b612eb157600080fd5b60006000604463753c09856101c052610180516101e0526101a051610200526101dc610180516002545af1612ee557600080fd5b610140516101c052610160516101e05261018051610200526101a051610220526002547fd94ac81cdb49ea558800854e3bfd1aedf2a0a02abc471047c34e382fd5137cbd60806101c0a2005b632e1a7d4d811415613218573415612f4857600080fd5b6001541515612f96576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60025433141515612fe6576308c379a0610140526020610160526006610180527f217661756c7400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b61014051600658016140b6565b610160526101405261016051610140526004356101405180821115613018578061301a565b815b9050905061016052600061016051111515613074576308c379a06101805260206101a052600c6101c0527f7769746864726177203d203000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60206102006004630dca59c16101a0526101bc6002545afa61309557600080fd5b601f3d116130a257600080fd5b600050610200516101805260006101a052610140516101805111156130e2576101805161014051808210156130d657600080fd5b808203905090506101a0525b476101c0526101c051610160511115613176576101a080516101405161016051610180516101a0516101c051610160516101e0526101e0516006580161446b565b610240526101c0526101a0526101805261016052610140526102405181818301101561314e57600080fd5b8082019050905081525061016051478082111561316b578061316d565b815b90509050610160525b60006101605111156131cc576101405161016051610180516101a0516101c051336101e0526101605161020052610200516101e05160065801613e74565b6101c0526101a0526101805261016052610140526000505b6004356101e05261016051610200526101a05161022052337f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9460606101e0a26101a05160005260206000f35b63f19f054281141561326457341561322f57600080fd5b60043560a01c1561323f57600080fd5b6004356101405261014051600658016146ff565b6101a0526101a05160005260206000f35b63c6f2be588114156132b057341561327b57600080fd5b60043560a01c1561328b57600080fd5b6004356101405261014051600658016148a6565b6101a0526101a05160005260206000f35b639a78e72e8114156132fc5734156132c757600080fd5b60043560a01c156132d757600080fd5b6004600a60043560e05260c052604060c02060c052602060c020015460005260206000f35b63c5ebeaec81141561358157600d541561331557600080fd5b6001600d55341561332557600080fd5b6001541515613373576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515156133c2576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c02001541515613427576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014051336101605261016051600658016146ff565b6101c052610140526101c0518082111561345a578061345c565b815b90509050610140526000610140511115156134b6576308c379a061016052602061018052600a6101a0527f626f72726f77203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405133610160526101405161018052610180516101605160065801613e74565b610140526000506004600a3360e05260c052604060c02060c052602060c0200180546101405181818301101561350d57600080fd5b80820190509050815550600880546101405181818301101561352e57600080fd5b80820190509050815550600435610160526101405161018052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610160a2610140516000526000600d5560206000f35b636cb56d19811415613a3057341561359857600080fd5b60043560a01c156135a857600080fd5b60243560a01c156135b857600080fd5b6001541515613606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156136455760018352613655565b8151600101808352811415613629575b5050506101405115156136a7576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151561370e576308c379a061014052602061016052600b610180527f6f6c6420216163746976650000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60243560e05260c052604060c02060c052602060c020541515613772576308c379a061014052602061016052600d610180527f6e65772021617070726f766564000000000000000000000000000000000000006101a05261018050606461015cfd5b6002600a60243560e05260c052604060c02060c052602060c02001541515156137da576308c379a0610140526020610160526009610180527f61637469766174656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140600a60043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015260048160c052602060c0200154826080015260058160c052602060c02001548260a0015260068160c052602060c02001548260c001525050600a60243560e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101a05160038201556101c05160048201556101e05160058201556102005160068201555060006001600a60043560e05260c052604060c02060c052602060c020015560006003600a60043560e05260c052604060c02060c052602060c020015560006004600a60043560e05260c052604060c02060c052602060c020015560006005600a60043560e05260c052604060c02060c052602060c020015560006006600a60043560e05260c052604060c02060c052602060c02001556101405161016051610180516101a0516101c0516101e05161020051610220516004356102405261024051600658016143c7565b6102a05261022052610200526101e0526101c0526101a0526101805261016052610140526102a0516102205260243561022051601481106139c057600080fd5b600b60c052602060c02001556004353b6139d957600080fd5b60006000602463ce5494bb610240526024356102605261025c60006004355af1613a0257600080fd5b6024356004357f9249d6a64288c19c5be5f4f1bb9b763ad4afac803128f1ef65b88acb13df9aa460006000a3005b6301681a62811415613b94573415613a4757600080fd5b60043560a01c15613a5757600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415613a965760018352613aa6565b8151600101808352811415613a7a575b505050610140511515613af8576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa613b1e57600080fd5b601f3d11613b2b57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613f1c565b6101e0526101c0526101a052610180526101605261014052600050005b635c975abb811415613bb7573415613bab57600080fd5b60005460005260206000f35b63158ef93e811415613bda573415613bce57600080fd5b60015460005260206000f35b63fbfa77cf811415613bfd573415613bf157600080fd5b60025460005260206000f35b63d085835a811415613c20573415613c1457600080fd5b60035460005260206000f35b63b127df87811415613c43573415613c3757600080fd5b60045460005260206000f35b63f851a440811415613c66573415613c5a57600080fd5b60055460005260206000f35b63452a9320811415613c89573415613c7d57600080fd5b60065460005260206000f35b634d547ada811415613cac573415613ca057600080fd5b60075460005260206000f35b63fc7b9c18811415613ccf573415613cc357600080fd5b60085460005260206000f35b632df9eab9811415613cf2573415613ce657600080fd5b60095460005260206000f35b6339ebf823811415613de4573415613d0957600080fd5b60043560a01c15613d1957600080fd5b600a60043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c020015481525050602081019050808060048560c052602060c020015481525050602081019050808060058560c052602060c020015481525050602081019050808060068560c052602060c02001548152505060e09050905060c05260c051610140f35b63ddf0b009811415613e20573415613dfb57600080fd5b60043560148110613e0b57600080fd5b600b60c052602060c020015460005260206000f35b63a598adff811415613e43573415613e3757600080fd5b600c5460005260206000f35b505b3461014052337fefc0288202e432ade6bf71491d0001d7e389ad4f8e4e9c7aa038dd1a563efc606020610140a2005b61018052610140526101605260006101405114151515613ed3576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af1613ef657600080fd5b5050600060006101e05161020061016051610140515af1613f1657600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613fc557600080fd5b505060206103e0610320516103406000610140515af1613fe457600080fd5b60203d80821115613ff55780613ff7565b815b905090506103c0526103c08051602001806101c08284600060045af161401c57600080fd5b505060006101c05111156140b0576101c080602001516000825180602090131561404557600080fd5b809190121561405357600080fd5b806020036101000a8204905090509050151515156140b0576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b61014052476008548181830110156140cd57600080fd5b8082019050905060005260005161014051565b610140526102a0366101603761042060006014818352015b61042051600b60c052602060c020015461040052600061040051181561415657610400516101606103e0516014811061413057600080fd5b60200201526103e08051600181818301101561414b57600080fd5b808201905090508152505b81516001018083528114156140f8575b5050600b60c052602060c0206101605181556101805160018201556101a05160028201556101c05160038201556101e05160048201556102005160058201556102205160068201556102405160078201556102605160088201556102805160098201556102a051600a8201556102c051600b8201556102e051600c82015561030051600d82015561032051600e82015561034051600f8201556103605160108201556103805160118201556103a05160128201556103c05160138201555061014051565b61016052610140526013600b60c052602060c020015415151561428c576308c379a06101805260206101a052600b6101c0527f7175657565203e206d61780000000000000000000000000000000000000000006101e0526101c050606461019cfd5b610140516013600b60c052602060c02001556101405161016051600658016140e0565b610160526101405260005061016051565b610160526101405260146101405110151561431a576308c379a06101805260206101a05260086101c0527f69203e3d206d61780000000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061432d57600080fd5b600b60c052602060c020015414151515614386576308c379a06101805260206101a052600d6101c0527f217a65726f2061646472657373000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061439957600080fd5b600b60c052602060c02001556101405161016051600658016140e0565b610160526101405260005061016051565b610160526101405261018060006014818352015b6101405161018051601481106143f057600080fd5b600b60c052602060c020015414156144145761018051600052505060005161016051565b81516001018083528114156143db575b50506308c379a06101805260206101a05260096101c0527f6e6f7420666f756e6400000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101605261014052610140516101805260006101a0526101e060006014818352015b6101e051600b60c052602060c02001546101c0526101c05115156144b0576146ed565b476102005261018051610200511015156144c9576146ed565b6004600a6101c05160e05260c052604060c02060c052602060c0200154610220526101805161020051808210156144ff57600080fd5b808203905090506102205180821115614518578061451a565b815b9050905061024052610240511515614531576146dd565b60206103006024632e1a7d4d61028052610240516102a05261029c60006101c0515af161455d57600080fd5b601f3d1161456a57600080fd5b600050610300516102605247610200518082101561458757600080fd5b8082039050905061028052600061026051111561463957610180805161026051808210156145b457600080fd5b808203905090508152506101a08051610260518181830110156145d657600080fd5b808201905090508152506004600a6101c05160e05260c052604060c02060c052602060c020018054610260518082101561460f57600080fd5b8082039050905081555060088054610260518082101561462e57600080fd5b808203905090508155505b6004600a6101c05160e05260c052604060c02060c052602060c020018054610280518082101561466857600080fd5b8082039050905081555060088054610280518082101561468757600080fd5b80820390509050815550610220516102a052610240516102c052610260516102e05261028051610300526101c0517fa1db2d4488a8004dde12ff73253859b508b0458878ea4086047bab6672f9f1d760806102a0a25b815160010180835281141561448d575b50506101a05160005260005161016051565b6101605261014052600154151561471757600161472b565b6000541561472657600161472b565b600954155b1561473e57600060005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c0200154610140516101605161018051600658016140b6565b6101a0526101805261016052610140526101a051808202821582848304141761479857600080fd5b8090509050905060095480806147ad57600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a052610180516101a0511015156147f557600060005260005161016051565b610180516101a0518082101561480a57600080fd5b8082039050905047808211156148205780614822565b815b905090506101c0526005600a6101405160e05260c052604060c02060c052602060c02001546101c051101561486357600060005260005161016051566148a4565b6101c0516006600a6101405160e05260c052604060c02060c052602060c0200154808211156148925780614894565b815b9050905060005260005161016051565b005b610160526101405260015415156148c557600060005260005161016051565b60095415156148f7576004600a6101405160e05260c052604060c02060c052602060c020015460005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c0200154600854808202821582848304141761492b57600080fd5b80905090509050600954808061494057600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a05260005415614987576101a05160005260005161016051566149d0565b610180516101a0511115156149a857600060005260005161016051566149d0565b6101a05161018051808210156149bd57600080fd5b8082039050905060005260005161016051565b005b61011a614aec0361011a60003961011a614aec036000f300000000000000000000000086d10751b18f3fe331c146546868a07224a8598b00000000000000000000000086d10751b18f3fe331c146546868a07224a8598b0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x600436101561000d57613e45565b600035601c52600051638129fc1c8114156105ac57600154151515610071576308c379a061014052602061016052600b610180527f696e697469616c697a65640000000000000000000000000000000000000000006101a05261018050606461015cfd5b600c54151561012057600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156100b957600183526100c9565b815160010180835281141561009d575b50505061014051151561011b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6105a5565b600c5433141515610170576308c379a0610140526020610160526011610180527f216f6c642066756e64206d616e616765720000000000000000000000000000006101a05261018050606461015cfd5b60206101a0600463fbfa77cf6101405261015c600c545afa61019157600080fd5b601f3d1161019e57600080fd5b6000506101a0516002541415156101f4576308c379a06101c05260206101e052601f610200527f6f6c642066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b60206101a0600463fc7b9c186101405261015c600c545afa61021557600080fd5b601f3d1161022257600080fd5b6000506101a05160085560206101a06004632df9eab96101405261015c600c545afa61024d57600080fd5b601f3d1161025a57600080fd5b6000506101a05160095561014060006014818352015b6020610200602463ddf0b00961018052610140516101a05261019c600c545afa61029957600080fd5b601f3d116102a657600080fd5b60005061020051610160526101605115156102c0576105a2565b3060206101e06004636209ec2d6101805261019c610160515afa6102e357600080fd5b601f3d116102f057600080fd5b6000506101e051141515610343576308c379a061020052602061022052601d610240527f73747261746567792066756e64206d616e6167657220213d2073656c660000006102605261024050606461021cfd5b60e0366101803760e06102e060246339ebf82361026052610160516102805261027c600c545afa61037357600080fd5b60df3d1161038057600080fd5b6102e080808080516103c0525050602081019050808080516103e0525050602081019050808080516104005250506020810190508080805161042052505060208101905080808051610440525050602081019050808080516104605250506020810190508080805161048052505050506000506103c080516101805280602001516101a05280604001516101c05280606001516101e0528060800151610200528060a00151610220528060c001516102405250610180511515610482576308c379a06102605260206102805260096102a0527f21617070726f76656400000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101a05115156104d1576308c379a06102605260206102805260076102a0527f21616374697665000000000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b6101c0511515610520576308c379a061026052602061028052600a6102a0527f21616374697661746564000000000000000000000000000000000000000000006102c0526102a050606461027cfd5b61016051610140516014811061053557600080fd5b600b60c052602060c0200155600a6101605160e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101e0516003820155610200516004820155610220516005820155610240516006820155505b8151600101808352811415610270575b50505b6001600155005b63371fd8e681141561079e576001541515610606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600a3360e05260c052604060c02060c052602060c020541515610668576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b346004351415156106b8576308c379a0610140526020610160526013610180527f616d6f756e7420213d206d73672e76616c7565000000000000000000000000006101a05261018050606461015cfd5b6000600435111515610709576308c379a0610140526020610160526009610180527f7265706179203d203000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004600a3360e05260c052604060c02060c052602060c0200180546004358082101561073457600080fd5b80820390509050815550600880546004358082101561075257600080fd5b808203905090508155506004356101405260043561016052337f77c6871227e5d2dec8dadd5354f78453203e22e669cd0ec4c19d9a8c5edb31d06040610140a260043560005260206000f35b63753c09858114156109f35760015415156107f8576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c0200154151561085d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60006004351015156108725760243515610875565b60005b15610881576001610899565b60043515156108965760006024351015610899565b60005b15156108e4576308c379a0610140526020610160526011610180527f6761696e20616e64206c6f7373203e20300000000000000000000000000000006101a05261018050606461015cfd5b34600435141515610934576308c379a0610140526020610160526011610180527f6761696e20213d206d73672e76616c75650000000000000000000000000000006101a05261018050606461015cfd5b60006004351115610944576109a3565b600060243511156109a3576004600a3360e05260c052604060c02060c052602060c0200180546024358082101561097a57600080fd5b80820390509050815550600880546024358082101561099857600080fd5b808203905090508155505b60406004610140376004600a3360e05260c052604060c02060c052602060c020015461018052337f36d8646df39e8831ab3926651692b6a0ea874e6cc807ea1c428fcf2ba32859f86060610140a2005b63fc0c546a811415610a28573415610a0a57600080fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60005260206000f35b63ce5494bb811415610e1b573415610a3f57600080fd5b60043560a01c15610a4f57600080fd5b60035433141515610a9f576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001541515610aed576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515610b3b576308c379a0610140526020610160526007610180527f21706175736564000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa610b7157600080fd5b601f3d11610b7e57600080fd5b6000506101a051141515610bd1576308c379a06101c05260206101e052601d610200527f6e65772066756e64206d616e6167657220746f6b656e20213d20455448000000610220526102005060646101dcfd5b60025460206101a0600463fbfa77cf6101405261015c6004355afa610bf557600080fd5b601f3d11610c0257600080fd5b6000506101a051141515610c55576308c379a06101c05260206101e052601f610200527f6e65772066756e64206d616e61676572207661756c7420213d207661756c7400610220526102005060646101dcfd5b61016060006014818352015b61016051600b60c052602060c020015461014052610140511515610c8457610d3e565b60043560206101e06004636209ec2d6101805261019c610140515afa610ca957600080fd5b601f3d11610cb657600080fd5b6000506101e051141515610d2e576308c379a0610200526020610220526029610240527f73747261746567792066756e64206d616e6167657220213d206e65772066756e610260527f64206d616e6167657200000000000000000000000000000000000000000000006102805261024050608461021cfd5b8151600101808352811415610c61575b505047610140526004353b610d5257600080fd5b600060006004638129fc1c6101605261017c610140516004355af1610d7657600080fd5b6004356101605261014051610180526008546101a0527fd44a6dd2bfac4f6bc02d116d96aa12c24e8580626b95cb6a2f543f18cb61bd4c6060610160a1600060085561018060006014818352015b61018051600b60c052602060c020015461016052610160511515610de757610e17565b60006004600a6101605160e05260c052604060c02060c052602060c02001555b8151600101808352811415610dc4575b5050005b6347a02a44811415610ec8573415610e3257600080fd5b60043560a01c15610e4257600080fd5b60035433141515610e92576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600435600455600435610140527f5c06d5a6f95a574bb95a214c88933831c63fcd6f6c5d1d61a21efb92be19bc2c6020610140a1005b631e39831e811415610f66573415610edf57600080fd5b60045433141515610f2f576308c379a061014052602061016052600f610180527f216e6578742074696d65206c6f636b00000000000000000000000000000000006101a05261018050606461015cfd5b33600355600060045533610140527f77b69635186d51fb2d031f67a7995795c8384acb800219c7d30861125d154f026020610140a1005b63704b6c02811415611064573415610f7d57600080fd5b60043560a01c15610f8d57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415610fcc5760018352610fdc565b8151600101808352811415610fb0575b50505061014051151561102e576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600555600435610140527f5a272403b402d892977df56625f4164ccaf70ca3863991c43ecfe76a6905b0a16020610140a1005b638a0dac4a81141561116257341561107b57600080fd5b60043560a01c1561108b57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156110ca57600183526110da565b81516001018083528114156110ae575b50505061014051151561112c576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600655600435610140527f31845eceb9cde510c7e8b37f76301c688feb70bc9653aa4c28a3734999840fd86020610140a1005b63c26f6d4481141561126057341561117957600080fd5b60043560a01c1561118957600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156111c857600183526111d8565b81516001018083528114156111ac575b50505061014051151561122a576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600435600755600435610140527fcabc8521621c89fc973d8f1e8455da2ce64a666915af33e0ebaa69cd5215083b6020610140a1005b63bedb86fb81141561136557341561127757600080fd5b60043560011c1561128757600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156112cd57600183526112dd565b81516001018083528114156112b1575b50505061014051151561132f576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b600435600055600435610140527f140eb9f8b591138e129e4caf389c92df4f0545b902523eee9e63153ecdb2026e6020610140a1005b636817031b8114156114a857341561137c57600080fd5b60043560a01c1561138c57600080fd5b600354331415156113dc576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61141257600080fd5b601f3d1161141f57600080fd5b6000506101a051141515611472576308c379a06101c05260206101e0526012610200527f7661756c7420746f6b656e20213d204554480000000000000000000000000000610220526102005060646101dcfd5b600435600255600435610140527fd459c7242e23d490831b5676a611c4342d899d28f342d89ae80793e56a930f306020610140a1005b6301e1d1148114156114d95734156114bf57600080fd5b600658016140b6565b610140526101405160005260206000f35b633b8ae39781141561173f5734156114f057600080fd5b60043560a01c1561150057600080fd5b60035433141515611550576308c379a061014052602061016052600a610180527f2174696d65206c6f636b000000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60043560e05260c052604060c02060c052602060c020541515156115b5576308c379a0610140526020610160526008610180527f617070726f7665640000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b3060206101a06004636209ec2d6101405261015c6004355afa6115d757600080fd5b601f3d116115e457600080fd5b6000506101a051141515611637576308c379a06101c05260206101e052601d610200527f73747261746567792066756e64206d616e6167657220213d2074686973000000610220526102005060646101dcfd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee60206101a0600463fc0c546a6101405261015c6004355afa61166d57600080fd5b601f3d1161167a57600080fd5b6000506101a0511415156116cd576308c379a06101c05260206101e0526015610200527f737472617465677920746f6b656e20213d204554480000000000000000000000610220526102005060646101dcfd5b600a60043560e05260c052604060c02060c052602060c02060018155600060018201556000600282015560006003820155600060048201556000600582015560006006820155506004357f4c6d0fbb89373829bc56000a87d561331bca06f725fd8861d055215ed90f209b60006000a2005b63bb994d4881141561191957341561175657600080fd5b60043560a01c1561176657600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156117a557600183526117b5565b8151600101808352811415611789575b505050610140511515611807576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c02054151561186b576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515156118d3576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6000600a60043560e05260c052604060c02060c052602060c020556004357f7d3e35e217272b8400fec8397b08eb8c60c4db9ae834af14ac0fc9c0bb914a8f60006000a2005b635f1ac310811415611c6757341561193057600080fd5b60043560a01c1561194057600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b61012051602002610160015133141561197f576001835261198f565b8151600101808352811415611963575b5050506101405115156119e1576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c020541515611a45576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151515611aad576308c379a0610140526020610160526006610180527f61637469766500000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b612710600954602435818183011015611ac557600080fd5b8082019050905011151515611b19576308c379a061014052602061016052600b610180527f726174696f203e206d61780000000000000000000000000000000000000000006101a05261018050606461015cfd5b60643560443511151515611b6c576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b60043561014052610140516006580161422a565b60005060016001600a60043560e05260c052604060c02060c052602060c020015560016002600a60043560e05260c052604060c02060c052602060c02001556024356003600a60043560e05260c052604060c02060c052602060c02001556044356005600a60043560e05260c052604060c02060c052602060c02001556064356006600a60043560e05260c052604060c02060c052602060c020015560098054602435818183011015611c3257600080fd5b808201905090508155506004357fa3cbd67e6583e6c7ef034e5f87b7b40b0a0e87182a8377dfb42e59aa414c6cd560006000a2005b63b22439f5811415611e9b573415611c7e57600080fd5b60043560a01c15611c8e57600080fd5b60035461016052600554610180526006546101a05260006101405261014061012060006003818352015b610120516020026101600151331415611cd45760018352611ce4565b8151600101808352811415611cb8575b505050610140511515611d36576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b6001600a60043560e05260c052604060c02060c052602060c02001541515611d9d576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6004356101405261014051600658016143c7565b6101a0526101a0516101c0526101405161016051610180516101a0516101c0516101c0516101e0526101e051600658016142c0565b6101c0526101a05261018052610160526101405260005060006001600a60043560e05260c052604060c02060c052602060c0200155600980546003600a60043560e05260c052604060c02060c052602060c020015480821015611e4857600080fd5b8082039050905081555060006003600a60043560e05260c052604060c02060c052602060c02001556004357fff2f97c1f3529c6b02543b63f7efae22cdc885048adf65c679a1c5c4ea3b2fa860006000a2005b63c5cde90b811415612366573415611eb257600080fd5b6000610120525b610120516004013560a01c15611ece57600080fd5b6020610120510161012052610280610120511015611eeb57611eb9565b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415611f2a5760018352611f3a565b8151600101808352811415611f0e575b505050610140511515611f8c576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405261016060006014818352015b60046101605160148110611fb157600080fd5b602002013561018052610180511515611fda57610140511515611fd5576001610140525b61202a565b6101405115151561202a576308c379a06101a05260206101c05260036101e0527f6761700000000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b8151600101808352811415611f9e575b505061016060006014818352015b610160516014811061205957600080fd5b600b60c052602060c0200154610180526004610160516014811061207c57600080fd5b60200201356101a0526101805115156120e4576101a0511515156120df576308c379a06101c05260206101e0526008610200527f6e657720213d2030000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b612137565b60006101a05114151515612137576308c379a06101c05260206101e0526007610200527f6e6577203d203000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b8151600101808352811415612048575b505061016060006014818352015b6004610160516014811061216857600080fd5b60200201356101805261018051151561218057612218565b6001600a6101805160e05260c052604060c02060c052602060c020015415156121e8576308c379a06101a05260206101c05260076101e0527f2161637469766500000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006001600a6101805160e05260c052604060c02060c052602060c02001555b8151600101808352811415612155575b505061016060006014818352015b6004610160516014811061223957600080fd5b602002013561018052610180511515612251576122a2565b60016001600a6101805160e05260c052604060c02060c052602060c020015561018051610160516014811061228557600080fd5b600b60c052602060c02001555b8151600101808352811415612226575b505060043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527fa03ab32749bdff946d914bdbc7fadedf2bdeb6a83f2b56effa25a0eae1012675610280610160a1005b63260829c081141561269357341561237d57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156123bc57600183526123cc565b81516001018083528114156123a0575b50505061014051151561241e576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b61014060006014818352015b610140516014811061243b57600080fd5b600b60c052602060c020015415156124b1576004610140516014811061246057600080fd5b60200201351515156124b1576308c379a061016052602061018052600f6101a0527f6465627420726174696f20213d203000000000000000000000000000000000006101c0526101a050606461017cfd5b815160010180835281141561242a575b505060006101405261016060006014818352015b61016051601481106124e657600080fd5b600b60c052602060c02001546101805261018051151561250557612575565b6004610160516014811061251857600080fd5b60200201356101a0526101a0516003600a6101805160e05260c052604060c02060c052602060c020015561014080516101a05181818301101561255a57600080fd5b808201905090508152505b81516001018083528114156124d5575b505061014051600955612710600954111515156125d1576308c379a061016052602061018052600b6101a0527f746f74616c203e206d61780000000000000000000000000000000000000000006101c0526101a050606461017cfd5b60043561016052602435610180526044356101a0526064356101c0526084356101e05260a4356102005260c4356102205260e4356102405261010435610260526101243561028052610144356102a052610164356102c052610184356102e0526101a435610300526101c435610320526101e4356103405261020435610360526102243561038052610244356103a052610264356103c0527f8edb07c0d6dfa3d8e47f8faaeffa94a7c21b80ebb98ccf264581f64c8270a906610280610160a1005b63da17143181141561288a5734156126aa57600080fd5b60043560a01c156126ba57600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156126f95760018352612709565b81516001018083528114156126dd575b50505061014051151561275b576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b600a60043560e05260c052604060c02060c052602060c0205415156127bf576308c379a0610140526020610160526009610180527f21617070726f76656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60443560243511151515612812576308c379a0610140526020610160526017610180527f6d696e20626f72726f77203e206d617820626f72726f770000000000000000006101a05261018050606461015cfd5b6024356005600a60043560e05260c052604060c02060c052602060c02001556044356006600a60043560e05260c052604060c02060c052602060c020015560243561014052604435610160526004357ffedf8d30e937b57e4e95271e9f17cfab1a1315ac6d612ef72912405e9524f7d56040610140a2005b63505b6a76811415612a685734156128a157600080fd5b60015415156128ef576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b6101205160200261016001513314156129355760018352612945565b8151600101808352811415612919575b505050610140511515612997576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463c5ebeaec610160526004356101805261017c60006002545af16129c157600080fd5b601f3d116129ce57600080fd5b6000506101e051610140526024356101405110151515612a2d576308c379a061016052602061018052600e6101a0527f626f72726f776564203c206d696e0000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547fb87de9931230544a0b3a00e753f5ab70f79a54e84e47bcad4239e1c1c97588d36040610160a2005b6348b8a1f9811415612c47573415612a7f57600080fd5b6001541515612acd576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612b135760018352612b23565b8151600101808352811415612af7575b505050610140511515612b75576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b60206101e0602463371fd8e6610160526004356101805261017c6004356002545af1612ba057600080fd5b601f3d11612bad57600080fd5b6000506101e051610140526024356101405110151515612c0c576308c379a061016052602061018052600c6101a0527f726570616964203c206d696e00000000000000000000000000000000000000006101c0526101a050606461017cfd5b6004356101605261014051610180526002547f447949f39e7c140dbba1469e2e065abd8a278ac561449a4fcd1c51f5aadc91d86040610160a2005b63d5b6e219811415612f31573415612c5e57600080fd5b6001541515612cac576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60035461016052600554610180526007546101a05260006101405261014061012060006003818352015b610120516020026101600151331415612cf25760018352612d02565b8151600101808352811415612cd6575b505050610140511515612d54576308c379a06101c05260206101e0526005610200527f2161757468000000000000000000000000000000000000000000000000000000610220526102005060646101dcfd5b61014051600658016140b6565b6101605261014052610160516101405260043561014051101515612d8d57602435610140511115612d90565b60005b1515612ddb576308c379a06101605260206101805260126101a0527f746f74616c206e6f7420696e2072616e676500000000000000000000000000006101c0526101a050606461017cfd5b60206101e06004630dca59c16101805261019c6002545afa612dfc57600080fd5b601f3d11612e0957600080fd5b6000506101e051610160526040366101803761016051610140511115612e6357610140516101605180821015612e3e57600080fd5b808203905090504780821115612e545780612e56565b815b9050905061018052612e84565b610160516101405180821015612e7857600080fd5b808203905090506101a0525b6000610180511115612e97576001612e9f565b60006101a051115b15612ee5576002543b612eb157600080fd5b60006000604463753c09856101c052610180516101e0526101a051610200526101dc610180516002545af1612ee557600080fd5b610140516101c052610160516101e05261018051610200526101a051610220526002547fd94ac81cdb49ea558800854e3bfd1aedf2a0a02abc471047c34e382fd5137cbd60806101c0a2005b632e1a7d4d811415613218573415612f4857600080fd5b6001541515612f96576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b60025433141515612fe6576308c379a0610140526020610160526006610180527f217661756c7400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b61014051600658016140b6565b610160526101405261016051610140526004356101405180821115613018578061301a565b815b9050905061016052600061016051111515613074576308c379a06101805260206101a052600c6101c0527f7769746864726177203d203000000000000000000000000000000000000000006101e0526101c050606461019cfd5b60206102006004630dca59c16101a0526101bc6002545afa61309557600080fd5b601f3d116130a257600080fd5b600050610200516101805260006101a052610140516101805111156130e2576101805161014051808210156130d657600080fd5b808203905090506101a0525b476101c0526101c051610160511115613176576101a080516101405161016051610180516101a0516101c051610160516101e0526101e0516006580161446b565b610240526101c0526101a0526101805261016052610140526102405181818301101561314e57600080fd5b8082019050905081525061016051478082111561316b578061316d565b815b90509050610160525b60006101605111156131cc576101405161016051610180516101a0516101c051336101e0526101605161020052610200516101e05160065801613e74565b6101c0526101a0526101805261016052610140526000505b6004356101e05261016051610200526101a05161022052337f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca9460606101e0a26101a05160005260206000f35b63f19f054281141561326457341561322f57600080fd5b60043560a01c1561323f57600080fd5b6004356101405261014051600658016146ff565b6101a0526101a05160005260206000f35b63c6f2be588114156132b057341561327b57600080fd5b60043560a01c1561328b57600080fd5b6004356101405261014051600658016148a6565b6101a0526101a05160005260206000f35b639a78e72e8114156132fc5734156132c757600080fd5b60043560a01c156132d757600080fd5b6004600a60043560e05260c052604060c02060c052602060c020015460005260206000f35b63c5ebeaec81141561358157600d541561331557600080fd5b6001600d55341561332557600080fd5b6001541515613373576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b6000541515156133c2576308c379a0610140526020610160526006610180527f70617573656400000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b6001600a3360e05260c052604060c02060c052602060c02001541515613427576308c379a0610140526020610160526007610180527f21616374697665000000000000000000000000000000000000000000000000006101a05261018050606461015cfd5b60043561014051336101605261016051600658016146ff565b6101c052610140526101c0518082111561345a578061345c565b815b90509050610140526000610140511115156134b6576308c379a061016052602061018052600a6101a0527f626f72726f77203d2030000000000000000000000000000000000000000000006101c0526101a050606461017cfd5b6101405133610160526101405161018052610180516101605160065801613e74565b610140526000506004600a3360e05260c052604060c02060c052602060c0200180546101405181818301101561350d57600080fd5b80820190509050815550600880546101405181818301101561352e57600080fd5b80820190509050815550600435610160526101405161018052337fe1979fe4c35e0cef342fef5668e2c8e7a7e9f5d5d1ca8fee0ac6c427fa4153af6040610160a2610140516000526000600d5560206000f35b636cb56d19811415613a3057341561359857600080fd5b60043560a01c156135a857600080fd5b60243560a01c156135b857600080fd5b6001541515613606576308c379a061014052602061016052600c610180527f21696e697469616c697a656400000000000000000000000000000000000000006101a05261018050606461015cfd5b600354610160526005546101805260006101405261014061012060006002818352015b6101205160200261016001513314156136455760018352613655565b8151600101808352811415613629575b5050506101405115156136a7576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b6001600a60043560e05260c052604060c02060c052602060c0200154151561370e576308c379a061014052602061016052600b610180527f6f6c6420216163746976650000000000000000000000000000000000000000006101a05261018050606461015cfd5b600a60243560e05260c052604060c02060c052602060c020541515613772576308c379a061014052602061016052600d610180527f6e65772021617070726f766564000000000000000000000000000000000000006101a05261018050606461015cfd5b6002600a60243560e05260c052604060c02060c052602060c02001541515156137da576308c379a0610140526020610160526009610180527f61637469766174656400000000000000000000000000000000000000000000006101a05261018050606461015cfd5b610140600a60043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015260048160c052602060c0200154826080015260058160c052602060c02001548260a0015260068160c052602060c02001548260c001525050600a60243560e05260c052604060c02060c052602060c0206001815560016001820155600160028201556101a05160038201556101c05160048201556101e05160058201556102005160068201555060006001600a60043560e05260c052604060c02060c052602060c020015560006003600a60043560e05260c052604060c02060c052602060c020015560006004600a60043560e05260c052604060c02060c052602060c020015560006005600a60043560e05260c052604060c02060c052602060c020015560006006600a60043560e05260c052604060c02060c052602060c02001556101405161016051610180516101a0516101c0516101e05161020051610220516004356102405261024051600658016143c7565b6102a05261022052610200526101e0526101c0526101a0526101805261016052610140526102a0516102205260243561022051601481106139c057600080fd5b600b60c052602060c02001556004353b6139d957600080fd5b60006000602463ce5494bb610240526024356102605261025c60006004355af1613a0257600080fd5b6024356004357f9249d6a64288c19c5be5f4f1bb9b763ad4afac803128f1ef65b88acb13df9aa460006000a3005b6301681a62811415613b94573415613a4757600080fd5b60043560a01c15613a5757600080fd5b600354610160526005546101805260006101405261014061012060006002818352015b610120516020026101600151331415613a965760018352613aa6565b8151600101808352811415613a7a575b505050610140511515613af8576308c379a06101a05260206101c05260056101e0527f2161757468000000000000000000000000000000000000000000000000000000610200526101e05060646101bcfd5b60206101c060246370a0823161014052306101605261015c6004355afa613b1e57600080fd5b601f3d11613b2b57600080fd5b6000506101c0516101e0526101405161016051610180516101a0516101c0516101e0516004356102005233610220526101e0516102405261024051610220516102005160065801613f1c565b6101e0526101c0526101a052610180526101605261014052600050005b635c975abb811415613bb7573415613bab57600080fd5b60005460005260206000f35b63158ef93e811415613bda573415613bce57600080fd5b60015460005260206000f35b63fbfa77cf811415613bfd573415613bf157600080fd5b60025460005260206000f35b63d085835a811415613c20573415613c1457600080fd5b60035460005260206000f35b63b127df87811415613c43573415613c3757600080fd5b60045460005260206000f35b63f851a440811415613c66573415613c5a57600080fd5b60055460005260206000f35b63452a9320811415613c89573415613c7d57600080fd5b60065460005260206000f35b634d547ada811415613cac573415613ca057600080fd5b60075460005260206000f35b63fc7b9c18811415613ccf573415613cc357600080fd5b60085460005260206000f35b632df9eab9811415613cf2573415613ce657600080fd5b60095460005260206000f35b6339ebf823811415613de4573415613d0957600080fd5b60043560a01c15613d1957600080fd5b600a60043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c020015481525050602081019050808060048560c052602060c020015481525050602081019050808060058560c052602060c020015481525050602081019050808060068560c052602060c02001548152505060e09050905060c05260c051610140f35b63ddf0b009811415613e20573415613dfb57600080fd5b60043560148110613e0b57600080fd5b600b60c052602060c020015460005260206000f35b63a598adff811415613e43573415613e3757600080fd5b600c5460005260206000f35b505b3461014052337fefc0288202e432ade6bf71491d0001d7e389ad4f8e4e9c7aa038dd1a563efc606020610140a2005b61018052610140526101605260006101405114151515613ed3576308c379a06101a05260206101c052600e6101e0527f746f203d20302061646472657373000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101a0526101a08051602001806101e08284600060045af1613ef657600080fd5b5050600060006101e05161020061016051610140515af1613f1657600080fd5b61018051565b6101a05261014052610160526101805260006004610220527fa9059cbb000000000000000000000000000000000000000000000000000000006102405261022060048060208461028001018260208501600060045af15050805182019150506101605160208261028001015260208101905061018051602082610280010152602081019050806102805261028090508051602001806103208284600060045af1613fc557600080fd5b505060206103e0610320516103406000610140515af1613fe457600080fd5b60203d80821115613ff55780613ff7565b815b905090506103c0526103c08051602001806101c08284600060045af161401c57600080fd5b505060006101c05111156140b0576101c080602001516000825180602090131561404557600080fd5b809190121561405357600080fd5b806020036101000a8204905090509050151515156140b0576308c379a061022052602061024052600f610260527f7472616e73666572206661696c656400000000000000000000000000000000006102805261026050606461023cfd5b6101a051565b61014052476008548181830110156140cd57600080fd5b8082019050905060005260005161014051565b610140526102a0366101603761042060006014818352015b61042051600b60c052602060c020015461040052600061040051181561415657610400516101606103e0516014811061413057600080fd5b60200201526103e08051600181818301101561414b57600080fd5b808201905090508152505b81516001018083528114156140f8575b5050600b60c052602060c0206101605181556101805160018201556101a05160028201556101c05160038201556101e05160048201556102005160058201556102205160068201556102405160078201556102605160088201556102805160098201556102a051600a8201556102c051600b8201556102e051600c82015561030051600d82015561032051600e82015561034051600f8201556103605160108201556103805160118201556103a05160128201556103c05160138201555061014051565b61016052610140526013600b60c052602060c020015415151561428c576308c379a06101805260206101a052600b6101c0527f7175657565203e206d61780000000000000000000000000000000000000000006101e0526101c050606461019cfd5b610140516013600b60c052602060c02001556101405161016051600658016140e0565b610160526101405260005061016051565b610160526101405260146101405110151561431a576308c379a06101805260206101a05260086101c0527f69203e3d206d61780000000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061432d57600080fd5b600b60c052602060c020015414151515614386576308c379a06101805260206101a052600d6101c0527f217a65726f2061646472657373000000000000000000000000000000000000006101e0526101c050606461019cfd5b6000610140516014811061439957600080fd5b600b60c052602060c02001556101405161016051600658016140e0565b610160526101405260005061016051565b610160526101405261018060006014818352015b6101405161018051601481106143f057600080fd5b600b60c052602060c020015414156144145761018051600052505060005161016051565b81516001018083528114156143db575b50506308c379a06101805260206101a05260096101c0527f6e6f7420666f756e6400000000000000000000000000000000000000000000006101e0526101c050606461019cfd5b6101605261014052610140516101805260006101a0526101e060006014818352015b6101e051600b60c052602060c02001546101c0526101c05115156144b0576146ed565b476102005261018051610200511015156144c9576146ed565b6004600a6101c05160e05260c052604060c02060c052602060c0200154610220526101805161020051808210156144ff57600080fd5b808203905090506102205180821115614518578061451a565b815b9050905061024052610240511515614531576146dd565b60206103006024632e1a7d4d61028052610240516102a05261029c60006101c0515af161455d57600080fd5b601f3d1161456a57600080fd5b600050610300516102605247610200518082101561458757600080fd5b8082039050905061028052600061026051111561463957610180805161026051808210156145b457600080fd5b808203905090508152506101a08051610260518181830110156145d657600080fd5b808201905090508152506004600a6101c05160e05260c052604060c02060c052602060c020018054610260518082101561460f57600080fd5b8082039050905081555060088054610260518082101561462e57600080fd5b808203905090508155505b6004600a6101c05160e05260c052604060c02060c052602060c020018054610280518082101561466857600080fd5b8082039050905081555060088054610280518082101561468757600080fd5b80820390509050815550610220516102a052610240516102c052610260516102e05261028051610300526101c0517fa1db2d4488a8004dde12ff73253859b508b0458878ea4086047bab6672f9f1d760806102a0a25b815160010180835281141561448d575b50506101a05160005260005161016051565b6101605261014052600154151561471757600161472b565b6000541561472657600161472b565b600954155b1561473e57600060005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c0200154610140516101605161018051600658016140b6565b6101a0526101805261016052610140526101a051808202821582848304141761479857600080fd5b8090509050905060095480806147ad57600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a052610180516101a0511015156147f557600060005260005161016051565b610180516101a0518082101561480a57600080fd5b8082039050905047808211156148205780614822565b815b905090506101c0526005600a6101405160e05260c052604060c02060c052602060c02001546101c051101561486357600060005260005161016051566148a4565b6101c0516006600a6101405160e05260c052604060c02060c052602060c0200154808211156148925780614894565b815b9050905060005260005161016051565b005b610160526101405260015415156148c557600060005260005161016051565b60095415156148f7576004600a6101405160e05260c052604060c02060c052602060c020015460005260005161016051565b6003600a6101405160e05260c052604060c02060c052602060c0200154600854808202821582848304141761492b57600080fd5b80905090509050600954808061494057600080fd5b820490509050610180526004600a6101405160e05260c052604060c02060c052602060c02001546101a05260005415614987576101a05160005260005161016051566149d0565b610180516101a0511115156149a857600060005260005161016051566149d0565b6101a05161018051808210156149bd57600080fd5b8082039050905060005260005161016051565b00
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
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.