Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x6128e456 | 18141912 | 350 days ago | IN | 0 ETH | 0.03788712 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Voting Escrow
Compiler Version
vyper:0.3.1
Contract Source Code (Vyper language format)
# @version 0.3.1 """ @title Voting Escrow @author Aladdin DAO @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://resources.curve.fi/faq/vote-locking-boost # https://github.com/curvefi/curve-dao-contracts/blob/master/contracts/VotingEscrow.vy # This contract is an almost-identical fork of Curve's contract # 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 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 # Aragon's view methods for compatibility controller: public(address) transfersEnabled: public(bool) name: public(String[64]) symbol: public(String[32]) version: 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) @external def initialize(_admin: address, token_addr: address, _name: String[64], _symbol: String[32], _version: String[32]): """ @notice Contract constructor @param token_addr `ERC20 ACT` token address @param _name Token name @param _symbol Token symbol @param _version Contract version - required for Aragon compatibility """ assert self.token == ZERO_ADDRESS, "already initialized" self.admin = _admin self.token = token_addr self.point_history[0].blk = block.number self.point_history[0].ts = block.timestamp self.controller = _admin self.transfersEnabled = True _decimals: uint256 = ERC20(token_addr).decimals() assert _decimals <= 255 self.decimals = _decimals self.name = _name self.symbol = _symbol self.version = _version @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 self.future_admin = addr log CommitOwnership(addr) @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(_sender: address, _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(_sender, 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(msg.sender, _addr, _value, 0, self.locked[_addr], DEPOSIT_FOR_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, 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, 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, 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) @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 """ # 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 @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) # Dummy methods for compatibility with Aragon @external def changeController(_newController: address): """ @dev Dummy method required for Aragon compatibility """ assert msg.sender == self.controller self.controller = _newController
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":"function","name":"initialize","inputs":[{"name":"_admin","type":"address"},{"name":"token_addr","type":"address"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_version","type":"string"}],"outputs":[],"gas":510181},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"addr","type":"address"}],"outputs":[],"gas":39475},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":41566},{"stateMutability":"nonpayable","type":"function","name":"commit_smart_wallet_checker","inputs":[{"name":"addr","type":"address"}],"outputs":[],"gas":37695},{"stateMutability":"nonpayable","type":"function","name":"apply_smart_wallet_checker","inputs":[],"outputs":[],"gas":39671},{"stateMutability":"view","type":"function","name":"get_last_user_slope","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"int128"}],"gas":5154},{"stateMutability":"view","type":"function","name":"user_point_history__ts","inputs":[{"name":"_addr","type":"address"},{"name":"_idx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":2957},{"stateMutability":"view","type":"function","name":"locked__end","inputs":[{"name":"_addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":2942},{"stateMutability":"nonpayable","type":"function","name":"checkpoint","inputs":[],"outputs":[],"gas":37283310},{"stateMutability":"nonpayable","type":"function","name":"deposit_for","inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[],"gas":37475860},{"stateMutability":"nonpayable","type":"function","name":"create_lock","inputs":[{"name":"_value","type":"uint256"},{"name":"_unlock_time","type":"uint256"}],"outputs":[],"gas":37483708},{"stateMutability":"nonpayable","type":"function","name":"increase_amount","inputs":[{"name":"_value","type":"uint256"}],"outputs":[],"gas":37479930},{"stateMutability":"nonpayable","type":"function","name":"increase_unlock_time","inputs":[{"name":"_unlock_time","type":"uint256"}],"outputs":[],"gas":37487084},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[],"outputs":[],"gas":37465833},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":12690},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"},{"name":"_t","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":12690},{"stateMutability":"view","type":"function","name":"balanceOfAt","inputs":[{"name":"addr","type":"address"},{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":792970},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":905086},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[{"name":"t","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":905086},{"stateMutability":"view","type":"function","name":"totalSupplyAt","inputs":[{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":1287578},{"stateMutability":"nonpayable","type":"function","name":"changeController","inputs":[{"name":"_newController","type":"address"}],"outputs":[],"gas":38145},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3030},{"stateMutability":"view","type":"function","name":"supply","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3060},{"stateMutability":"view","type":"function","name":"locked","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"amount","type":"int128"},{"name":"end","type":"uint256"}]}],"gas":5513},{"stateMutability":"view","type":"function","name":"epoch","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3120},{"stateMutability":"view","type":"function","name":"point_history","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"bias","type":"int128"},{"name":"slope","type":"int128"},{"name":"ts","type":"uint256"},{"name":"blk","type":"uint256"}]}],"gas":9584},{"stateMutability":"view","type":"function","name":"user_point_history","inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"uint256"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"bias","type":"int128"},{"name":"slope","type":"int128"},{"name":"ts","type":"uint256"},{"name":"blk","type":"uint256"}]}],"gas":9880},{"stateMutability":"view","type":"function","name":"user_point_epoch","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3476},{"stateMutability":"view","type":"function","name":"slope_changes","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"int128"}],"gas":3355},{"stateMutability":"view","type":"function","name":"controller","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3270},{"stateMutability":"view","type":"function","name":"transfersEnabled","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3300},{"stateMutability":"view","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":13619},{"stateMutability":"view","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":11378},{"stateMutability":"view","type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":11408},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3420},{"stateMutability":"view","type":"function","name":"future_smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3450},{"stateMutability":"view","type":"function","name":"smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3480},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3510},{"stateMutability":"view","type":"function","name":"future_admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3540}]
Contract Creation Code
6128e456600436101561000d57611cd9565b60046000601c37600051346128db57633f2f5ee281186102c5576004358060a01c6128db5760e0526024358060a01c6128db576101005260443560040160408135116128db5780803560200180826101203750505060643560040160208135116128db5780803560200180826101803750505060843560040160208135116128db5780803560200180826101c0375050506001541561011d576013610200527f616c726561647920696e697469616c697a6564000000000000000000000000006102205261020050610200518061022001818260206001820306601f82010390500336823750506308c379a06101c05260206101e0526102005160206001820306601f82010390506044016101dcfd5b60e0516c050c783eb9b5c84000000000145561010051600155436008554260075560e0516c050c783eb9b5c84000000000085560016c050c783eb9b5c84000000000095563313ce567610220526020610220600461023c610100515afa610189573d600060003e3d6000fd5b601f3d11156128db57610220516102005260ff61020051116128db57610200516c050c783eb9b5c840000000001155610120806c050c783eb9b5c840000000000a602082510160c060006003818352015b8260c05160200211156101ec5761020b565b60c05160200285015160c05185015581516001018083528114156101da575b505050505050610180806c050c783eb9b5c840000000000d602082510160c060006002818352015b8260c051602002111561024557610264565b60c05160200285015160c0518501558151600101808352811415610233575b5050505050506101c0806c050c783eb9b5c840000000000f602082510160c060006002818352015b8260c051602002111561029e576102bd565b60c05160200285015160c051850155815160010180835281141561028c575b505050505050005b636b441a408118610335576004358060a01c6128db5760e0526c050c783eb9b5c84000000000145433186128db5760e0516c050c783eb9b5c8400000000015557f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e960e051610100526020610100a1005b636a1c05ae81186103b3576c050c783eb9b5c84000000000145433186128db576c050c783eb9b5c84000000000155460e052600060e051146128db5760e0516c050c783eb9b5c8400000000014557febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a118910560e051610100526020610100a1005b6357f901e281186103f5576004358060a01c6128db5760e0526c050c783eb9b5c84000000000145433186128db5760e0516c050c783eb9b5c840000000001255005b638e5b490f8118610435576c050c783eb9b5c84000000000145433186128db576c050c783eb9b5c8400000000012546c050c783eb9b5c840000000001355005b637c74a17481186104ae576004358060a01c6128db5760e0526c050c783eb9b5c840000000000660e05160a052608052604060802054610100526001600461010051633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a0526080526040608020010154610120526020610120f35b63da020a188118610505576004358060a01c6128db5760e05260026004602435633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a0526080526040608020010154610100526020610100f35b63adc63589811861053d576004358060a01c6128db5760e0526001600360e05160a05260805260406080200154610100526020610100f35b63c2c4c5c1811861056557600060e0526040366101003760403661014037610563611dea565b005b633a46273e811861072f576004358060a01c6128db57610680526000546128db57600160005560036106805160a052608052604060802080546106a05260018101546106c05250600060243511156128db5760006106a051136106395760166106e0527f4e6f206578697374696e67206c6f636b20666f756e6400000000000000000000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b426106c051116106df5760246106e0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610700527f6472617700000000000000000000000000000000000000000000000000000000610720526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b3361048052610680516104a0526024356104c05260006104e05260036106805160a0526080526040608020805461050052600181015461052052506000610540526107286124d9565b6000600055005b6365fc387381186109a0576000546128db5760016000553360e052610752611cdf565b60243562093a808082049050905062093a808082028215828483041417156128db57905090506106805260033360a052608052604060802080546106a05260018101546106c05250600060043511156128db576106a051156108255760196106e0527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b4261068051116108cb5760266106e0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610700527f6675747572650000000000000000000000000000000000000000000000000000610720526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b42630784ce0081818301106128db578082019050905061068051111561096257601e6106e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b3361048052336104a0526004356104c052610680516104e0526106a051610500526106c051610520526001610540526109996124d9565b6000600055005b634957677c8118610b50576000546128db5760016000553360e0526109c3611cdf565b60033360a052608052604060802080546106805260018101546106a05250600060043511156128db5760006106805113610a6e5760166106c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426106a05111610b145760246106c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686106e0527f6472617700000000000000000000000000000000000000000000000000000000610700526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b3361048052336104a0526004356104c05260006104e05261068051610500526106a05161052052600261054052610b496124d9565b6000600055005b63eff7a6128118610e16576000546128db5760016000553360e052610b73611cdf565b60033360a052608052604060802080546106805260018101546106a0525060043562093a808082049050905062093a808082028215828483041417156128db57905090506106c052426106a05111610c3c57600c6106e0527f4c6f636b20657870697265640000000000000000000000000000000000000000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b60006106805113610cbe5760116106e0527f4e6f7468696e67206973206c6f636b6564000000000000000000000000000000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b6106a0516106c05111610d4257601f6106e0527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e00610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b42630784ce0081818301106128db57808201905090506106c0511115610dd957601e6106e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b3361048052336104a05260006104c0526106c0516104e05261068051610500526106a05161052052600361054052610e0f6124d9565b6000600055005b633ccfd60b8118611030576000546128db57600160005560033360a052608052604060802080546104805260018101546104a052506104a051421015610ecd5760166104c0527f546865206c6f636b206469646e277420657870697265000000000000000000006104e0526104c0506104c051806104e001818260206001820306601f82010390500336823750506308c379a06104805260206104a0526104c05160206001820306601f820103905060440161049cfd5b61048051600081126128db576104c052610480516104e0526104a0516105005260006104a05260006104805260033360a05260805260406080206104805181556104a05160018201555060025461052052610520516104c0518082106128db57808203905090506002553360e0526104e05161010052610500516101205261048051610140526104a05161016052610f63611dea565b63a9059cbb6105405233610560526104c051610580526020610540604461055c60006001545af1610f99573d600060003e3d6000fd5b601f3d11156128db5761054051156128db57337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686104c0516105405242610560526040610540a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105205161054052610520516104c0518082106128db5780820390509050610560526040610540a16000600055005b6370a082318118611045574261010052611057565b62fdd58e811861117657602435610100525b6004358060a01c6128db5760e0526c050c783eb9b5c840000000000660e05160a05260805260406080205461012052610120511561116457600461012051633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a05260805260406080200180546101405260018101546101605260028101546101805260038101546101a0525061014080516101605161010051610180518082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db57905090508082038060801d81607f1d186128db57905090508152506000610140511215611146576000610140525b61014051600081126128db576101c05260206101c061117456611174565b6000610140526020610140611174565bf35b634ee2cd7e811861150f576004358060a01c6128db576101a05243602435116128db5760006101c0526c050c783eb9b5c84000000000066101a05160a0526080526040608020546101e05261020060006080818352015b6101e0516101c051106111df5761128a565b6101c0516101e05181818301106128db5780820190509050600181818301106128db5780820190509050600280820490509050610220526024356003600461022051633b9aca008110156128db57026c050c783eb9b5c84000000000056101a05160a05260805260406080200101541115611271576102205160018082106128db57808203905090506101e05261127a565b610220516101c0525b81516001018083528114156111cd575b505060046101c051633b9aca008110156128db57026c050c783eb9b5c84000000000056101a05160a052608052604060802001805461020052600181015461022052600281015461024052600381015461026052506004546102805260243560e05261028051610100526112ff6102c0612694565b6102c0516102a05260046102a0516c01431e0fae6d7217caa00000008110156128db570260050180546102c05260018101546102e0526002810154610300526003810154610320525060403661034037610280516102a0511061138f5743610320518082106128db57808203905090506103405242610300518082106128db578082039050905061036052611417565b60046102a051600181818301106128db57808201905090506c01431e0fae6d7217caa00000008110156128db570260050180546103805260018101546103a05260028101546103c05260038101546103e052506103e051610320518082106128db5780820390509050610340526103c051610300518082106128db5780820390509050610360525b61030051610380526000610340511461148157610380805161036051602435610320518082106128db57808203905090508082028215828483041417156128db5790509050610340518080156128db5782049050905081818301106128db57808201905090508152505b61020080516102205161038051610240518082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db57905090508082038060801d81607f1d186128db579050905081525060006102005112156114f35760006103a05260206103a061150d5661150d565b61020051600081126128db576103a05260206103a061150d565bf35b6318160ddd8118611524574261026052611537565b63bd85b03981186115c057600435610260525b600454610280526004610280516c01431e0fae6d7217caa00000008110156128db570260050180546102a05260018101546102c05260028101546102e052600381015461030052506102a05160e0526102c051610100526102e05161012052610300516101405261026051610160526115b1610320612764565b61032051610340526020610340f35b63981b24d081186117db5743600435116128db576004546102605260043560e05261026051610100526115f46102a0612694565b6102a051610280526004610280516c01431e0fae6d7217caa00000008110156128db570260050180546102a05260018101546102c05260028101546102e052600381015461030052506000610320526102605161028051106116bf5743610300511461178657600435610300518082106128db5780820390509050426102e0518082106128db57808203905090508082028215828483041417156128db579050905043610300518082106128db57808203905090508080156128db5782049050905061032052611786565b600461028051600181818301106128db57808201905090506c01431e0fae6d7217caa00000008110156128db570260050180546103405260018101546103605260028101546103805260038101546103a052506103a051610300511461178657600435610300518082106128db5780820390509050610380516102e0518082106128db57808203905090508082028215828483041417156128db57905090506103a051610300518082106128db57808203905090508080156128db57820490509050610320525b6102a05160e0526102c051610100526102e0516101205261030051610140526102e0516103205181818301106128db5780820190509050610160526117cc610340612764565b61034051610360526020610360f35b633cebb823811861181d576004358060a01c6128db5760e0526c050c783eb9b5c84000000000085433186128db5760e0516c050c783eb9b5c840000000000855005b63fc0c546a81186118345760015460e052602060e0f35b63047fc9aa811861184b5760025460e052602060e0f35b63cbf9fe5f811861188b576004358060a01c6128db5760e052600360e05160a0526080526040608020805461010052600181015461012052506040610100f35b63900cf0cf81186118a25760045460e052602060e0f35b63d1febfb981186118f25760046004356c01431e0fae6d7217caa00000008110156128db5702600501805460e05260018101546101005260028101546101205260038101546101405250608060e0f35b6328d09d478118611963576004358060a01c6128db5760e0526004602435633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a052608052604060802001805461010052600181015461012052600281015461014052600381015461016052506080610100f35b63010ae75781186119a4576004358060a01c6128db5760e0526c050c783eb9b5c840000000000660e05160a052608052604060802054610100526020610100f35b637119748481186119d5576c050c783eb9b5c840000000000760043560a05260805260406080205460e052602060e0f35b63f77c479181186119f8576c050c783eb9b5c84000000000085460e052602060e0f35b63bef97c878118611a1b576c050c783eb9b5c84000000000095460e052602060e0f35b6306fdde038118611aca5760e0806020808252808301806c050c783eb9b5c840000000000a8082602082540160c060006003818352015b8260c0516020021115611a6457611a83565b60c05185015460c0516020028501528151600101808352811415611a52575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6395d89b418118611b795760e0806020808252808301806c050c783eb9b5c840000000000d8082602082540160c060006002818352015b8260c0516020021115611b1357611b32565b60c05185015460c0516020028501528151600101808352811415611b01575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6354fd4d508118611c285760e0806020808252808301806c050c783eb9b5c840000000000f8082602082540160c060006002818352015b8260c0516020021115611bc257611be1565b60c05185015460c0516020028501528151600101808352811415611bb0575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b63313ce5678118611c4b576c050c783eb9b5c84000000000115460e052602060e0f35b638ff36fd18118611c6e576c050c783eb9b5c84000000000125460e052602060e0f35b637175d4f78118611c91576c050c783eb9b5c84000000000135460e052602060e0f35b63f851a4408118611cb4576c050c783eb9b5c84000000000145460e052602060e0f35b6317f7182a8118611cd7576c050c783eb9b5c84000000000155460e052602060e0f35b505b60006000fd5b3260e05114611de8576c050c783eb9b5c8400000000013546101005260006101005114611d4e5763c23697a86101205260e051610140526020610120602461013c6000610100515af1611d37573d600060003e3d6000fd5b601f3d11156128db576101205115611d4e57611de8565b6025610120527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c610140527f6c6f7765640000000000000000000000000000000000000000000000000000006101605261012050610120518061014001818260206001820306601f82010390500336823750506308c379a060e0526020610100526101205160206001820306601f820103905060440160fcfd5b565b61014036610180376004546102c052600060e05114611f5b57426101205111611e14576000611e1c565b600061010051135b15611e7a5761010051630784ce008082058060801d81607f1d186128db57905090506101a0526101a05161012051428082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db5790509050610180525b426101605111611e8b576000611e93565b600061014051135b15611ef15761014051630784ce008082058060801d81607f1d186128db5790509050610220526102205161016051428082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db5790509050610200525b6c050c783eb9b5c84000000000076101205160a0526080526040608020546102805260006101605114611f5b57610120516101605118611f3857610280516102a052611f5b565b6c050c783eb9b5c84000000000076101605160a0526080526040608020546102a0525b6040366102e0374261032052436103405260006102c0511115611fba5760046102c0516c01431e0fae6d7217caa00000008110156128db570260050180546102e052600181015461030052600281015461032052600381015461034052505b61032051610360526102e05161038052610300516103a052610320516103c052610340516103e0526000610400526103205142111561204857670de0b6b3a764000043610340518082106128db57808203905090508082028215828483041417156128db579050905042610320518082106128db57808203905090508080156128db57820490509050610400525b6103605162093a808082049050905062093a808082028215828483041417156128db579050905061042052610440600060ff818352015b610420805162093a8081818301106128db57808201905090508152506000610460524261042051116120d2576c050c783eb9b5c84000000000076104205160a052608052604060802054610460526120d8565b42610420525b6102e080516103005161042051610360518082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db57905090508082038060801d81607f1d186128db57905090508152506103008051610460518082018060801d81607f1d186128db579050905081525060006102e051121561215d5760006102e0525b6000610300511215612170576000610300525b610420516103605261042051610320526103e05161040051610420516103c0518082106128db57808203905090508082028215828483041417156128db5790509050670de0b6b3a76400008082049050905081818301106128db5780820190509050610340526102c08051600181818301106128db578082019050905081525042610420511861220857436103405261225a5661224a565b60046102c0516c01431e0fae6d7217caa00000008110156128db57026005016102e0518155610300516001820155610320516002820155610340516003820155505b815160010180835281141561207f575b50506102c051600455600060e05114612303576103008051610220516101a0518082038060801d81607f1d186128db57905090508082018060801d81607f1d186128db57905090508152506102e0805161020051610180518082038060801d81607f1d186128db57905090508082018060801d81607f1d186128db579050905081525060006103005112156122f0576000610300525b60006102e05112156123035760006102e0525b60046102c0516c01431e0fae6d7217caa00000008110156128db57026005016102e051815561030051600182015561032051600282015561034051600382015550600060e051146124d757426101205111156123ca5761028080516101a0518082018060801d81607f1d186128db57905090508152506101205161016051186123a7576102808051610220518082038060801d81607f1d186128db57905090508152505b610280516c050c783eb9b5c84000000000076101205160a0526080526040608020555b426101605111156124265761012051610160511115612426576102a08051610220518082038060801d81607f1d186128db57905090508152506102a0516c050c783eb9b5c84000000000076101605160a0526080526040608020555b6c050c783eb9b5c840000000000660e05160a052608052604060802054600181818301106128db578082019050905061044052610440516c050c783eb9b5c840000000000660e05160a05260805260406080205542610240524361026052600461044051633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a052608052604060802001610200518155610220516001820155610240516002820155610260516003820155505b565b610500516105605261052051610580526002546105a0526105a0516104c05181818301106128db5780820190509050600255610560516105c052610580516105e05261056080516104c05180607f1c6128db578082018060801d81607f1d186128db579050905081525060006104e05114612557576104e051610580525b60036104a05160a0526080526040608020610560518155610580516001820155506104a05160e0526105c051610100526105e05161012052610560516101405261058051610160526125a7611dea565b60006104c05114612603576323b872dd61060052610480516106205230610640526104c051610660526020610600606461061c60006001545af16125f0573d600060003e3d6000fd5b601f3d11156128db5761060051156128db575b610580516104a0517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596104c05161060052610540516106205242610640526060610600a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105a051610600526105a0516104c05181818301106128db5780820190509050610620526040610600a1565b600061012052610100516101405261016060006080818352015b6101405161012051106126c057612759565b610120516101405181818301106128db5780820190509050600181818301106128db57808201905090506002808204905090506101805260e05160036004610180516c01431e0fae6d7217caa00000008110156128db570260050101541115612740576101805160018082106128db578082039050905061014052612749565b61018051610120525b81516001018083528114156126ae575b505061012051815250565b60e05161018052610100516101a052610120516101c052610140516101e0526101c05162093a808082049050905062093a808082028215828483041417156128db579050905061020052610220600060ff818352015b610200805162093a8081818301106128db5780820190509050815250600061024052610160516102005111612810576c050c783eb9b5c84000000000076102005160a05260805260406080205461024052612819565b61016051610200525b61018080516101a051610200516101c0518082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db57905090508082038060801d81607f1d186128db579050905081525061016051610200511861287d576128b5565b6101a08051610240518082018060801d81607f1d186128db5790509050815250610200516101c05281516001018083528114156127ba575b505060006101805112156128ca576000610180525b61018051600081126128db57815250565b600080fd5b6100046128e4036100046000396100046128e4036000f3
Deployed Bytecode
0x600436101561000d57611cd9565b60046000601c37600051346128db57633f2f5ee281186102c5576004358060a01c6128db5760e0526024358060a01c6128db576101005260443560040160408135116128db5780803560200180826101203750505060643560040160208135116128db5780803560200180826101803750505060843560040160208135116128db5780803560200180826101c0375050506001541561011d576013610200527f616c726561647920696e697469616c697a6564000000000000000000000000006102205261020050610200518061022001818260206001820306601f82010390500336823750506308c379a06101c05260206101e0526102005160206001820306601f82010390506044016101dcfd5b60e0516c050c783eb9b5c84000000000145561010051600155436008554260075560e0516c050c783eb9b5c84000000000085560016c050c783eb9b5c84000000000095563313ce567610220526020610220600461023c610100515afa610189573d600060003e3d6000fd5b601f3d11156128db57610220516102005260ff61020051116128db57610200516c050c783eb9b5c840000000001155610120806c050c783eb9b5c840000000000a602082510160c060006003818352015b8260c05160200211156101ec5761020b565b60c05160200285015160c05185015581516001018083528114156101da575b505050505050610180806c050c783eb9b5c840000000000d602082510160c060006002818352015b8260c051602002111561024557610264565b60c05160200285015160c0518501558151600101808352811415610233575b5050505050506101c0806c050c783eb9b5c840000000000f602082510160c060006002818352015b8260c051602002111561029e576102bd565b60c05160200285015160c051850155815160010180835281141561028c575b505050505050005b636b441a408118610335576004358060a01c6128db5760e0526c050c783eb9b5c84000000000145433186128db5760e0516c050c783eb9b5c8400000000015557f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e960e051610100526020610100a1005b636a1c05ae81186103b3576c050c783eb9b5c84000000000145433186128db576c050c783eb9b5c84000000000155460e052600060e051146128db5760e0516c050c783eb9b5c8400000000014557febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a118910560e051610100526020610100a1005b6357f901e281186103f5576004358060a01c6128db5760e0526c050c783eb9b5c84000000000145433186128db5760e0516c050c783eb9b5c840000000001255005b638e5b490f8118610435576c050c783eb9b5c84000000000145433186128db576c050c783eb9b5c8400000000012546c050c783eb9b5c840000000001355005b637c74a17481186104ae576004358060a01c6128db5760e0526c050c783eb9b5c840000000000660e05160a052608052604060802054610100526001600461010051633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a0526080526040608020010154610120526020610120f35b63da020a188118610505576004358060a01c6128db5760e05260026004602435633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a0526080526040608020010154610100526020610100f35b63adc63589811861053d576004358060a01c6128db5760e0526001600360e05160a05260805260406080200154610100526020610100f35b63c2c4c5c1811861056557600060e0526040366101003760403661014037610563611dea565b005b633a46273e811861072f576004358060a01c6128db57610680526000546128db57600160005560036106805160a052608052604060802080546106a05260018101546106c05250600060243511156128db5760006106a051136106395760166106e0527f4e6f206578697374696e67206c6f636b20666f756e6400000000000000000000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b426106c051116106df5760246106e0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610700527f6472617700000000000000000000000000000000000000000000000000000000610720526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b3361048052610680516104a0526024356104c05260006104e05260036106805160a0526080526040608020805461050052600181015461052052506000610540526107286124d9565b6000600055005b6365fc387381186109a0576000546128db5760016000553360e052610752611cdf565b60243562093a808082049050905062093a808082028215828483041417156128db57905090506106805260033360a052608052604060802080546106a05260018101546106c05250600060043511156128db576106a051156108255760196106e0527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b4261068051116108cb5760266106e0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610700527f6675747572650000000000000000000000000000000000000000000000000000610720526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b42630784ce0081818301106128db578082019050905061068051111561096257601e6106e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b3361048052336104a0526004356104c052610680516104e0526106a051610500526106c051610520526001610540526109996124d9565b6000600055005b634957677c8118610b50576000546128db5760016000553360e0526109c3611cdf565b60033360a052608052604060802080546106805260018101546106a05250600060043511156128db5760006106805113610a6e5760166106c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426106a05111610b145760246106c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686106e0527f6472617700000000000000000000000000000000000000000000000000000000610700526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b3361048052336104a0526004356104c05260006104e05261068051610500526106a05161052052600261054052610b496124d9565b6000600055005b63eff7a6128118610e16576000546128db5760016000553360e052610b73611cdf565b60033360a052608052604060802080546106805260018101546106a0525060043562093a808082049050905062093a808082028215828483041417156128db57905090506106c052426106a05111610c3c57600c6106e0527f4c6f636b20657870697265640000000000000000000000000000000000000000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b60006106805113610cbe5760116106e0527f4e6f7468696e67206973206c6f636b6564000000000000000000000000000000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b6106a0516106c05111610d4257601f6106e0527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e00610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b42630784ce0081818301106128db57808201905090506106c0511115610dd957601e6106e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610700526106e0506106e0518061070001818260206001820306601f82010390500336823750506308c379a06106a05260206106c0526106e05160206001820306601f82010390506044016106bcfd5b3361048052336104a05260006104c0526106c0516104e05261068051610500526106a05161052052600361054052610e0f6124d9565b6000600055005b633ccfd60b8118611030576000546128db57600160005560033360a052608052604060802080546104805260018101546104a052506104a051421015610ecd5760166104c0527f546865206c6f636b206469646e277420657870697265000000000000000000006104e0526104c0506104c051806104e001818260206001820306601f82010390500336823750506308c379a06104805260206104a0526104c05160206001820306601f820103905060440161049cfd5b61048051600081126128db576104c052610480516104e0526104a0516105005260006104a05260006104805260033360a05260805260406080206104805181556104a05160018201555060025461052052610520516104c0518082106128db57808203905090506002553360e0526104e05161010052610500516101205261048051610140526104a05161016052610f63611dea565b63a9059cbb6105405233610560526104c051610580526020610540604461055c60006001545af1610f99573d600060003e3d6000fd5b601f3d11156128db5761054051156128db57337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686104c0516105405242610560526040610540a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105205161054052610520516104c0518082106128db5780820390509050610560526040610540a16000600055005b6370a082318118611045574261010052611057565b62fdd58e811861117657602435610100525b6004358060a01c6128db5760e0526c050c783eb9b5c840000000000660e05160a05260805260406080205461012052610120511561116457600461012051633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a05260805260406080200180546101405260018101546101605260028101546101805260038101546101a0525061014080516101605161010051610180518082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db57905090508082038060801d81607f1d186128db57905090508152506000610140511215611146576000610140525b61014051600081126128db576101c05260206101c061117456611174565b6000610140526020610140611174565bf35b634ee2cd7e811861150f576004358060a01c6128db576101a05243602435116128db5760006101c0526c050c783eb9b5c84000000000066101a05160a0526080526040608020546101e05261020060006080818352015b6101e0516101c051106111df5761128a565b6101c0516101e05181818301106128db5780820190509050600181818301106128db5780820190509050600280820490509050610220526024356003600461022051633b9aca008110156128db57026c050c783eb9b5c84000000000056101a05160a05260805260406080200101541115611271576102205160018082106128db57808203905090506101e05261127a565b610220516101c0525b81516001018083528114156111cd575b505060046101c051633b9aca008110156128db57026c050c783eb9b5c84000000000056101a05160a052608052604060802001805461020052600181015461022052600281015461024052600381015461026052506004546102805260243560e05261028051610100526112ff6102c0612694565b6102c0516102a05260046102a0516c01431e0fae6d7217caa00000008110156128db570260050180546102c05260018101546102e0526002810154610300526003810154610320525060403661034037610280516102a0511061138f5743610320518082106128db57808203905090506103405242610300518082106128db578082039050905061036052611417565b60046102a051600181818301106128db57808201905090506c01431e0fae6d7217caa00000008110156128db570260050180546103805260018101546103a05260028101546103c05260038101546103e052506103e051610320518082106128db5780820390509050610340526103c051610300518082106128db5780820390509050610360525b61030051610380526000610340511461148157610380805161036051602435610320518082106128db57808203905090508082028215828483041417156128db5790509050610340518080156128db5782049050905081818301106128db57808201905090508152505b61020080516102205161038051610240518082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db57905090508082038060801d81607f1d186128db579050905081525060006102005112156114f35760006103a05260206103a061150d5661150d565b61020051600081126128db576103a05260206103a061150d565bf35b6318160ddd8118611524574261026052611537565b63bd85b03981186115c057600435610260525b600454610280526004610280516c01431e0fae6d7217caa00000008110156128db570260050180546102a05260018101546102c05260028101546102e052600381015461030052506102a05160e0526102c051610100526102e05161012052610300516101405261026051610160526115b1610320612764565b61032051610340526020610340f35b63981b24d081186117db5743600435116128db576004546102605260043560e05261026051610100526115f46102a0612694565b6102a051610280526004610280516c01431e0fae6d7217caa00000008110156128db570260050180546102a05260018101546102c05260028101546102e052600381015461030052506000610320526102605161028051106116bf5743610300511461178657600435610300518082106128db5780820390509050426102e0518082106128db57808203905090508082028215828483041417156128db579050905043610300518082106128db57808203905090508080156128db5782049050905061032052611786565b600461028051600181818301106128db57808201905090506c01431e0fae6d7217caa00000008110156128db570260050180546103405260018101546103605260028101546103805260038101546103a052506103a051610300511461178657600435610300518082106128db5780820390509050610380516102e0518082106128db57808203905090508082028215828483041417156128db57905090506103a051610300518082106128db57808203905090508080156128db57820490509050610320525b6102a05160e0526102c051610100526102e0516101205261030051610140526102e0516103205181818301106128db5780820190509050610160526117cc610340612764565b61034051610360526020610360f35b633cebb823811861181d576004358060a01c6128db5760e0526c050c783eb9b5c84000000000085433186128db5760e0516c050c783eb9b5c840000000000855005b63fc0c546a81186118345760015460e052602060e0f35b63047fc9aa811861184b5760025460e052602060e0f35b63cbf9fe5f811861188b576004358060a01c6128db5760e052600360e05160a0526080526040608020805461010052600181015461012052506040610100f35b63900cf0cf81186118a25760045460e052602060e0f35b63d1febfb981186118f25760046004356c01431e0fae6d7217caa00000008110156128db5702600501805460e05260018101546101005260028101546101205260038101546101405250608060e0f35b6328d09d478118611963576004358060a01c6128db5760e0526004602435633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a052608052604060802001805461010052600181015461012052600281015461014052600381015461016052506080610100f35b63010ae75781186119a4576004358060a01c6128db5760e0526c050c783eb9b5c840000000000660e05160a052608052604060802054610100526020610100f35b637119748481186119d5576c050c783eb9b5c840000000000760043560a05260805260406080205460e052602060e0f35b63f77c479181186119f8576c050c783eb9b5c84000000000085460e052602060e0f35b63bef97c878118611a1b576c050c783eb9b5c84000000000095460e052602060e0f35b6306fdde038118611aca5760e0806020808252808301806c050c783eb9b5c840000000000a8082602082540160c060006003818352015b8260c0516020021115611a6457611a83565b60c05185015460c0516020028501528151600101808352811415611a52575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6395d89b418118611b795760e0806020808252808301806c050c783eb9b5c840000000000d8082602082540160c060006002818352015b8260c0516020021115611b1357611b32565b60c05185015460c0516020028501528151600101808352811415611b01575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b6354fd4d508118611c285760e0806020808252808301806c050c783eb9b5c840000000000f8082602082540160c060006002818352015b8260c0516020021115611bc257611be1565b60c05185015460c0516020028501528151600101808352811415611bb0575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f820103905090509050810190509050905060e0f35b63313ce5678118611c4b576c050c783eb9b5c84000000000115460e052602060e0f35b638ff36fd18118611c6e576c050c783eb9b5c84000000000125460e052602060e0f35b637175d4f78118611c91576c050c783eb9b5c84000000000135460e052602060e0f35b63f851a4408118611cb4576c050c783eb9b5c84000000000145460e052602060e0f35b6317f7182a8118611cd7576c050c783eb9b5c84000000000155460e052602060e0f35b505b60006000fd5b3260e05114611de8576c050c783eb9b5c8400000000013546101005260006101005114611d4e5763c23697a86101205260e051610140526020610120602461013c6000610100515af1611d37573d600060003e3d6000fd5b601f3d11156128db576101205115611d4e57611de8565b6025610120527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c610140527f6c6f7765640000000000000000000000000000000000000000000000000000006101605261012050610120518061014001818260206001820306601f82010390500336823750506308c379a060e0526020610100526101205160206001820306601f820103905060440160fcfd5b565b61014036610180376004546102c052600060e05114611f5b57426101205111611e14576000611e1c565b600061010051135b15611e7a5761010051630784ce008082058060801d81607f1d186128db57905090506101a0526101a05161012051428082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db5790509050610180525b426101605111611e8b576000611e93565b600061014051135b15611ef15761014051630784ce008082058060801d81607f1d186128db5790509050610220526102205161016051428082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db5790509050610200525b6c050c783eb9b5c84000000000076101205160a0526080526040608020546102805260006101605114611f5b57610120516101605118611f3857610280516102a052611f5b565b6c050c783eb9b5c84000000000076101605160a0526080526040608020546102a0525b6040366102e0374261032052436103405260006102c0511115611fba5760046102c0516c01431e0fae6d7217caa00000008110156128db570260050180546102e052600181015461030052600281015461032052600381015461034052505b61032051610360526102e05161038052610300516103a052610320516103c052610340516103e0526000610400526103205142111561204857670de0b6b3a764000043610340518082106128db57808203905090508082028215828483041417156128db579050905042610320518082106128db57808203905090508080156128db57820490509050610400525b6103605162093a808082049050905062093a808082028215828483041417156128db579050905061042052610440600060ff818352015b610420805162093a8081818301106128db57808201905090508152506000610460524261042051116120d2576c050c783eb9b5c84000000000076104205160a052608052604060802054610460526120d8565b42610420525b6102e080516103005161042051610360518082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db57905090508082038060801d81607f1d186128db57905090508152506103008051610460518082018060801d81607f1d186128db579050905081525060006102e051121561215d5760006102e0525b6000610300511215612170576000610300525b610420516103605261042051610320526103e05161040051610420516103c0518082106128db57808203905090508082028215828483041417156128db5790509050670de0b6b3a76400008082049050905081818301106128db5780820190509050610340526102c08051600181818301106128db578082019050905081525042610420511861220857436103405261225a5661224a565b60046102c0516c01431e0fae6d7217caa00000008110156128db57026005016102e0518155610300516001820155610320516002820155610340516003820155505b815160010180835281141561207f575b50506102c051600455600060e05114612303576103008051610220516101a0518082038060801d81607f1d186128db57905090508082018060801d81607f1d186128db57905090508152506102e0805161020051610180518082038060801d81607f1d186128db57905090508082018060801d81607f1d186128db579050905081525060006103005112156122f0576000610300525b60006102e05112156123035760006102e0525b60046102c0516c01431e0fae6d7217caa00000008110156128db57026005016102e051815561030051600182015561032051600282015561034051600382015550600060e051146124d757426101205111156123ca5761028080516101a0518082018060801d81607f1d186128db57905090508152506101205161016051186123a7576102808051610220518082038060801d81607f1d186128db57905090508152505b610280516c050c783eb9b5c84000000000076101205160a0526080526040608020555b426101605111156124265761012051610160511115612426576102a08051610220518082038060801d81607f1d186128db57905090508152506102a0516c050c783eb9b5c84000000000076101605160a0526080526040608020555b6c050c783eb9b5c840000000000660e05160a052608052604060802054600181818301106128db578082019050905061044052610440516c050c783eb9b5c840000000000660e05160a05260805260406080205542610240524361026052600461044051633b9aca008110156128db57026c050c783eb9b5c840000000000560e05160a052608052604060802001610200518155610220516001820155610240516002820155610260516003820155505b565b610500516105605261052051610580526002546105a0526105a0516104c05181818301106128db5780820190509050600255610560516105c052610580516105e05261056080516104c05180607f1c6128db578082018060801d81607f1d186128db579050905081525060006104e05114612557576104e051610580525b60036104a05160a0526080526040608020610560518155610580516001820155506104a05160e0526105c051610100526105e05161012052610560516101405261058051610160526125a7611dea565b60006104c05114612603576323b872dd61060052610480516106205230610640526104c051610660526020610600606461061c60006001545af16125f0573d600060003e3d6000fd5b601f3d11156128db5761060051156128db575b610580516104a0517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596104c05161060052610540516106205242610640526060610600a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105a051610600526105a0516104c05181818301106128db5780820190509050610620526040610600a1565b600061012052610100516101405261016060006080818352015b6101405161012051106126c057612759565b610120516101405181818301106128db5780820190509050600181818301106128db57808201905090506002808204905090506101805260e05160036004610180516c01431e0fae6d7217caa00000008110156128db570260050101541115612740576101805160018082106128db578082039050905061014052612749565b61018051610120525b81516001018083528114156126ae575b505061012051815250565b60e05161018052610100516101a052610120516101c052610140516101e0526101c05162093a808082049050905062093a808082028215828483041417156128db579050905061020052610220600060ff818352015b610200805162093a8081818301106128db5780820190509050815250600061024052610160516102005111612810576c050c783eb9b5c84000000000076102005160a05260805260406080205461024052612819565b61016051610200525b61018080516101a051610200516101c0518082106128db578082039050905080607f1c6128db578082028060801d81607f1d186128db57905090508082038060801d81607f1d186128db579050905081525061016051610200511861287d576128b5565b6101a08051610240518082018060801d81607f1d186128db5790509050815250610200516101c05281516001018083528114156127ba575b505060006101805112156128ca576000610180525b61018051600081126128db57815250565b600080fd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.