Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.16
Contract Source Code (Vyper language format)
# @version 0.2.16 """ @title Voting Escrow @author Stake DAO Protocol @license MIT @notice Votes have a weight depending on time, so that users are committed to the future of (whatever they are voting for) @dev Vote weight decays linearly over time. Lock time cannot be more than `MAXTIME` (4 years). """ # Original idea and credit: # Curve Finance's veCRV # https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/VotingEscrow.vy # Angle Protocol updates # https://github.com/AngleProtocol/angle-solidity/blob/main/contracts/dao/veANGLE.vy # veSDT is a fork with only one view functions added to it to make veSDT compatible # with Compound governance system. The references to the controller have also been removed # Voting escrow to have time-weighted votes # Votes have a weight depending on time, so that users are committed # to the future of (whatever they are voting for). # The weight in this implementation is linear, and lock cannot be more than maxtime: # w ^ # 1 + / # | / # | / # | / # |/ # 0 +--------+------> time # maxtime (4 years?) struct Point: bias: int128 slope: int128 # - dweight / dt ts: uint256 blk: uint256 # block # We cannot really do block numbers per se b/c slope is per time, not per block # and per block could be fairly bad b/c Ethereum changes blocktimes. # What we can do is to extrapolate ***At functions struct LockedBalance: amount: int128 end: uint256 interface ERC20: def decimals() -> uint256: view def name() -> String[64]: view def symbol() -> String[32]: view def transfer(to: address, amount: uint256) -> bool: nonpayable def transferFrom(spender: address, to: address, amount: uint256) -> bool: nonpayable # Interface for checking whether address belongs to a whitelisted # type of a smart wallet. # When new types are added - the whole contract is changed # The check() method is modifying to be able to use caching # for individual wallet addresses interface SmartWalletChecker: def check(addr: address) -> bool: nonpayable DEPOSIT_FOR_TYPE: constant(int128) = 0 CREATE_LOCK_TYPE: constant(int128) = 1 INCREASE_LOCK_AMOUNT: constant(int128) = 2 INCREASE_UNLOCK_TIME: constant(int128) = 3 DEPOSIT_FOR_FROM_TYPE: constant(int128) = 4 event CommitOwnership: admin: address event ApplyOwnership: admin: address event Deposit: provider: indexed(address) value: uint256 locktime: indexed(uint256) type: int128 ts: uint256 event Withdraw: provider: indexed(address) value: uint256 ts: uint256 event Supply: prevSupply: uint256 supply: uint256 WEEK: constant(uint256) = 7 * 86400 # all future times are rounded by week MAXTIME: constant(uint256) = 4 * 365 * 86400 # 4 years MULTIPLIER: constant(uint256) = 10 ** 18 token: public(address) supply: public(uint256) locked: public(HashMap[address, LockedBalance]) epoch: public(uint256) point_history: public(Point[100000000000000000000000000000]) # epoch -> unsigned point user_point_history: public(HashMap[address, Point[1000000000]]) # user -> Point[user_epoch] user_point_epoch: public(HashMap[address, uint256]) slope_changes: public(HashMap[uint256, int128]) # time -> signed slope change name: public(String[64]) symbol: public(String[32]) decimals: public(uint256) # Checker for whitelisted (smart contract) wallets which are allowed to deposit # The goal is to prevent tokenizing the escrow future_smart_wallet_checker: public(address) smart_wallet_checker: public(address) admin: public(address) # Can and will be a smart contract future_admin: public(address) initialized: public(bool) @external def __init__(): """ @notice Contract constructor @dev The contract has an initializer to prevent the take over of the implementation """ assert self.initialized == False #dev: contract is already initialized self.initialized = True @external def initialize(_admin: address, token_addr: address, _smart_wallet_checker: address, _name: String[64], _symbol: String[32]): """ @notice Contract initializer @param _admin Future veSDT admin @param token_addr `ERC20ANGLE` token address @param _smart_wallet_checker Future smart wallet checker contract @param _name Token name @param _symbol Token symbol """ assert self.initialized == False #dev: contract is already initialized self.initialized = True assert _admin!= ZERO_ADDRESS #dev: admin cannot be the 0 address self.admin = _admin self.token = token_addr self.smart_wallet_checker = _smart_wallet_checker self.point_history[0].blk = block.number self.point_history[0].ts = block.timestamp _decimals: uint256 = ERC20(token_addr).decimals() assert _decimals <= 255 self.decimals = _decimals self.name = _name self.symbol = _symbol @external def commit_transfer_ownership(addr: address): """ @notice Transfer ownership of VotingEscrow contract to `addr` @param addr Address to have ownership transferred to """ assert msg.sender == self.admin # dev: admin only assert addr != ZERO_ADDRESS # dev: future admin cannot be the 0 address self.future_admin = addr log CommitOwnership(addr) @external def accept_transfer_ownership(): """ @notice Accept a pending ownership transfer """ _admin: address = self.future_admin assert msg.sender == _admin # dev: future admin only self.admin = _admin log ApplyOwnership(_admin) @external def apply_transfer_ownership(): """ @notice Apply ownership transfer """ assert msg.sender == self.admin # dev: admin only _admin: address = self.future_admin assert _admin != ZERO_ADDRESS # dev: admin not set self.admin = _admin log ApplyOwnership(_admin) @external def commit_smart_wallet_checker(addr: address): """ @notice Set an external contract to check for approved smart contract wallets @param addr Address of Smart contract checker """ assert msg.sender == self.admin self.future_smart_wallet_checker = addr @external def apply_smart_wallet_checker(): """ @notice Apply setting external contract to check approved smart contract wallets """ assert msg.sender == self.admin self.smart_wallet_checker = self.future_smart_wallet_checker @internal def assert_not_contract(addr: address): """ @notice Check if the call is from a whitelisted smart contract, revert if not @param addr Address to be checked """ if addr != tx.origin: checker: address = self.smart_wallet_checker if checker != ZERO_ADDRESS: if SmartWalletChecker(checker).check(addr): return raise "Smart contract depositors not allowed" @external @view def get_last_user_slope(addr: address) -> int128: """ @notice Get the most recently recorded rate of voting power decrease for `addr` @param addr Address of the user wallet @return Value of the slope """ uepoch: uint256 = self.user_point_epoch[addr] return self.user_point_history[addr][uepoch].slope @external @view def user_point_history__ts(_addr: address, _idx: uint256) -> uint256: """ @notice Get the timestamp for checkpoint `_idx` for `_addr` @param _addr User wallet address @param _idx User epoch number @return Epoch time of the checkpoint """ return self.user_point_history[_addr][_idx].ts @external @view def locked__end(_addr: address) -> uint256: """ @notice Get timestamp when `_addr`'s lock finishes @param _addr User wallet @return Epoch time of the lock end """ return self.locked[_addr].end @internal def _checkpoint(addr: address, old_locked: LockedBalance, new_locked: LockedBalance): """ @notice Record global and per-user data to checkpoint @param addr User's wallet address. No user checkpoint if 0x0 @param old_locked Pevious locked amount / end lock time for the user @param new_locked New locked amount / end lock time for the user """ u_old: Point = empty(Point) u_new: Point = empty(Point) old_dslope: int128 = 0 new_dslope: int128 = 0 _epoch: uint256 = self.epoch if addr != ZERO_ADDRESS: # Calculate slopes and biases # Kept at zero when they have to if old_locked.end > block.timestamp and old_locked.amount > 0: u_old.slope = old_locked.amount / MAXTIME u_old.bias = u_old.slope * convert(old_locked.end - block.timestamp, int128) if new_locked.end > block.timestamp and new_locked.amount > 0: u_new.slope = new_locked.amount / MAXTIME u_new.bias = u_new.slope * convert(new_locked.end - block.timestamp, int128) # Read values of scheduled changes in the slope # old_locked.end can be in the past and in the future # new_locked.end can ONLY by in the FUTURE unless everything expired: than zeros old_dslope = self.slope_changes[old_locked.end] if new_locked.end != 0: if new_locked.end == old_locked.end: new_dslope = old_dslope else: new_dslope = self.slope_changes[new_locked.end] last_point: Point = Point({bias: 0, slope: 0, ts: block.timestamp, blk: block.number}) if _epoch > 0: last_point = self.point_history[_epoch] last_checkpoint: uint256 = last_point.ts # initial_last_point is used for extrapolation to calculate block number # (approximately, for *At methods) and save them # as we cannot figure that out exactly from inside the contract initial_last_point: Point = last_point block_slope: uint256 = 0 # dblock/dt if block.timestamp > last_point.ts: block_slope = MULTIPLIER * (block.number - last_point.blk) / (block.timestamp - last_point.ts) # If last point is already recorded in this block, slope=0 # But that's ok b/c we know the block in such case # Go over weeks to fill history and calculate what the current point is t_i: uint256 = (last_checkpoint / WEEK) * WEEK for i in range(255): # Hopefully it won't happen that this won't get used in 5 years! # If it does, users will be able to withdraw but vote weight will be broken t_i += WEEK d_slope: int128 = 0 if t_i > block.timestamp: t_i = block.timestamp else: d_slope = self.slope_changes[t_i] last_point.bias -= last_point.slope * convert(t_i - last_checkpoint, int128) last_point.slope += d_slope if last_point.bias < 0: # This can happen last_point.bias = 0 if last_point.slope < 0: # This cannot happen - just in case last_point.slope = 0 last_checkpoint = t_i last_point.ts = t_i last_point.blk = initial_last_point.blk + block_slope * (t_i - initial_last_point.ts) / MULTIPLIER _epoch += 1 if t_i == block.timestamp: last_point.blk = block.number break else: self.point_history[_epoch] = last_point self.epoch = _epoch # Now point_history is filled until t=now if addr != ZERO_ADDRESS: # If last point was in this block, the slope change has been applied already # But in such case we have 0 slope(s) last_point.slope += (u_new.slope - u_old.slope) last_point.bias += (u_new.bias - u_old.bias) if last_point.slope < 0: last_point.slope = 0 if last_point.bias < 0: last_point.bias = 0 # Record the changed point into history self.point_history[_epoch] = last_point if addr != ZERO_ADDRESS: # Schedule the slope changes (slope is going down) # We subtract new_user_slope from [new_locked.end] # and add old_user_slope to [old_locked.end] if old_locked.end > block.timestamp: # old_dslope was <something> - u_old.slope, so we cancel that old_dslope += u_old.slope if new_locked.end == old_locked.end: old_dslope -= u_new.slope # It was a new deposit, not extension self.slope_changes[old_locked.end] = old_dslope if new_locked.end > block.timestamp: if new_locked.end > old_locked.end: new_dslope -= u_new.slope # old slope disappeared at this point self.slope_changes[new_locked.end] = new_dslope # else: we recorded it already in old_dslope # Now handle user history user_epoch: uint256 = self.user_point_epoch[addr] + 1 self.user_point_epoch[addr] = user_epoch u_new.ts = block.timestamp u_new.blk = block.number self.user_point_history[addr][user_epoch] = u_new @internal def _deposit_for(_addr: address, _value: uint256, unlock_time: uint256, locked_balance: LockedBalance, type: int128): """ @notice Deposit and lock tokens for a user @param _addr User's wallet address @param _value Amount to deposit @param unlock_time New time when to unlock the tokens, or 0 if unchanged @param locked_balance Previous locked amount / timestamp """ _locked: LockedBalance = locked_balance supply_before: uint256 = self.supply self.supply = supply_before + _value old_locked: LockedBalance = _locked # Adding to existing lock, or if a lock is expired - creating a new one _locked.amount += convert(_value, int128) if unlock_time != 0: _locked.end = unlock_time self.locked[_addr] = _locked # Possibilities: # Both old_locked.end could be current or expired (>/< block.timestamp) # value == 0 (extend lock) or value > 0 (add to lock or extend lock) # _locked.end > block.timestamp (always) self._checkpoint(_addr, old_locked, _locked) if _value != 0: assert ERC20(self.token).transferFrom(_addr, self, _value) log Deposit(_addr, _value, _locked.end, type, block.timestamp) log Supply(supply_before, supply_before + _value) @internal def _deposit_for_from(_addr: address, _value: uint256, _from_account: address, unlock_time: uint256, locked_balance: LockedBalance, type: int128): """ @notice Deposit and lock tokens for a user This function is different from the original _deposit_for in terms of where the token is transferred from. @param _addr User's wallet address @param _value Amount to deposit @param _from_account Account from which to deposit @param unlock_time New time when to unlock the tokens, or 0 if unchanged @param locked_balance Previous locked amount / timestamp """ _locked: LockedBalance = locked_balance supply_before: uint256 = self.supply self.supply = supply_before + _value old_locked: LockedBalance = _locked # Adding to existing lock, or if a lock is expired - creating a new one _locked.amount += convert(_value, int128) if unlock_time != 0: _locked.end = unlock_time self.locked[_addr] = _locked # Possibilities: # Both old_locked.end could be current or expired (>/< block.timestamp) # value == 0 (extend lock) or value > 0 (add to lock or extend lock) # _locked.end > block.timestamp (always) self._checkpoint(_addr, old_locked, _locked) if _value != 0: assert ERC20(self.token).transferFrom(_from_account, self, _value) log Deposit(_addr, _value, _locked.end, type, block.timestamp) log Supply(supply_before, supply_before + _value) @external def checkpoint(): """ @notice Record global data to checkpoint """ self._checkpoint(ZERO_ADDRESS, empty(LockedBalance), empty(LockedBalance)) @external @nonreentrant('lock') def deposit_for(_addr: address, _value: uint256): """ @notice Deposit `_value` tokens for `_addr` and add to the lock @dev Anyone (even a smart contract) can deposit for someone else, but cannot extend their locktime and deposit for a brand new user @param _addr User's wallet address @param _value Amount to add to user's lock """ _locked: LockedBalance = self.locked[_addr] assert _value > 0 # dev: need non-zero value assert _locked.amount > 0, "No existing lock found" assert _locked.end > block.timestamp, "Cannot add to expired lock. Withdraw" self._deposit_for(_addr, _value, 0, self.locked[_addr], DEPOSIT_FOR_TYPE) @external @nonreentrant('lock') def deposit_for_from(_addr: address, _value: uint256): """ @notice Deposit `_value` tokens for `_addr` and add to the lock @dev Anyone (even a smart contract) can deposit for someone else from their account @param _addr User's wallet address @param _value Amount to add to user's lock """ _locked: LockedBalance = self.locked[_addr] assert _value > 0 # dev: need non-zero value assert _locked.amount > 0, "No existing lock found" assert _locked.end > block.timestamp, "Cannot add to expired lock. Withdraw" assert _addr != msg.sender, "cannot call it on own account" self._deposit_for_from(_addr, _value, msg.sender, 0, self.locked[_addr], DEPOSIT_FOR_FROM_TYPE) @external @nonreentrant('lock') def create_lock(_value: uint256, _unlock_time: uint256): """ @notice Deposit `_value` tokens for `msg.sender` and lock until `_unlock_time` @param _value Amount to deposit @param _unlock_time Epoch time when tokens unlock, rounded down to whole weeks """ self.assert_not_contract(msg.sender) unlock_time: uint256 = (_unlock_time / WEEK) * WEEK # Locktime is rounded down to weeks _locked: LockedBalance = self.locked[msg.sender] assert _value > 0 # dev: need non-zero value assert _locked.amount == 0, "Withdraw old tokens first" assert unlock_time > block.timestamp, "Can only lock until time in the future" assert unlock_time <= block.timestamp + MAXTIME, "Voting lock can be 4 years max" self._deposit_for(msg.sender, _value, unlock_time, _locked, CREATE_LOCK_TYPE) @external @nonreentrant('lock') def increase_amount(_value: uint256): """ @notice Deposit `_value` additional tokens for `msg.sender` without modifying the unlock time @param _value Amount of tokens to deposit and add to the lock """ self.assert_not_contract(msg.sender) _locked: LockedBalance = self.locked[msg.sender] assert _value > 0 # dev: need non-zero value assert _locked.amount > 0, "No existing lock found" assert _locked.end > block.timestamp, "Cannot add to expired lock. Withdraw" self._deposit_for(msg.sender, _value, 0, _locked, INCREASE_LOCK_AMOUNT) @external @nonreentrant('lock') def increase_unlock_time(_unlock_time: uint256): """ @notice Extend the unlock time for `msg.sender` to `_unlock_time` @param _unlock_time New epoch time for unlocking """ self.assert_not_contract(msg.sender) _locked: LockedBalance = self.locked[msg.sender] unlock_time: uint256 = (_unlock_time / WEEK) * WEEK # Locktime is rounded down to weeks assert _locked.end > block.timestamp, "Lock expired" assert _locked.amount > 0, "Nothing is locked" assert unlock_time > _locked.end, "Can only increase lock duration" assert unlock_time <= block.timestamp + MAXTIME, "Voting lock can be 4 years max" self._deposit_for(msg.sender, 0, unlock_time, _locked, INCREASE_UNLOCK_TIME) @external @nonreentrant('lock') def withdraw(): """ @notice Withdraw all tokens for `msg.sender` @dev Only possible if the lock has expired """ _locked: LockedBalance = self.locked[msg.sender] assert block.timestamp >= _locked.end, "The lock didn't expire" value: uint256 = convert(_locked.amount, uint256) old_locked: LockedBalance = _locked _locked.end = 0 _locked.amount = 0 self.locked[msg.sender] = _locked supply_before: uint256 = self.supply self.supply = supply_before - value # old_locked can have either expired <= timestamp or zero end # _locked has only 0 end # Both can have >= 0 amount self._checkpoint(msg.sender, old_locked, _locked) assert ERC20(self.token).transfer(msg.sender, value) log Withdraw(msg.sender, value, block.timestamp) log Supply(supply_before, supply_before - value) # The following ERC20/minime-compatible methods are not real balanceOf and supply! # They measure the weights for the purpose of voting, so they don't represent # real coins. @internal @view def find_block_epoch(_block: uint256, max_epoch: uint256) -> uint256: """ @notice Binary search to estimate timestamp for block number @param _block Block to find @param max_epoch Don't go beyond this epoch @return Approximate timestamp for block """ # Binary search _min: uint256 = 0 _max: uint256 = max_epoch for i in range(128): # Will be always enough for 128-bit numbers if _min >= _max: break _mid: uint256 = (_min + _max + 1) / 2 if self.point_history[_mid].blk <= _block: _min = _mid else: _max = _mid - 1 return _min @external @view def balanceOf(addr: address, _t: uint256 = block.timestamp) -> uint256: """ @notice Get the current voting power for `msg.sender` @dev Adheres to the ERC20 `balanceOf` interface for Aragon compatibility @param addr User wallet address @param _t Epoch time to return voting power at @return User voting power """ _epoch: uint256 = self.user_point_epoch[addr] if _epoch == 0: return 0 else: last_point: Point = self.user_point_history[addr][_epoch] last_point.bias -= last_point.slope * convert(_t - last_point.ts, int128) if last_point.bias < 0: last_point.bias = 0 return convert(last_point.bias, uint256) @internal @view def _balanceOfAt(addr: address, _block: uint256) -> uint256: """ @notice measure voting power of `addr` at block height `_block` @param addr User's wallet address @param _block Block to calculate the voting power at @return Voting power """ # Copying and pasting totalSupply code because Vyper cannot pass by # reference yet assert _block <= block.number # Binary search _min: uint256 = 0 _max: uint256 = self.user_point_epoch[addr] for i in range(128): # Will be always enough for 128-bit numbers if _min >= _max: break _mid: uint256 = (_min + _max + 1) / 2 if self.user_point_history[addr][_mid].blk <= _block: _min = _mid else: _max = _mid - 1 upoint: Point = self.user_point_history[addr][_min] max_epoch: uint256 = self.epoch _epoch: uint256 = self.find_block_epoch(_block, max_epoch) point_0: Point = self.point_history[_epoch] d_block: uint256 = 0 d_t: uint256 = 0 if _epoch < max_epoch: point_1: Point = self.point_history[_epoch + 1] d_block = point_1.blk - point_0.blk d_t = point_1.ts - point_0.ts else: d_block = block.number - point_0.blk d_t = block.timestamp - point_0.ts block_time: uint256 = point_0.ts if d_block != 0: block_time += d_t * (_block - point_0.blk) / d_block upoint.bias -= upoint.slope * convert(block_time - upoint.ts, int128) if upoint.bias >= 0: return convert(upoint.bias, uint256) else: return 0 @external @view def balanceOfAt(addr: address, _block: uint256) -> uint256: """ @notice Measure voting power of `addr` at block height `_block` @dev Adheres to MiniMe `balanceOfAt` interface: https://github.com/Giveth/minime @param addr User's wallet address @param _block Block to calculate the voting power at @return Voting power """ return self._balanceOfAt(addr,_block) @external @view def getPastVotes(addr: address, _block: uint256) -> uint256: """ @notice Measure voting power of `addr` at block height `_block` @dev Adheres to ERC20Votes `getPastVotes` interface: @openzeppelin-contracts-upgradeable/blob/master/contracts/token/ERC20/extensions/ERC20VotesCompUpgradeable.sol @param addr User's wallet address @param _block Block to calculate the voting power at @return Voting power """ return self._balanceOfAt(addr,_block) @internal @view def supply_at(point: Point, t: uint256) -> uint256: """ @notice Calculate total voting power at some point in the past @param point The point (bias/slope) to start search from @param t Time to calculate the total voting power at @return Total voting power at that time """ last_point: Point = point t_i: uint256 = (last_point.ts / WEEK) * WEEK for i in range(255): t_i += WEEK d_slope: int128 = 0 if t_i > t: t_i = t else: d_slope = self.slope_changes[t_i] last_point.bias -= last_point.slope * convert(t_i - last_point.ts, int128) if t_i == t: break last_point.slope += d_slope last_point.ts = t_i if last_point.bias < 0: last_point.bias = 0 return convert(last_point.bias, uint256) @external @view def totalSupply(t: uint256 = block.timestamp) -> uint256: """ @notice Calculate total voting power @dev Adheres to the ERC20 `totalSupply` interface for Aragon compatibility @return Total voting power """ _epoch: uint256 = self.epoch last_point: Point = self.point_history[_epoch] return self.supply_at(last_point, t) @external @view def totalSupplyAt(_block: uint256) -> uint256: """ @notice Calculate total voting power at some point in the past @param _block Block to calculate the total voting power at @return Total voting power at `_block` """ assert _block <= block.number _epoch: uint256 = self.epoch target_epoch: uint256 = self.find_block_epoch(_block, _epoch) point: Point = self.point_history[target_epoch] dt: uint256 = 0 if target_epoch < _epoch: point_next: Point = self.point_history[target_epoch + 1] if point.blk != point_next.blk: dt = (_block - point.blk) * (point_next.ts - point.ts) / (point_next.blk - point.blk) else: if point.blk != block.number: dt = (_block - point.blk) * (block.timestamp - point.ts) / (block.number - point.blk) # Now dt contains info on how far are we beyond point return self.supply_at(point, point.ts + dt)
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"name":"CommitOwnership","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ApplyOwnership","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"Deposit","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"value","type":"uint256","indexed":false},{"name":"locktime","type":"uint256","indexed":true},{"name":"type","type":"int128","indexed":false},{"name":"ts","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Withdraw","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"value","type":"uint256","indexed":false},{"name":"ts","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Supply","inputs":[{"name":"prevSupply","type":"uint256","indexed":false},{"name":"supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"initialize","inputs":[{"name":"_admin","type":"address"},{"name":"token_addr","type":"address"},{"name":"_smart_wallet_checker","type":"address"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"}],"outputs":[],"gas":426758},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"addr","type":"address"}],"outputs":[],"gas":39572},{"stateMutability":"nonpayable","type":"function","name":"accept_transfer_ownership","inputs":[],"outputs":[],"gas":39420},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":41644},{"stateMutability":"nonpayable","type":"function","name":"commit_smart_wallet_checker","inputs":[{"name":"addr","type":"address"}],"outputs":[],"gas":37665},{"stateMutability":"nonpayable","type":"function","name":"apply_smart_wallet_checker","inputs":[],"outputs":[],"gas":39692},{"stateMutability":"view","type":"function","name":"get_last_user_slope","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"int128"}],"gas":5061},{"stateMutability":"view","type":"function","name":"user_point_history__ts","inputs":[{"name":"_addr","type":"address"},{"name":"_idx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":2864},{"stateMutability":"view","type":"function","name":"locked__end","inputs":[{"name":"_addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":2849},{"stateMutability":"nonpayable","type":"function","name":"checkpoint","inputs":[],"outputs":[],"gas":37407744},{"stateMutability":"nonpayable","type":"function","name":"deposit_for","inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[],"gas":75001253},{"stateMutability":"nonpayable","type":"function","name":"deposit_for_from","inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[],"gas":75001434},{"stateMutability":"nonpayable","type":"function","name":"create_lock","inputs":[{"name":"_value","type":"uint256"},{"name":"_unlock_time","type":"uint256"}],"outputs":[],"gas":75002912},{"stateMutability":"nonpayable","type":"function","name":"increase_amount","inputs":[{"name":"_value","type":"uint256"}],"outputs":[],"gas":75002333},{"stateMutability":"nonpayable","type":"function","name":"increase_unlock_time","inputs":[{"name":"_unlock_time","type":"uint256"}],"outputs":[],"gas":75002980},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[],"outputs":[],"gas":37587268},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"},{"name":"_t","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"balanceOfAt","inputs":[{"name":"addr","type":"address"},{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":1231801},{"stateMutability":"view","type":"function","name":"getPastVotes","inputs":[{"name":"addr","type":"address"},{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":1231831},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[{"name":"t","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalSupplyAt","inputs":[{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":1354118},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3018},{"stateMutability":"view","type":"function","name":"supply","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3048},{"stateMutability":"view","type":"function","name":"locked","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"amount","type":"int128"},{"name":"end","type":"uint256"}],"gas":5683},{"stateMutability":"view","type":"function","name":"epoch","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3108},{"stateMutability":"view","type":"function","name":"point_history","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"bias","type":"int128"},{"name":"slope","type":"int128"},{"name":"ts","type":"uint256"},{"name":"blk","type":"uint256"}],"gas":9993},{"stateMutability":"view","type":"function","name":"user_point_history","inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"uint256"}],"outputs":[{"name":"bias","type":"int128"},{"name":"slope","type":"int128"},{"name":"ts","type":"uint256"},{"name":"blk","type":"uint256"}],"gas":10238},{"stateMutability":"view","type":"function","name":"user_point_epoch","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3413},{"stateMutability":"view","type":"function","name":"slope_changes","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"int128"}],"gas":3343},{"stateMutability":"view","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":13488},{"stateMutability":"view","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":11241},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3318},{"stateMutability":"view","type":"function","name":"future_smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3348},{"stateMutability":"view","type":"function","name":"smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3378},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3408},{"stateMutability":"view","type":"function","name":"future_admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3438},{"stateMutability":"view","type":"function","name":"initialized","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3468}]
Contract Creation Code
6f7fffffffffffffffffffffffffffffff6040526c050c783eb9b5c840000000001954612fd35760016c050c783eb9b5c840000000001955612fbb56600436101561000d57611b1e565b600035601c526f7fffffffffffffffffffffffffffffff60405260005134612f7a576383b435898114156101fb5760043560a01c612f7a5760243560a01c612f7a5760443560a01c612f7a5760606064356004016101403760406064356004013511612f7a5760406084356004016101c03760206084356004013511612f7a576c050c783eb9b5c840000000001954612f7a5760016c050c783eb9b5c84000000000195560006004351815612f7a576004356c050c783eb9b5c8400000000017556024356006556044356c050c783eb9b5c84000000000165543600d5542600c5560206102a0600463313ce5676102405261025c6024355afa15612f7a57601f3d1115612f7a576000506102a0516102205260ff6102205111612f7a57610220516c050c783eb9b5c840000000001455610140806c050c783eb9b5c840000000000d602082510161012060006003818352015b8261012051602002111561017357610195565b61012051602002850151610120518501555b8151600101808352811415610160575b5050505050506101c0806c050c783eb9b5c8400000000011602082510161012060006002818352015b826101205160200211156101d1576101f3565b61012051602002850151610120518501555b81516001018083528114156101be575b505050505050005b636b441a4081141561027e5760043560a01c612f7a576c050c783eb9b5c840000000001754331415612f7a5760006004351815612f7a576004356c050c783eb9b5c8400000000018557f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e961014080808060043581525050602090509050610140a1005b63e5ea47b88114156102f6576c050c783eb9b5c8400000000018546101405261014051331415612f7a57610140516c050c783eb9b5c8400000000017557febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056101608080806101405181525050602090509050610160a1005b636a1c05ae811415610385576c050c783eb9b5c840000000001754331415612f7a576c050c783eb9b5c840000000001854610140526000610140511815612f7a57610140516c050c783eb9b5c8400000000017557febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056101608080806101405181525050602090509050610160a1005b6357f901e28114156103c55760043560a01c612f7a576c050c783eb9b5c840000000001754331415612f7a576004356c050c783eb9b5c840000000001555005b638e5b490f811415610407576c050c783eb9b5c840000000001754331415612f7a576c050c783eb9b5c8400000000015546c050c783eb9b5c840000000001655005b637c74a17481141561047b5760043560a01c612f7a576c050c783eb9b5c840000000000b60043560e05260c052604060c02054610140526001600461014051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a60043560e05260c052604060c02001015460005260206000f35b63da020a188114156104cd5760043560a01c612f7a5760026004602435633b9aca00811015612f7a57026c050c783eb9b5c840000000000a60043560e05260c052604060c02001015460005260206000f35b63adc635898114156105005760043560a01c612f7a576001600860043560e05260c052604060c020015460005260206000f35b63c2c4c5c181141561058e5760403661014037604036610180376101405161016051610180516101a05160006101c0526101e061014080518252806020015182602001525050610220610180805182528060200151826020015250506102405161022051610200516101e0516101c05160065801611c0a565b6101a052610180526101605261014052600050005b633a46273e81141561071457600054612f7a57600160005560043560a01c612f7a57610140600860043560e05260c052604060c0208054825260018101548260200152505060006024351115612f7a576000610140511361062e576308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050606461019cfd5b4261016051116106a2576308c379a06101805260206101a05260246101c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686101e0527f6472617700000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b6101405161016051604060046101803760006101c0526101e0600860043560e05260c052604060c0208054825260018101548260200152505060006102205261022051610200516101e0516101c0516101a0516101805160065801612396565b61016052610140526000506000600055005b63301d4a0d8114156108f257600154612f7a57600160015560043560a01c612f7a57610140600860043560e05260c052604060c0208054825260018101548260200152505060006024351115612f7a57600061014051136107b4576308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050606461019cfd5b426101605111610828576308c379a06101805260206101a05260246101c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686101e0527f6472617700000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b336004351415610877576308c379a06101805260206101a052601d6101c0527f63616e6e6f742063616c6c206974206f6e206f776e206163636f756e740000006101e0526101c050606461019cfd5b61014051610160516040600461018037336101c05260006101e052610200600860043560e05260c052604060c020805482526001810154826020015250506004610240526102405161022051610200516101e0516101c0516101a0516101805160065801612631565b61016052610140526000506000600155005b6365fc3873811415610b1257600254612f7a57600160025533610140526101405160065801611b24565b60005060243562093a808082049050905062093a80808202821582848304141715612f7a57809050905090506101405261016060083360e05260c052604060c0208054825260018101548260200152505060006004351115612f7a5761016051156109c6576308c379a06101a05260206101c05260196101e0527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000610200526101e05060646101bcfd5b426101405111610a3a576308c379a06101a05260206101c05260266101e0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610200527f6675747572650000000000000000000000000000000000000000000000000000610220526101e05060846101bcfd5b42630784ce008181830110612f7a5780820190509050610140511115610a9f576308c379a06101a05260206101c052601e6101e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610200526101e05060646101bcfd5b610140516101605161018051336101a0526004356101c052610140516101e052610200610160805182528060200151826020015250506001610240526102405161022051610200516101e0516101c0516101a05160065801612396565b6101805261016052610140526000506000600255005b634957677c811415610c9857600354612f7a57600160035533610140526101405160065801611b24565b60005061014060083360e05260c052604060c0208054825260018101548260200152505060006004351115612f7a5760006101405113610bbb576308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050606461019cfd5b426101605111610c2f576308c379a06101805260206101a05260246101c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686101e0527f6472617700000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b610140516101605133610180526004356101a05260006101c0526101e06101408051825280602001518260200152505060026102205261022051610200516101e0516101c0516101a0516101805160065801612396565b61016052610140526000506000600355005b63eff7a612811415610edb57600454612f7a57600160045533610140526101405160065801611b24565b60005061014060083360e05260c052604060c0208054825260018101548260200152505060043562093a808082049050905062093a80808202821582848304141715612f7a578090509050905061018052426101605111610d62576308c379a06101a05260206101c052600c6101e0527f4c6f636b20657870697265640000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405113610db2576308c379a06101a05260206101c05260116101e0527f4e6f7468696e67206973206c6f636b6564000000000000000000000000000000610200526101e05060646101bcfd5b610160516101805111610e04576308c379a06101a05260206101c052601f6101e0527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e00610200526101e05060646101bcfd5b42630784ce008181830110612f7a5780820190509050610180511115610e69576308c379a06101a05260206101c052601e6101e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610200526101e05060646101bcfd5b610140516101605161018051336101a05260006101c052610180516101e052610200610140805182528060200151826020015250506003610240526102405161022051610200516101e0516101c0516101a05160065801612396565b6101805261016052610140526000506000600455005b633ccfd60b81141561114257600554612f7a57600160055561014060083360e05260c052604060c0208054825260018101548260200152505061016051421015610f64576308c379a06101805260206101a05260166101c0527f546865206c6f636b206469646e277420657870697265000000000000000000006101e0526101c050606461019cfd5b6101405160008112612f7a57610180526101a06101408051825280602001518260200152505060006101605260006101405260083360e05260c052604060c020610140805182558060200151600183015550506007546101e0526101e05161018051808210612f7a57808203905090506007556101405161016051610180516101a0516101c0516101e05133610200526102206101a08051825280602001518260200152505061026061014080518252806020015182602001525050610280516102605161024051610220516102005160065801611c0a565b6101e0526101c0526101a05261018052610160526101405260005060206102a0604463a9059cbb610200523361022052610180516102405261021c60006006545af115612f7a57601f3d1115612f7a576000506102a05115612f7a57337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568610200808080610180518152505060208101905080804281525050604090509050610200a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6102008080806101e0518152505060208101905080806101e05161018051808210612f7a578082039050905081525050604090509050610200a16000600555005b6370a08231811415611158574261014052611178565b62fdd58e811415611173576020602461014037600050611178565b611296565b60043560a01c612f7a576c050c783eb9b5c840000000000b60043560e05260c052604060c0205461016052610160516111ba57600060005260206000f3611294565b610180600461016051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a60043560e05260c052604060c0200180548252600181015482602001526002810154826040015260038101548260600152505061018080516101a051610140516101c051808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a578090509050905080820380607f1d8160801d1415612f7a5780905090509050815250600061018051121561127f576000610180525b6101805160008112612f7a5760005260206000f35b005b634ee2cd7e8114156112dc5760043560a01c612f7a5760043561014052602435610160526101605161014051600658016129bc565b6101c0526101c05160005260206000f35b633a46b1a88114156113225760043560a01c612f7a5760043561014052602435610160526101605161014051600658016129bc565b6101c0526101c05160005260206000f35b6318160ddd811415611338574261014052611359565b63bd85b039811415611354576020600461014037600050611359565b611436565b600954610160526101806004610160516c01431e0fae6d7217caa0000000811015612f7a5702600a018054825260018101548260200152600281015482604001526003810154826060015250506101405161016051610180516101a0516101c0516101e0516102006101808051825280602001518260200152806040015182604001528060600151826060015250506101405161028052610280516102605161024051610220516102005160065801612dc6565b6102e0526101e0526101c0526101a0526101805261016052610140526102e05160005260206000f35b63981b24d08114156116d9574360043511612f7a5760095461014052610140516101605160043561018052610140516101a0526101a05161018051600658016128d8565b61020052610160526101405261020051610160526101806004610160516c01431e0fae6d7217caa0000000811015612f7a5702600a01805482526001810154826020015260028101548260400152600381015482606001525050600061020052610140516101605110156115bd5761022060046101605160018181830110612f7a57808201905090506c01431e0fae6d7217caa0000000811015612f7a5702600a01805482526001810154826020015260028101548260400152600381015482606001525050610280516101e05118156115b8576004356101e051808210612f7a5780820390509050610260516101c051808210612f7a5780820390509050808202821582848304141715612f7a5780905090509050610280516101e051808210612f7a5780820390509050808015612f7a57820490509050610200525b61162d565b436101e051181561162c576004356101e051808210612f7a5780820390509050426101c051808210612f7a5780820390509050808202821582848304141715612f7a5780905090509050436101e051808210612f7a5780820390509050808015612f7a57820490509050610200525b5b6101405161016051610180516101a0516101c0516101e051610200516102206101808051825280602001518260200152806040015182604001528060600151826060015250506101c051610200518181830110612f7a57808201905090506102a0526102a0516102805161026051610240516102205160065801612dc6565b61030052610200526101e0526101c0526101a0526101805261016052610140526103005160005260206000f35b63fc0c546a8114156116f15760065460005260206000f35b63047fc9aa8114156117095760075460005260206000f35b63cbf9fe5f81141561175d5760043560a01c612f7a57600860043560e05260c052604060c020610140808080845481525050602081019050808060018501548152505060409050905060c05260c051610140f35b63900cf0cf8114156117755760095460005260206000f35b63d1febfb98114156117ef5760046004356c01431e0fae6d7217caa0000000811015612f7a5702600a0161014080808084548152505060208101905080806001850154815250506020810190508080600285015481525050602081019050808060038501548152505060809050905060c05260c051610140f35b6328d09d478114156118845760043560a01c612f7a576004602435633b9aca00811015612f7a57026c050c783eb9b5c840000000000a60043560e05260c052604060c0200161014080808084548152505060208101905080806001850154815250506020810190508080600285015481525050602081019050808060038501548152505060809050905060c05260c051610140f35b63010ae7578114156118c05760043560a01c612f7a576c050c783eb9b5c840000000000b60043560e05260c052604060c0205460005260206000f35b63711974848114156118f2576c050c783eb9b5c840000000000c60043560e05260c052604060c0205460005260206000f35b6306fdde0381141561199b576c050c783eb9b5c840000000000d80610180602082540161012060006003818352015b8261012051602002111561193457611956565b61012051850154610120516020028501525b8151600101808352811415611921575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6395d89b41811415611a44576c050c783eb9b5c840000000001180610180602082540161012060006002818352015b826101205160200211156119dd576119ff565b61012051850154610120516020028501525b81516001018083528114156119ca575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b63313ce567811415611a68576c050c783eb9b5c84000000000145460005260206000f35b638ff36fd1811415611a8c576c050c783eb9b5c84000000000155460005260206000f35b637175d4f7811415611ab0576c050c783eb9b5c84000000000165460005260206000f35b63f851a440811415611ad4576c050c783eb9b5c84000000000175460005260206000f35b6317f7182a811415611af8576c050c783eb9b5c84000000000185460005260206000f35b63158ef93e811415611b1c576c050c783eb9b5c84000000000195460005260206000f35b505b60006000fd5b610160526101405232610140511815611c04576c050c783eb9b5c840000000001654610180526000610180511815611b9a576020610220602463c23697a86101a052610140516101c0526101bc6000610180515af115612f7a57601f3d1115612f7a576000506102205115611b995761016051565b5b6308c379a06101a05260206101c05260256101e0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c610200527f6c6f776564000000000000000000000000000000000000000000000000000000610220526101e05060846101bcfd5b61016051565b6101e0526101405261016052610180526101a0526101c0526101403661020037600954610340526000610140511815611dad5742610180511115611c545760006101605113611c57565b60005b15611cbe5761016051630784ce0080820580607f1d8160801d1415612f7a578090509050905061022052610220516101805142808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a5780905090509050610200525b426101c0511115611cd55760006101a05113611cd8565b60005b15611d3f576101a051630784ce0080820580607f1d8160801d1415612f7a57809050905090506102a0526102a0516101c05142808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a5780905090509050610280525b6c050c783eb9b5c840000000000c6101805160e05260c052604060c020546103005260006101c0511815611dac57610180516101c0511415611d88576103005161032052611dab565b6c050c783eb9b5c840000000000c6101c05160e05260c052604060c02054610320525b5b5b6103606000815260008160200152428160400152438160600152506000610340511115611e1b576103606004610340516c01431e0fae6d7217caa0000000811015612f7a5702600a018054825260018101548260200152600281015482604001526003810154826060015250505b6103a0516103e0526104006103608051825280602001518260200152806040015182604001528060600151826060015250506000610480526103a051421115611eb657670de0b6b3a7640000436103c051808210612f7a5780820390509050808202821582848304141715612f7a5780905090509050426103a051808210612f7a5780820390509050808015612f7a57820490509050610480525b6103e05162093a808082049050905062093a80808202821582848304141715612f7a57809050905090506104a0526104c0600060ff818352015b6104a0805162093a808181830110612f7a578082019050905081525060006104e052426104a0511115611f2757426104a052611f4a565b6c050c783eb9b5c840000000000c6104a05160e05260c052604060c020546104e0525b6103608051610380516104a0516103e051808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a578090509050905080820380607f1d8160801d1415612f7a578090509050905081525061038080516104e05180820180607f1d8160801d1415612f7a57809050905090508152506000610360511215611fdc576000610360525b6000610380511215611fef576000610380525b6104a0516103e0526104a0516103a05261046051610480516104a05161044051808210612f7a5780820390509050808202821582848304141715612f7a5780905090509050670de0b6b3a7640000808204905090508181830110612f7a57808201905090506103c052610340805160018181830110612f7a5780820190509050815250426104a051141561208b57436103c0526120e3566120d2565b6004610340516c01431e0fae6d7217caa0000000811015612f7a5702600a016103608051825580602001516001830155806040015160028301558060600151600383015550505b5b8151600101808352811415611ef0575b505061034051600955600061014051181561219f5761038080516102a0516102205180820380607f1d8160801d1415612f7a578090509050905080820180607f1d8160801d1415612f7a57809050905090508152506103608051610280516102005180820380607f1d8160801d1415612f7a578090509050905080820180607f1d8160801d1415612f7a5780905090509050815250600061038051121561218b576000610380525b600061036051121561219e576000610360525b5b6004610340516c01431e0fae6d7217caa0000000811015612f7a5702600a01610360805182558060200151600183015580604001516002830155806060015160038301555050600061014051181561239057426101805111156122765761030080516102205180820180607f1d8160801d1415612f7a5780905090509050815250610180516101c05114156122535761030080516102a05180820380607f1d8160801d1415612f7a57809050905090508152505b610300516c050c783eb9b5c840000000000c6101805160e05260c052604060c020555b426101c05111156122d757610180516101c05111156122d65761032080516102a05180820380607f1d8160801d1415612f7a5780905090509050815250610320516c050c783eb9b5c840000000000c6101c05160e05260c052604060c020555b5b6c050c783eb9b5c840000000000b6101405160e05260c052604060c0205460018181830110612f7a57808201905090506104c0526104c0516c050c783eb9b5c840000000000b6101405160e05260c052604060c02055426102c052436102e05260046104c051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a6101405160e05260c052604060c020016102808051825580602001516001830155806040015160028301558060600151600383015550505b6101e051565b610200526101405261016052610180526101a0526101c0526101e0526102206101a0805182528060200151826020015250506007546102605261026051610160518181830110612f7a5780820190509050600755610280610220805182528060200151826020015250506102208051610160516040518111612f7a5780820180607f1d8160801d1415612f7a578090509050905081525060006101805118156124425761018051610240525b60086101405160e05260c052604060c020610220805182558060200151600183015550506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610140516102c0526102e061028080518252806020015182602001525050610320610220805182528060200151826020015250506103405161032051610300516102e0516102c05160065801611c0a565b6102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052600050600061016051181561257057602061038060646323b872dd6102c052610140516102e052306103005261016051610320526102dc60006006545af115612f7a57601f3d1115612f7a576000506103805115612f7a575b61024051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596102c0808080610160518152505060208101905080806101e05181525050602081019050808042815250506060905090506102c0a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6102c08080806102605181525050602081019050808061026051610160518181830110612f7a5780820190509050815250506040905090506102c0a161020051565b610220526101405261016052610180526101a0526101c0526101e052610200526102406101c0805182528060200151826020015250506007546102805261028051610160518181830110612f7a57808201905090506007556102a0610240805182528060200151826020015250506102408051610160516040518111612f7a5780820180607f1d8160801d1415612f7a578090509050905081525060006101a05118156126e1576101a051610260525b60086101405160e05260c052604060c020610240805182558060200151600183015550506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610140516102e0526103006102a08051825280602001518260200152505061034061024080518252806020015182602001525050610360516103405161032051610300516102e05160065801611c0a565b6102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006101605118156128175760206103a060646323b872dd6102e0526101805161030052306103205261016051610340526102fc60006006545af115612f7a57601f3d1115612f7a576000506103a05115612f7a575b61026051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596102e0808080610160518152505060208101905080806102005181525050602081019050808042815250506060905090506102e0a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6102e08080806102805181525050602081019050808061028051610160518181830110612f7a5780820190509050815250506040905090506102e0a161022051565b61018052610140526101605260006101a052610160516101c0526101e060006080818352015b6101c0516101a05110612910576129aa565b6101a0516101c0518181830110612f7a578082019050905060018181830110612f7a5780820190509050600280820490509050610200526101405160036004610200516c01431e0fae6d7217caa0000000811015612f7a5702600a0101541161298057610200516101a052612999565b610200516001808210612f7a57808203905090506101c0525b5b81516001018083528114156128fe575b50506101a05160005260005161018051565b610180526101405261016052436101605111612f7a5760006101a0526c050c783eb9b5c840000000000b6101405160e05260c052604060c020546101c0526101e060006080818352015b6101c0516101a05110612a1857612ac4565b6101a0516101c0518181830110612f7a578082019050905060018181830110612f7a578082019050905060028082049050905061020052610160516003600461020051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a6101405160e05260c052604060c02001015411612a9a57610200516101a052612ab3565b610200516001808210612f7a57808203905090506101c0525b5b8151600101808352811415612a06575b50506101e060046101a051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a6101405160e05260c052604060c02001805482526001810154826020015260028101548260400152600381015482606001525050600954610260526101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610160516102a052610260516102c0526102c0516102a051600658016128d8565b6103205261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032051610280526102a06004610280516c01431e0fae6d7217caa0000000811015612f7a5702600a018054825260018101548260200152600281015482604001526003810154826060015250506040366103203761026051610280511015612c965761036060046102805160018181830110612f7a57808201905090506c01431e0fae6d7217caa0000000811015612f7a5702600a018054825260018101548260200152600281015482604001526003810154826060015250506103c05161030051808210612f7a5780820390509050610320526103a0516102e051808210612f7a578082039050905061034052612cc5565b4361030051808210612f7a578082039050905061032052426102e051808210612f7a5780820390509050610340525b6102e051610360526000610320511815612d34576103608051610340516101605161030051808210612f7a5780820390509050808202821582848304141715612f7a578090509050905061032051808015612f7a578204905090508181830110612f7a57808201905090508152505b6101e08051610200516103605161022051808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a578090509050905080820380607f1d8160801d1415612f7a578090509050905081525060006101e05112612db6576101e05160008112612f7a576000526000516101805156612dc4565b600060005260005161018051565b005b6101e0526101405261016052610180526101a0526101c0526102006101408051825280602001518260200152806040015182604001528060600151826060015250506102405162093a808082049050905062093a80808202821582848304141715612f7a5780905090509050610280526102a0600060ff818352015b610280805162093a808181830110612f7a578082019050905081525060006102c0526101c051610280511115612e7f576101c05161028052612ea2565b6c050c783eb9b5c840000000000c6102805160e05260c052604060c020546102c0525b6102008051610220516102805161024051808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a578090509050905080820380607f1d8160801d1415612f7a57809050905090508152506101c051610280511415612f1057612f4d565b61022080516102c05180820180607f1d8160801d1415612f7a578090509050905081525061028051610240525b8151600101808352811415612e42575b50506000610200511215612f62576000610200525b6102005160008112612f7a576000526000516101e051565b600080fd5b61003c612fbb0361003c60003961003c612fbb036000f35b600080fd
Deployed Bytecode
0x600436101561000d57611b1e565b600035601c526f7fffffffffffffffffffffffffffffff60405260005134612f7a576383b435898114156101fb5760043560a01c612f7a5760243560a01c612f7a5760443560a01c612f7a5760606064356004016101403760406064356004013511612f7a5760406084356004016101c03760206084356004013511612f7a576c050c783eb9b5c840000000001954612f7a5760016c050c783eb9b5c84000000000195560006004351815612f7a576004356c050c783eb9b5c8400000000017556024356006556044356c050c783eb9b5c84000000000165543600d5542600c5560206102a0600463313ce5676102405261025c6024355afa15612f7a57601f3d1115612f7a576000506102a0516102205260ff6102205111612f7a57610220516c050c783eb9b5c840000000001455610140806c050c783eb9b5c840000000000d602082510161012060006003818352015b8261012051602002111561017357610195565b61012051602002850151610120518501555b8151600101808352811415610160575b5050505050506101c0806c050c783eb9b5c8400000000011602082510161012060006002818352015b826101205160200211156101d1576101f3565b61012051602002850151610120518501555b81516001018083528114156101be575b505050505050005b636b441a4081141561027e5760043560a01c612f7a576c050c783eb9b5c840000000001754331415612f7a5760006004351815612f7a576004356c050c783eb9b5c8400000000018557f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e961014080808060043581525050602090509050610140a1005b63e5ea47b88114156102f6576c050c783eb9b5c8400000000018546101405261014051331415612f7a57610140516c050c783eb9b5c8400000000017557febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056101608080806101405181525050602090509050610160a1005b636a1c05ae811415610385576c050c783eb9b5c840000000001754331415612f7a576c050c783eb9b5c840000000001854610140526000610140511815612f7a57610140516c050c783eb9b5c8400000000017557febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056101608080806101405181525050602090509050610160a1005b6357f901e28114156103c55760043560a01c612f7a576c050c783eb9b5c840000000001754331415612f7a576004356c050c783eb9b5c840000000001555005b638e5b490f811415610407576c050c783eb9b5c840000000001754331415612f7a576c050c783eb9b5c8400000000015546c050c783eb9b5c840000000001655005b637c74a17481141561047b5760043560a01c612f7a576c050c783eb9b5c840000000000b60043560e05260c052604060c02054610140526001600461014051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a60043560e05260c052604060c02001015460005260206000f35b63da020a188114156104cd5760043560a01c612f7a5760026004602435633b9aca00811015612f7a57026c050c783eb9b5c840000000000a60043560e05260c052604060c02001015460005260206000f35b63adc635898114156105005760043560a01c612f7a576001600860043560e05260c052604060c020015460005260206000f35b63c2c4c5c181141561058e5760403661014037604036610180376101405161016051610180516101a05160006101c0526101e061014080518252806020015182602001525050610220610180805182528060200151826020015250506102405161022051610200516101e0516101c05160065801611c0a565b6101a052610180526101605261014052600050005b633a46273e81141561071457600054612f7a57600160005560043560a01c612f7a57610140600860043560e05260c052604060c0208054825260018101548260200152505060006024351115612f7a576000610140511361062e576308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050606461019cfd5b4261016051116106a2576308c379a06101805260206101a05260246101c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686101e0527f6472617700000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b6101405161016051604060046101803760006101c0526101e0600860043560e05260c052604060c0208054825260018101548260200152505060006102205261022051610200516101e0516101c0516101a0516101805160065801612396565b61016052610140526000506000600055005b63301d4a0d8114156108f257600154612f7a57600160015560043560a01c612f7a57610140600860043560e05260c052604060c0208054825260018101548260200152505060006024351115612f7a57600061014051136107b4576308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050606461019cfd5b426101605111610828576308c379a06101805260206101a05260246101c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686101e0527f6472617700000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b336004351415610877576308c379a06101805260206101a052601d6101c0527f63616e6e6f742063616c6c206974206f6e206f776e206163636f756e740000006101e0526101c050606461019cfd5b61014051610160516040600461018037336101c05260006101e052610200600860043560e05260c052604060c020805482526001810154826020015250506004610240526102405161022051610200516101e0516101c0516101a0516101805160065801612631565b61016052610140526000506000600155005b6365fc3873811415610b1257600254612f7a57600160025533610140526101405160065801611b24565b60005060243562093a808082049050905062093a80808202821582848304141715612f7a57809050905090506101405261016060083360e05260c052604060c0208054825260018101548260200152505060006004351115612f7a5761016051156109c6576308c379a06101a05260206101c05260196101e0527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000610200526101e05060646101bcfd5b426101405111610a3a576308c379a06101a05260206101c05260266101e0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610200527f6675747572650000000000000000000000000000000000000000000000000000610220526101e05060846101bcfd5b42630784ce008181830110612f7a5780820190509050610140511115610a9f576308c379a06101a05260206101c052601e6101e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610200526101e05060646101bcfd5b610140516101605161018051336101a0526004356101c052610140516101e052610200610160805182528060200151826020015250506001610240526102405161022051610200516101e0516101c0516101a05160065801612396565b6101805261016052610140526000506000600255005b634957677c811415610c9857600354612f7a57600160035533610140526101405160065801611b24565b60005061014060083360e05260c052604060c0208054825260018101548260200152505060006004351115612f7a5760006101405113610bbb576308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050606461019cfd5b426101605111610c2f576308c379a06101805260206101a05260246101c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686101e0527f6472617700000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b610140516101605133610180526004356101a05260006101c0526101e06101408051825280602001518260200152505060026102205261022051610200516101e0516101c0516101a0516101805160065801612396565b61016052610140526000506000600355005b63eff7a612811415610edb57600454612f7a57600160045533610140526101405160065801611b24565b60005061014060083360e05260c052604060c0208054825260018101548260200152505060043562093a808082049050905062093a80808202821582848304141715612f7a578090509050905061018052426101605111610d62576308c379a06101a05260206101c052600c6101e0527f4c6f636b20657870697265640000000000000000000000000000000000000000610200526101e05060646101bcfd5b60006101405113610db2576308c379a06101a05260206101c05260116101e0527f4e6f7468696e67206973206c6f636b6564000000000000000000000000000000610200526101e05060646101bcfd5b610160516101805111610e04576308c379a06101a05260206101c052601f6101e0527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e00610200526101e05060646101bcfd5b42630784ce008181830110612f7a5780820190509050610180511115610e69576308c379a06101a05260206101c052601e6101e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610200526101e05060646101bcfd5b610140516101605161018051336101a05260006101c052610180516101e052610200610140805182528060200151826020015250506003610240526102405161022051610200516101e0516101c0516101a05160065801612396565b6101805261016052610140526000506000600455005b633ccfd60b81141561114257600554612f7a57600160055561014060083360e05260c052604060c0208054825260018101548260200152505061016051421015610f64576308c379a06101805260206101a05260166101c0527f546865206c6f636b206469646e277420657870697265000000000000000000006101e0526101c050606461019cfd5b6101405160008112612f7a57610180526101a06101408051825280602001518260200152505060006101605260006101405260083360e05260c052604060c020610140805182558060200151600183015550506007546101e0526101e05161018051808210612f7a57808203905090506007556101405161016051610180516101a0516101c0516101e05133610200526102206101a08051825280602001518260200152505061026061014080518252806020015182602001525050610280516102605161024051610220516102005160065801611c0a565b6101e0526101c0526101a05261018052610160526101405260005060206102a0604463a9059cbb610200523361022052610180516102405261021c60006006545af115612f7a57601f3d1115612f7a576000506102a05115612f7a57337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568610200808080610180518152505060208101905080804281525050604090509050610200a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6102008080806101e0518152505060208101905080806101e05161018051808210612f7a578082039050905081525050604090509050610200a16000600555005b6370a08231811415611158574261014052611178565b62fdd58e811415611173576020602461014037600050611178565b611296565b60043560a01c612f7a576c050c783eb9b5c840000000000b60043560e05260c052604060c0205461016052610160516111ba57600060005260206000f3611294565b610180600461016051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a60043560e05260c052604060c0200180548252600181015482602001526002810154826040015260038101548260600152505061018080516101a051610140516101c051808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a578090509050905080820380607f1d8160801d1415612f7a5780905090509050815250600061018051121561127f576000610180525b6101805160008112612f7a5760005260206000f35b005b634ee2cd7e8114156112dc5760043560a01c612f7a5760043561014052602435610160526101605161014051600658016129bc565b6101c0526101c05160005260206000f35b633a46b1a88114156113225760043560a01c612f7a5760043561014052602435610160526101605161014051600658016129bc565b6101c0526101c05160005260206000f35b6318160ddd811415611338574261014052611359565b63bd85b039811415611354576020600461014037600050611359565b611436565b600954610160526101806004610160516c01431e0fae6d7217caa0000000811015612f7a5702600a018054825260018101548260200152600281015482604001526003810154826060015250506101405161016051610180516101a0516101c0516101e0516102006101808051825280602001518260200152806040015182604001528060600151826060015250506101405161028052610280516102605161024051610220516102005160065801612dc6565b6102e0526101e0526101c0526101a0526101805261016052610140526102e05160005260206000f35b63981b24d08114156116d9574360043511612f7a5760095461014052610140516101605160043561018052610140516101a0526101a05161018051600658016128d8565b61020052610160526101405261020051610160526101806004610160516c01431e0fae6d7217caa0000000811015612f7a5702600a01805482526001810154826020015260028101548260400152600381015482606001525050600061020052610140516101605110156115bd5761022060046101605160018181830110612f7a57808201905090506c01431e0fae6d7217caa0000000811015612f7a5702600a01805482526001810154826020015260028101548260400152600381015482606001525050610280516101e05118156115b8576004356101e051808210612f7a5780820390509050610260516101c051808210612f7a5780820390509050808202821582848304141715612f7a5780905090509050610280516101e051808210612f7a5780820390509050808015612f7a57820490509050610200525b61162d565b436101e051181561162c576004356101e051808210612f7a5780820390509050426101c051808210612f7a5780820390509050808202821582848304141715612f7a5780905090509050436101e051808210612f7a5780820390509050808015612f7a57820490509050610200525b5b6101405161016051610180516101a0516101c0516101e051610200516102206101808051825280602001518260200152806040015182604001528060600151826060015250506101c051610200518181830110612f7a57808201905090506102a0526102a0516102805161026051610240516102205160065801612dc6565b61030052610200526101e0526101c0526101a0526101805261016052610140526103005160005260206000f35b63fc0c546a8114156116f15760065460005260206000f35b63047fc9aa8114156117095760075460005260206000f35b63cbf9fe5f81141561175d5760043560a01c612f7a57600860043560e05260c052604060c020610140808080845481525050602081019050808060018501548152505060409050905060c05260c051610140f35b63900cf0cf8114156117755760095460005260206000f35b63d1febfb98114156117ef5760046004356c01431e0fae6d7217caa0000000811015612f7a5702600a0161014080808084548152505060208101905080806001850154815250506020810190508080600285015481525050602081019050808060038501548152505060809050905060c05260c051610140f35b6328d09d478114156118845760043560a01c612f7a576004602435633b9aca00811015612f7a57026c050c783eb9b5c840000000000a60043560e05260c052604060c0200161014080808084548152505060208101905080806001850154815250506020810190508080600285015481525050602081019050808060038501548152505060809050905060c05260c051610140f35b63010ae7578114156118c05760043560a01c612f7a576c050c783eb9b5c840000000000b60043560e05260c052604060c0205460005260206000f35b63711974848114156118f2576c050c783eb9b5c840000000000c60043560e05260c052604060c0205460005260206000f35b6306fdde0381141561199b576c050c783eb9b5c840000000000d80610180602082540161012060006003818352015b8261012051602002111561193457611956565b61012051850154610120516020028501525b8151600101808352811415611921575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6395d89b41811415611a44576c050c783eb9b5c840000000001180610180602082540161012060006002818352015b826101205160200211156119dd576119ff565b61012051850154610120516020028501525b81516001018083528114156119ca575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b63313ce567811415611a68576c050c783eb9b5c84000000000145460005260206000f35b638ff36fd1811415611a8c576c050c783eb9b5c84000000000155460005260206000f35b637175d4f7811415611ab0576c050c783eb9b5c84000000000165460005260206000f35b63f851a440811415611ad4576c050c783eb9b5c84000000000175460005260206000f35b6317f7182a811415611af8576c050c783eb9b5c84000000000185460005260206000f35b63158ef93e811415611b1c576c050c783eb9b5c84000000000195460005260206000f35b505b60006000fd5b610160526101405232610140511815611c04576c050c783eb9b5c840000000001654610180526000610180511815611b9a576020610220602463c23697a86101a052610140516101c0526101bc6000610180515af115612f7a57601f3d1115612f7a576000506102205115611b995761016051565b5b6308c379a06101a05260206101c05260256101e0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c610200527f6c6f776564000000000000000000000000000000000000000000000000000000610220526101e05060846101bcfd5b61016051565b6101e0526101405261016052610180526101a0526101c0526101403661020037600954610340526000610140511815611dad5742610180511115611c545760006101605113611c57565b60005b15611cbe5761016051630784ce0080820580607f1d8160801d1415612f7a578090509050905061022052610220516101805142808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a5780905090509050610200525b426101c0511115611cd55760006101a05113611cd8565b60005b15611d3f576101a051630784ce0080820580607f1d8160801d1415612f7a57809050905090506102a0526102a0516101c05142808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a5780905090509050610280525b6c050c783eb9b5c840000000000c6101805160e05260c052604060c020546103005260006101c0511815611dac57610180516101c0511415611d88576103005161032052611dab565b6c050c783eb9b5c840000000000c6101c05160e05260c052604060c02054610320525b5b5b6103606000815260008160200152428160400152438160600152506000610340511115611e1b576103606004610340516c01431e0fae6d7217caa0000000811015612f7a5702600a018054825260018101548260200152600281015482604001526003810154826060015250505b6103a0516103e0526104006103608051825280602001518260200152806040015182604001528060600151826060015250506000610480526103a051421115611eb657670de0b6b3a7640000436103c051808210612f7a5780820390509050808202821582848304141715612f7a5780905090509050426103a051808210612f7a5780820390509050808015612f7a57820490509050610480525b6103e05162093a808082049050905062093a80808202821582848304141715612f7a57809050905090506104a0526104c0600060ff818352015b6104a0805162093a808181830110612f7a578082019050905081525060006104e052426104a0511115611f2757426104a052611f4a565b6c050c783eb9b5c840000000000c6104a05160e05260c052604060c020546104e0525b6103608051610380516104a0516103e051808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a578090509050905080820380607f1d8160801d1415612f7a578090509050905081525061038080516104e05180820180607f1d8160801d1415612f7a57809050905090508152506000610360511215611fdc576000610360525b6000610380511215611fef576000610380525b6104a0516103e0526104a0516103a05261046051610480516104a05161044051808210612f7a5780820390509050808202821582848304141715612f7a5780905090509050670de0b6b3a7640000808204905090508181830110612f7a57808201905090506103c052610340805160018181830110612f7a5780820190509050815250426104a051141561208b57436103c0526120e3566120d2565b6004610340516c01431e0fae6d7217caa0000000811015612f7a5702600a016103608051825580602001516001830155806040015160028301558060600151600383015550505b5b8151600101808352811415611ef0575b505061034051600955600061014051181561219f5761038080516102a0516102205180820380607f1d8160801d1415612f7a578090509050905080820180607f1d8160801d1415612f7a57809050905090508152506103608051610280516102005180820380607f1d8160801d1415612f7a578090509050905080820180607f1d8160801d1415612f7a5780905090509050815250600061038051121561218b576000610380525b600061036051121561219e576000610360525b5b6004610340516c01431e0fae6d7217caa0000000811015612f7a5702600a01610360805182558060200151600183015580604001516002830155806060015160038301555050600061014051181561239057426101805111156122765761030080516102205180820180607f1d8160801d1415612f7a5780905090509050815250610180516101c05114156122535761030080516102a05180820380607f1d8160801d1415612f7a57809050905090508152505b610300516c050c783eb9b5c840000000000c6101805160e05260c052604060c020555b426101c05111156122d757610180516101c05111156122d65761032080516102a05180820380607f1d8160801d1415612f7a5780905090509050815250610320516c050c783eb9b5c840000000000c6101c05160e05260c052604060c020555b5b6c050c783eb9b5c840000000000b6101405160e05260c052604060c0205460018181830110612f7a57808201905090506104c0526104c0516c050c783eb9b5c840000000000b6101405160e05260c052604060c02055426102c052436102e05260046104c051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a6101405160e05260c052604060c020016102808051825580602001516001830155806040015160028301558060600151600383015550505b6101e051565b610200526101405261016052610180526101a0526101c0526101e0526102206101a0805182528060200151826020015250506007546102605261026051610160518181830110612f7a5780820190509050600755610280610220805182528060200151826020015250506102208051610160516040518111612f7a5780820180607f1d8160801d1415612f7a578090509050905081525060006101805118156124425761018051610240525b60086101405160e05260c052604060c020610220805182558060200151600183015550506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610140516102c0526102e061028080518252806020015182602001525050610320610220805182528060200151826020015250506103405161032051610300516102e0516102c05160065801611c0a565b6102a05261028052610260526102405261022052610200526101e0526101c0526101a052610180526101605261014052600050600061016051181561257057602061038060646323b872dd6102c052610140516102e052306103005261016051610320526102dc60006006545af115612f7a57601f3d1115612f7a576000506103805115612f7a575b61024051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596102c0808080610160518152505060208101905080806101e05181525050602081019050808042815250506060905090506102c0a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6102c08080806102605181525050602081019050808061026051610160518181830110612f7a5780820190509050815250506040905090506102c0a161020051565b610220526101405261016052610180526101a0526101c0526101e052610200526102406101c0805182528060200151826020015250506007546102805261028051610160518181830110612f7a57808201905090506007556102a0610240805182528060200151826020015250506102408051610160516040518111612f7a5780820180607f1d8160801d1415612f7a578090509050905081525060006101a05118156126e1576101a051610260525b60086101405160e05260c052604060c020610240805182558060200151600183015550506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c051610140516102e0526103006102a08051825280602001518260200152505061034061024080518252806020015182602001525050610360516103405161032051610300516102e05160065801611c0a565b6102c0526102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006101605118156128175760206103a060646323b872dd6102e0526101805161030052306103205261016051610340526102fc60006006545af115612f7a57601f3d1115612f7a576000506103a05115612f7a575b61026051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596102e0808080610160518152505060208101905080806102005181525050602081019050808042815250506060905090506102e0a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6102e08080806102805181525050602081019050808061028051610160518181830110612f7a5780820190509050815250506040905090506102e0a161022051565b61018052610140526101605260006101a052610160516101c0526101e060006080818352015b6101c0516101a05110612910576129aa565b6101a0516101c0518181830110612f7a578082019050905060018181830110612f7a5780820190509050600280820490509050610200526101405160036004610200516c01431e0fae6d7217caa0000000811015612f7a5702600a0101541161298057610200516101a052612999565b610200516001808210612f7a57808203905090506101c0525b5b81516001018083528114156128fe575b50506101a05160005260005161018051565b610180526101405261016052436101605111612f7a5760006101a0526c050c783eb9b5c840000000000b6101405160e05260c052604060c020546101c0526101e060006080818352015b6101c0516101a05110612a1857612ac4565b6101a0516101c0518181830110612f7a578082019050905060018181830110612f7a578082019050905060028082049050905061020052610160516003600461020051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a6101405160e05260c052604060c02001015411612a9a57610200516101a052612ab3565b610200516001808210612f7a57808203905090506101c0525b5b8151600101808352811415612a06575b50506101e060046101a051633b9aca00811015612f7a57026c050c783eb9b5c840000000000a6101405160e05260c052604060c02001805482526001810154826020015260028101548260400152600381015482606001525050600954610260526101405161016051610180516101a0516101c0516101e0516102005161022051610240516102605161028051610160516102a052610260516102c0526102c0516102a051600658016128d8565b6103205261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405261032051610280526102a06004610280516c01431e0fae6d7217caa0000000811015612f7a5702600a018054825260018101548260200152600281015482604001526003810154826060015250506040366103203761026051610280511015612c965761036060046102805160018181830110612f7a57808201905090506c01431e0fae6d7217caa0000000811015612f7a5702600a018054825260018101548260200152600281015482604001526003810154826060015250506103c05161030051808210612f7a5780820390509050610320526103a0516102e051808210612f7a578082039050905061034052612cc5565b4361030051808210612f7a578082039050905061032052426102e051808210612f7a5780820390509050610340525b6102e051610360526000610320511815612d34576103608051610340516101605161030051808210612f7a5780820390509050808202821582848304141715612f7a578090509050905061032051808015612f7a578204905090508181830110612f7a57808201905090508152505b6101e08051610200516103605161022051808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a578090509050905080820380607f1d8160801d1415612f7a578090509050905081525060006101e05112612db6576101e05160008112612f7a576000526000516101805156612dc4565b600060005260005161018051565b005b6101e0526101405261016052610180526101a0526101c0526102006101408051825280602001518260200152806040015182604001528060600151826060015250506102405162093a808082049050905062093a80808202821582848304141715612f7a5780905090509050610280526102a0600060ff818352015b610280805162093a808181830110612f7a578082019050905081525060006102c0526101c051610280511115612e7f576101c05161028052612ea2565b6c050c783eb9b5c840000000000c6102805160e05260c052604060c020546102c0525b6102008051610220516102805161024051808210612f7a57808203905090506040518111612f7a5780820280607f1d8160801d1415612f7a578090509050905080820380607f1d8160801d1415612f7a57809050905090508152506101c051610280511415612f1057612f4d565b61022080516102c05180820180607f1d8160801d1415612f7a578090509050905081525061028051610240525b8151600101808352811415612e42575b50506000610200511215612f62576000610200525b6102005160008112612f7a576000526000516101e051565b600080fd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.