More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 8,879 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Increase_unlock_... | 23733617 | 25 mins ago | IN | 0 ETH | 0.00084347 | ||||
| Increase_unlock_... | 23726656 | 23 hrs ago | IN | 0 ETH | 0.00074484 | ||||
| Withdraw | 23723627 | 33 hrs ago | IN | 0 ETH | 0.00004714 | ||||
| Withdraw | 23723231 | 35 hrs ago | IN | 0 ETH | 0.00048949 | ||||
| Withdraw | 23720158 | 45 hrs ago | IN | 0 ETH | 0.00094931 | ||||
| Withdraw | 23719959 | 46 hrs ago | IN | 0 ETH | 0.00155354 | ||||
| Withdraw | 23719641 | 47 hrs ago | IN | 0 ETH | 0.00065215 | ||||
| Withdraw | 23719640 | 47 hrs ago | IN | 0 ETH | 0.00020128 | ||||
| Withdraw | 23719235 | 2 days ago | IN | 0 ETH | 0.00066439 | ||||
| Create_lock | 23719190 | 2 days ago | IN | 0 ETH | 0.00031501 | ||||
| Withdraw | 23719000 | 2 days ago | IN | 0 ETH | 0.00081173 | ||||
| Increase_amount | 23715131 | 2 days ago | IN | 0 ETH | 0.00053456 | ||||
| Increase_unlock_... | 23714833 | 2 days ago | IN | 0 ETH | 0.00051449 | ||||
| Increase_unlock_... | 23714540 | 2 days ago | IN | 0 ETH | 0.00009873 | ||||
| Increase_amount | 23714537 | 2 days ago | IN | 0 ETH | 0.00010313 | ||||
| Increase_unlock_... | 23712797 | 2 days ago | IN | 0 ETH | 0.00012342 | ||||
| Create_lock | 23703714 | 4 days ago | IN | 0 ETH | 0.0000272 | ||||
| Withdraw | 23703713 | 4 days ago | IN | 0 ETH | 0.00002165 | ||||
| Increase_amount | 23700063 | 4 days ago | IN | 0 ETH | 0.00002608 | ||||
| Increase_amount | 23700022 | 4 days ago | IN | 0 ETH | 0.00002965 | ||||
| Increase_amount | 23695015 | 5 days ago | IN | 0 ETH | 0.0000246 | ||||
| Increase_amount | 23694982 | 5 days ago | IN | 0 ETH | 0.00002382 | ||||
| Increase_amount | 23694309 | 5 days ago | IN | 0 ETH | 0.00002571 | ||||
| Increase_unlock_... | 23692509 | 5 days ago | IN | 0 ETH | 0.00017551 | ||||
| Create_lock | 23692453 | 5 days ago | IN | 0 ETH | 0.00036183 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Vyper_contract
Compiler Version
vyper:0.3.1
Contract Source Code (Vyper language format)
# @version 0.3.1
"""
@title Voting Escrow
@author Curve Finance
@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` (1 year).
"""
# 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 (1 year?)
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 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) = 365 * 86400 # 1 year
MULTIPLIER: constant(uint256) = 10 ** 18
TOKEN: immutable(address)
AUTHORIZER_ADAPTOR: immutable(address) # Authorizer Adaptor
NAME: immutable(String[64])
SYMBOL: immutable(String[32])
DECIMALS: immutable(uint256)
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
# 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)
@external
def __init__(token_addr: address, _name: String[64], _symbol: String[32], _authorizer_adaptor: address):
"""
@notice Contract constructor
@param token_addr 80/20 BAL-WETH BPT token address
@param _name Token name
@param _symbol Token symbol
@param _authorizer_adaptor `AuthorizerAdaptor` contract address
"""
assert _authorizer_adaptor != ZERO_ADDRESS
TOKEN = token_addr
AUTHORIZER_ADAPTOR = _authorizer_adaptor
self.point_history[0].blk = block.number
self.point_history[0].ts = block.timestamp
_decimals: uint256 = ERC20(token_addr).decimals()
assert _decimals <= 255
NAME = _name
SYMBOL = _symbol
DECIMALS = _decimals
@external
@view
def token() -> address:
return TOKEN
@external
@view
def name() -> String[64]:
return NAME
@external
@view
def symbol() -> String[32]:
return SYMBOL
@external
@view
def decimals() -> uint256:
return DECIMALS
@external
@view
def admin() -> address:
return AUTHORIZER_ADAPTOR
@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 == AUTHORIZER_ADAPTOR
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 == AUTHORIZER_ADAPTOR
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(TOKEN).transferFrom(_addr, 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 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 1 year 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 1 year 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(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 find epoch containing block number
@param _block Block to find
@param max_epoch Don't go beyond this epoch
@return Epoch which contains _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
@internal
@view
def find_timestamp_epoch(_timestamp: uint256, max_epoch: uint256) -> uint256:
"""
@notice Binary search to find epoch for timestamp
@param _timestamp timestamp to find
@param max_epoch Don't go beyond this epoch
@return Epoch which contains _timestamp
"""
# 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].ts <= _timestamp:
_min = _mid
else:
_max = _mid - 1
return _min
@internal
@view
def find_block_user_epoch(_addr: address, _block: uint256, max_epoch: uint256) -> uint256:
"""
@notice Binary search to find epoch for block number
@param _addr User for which to find user epoch for
@param _block Block to find
@param max_epoch Don't go beyond this epoch
@return Epoch which contains _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.user_point_history[_addr][_mid].blk <= _block:
_min = _mid
else:
_max = _mid - 1
return _min
@internal
@view
def find_timestamp_user_epoch(_addr: address, _timestamp: uint256, max_epoch: uint256) -> uint256:
"""
@notice Binary search to find user epoch for timestamp
@param _addr User for which to find user epoch for
@param _timestamp timestamp to find
@param max_epoch Don't go beyond this epoch
@return Epoch which contains _timestamp
"""
# 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.user_point_history[_addr][_mid].ts <= _timestamp:
_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 = 0
if _t == block.timestamp:
# No need to do binary search, will always live in current epoch
_epoch = self.user_point_epoch[addr]
else:
_epoch = self.find_timestamp_user_epoch(addr, _t, 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
_user_epoch: uint256 = self.find_block_user_epoch(addr, _block, self.user_point_epoch[addr])
upoint: Point = self.user_point_history[addr][_user_epoch]
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 = 0
if t == block.timestamp:
# No need to do binary search, will always live in current epoch
_epoch = self.epoch
else:
_epoch = self.find_timestamp_epoch(t, self.epoch)
if _epoch == 0:
return 0
else:
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
Contract ABI
API[{"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":[{"name":"token_addr","type":"address"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_authorizer_adaptor","type":"address"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}]},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"nonpayable","type":"function","name":"commit_smart_wallet_checker","inputs":[{"name":"addr","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"apply_smart_wallet_checker","inputs":[],"outputs":[]},{"stateMutability":"view","type":"function","name":"get_last_user_slope","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"int128"}]},{"stateMutability":"view","type":"function","name":"user_point_history__ts","inputs":[{"name":"_addr","type":"address"},{"name":"_idx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"locked__end","inputs":[{"name":"_addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"function","name":"checkpoint","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"deposit_for","inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"create_lock","inputs":[{"name":"_value","type":"uint256"},{"name":"_unlock_time","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"increase_amount","inputs":[{"name":"_value","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"increase_unlock_time","inputs":[{"name":"_unlock_time","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[],"outputs":[]},{"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"}]},{"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"}]},{"stateMutability":"view","type":"function","name":"supply","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"locked","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"amount","type":"int128"},{"name":"end","type":"uint256"}]}]},{"stateMutability":"view","type":"function","name":"epoch","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"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"}]}]},{"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"}]}]},{"stateMutability":"view","type":"function","name":"user_point_epoch","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"slope_changes","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"int128"}]},{"stateMutability":"view","type":"function","name":"future_smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}]}]Contract Creation Code
60206127ba6080396080518060a01c6127b55760e052602060206127ba016080396080516127ba016040602082608039608051116127b55780602081608039608051602001808261010039505050602060406127ba016080396080516127ba016020602082608039608051116127b55780602081608039608051602001808261016039505050602060606127ba016080396080518060a01c6127b5576101a05260006101a051146127b55760e0516101c0526101a0516101e052436007554260065563313ce567610220526020610220600461023c60e0515afa6100e8573d600060003e3d6000fd5b601f3d11156127b557610220516102005260ff61020051116127b557610100805160200180610220828460045afa90505050610160805160200180610280828460045afa90505050610200516102c05261274856600436101561000d57611766565b60046000601c37600051346126065763fc0c546a811861003d576020610100380360803960805160e052602060e0f35b6306fdde0381186100ae5760e080602080825260c0380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b6395d89b41811861011f5760e08060208082526060380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b63313ce567811861013f5760206020380360803960805160e052602060e0f35b63f851a440811861015f57602060e0380360803960805160e052602060e0f35b6357f901e2811861019e576004358060a01c6126065760e052602060e0380360803960805133186126065760e0516c050c783eb9b5c840000000000755005b638e5b490f81186101db57602060e038036080396080513318612606576c050c783eb9b5c8400000000007546c050c783eb9b5c840000000000855005b637c74a1748118610254576004358060a01c6126065760e0526c050c783eb9b5c840000000000560e05160a052608052604060802054610100526001600461010051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154610120526020610120f35b63da020a1881186102ab576004358060a01c6126065760e05260026004602435633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154610100526020610100f35b63adc6358981186102e3576004358060a01c6126065760e0526001600260e05160a05260805260406080200154610100526020610100f35b63c2c4c5c1811861030b57600060e0526040366101003760403661014037610309611877565b005b633a46273e81186104d0576004358060a01c612606576106605260005461260657600160005560026106605160a052608052604060802080546106805260018101546106a052506000602435111561260657600061068051136103df5760166106c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426106a051116104855760246106c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686106e0527f6472617700000000000000000000000000000000000000000000000000000000610700526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b61066051610480526024356104a05260006104c05260026106605160a052608052604060802080546104e052600181015461050052506000610520526104c9611f66565b6000600055005b6365fc3873811861073c576000546126065760016000553360e0526104f361176c565b60243562093a808082049050905062093a8080820282158284830414171561260657905090506106605260023360a052608052604060802080546106805260018101546106a05250600060043511156126065761068051156105c65760196106c0527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b42610660511161066c5760266106c0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e20746865206106e0527f6675747572650000000000000000000000000000000000000000000000000000610700526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426301e133808181830110612606578082019050905061066051111561070357601d6106c0527f566f74696e67206c6f636b2063616e20626520312079656172206d61780000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b33610480526004356104a052610660516104c052610680516104e0526106a05161050052600161052052610735611f66565b6000600055005b634957677c81186108e7576000546126065760016000553360e05261075f61176c565b60023360a05260805260406080208054610660526001810154610680525060006004351115612606576000610660511361080a5760166106a0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006106c0526106a0506106a051806106c001818260206001820306601f82010390500336823750506308c379a0610660526020610680526106a05160206001820306601f820103905060440161067cfd5b4261068051116108b05760246106a0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686106c0527f64726177000000000000000000000000000000000000000000000000000000006106e0526106a0506106a051806106c001818260206001820306601f82010390500336823750506308c379a0610660526020610680526106a05160206001820306601f820103905060440161067cfd5b33610480526004356104a05260006104c052610660516104e05261068051610500526002610520526108e0611f66565b6000600055005b63eff7a6128118610ba8576000546126065760016000553360e05261090a61176c565b60023360a05260805260406080208054610660526001810154610680525060043562093a808082049050905062093a8080820282158284830414171561260657905090506106a0524261068051116109d357600c6106c0527f4c6f636b206578706972656400000000000000000000000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b60006106605113610a555760116106c0527f4e6f7468696e67206973206c6f636b65640000000000000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b610680516106a05111610ad957601f6106c0527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426301e13380818183011061260657808201905090506106a0511115610b7057601d6106c0527f566f74696e67206c6f636b2063616e20626520312079656172206d61780000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b336104805260006104a0526106a0516104c052610660516104e0526106805161050052600361052052610ba1611f66565b6000600055005b633ccfd60b8118610dcc5760005461260657600160005560023360a052608052604060802080546104805260018101546104a052506104a051421015610c5f5760166104c0527f546865206c6f636b206469646e277420657870697265000000000000000000006104e0526104c0506104c051806104e001818260206001820306601f82010390500336823750506308c379a06104805260206104a0526104c05160206001820306601f820103905060440161049cfd5b6104805160008112612606576104c052610480516104e0526104a0516105005260006104a05260006104805260023360a05260805260406080206104805181556104a05160018201555060015461052052610520516104c05180821061260657808203905090506001553360e0526104e05161010052610500516101205261048051610140526104a05161016052610cf5611877565b63a9059cbb6105405233610560526104c051610580526020610540604461055c6000602061010038036080396080515af1610d35573d600060003e3d6000fd5b601f3d111561260657610540511561260657337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686104c0516105405242610560526040610540a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105205161054052610520516104c0518082106126065780820390509050610560526040610540a16000600055005b6370a082318118610de157426101e052610df3565b62fdd58e8118610f6f576024356101e0525b6004358060a01c612606576101c052600061020052426101e05118610e39576c050c783eb9b5c84000000000056101c05160a05260805260406080205461020052610e7e565b6101c05160e0526101e051610100526c050c783eb9b5c84000000000056101c05160a05260805260406080205461012052610e756102206123ad565b61022051610200525b6102005115610f5d57600461020051633b9aca0081101561260657026c050c783eb9b5c84000000000046101c05160a052608052604060802001805461022052600181015461024052600281015461026052600381015461028052506102208051610240516101e05161026051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506000610220511215610f3f576000610220525b6102205160008112612606576102a05260206102a0610f6d56610f6d565b6000610220526020610220610f6d565bf35b634ee2cd7e8118611258576004358060a01c612606576101c0524360243511612606576101c05160e052602435610100526c050c783eb9b5c84000000000056101c05160a05260805260406080205461012052610fcd6102006122cb565b610200516101e05260046101e051633b9aca0081101561260657026c050c783eb9b5c84000000000046101c05160a052608052604060802001805461020052600181015461022052600281015461024052600381015461026052506003546102805260243560e05261028051610100526110486102c061212b565b6102c0516102a05260046102a0516c01431e0fae6d7217caa0000000811015612606570260040180546102c05260018101546102e0526002810154610300526003810154610320525060403661034037610280516102a051106110d85743610320518082106126065780820390509050610340524261030051808210612606578082039050905061036052611160565b60046102a0516001818183011061260657808201905090506c01431e0fae6d7217caa0000000811015612606570260040180546103805260018101546103a05260028101546103c05260038101546103e052506103e051610320518082106126065780820390509050610340526103c051610300518082106126065780820390509050610360525b6103005161038052600061034051146111ca5761038080516103605160243561032051808210612606578082039050905080820282158284830414171561260657905090506103405180801561260657820490509050818183011061260657808201905090508152505b6102008051610220516103805161024051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d186126065790509050815250600061020051121561123c5760006103a05260206103a061125656611256565b6102005160008112612606576103a05260206103a0611256565bf35b6318160ddd811861126d574261026052611280565b63bd85b039811861136257600435610260525b60006102805242610260511861129c57600354610280526112be565b6102605160e052600354610100526112b56102a06121fb565b6102a051610280525b6102805115611350576004610280516c01431e0fae6d7217caa0000000811015612606570260040180546102a05260018101546102c05260028101546102e052600381015461030052506102a05160e0526102c051610100526102e051610120526103005161014052610260516101605261133a61032061248f565b6103205161034052602061034061136056611360565b60006102a05260206102a0611360565bf35b63981b24d0811861157d574360043511612606576003546102605260043560e05261026051610100526113966102a061212b565b6102a051610280526004610280516c01431e0fae6d7217caa0000000811015612606570260040180546102a05260018101546102c05260028101546102e052600381015461030052506000610320526102605161028051106114615743610300511461152857600435610300518082106126065780820390509050426102e05180821061260657808203905090508082028215828483041417156126065790509050436103005180821061260657808203905090508080156126065782049050905061032052611528565b6004610280516001818183011061260657808201905090506c01431e0fae6d7217caa0000000811015612606570260040180546103405260018101546103605260028101546103805260038101546103a052506103a051610300511461152857600435610300518082106126065780820390509050610380516102e051808210612606578082039050905080820282158284830414171561260657905090506103a05161030051808210612606578082039050905080801561260657820490509050610320525b6102a05160e0526102c051610100526102e0516101205261030051610140526102e05161032051818183011061260657808201905090506101605261156e61034061248f565b61034051610360526020610360f35b63047fc9aa81186115945760015460e052602060e0f35b63cbf9fe5f81186115d4576004358060a01c6126065760e052600260e05160a0526080526040608020805461010052600181015461012052506040610100f35b63900cf0cf81186115eb5760035460e052602060e0f35b63d1febfb9811861163b5760046004356c01431e0fae6d7217caa00000008110156126065702600401805460e05260018101546101005260028101546101205260038101546101405250608060e0f35b6328d09d4781186116ac576004358060a01c6126065760e0526004602435633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a052608052604060802001805461010052600181015461012052600281015461014052600381015461016052506080610100f35b63010ae75781186116ed576004358060a01c6126065760e0526c050c783eb9b5c840000000000560e05160a052608052604060802054610100526020610100f35b6371197484811861171e576c050c783eb9b5c840000000000660043560a05260805260406080205460e052602060e0f35b638ff36fd18118611741576c050c783eb9b5c84000000000075460e052602060e0f35b637175d4f78118611764576c050c783eb9b5c84000000000085460e052602060e0f35b505b60006000fd5b3260e05114611875576c050c783eb9b5c84000000000085461010052600061010051146117db5763c23697a86101205260e051610140526020610120602461013c6000610100515af16117c4573d600060003e3d6000fd5b601f3d11156126065761012051156117db57611875565b6025610120527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c610140527f6c6f7765640000000000000000000000000000000000000000000000000000006101605261012050610120518061014001818260206001820306601f82010390500336823750506308c379a060e0526020610100526101205160206001820306601f820103905060440160fcfd5b565b61014036610180376003546102c052600060e051146119e8574261012051116118a15760006118a9565b600061010051135b1561190757610100516301e133808082058060801d81607f1d1861260657905090506101a0526101a0516101205142808210612606578082039050905080607f1c612606578082028060801d81607f1d186126065790509050610180525b426101605111611918576000611920565b600061014051135b1561197e57610140516301e133808082058060801d81607f1d18612606579050905061022052610220516101605142808210612606578082039050905080607f1c612606578082028060801d81607f1d186126065790509050610200525b6c050c783eb9b5c84000000000066101205160a05260805260406080205461028052600061016051146119e8576101205161016051186119c557610280516102a0526119e8565b6c050c783eb9b5c84000000000066101605160a0526080526040608020546102a0525b6040366102e0374261032052436103405260006102c0511115611a475760046102c0516c01431e0fae6d7217caa0000000811015612606570260040180546102e052600181015461030052600281015461032052600381015461034052505b61032051610360526102e05161038052610300516103a052610320516103c052610340516103e05260006104005261032051421115611ad557670de0b6b3a76400004361034051808210612606578082039050905080820282158284830414171561260657905090504261032051808210612606578082039050905080801561260657820490509050610400525b6103605162093a808082049050905062093a80808202821582848304141715612606579050905061042052610440600060ff818352015b610420805162093a8081818301106126065780820190509050815250600061046052426104205111611b5f576c050c783eb9b5c84000000000066104205160a05260805260406080205461046052611b65565b42610420525b6102e08051610300516104205161036051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506103008051610460518082018060801d81607f1d18612606579050905081525060006102e0511215611bea5760006102e0525b6000610300511215611bfd576000610300525b610420516103605261042051610320526103e05161040051610420516103c05180821061260657808203905090508082028215828483041417156126065790509050670de0b6b3a76400008082049050905081818301106126065780820190509050610340526102c08051600181818301106126065780820190509050815250426104205118611c95574361034052611ce756611cd7565b60046102c0516c01431e0fae6d7217caa000000081101561260657026004016102e0518155610300516001820155610320516002820155610340516003820155505b8151600101808352811415611b0c575b50506102c051600355600060e05114611d90576103008051610220516101a0518082038060801d81607f1d1861260657905090508082018060801d81607f1d1861260657905090508152506102e0805161020051610180518082038060801d81607f1d1861260657905090508082018060801d81607f1d1861260657905090508152506000610300511215611d7d576000610300525b60006102e0511215611d905760006102e0525b60046102c0516c01431e0fae6d7217caa000000081101561260657026004016102e051815561030051600182015561032051600282015561034051600382015550600060e05114611f645742610120511115611e575761028080516101a0518082018060801d81607f1d186126065790509050815250610120516101605118611e34576102808051610220518082038060801d81607f1d1861260657905090508152505b610280516c050c783eb9b5c84000000000066101205160a0526080526040608020555b42610160511115611eb35761012051610160511115611eb3576102a08051610220518082038060801d81607f1d1861260657905090508152506102a0516c050c783eb9b5c84000000000066101605160a0526080526040608020555b6c050c783eb9b5c840000000000560e05160a05260805260406080205460018181830110612606578082019050905061044052610440516c050c783eb9b5c840000000000560e05160a05260805260406080205542610240524361026052600461044051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a052608052604060802001610200518155610220516001820155610240516002820155610260516003820155505b565b6104e05161054052610500516105605260015461058052610580516104a05181818301106126065780820190509050600155610540516105a052610560516105c05261054080516104a05180607f1c612606578082018060801d81607f1d18612606579050905081525060006104c05114611fe4576104c051610560525b60026104805160a0526080526040608020610540518155610560516001820155506104805160e0526105a051610100526105c0516101205261054051610140526105605161016052612034611877565b60006104a0511461209a576323b872dd6105e052610480516106005230610620526104a0516106405260206105e060646105fc6000602061010038036080396080515af1612087573d600060003e3d6000fd5b601f3d1115612606576105e05115612606575b61056051610480517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596104a0516105e0526105205161060052426106205260606105e0a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c610580516105e052610580516104a051818183011061260657808201905090506106005260406105e0a1565b600061012052610100516101405261016060006080818352015b610140516101205110612157576121f0565b6101205161014051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101805260e05160036004610180516c01431e0fae6d7217caa00000008110156126065702600401015411156121d7576101805160018082106126065780820390509050610140526121e0565b61018051610120525b8151600101808352811415612145575b505061012051815250565b600061012052610100516101405261016060006080818352015b610140516101205110612227576122c0565b6101205161014051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101805260e05160026004610180516c01431e0fae6d7217caa00000008110156126065702600401015411156122a7576101805160018082106126065780820390509050610140526122b0565b61018051610120525b8151600101808352811415612215575b505061012051815250565b600061014052610120516101605261018060006080818352015b6101605161014051106122f7576123a2565b6101405161016051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101a05261010051600360046101a051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a05260805260406080200101541115612389576101a0516001808210612606578082039050905061016052612392565b6101a051610140525b81516001018083528114156122e5575b505061014051815250565b600061014052610120516101605261018060006080818352015b6101605161014051106123d957612484565b6101405161016051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101a05261010051600260046101a051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154111561246b576101a0516001808210612606578082039050905061016052612474565b6101a051610140525b81516001018083528114156123c7575b505061014051815250565b60e05161018052610100516101a052610120516101c052610140516101e0526101c05162093a808082049050905062093a80808202821582848304141715612606579050905061020052610220600060ff818352015b610200805162093a808181830110612606578082019050905081525060006102405261016051610200511161253b576c050c783eb9b5c84000000000066102005160a05260805260406080205461024052612544565b61016051610200525b61018080516101a051610200516101c051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506101605161020051186125a8576125e0565b6101a08051610240518082018060801d81607f1d186126065790509050815250610200516101c05281516001018083528114156124e5575b505060006101805112156125f5576000610180525b610180516000811261260657815250565b600080fd5b61013d6127480361013d6102e03961013d612748036101c051816102e001526101e0518161030001526102208051602001808361032001828460045afa905050506102808051602001808361038001828460045afa905050506102c051816103c0015280610100016102e0f35b600080fd0000000000000000000000005c6ee304399dbdb9c8ef030ab642b10820db8f56000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000008f42adbba1b16eaae3bb5754915e0d06059add75000000000000000000000000000000000000000000000000000000000000001a566f746520457363726f7765642042616c616e636572204250540000000000000000000000000000000000000000000000000000000000000000000000000005766542414c000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x600436101561000d57611766565b60046000601c37600051346126065763fc0c546a811861003d576020610100380360803960805160e052602060e0f35b6306fdde0381186100ae5760e080602080825260c0380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b6395d89b41811861011f5760e08060208082526060380381840180826020816080396080516020018082843950508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090509050810190509050905060e0f35b63313ce567811861013f5760206020380360803960805160e052602060e0f35b63f851a440811861015f57602060e0380360803960805160e052602060e0f35b6357f901e2811861019e576004358060a01c6126065760e052602060e0380360803960805133186126065760e0516c050c783eb9b5c840000000000755005b638e5b490f81186101db57602060e038036080396080513318612606576c050c783eb9b5c8400000000007546c050c783eb9b5c840000000000855005b637c74a1748118610254576004358060a01c6126065760e0526c050c783eb9b5c840000000000560e05160a052608052604060802054610100526001600461010051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154610120526020610120f35b63da020a1881186102ab576004358060a01c6126065760e05260026004602435633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154610100526020610100f35b63adc6358981186102e3576004358060a01c6126065760e0526001600260e05160a05260805260406080200154610100526020610100f35b63c2c4c5c1811861030b57600060e0526040366101003760403661014037610309611877565b005b633a46273e81186104d0576004358060a01c612606576106605260005461260657600160005560026106605160a052608052604060802080546106805260018101546106a052506000602435111561260657600061068051136103df5760166106c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426106a051116104855760246106c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686106e0527f6472617700000000000000000000000000000000000000000000000000000000610700526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b61066051610480526024356104a05260006104c05260026106605160a052608052604060802080546104e052600181015461050052506000610520526104c9611f66565b6000600055005b6365fc3873811861073c576000546126065760016000553360e0526104f361176c565b60243562093a808082049050905062093a8080820282158284830414171561260657905090506106605260023360a052608052604060802080546106805260018101546106a05250600060043511156126065761068051156105c65760196106c0527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b42610660511161066c5760266106c0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e20746865206106e0527f6675747572650000000000000000000000000000000000000000000000000000610700526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426301e133808181830110612606578082019050905061066051111561070357601d6106c0527f566f74696e67206c6f636b2063616e20626520312079656172206d61780000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b33610480526004356104a052610660516104c052610680516104e0526106a05161050052600161052052610735611f66565b6000600055005b634957677c81186108e7576000546126065760016000553360e05261075f61176c565b60023360a05260805260406080208054610660526001810154610680525060006004351115612606576000610660511361080a5760166106a0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006106c0526106a0506106a051806106c001818260206001820306601f82010390500336823750506308c379a0610660526020610680526106a05160206001820306601f820103905060440161067cfd5b4261068051116108b05760246106a0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686106c0527f64726177000000000000000000000000000000000000000000000000000000006106e0526106a0506106a051806106c001818260206001820306601f82010390500336823750506308c379a0610660526020610680526106a05160206001820306601f820103905060440161067cfd5b33610480526004356104a05260006104c052610660516104e05261068051610500526002610520526108e0611f66565b6000600055005b63eff7a6128118610ba8576000546126065760016000553360e05261090a61176c565b60023360a05260805260406080208054610660526001810154610680525060043562093a808082049050905062093a8080820282158284830414171561260657905090506106a0524261068051116109d357600c6106c0527f4c6f636b206578706972656400000000000000000000000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b60006106605113610a555760116106c0527f4e6f7468696e67206973206c6f636b65640000000000000000000000000000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b610680516106a05111610ad957601f6106c0527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b426301e13380818183011061260657808201905090506106a0511115610b7057601d6106c0527f566f74696e67206c6f636b2063616e20626520312079656172206d61780000006106e0526106c0506106c051806106e001818260206001820306601f82010390500336823750506308c379a06106805260206106a0526106c05160206001820306601f820103905060440161069cfd5b336104805260006104a0526106a0516104c052610660516104e0526106805161050052600361052052610ba1611f66565b6000600055005b633ccfd60b8118610dcc5760005461260657600160005560023360a052608052604060802080546104805260018101546104a052506104a051421015610c5f5760166104c0527f546865206c6f636b206469646e277420657870697265000000000000000000006104e0526104c0506104c051806104e001818260206001820306601f82010390500336823750506308c379a06104805260206104a0526104c05160206001820306601f820103905060440161049cfd5b6104805160008112612606576104c052610480516104e0526104a0516105005260006104a05260006104805260023360a05260805260406080206104805181556104a05160018201555060015461052052610520516104c05180821061260657808203905090506001553360e0526104e05161010052610500516101205261048051610140526104a05161016052610cf5611877565b63a9059cbb6105405233610560526104c051610580526020610540604461055c6000602061010038036080396080515af1610d35573d600060003e3d6000fd5b601f3d111561260657610540511561260657337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686104c0516105405242610560526040610540a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105205161054052610520516104c0518082106126065780820390509050610560526040610540a16000600055005b6370a082318118610de157426101e052610df3565b62fdd58e8118610f6f576024356101e0525b6004358060a01c612606576101c052600061020052426101e05118610e39576c050c783eb9b5c84000000000056101c05160a05260805260406080205461020052610e7e565b6101c05160e0526101e051610100526c050c783eb9b5c84000000000056101c05160a05260805260406080205461012052610e756102206123ad565b61022051610200525b6102005115610f5d57600461020051633b9aca0081101561260657026c050c783eb9b5c84000000000046101c05160a052608052604060802001805461022052600181015461024052600281015461026052600381015461028052506102208051610240516101e05161026051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506000610220511215610f3f576000610220525b6102205160008112612606576102a05260206102a0610f6d56610f6d565b6000610220526020610220610f6d565bf35b634ee2cd7e8118611258576004358060a01c612606576101c0524360243511612606576101c05160e052602435610100526c050c783eb9b5c84000000000056101c05160a05260805260406080205461012052610fcd6102006122cb565b610200516101e05260046101e051633b9aca0081101561260657026c050c783eb9b5c84000000000046101c05160a052608052604060802001805461020052600181015461022052600281015461024052600381015461026052506003546102805260243560e05261028051610100526110486102c061212b565b6102c0516102a05260046102a0516c01431e0fae6d7217caa0000000811015612606570260040180546102c05260018101546102e0526002810154610300526003810154610320525060403661034037610280516102a051106110d85743610320518082106126065780820390509050610340524261030051808210612606578082039050905061036052611160565b60046102a0516001818183011061260657808201905090506c01431e0fae6d7217caa0000000811015612606570260040180546103805260018101546103a05260028101546103c05260038101546103e052506103e051610320518082106126065780820390509050610340526103c051610300518082106126065780820390509050610360525b6103005161038052600061034051146111ca5761038080516103605160243561032051808210612606578082039050905080820282158284830414171561260657905090506103405180801561260657820490509050818183011061260657808201905090508152505b6102008051610220516103805161024051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d186126065790509050815250600061020051121561123c5760006103a05260206103a061125656611256565b6102005160008112612606576103a05260206103a0611256565bf35b6318160ddd811861126d574261026052611280565b63bd85b039811861136257600435610260525b60006102805242610260511861129c57600354610280526112be565b6102605160e052600354610100526112b56102a06121fb565b6102a051610280525b6102805115611350576004610280516c01431e0fae6d7217caa0000000811015612606570260040180546102a05260018101546102c05260028101546102e052600381015461030052506102a05160e0526102c051610100526102e051610120526103005161014052610260516101605261133a61032061248f565b6103205161034052602061034061136056611360565b60006102a05260206102a0611360565bf35b63981b24d0811861157d574360043511612606576003546102605260043560e05261026051610100526113966102a061212b565b6102a051610280526004610280516c01431e0fae6d7217caa0000000811015612606570260040180546102a05260018101546102c05260028101546102e052600381015461030052506000610320526102605161028051106114615743610300511461152857600435610300518082106126065780820390509050426102e05180821061260657808203905090508082028215828483041417156126065790509050436103005180821061260657808203905090508080156126065782049050905061032052611528565b6004610280516001818183011061260657808201905090506c01431e0fae6d7217caa0000000811015612606570260040180546103405260018101546103605260028101546103805260038101546103a052506103a051610300511461152857600435610300518082106126065780820390509050610380516102e051808210612606578082039050905080820282158284830414171561260657905090506103a05161030051808210612606578082039050905080801561260657820490509050610320525b6102a05160e0526102c051610100526102e0516101205261030051610140526102e05161032051818183011061260657808201905090506101605261156e61034061248f565b61034051610360526020610360f35b63047fc9aa81186115945760015460e052602060e0f35b63cbf9fe5f81186115d4576004358060a01c6126065760e052600260e05160a0526080526040608020805461010052600181015461012052506040610100f35b63900cf0cf81186115eb5760035460e052602060e0f35b63d1febfb9811861163b5760046004356c01431e0fae6d7217caa00000008110156126065702600401805460e05260018101546101005260028101546101205260038101546101405250608060e0f35b6328d09d4781186116ac576004358060a01c6126065760e0526004602435633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a052608052604060802001805461010052600181015461012052600281015461014052600381015461016052506080610100f35b63010ae75781186116ed576004358060a01c6126065760e0526c050c783eb9b5c840000000000560e05160a052608052604060802054610100526020610100f35b6371197484811861171e576c050c783eb9b5c840000000000660043560a05260805260406080205460e052602060e0f35b638ff36fd18118611741576c050c783eb9b5c84000000000075460e052602060e0f35b637175d4f78118611764576c050c783eb9b5c84000000000085460e052602060e0f35b505b60006000fd5b3260e05114611875576c050c783eb9b5c84000000000085461010052600061010051146117db5763c23697a86101205260e051610140526020610120602461013c6000610100515af16117c4573d600060003e3d6000fd5b601f3d11156126065761012051156117db57611875565b6025610120527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c610140527f6c6f7765640000000000000000000000000000000000000000000000000000006101605261012050610120518061014001818260206001820306601f82010390500336823750506308c379a060e0526020610100526101205160206001820306601f820103905060440160fcfd5b565b61014036610180376003546102c052600060e051146119e8574261012051116118a15760006118a9565b600061010051135b1561190757610100516301e133808082058060801d81607f1d1861260657905090506101a0526101a0516101205142808210612606578082039050905080607f1c612606578082028060801d81607f1d186126065790509050610180525b426101605111611918576000611920565b600061014051135b1561197e57610140516301e133808082058060801d81607f1d18612606579050905061022052610220516101605142808210612606578082039050905080607f1c612606578082028060801d81607f1d186126065790509050610200525b6c050c783eb9b5c84000000000066101205160a05260805260406080205461028052600061016051146119e8576101205161016051186119c557610280516102a0526119e8565b6c050c783eb9b5c84000000000066101605160a0526080526040608020546102a0525b6040366102e0374261032052436103405260006102c0511115611a475760046102c0516c01431e0fae6d7217caa0000000811015612606570260040180546102e052600181015461030052600281015461032052600381015461034052505b61032051610360526102e05161038052610300516103a052610320516103c052610340516103e05260006104005261032051421115611ad557670de0b6b3a76400004361034051808210612606578082039050905080820282158284830414171561260657905090504261032051808210612606578082039050905080801561260657820490509050610400525b6103605162093a808082049050905062093a80808202821582848304141715612606579050905061042052610440600060ff818352015b610420805162093a8081818301106126065780820190509050815250600061046052426104205111611b5f576c050c783eb9b5c84000000000066104205160a05260805260406080205461046052611b65565b42610420525b6102e08051610300516104205161036051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506103008051610460518082018060801d81607f1d18612606579050905081525060006102e0511215611bea5760006102e0525b6000610300511215611bfd576000610300525b610420516103605261042051610320526103e05161040051610420516103c05180821061260657808203905090508082028215828483041417156126065790509050670de0b6b3a76400008082049050905081818301106126065780820190509050610340526102c08051600181818301106126065780820190509050815250426104205118611c95574361034052611ce756611cd7565b60046102c0516c01431e0fae6d7217caa000000081101561260657026004016102e0518155610300516001820155610320516002820155610340516003820155505b8151600101808352811415611b0c575b50506102c051600355600060e05114611d90576103008051610220516101a0518082038060801d81607f1d1861260657905090508082018060801d81607f1d1861260657905090508152506102e0805161020051610180518082038060801d81607f1d1861260657905090508082018060801d81607f1d1861260657905090508152506000610300511215611d7d576000610300525b60006102e0511215611d905760006102e0525b60046102c0516c01431e0fae6d7217caa000000081101561260657026004016102e051815561030051600182015561032051600282015561034051600382015550600060e05114611f645742610120511115611e575761028080516101a0518082018060801d81607f1d186126065790509050815250610120516101605118611e34576102808051610220518082038060801d81607f1d1861260657905090508152505b610280516c050c783eb9b5c84000000000066101205160a0526080526040608020555b42610160511115611eb35761012051610160511115611eb3576102a08051610220518082038060801d81607f1d1861260657905090508152506102a0516c050c783eb9b5c84000000000066101605160a0526080526040608020555b6c050c783eb9b5c840000000000560e05160a05260805260406080205460018181830110612606578082019050905061044052610440516c050c783eb9b5c840000000000560e05160a05260805260406080205542610240524361026052600461044051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a052608052604060802001610200518155610220516001820155610240516002820155610260516003820155505b565b6104e05161054052610500516105605260015461058052610580516104a05181818301106126065780820190509050600155610540516105a052610560516105c05261054080516104a05180607f1c612606578082018060801d81607f1d18612606579050905081525060006104c05114611fe4576104c051610560525b60026104805160a0526080526040608020610540518155610560516001820155506104805160e0526105a051610100526105c0516101205261054051610140526105605161016052612034611877565b60006104a0511461209a576323b872dd6105e052610480516106005230610620526104a0516106405260206105e060646105fc6000602061010038036080396080515af1612087573d600060003e3d6000fd5b601f3d1115612606576105e05115612606575b61056051610480517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596104a0516105e0526105205161060052426106205260606105e0a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c610580516105e052610580516104a051818183011061260657808201905090506106005260406105e0a1565b600061012052610100516101405261016060006080818352015b610140516101205110612157576121f0565b6101205161014051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101805260e05160036004610180516c01431e0fae6d7217caa00000008110156126065702600401015411156121d7576101805160018082106126065780820390509050610140526121e0565b61018051610120525b8151600101808352811415612145575b505061012051815250565b600061012052610100516101405261016060006080818352015b610140516101205110612227576122c0565b6101205161014051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101805260e05160026004610180516c01431e0fae6d7217caa00000008110156126065702600401015411156122a7576101805160018082106126065780820390509050610140526122b0565b61018051610120525b8151600101808352811415612215575b505061012051815250565b600061014052610120516101605261018060006080818352015b6101605161014051106122f7576123a2565b6101405161016051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101a05261010051600360046101a051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a05260805260406080200101541115612389576101a0516001808210612606578082039050905061016052612392565b6101a051610140525b81516001018083528114156122e5575b505061014051815250565b600061014052610120516101605261018060006080818352015b6101605161014051106123d957612484565b6101405161016051818183011061260657808201905090506001818183011061260657808201905090506002808204905090506101a05261010051600260046101a051633b9aca0081101561260657026c050c783eb9b5c840000000000460e05160a0526080526040608020010154111561246b576101a0516001808210612606578082039050905061016052612474565b6101a051610140525b81516001018083528114156123c7575b505061014051815250565b60e05161018052610100516101a052610120516101c052610140516101e0526101c05162093a808082049050905062093a80808202821582848304141715612606579050905061020052610220600060ff818352015b610200805162093a808181830110612606578082019050905081525060006102405261016051610200511161253b576c050c783eb9b5c84000000000066102005160a05260805260406080205461024052612544565b61016051610200525b61018080516101a051610200516101c051808210612606578082039050905080607f1c612606578082028060801d81607f1d1861260657905090508082038060801d81607f1d1861260657905090508152506101605161020051186125a8576125e0565b6101a08051610240518082018060801d81607f1d186126065790509050815250610200516101c05281516001018083528114156124e5575b505060006101805112156125f5576000610180525b610180516000811261260657815250565b600080fd0000000000000000000000005c6ee304399dbdb9c8ef030ab642b10820db8f560000000000000000000000008f42adbba1b16eaae3bb5754915e0d06059add75000000000000000000000000000000000000000000000000000000000000001a566f746520457363726f7765642042616c616e6365722042505400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005766542414c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c6ee304399dbdb9c8ef030ab642b10820db8f56000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000008f42adbba1b16eaae3bb5754915e0d06059add75000000000000000000000000000000000000000000000000000000000000001a566f746520457363726f7765642042616c616e636572204250540000000000000000000000000000000000000000000000000000000000000000000000000005766542414c000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : token_addr (address): 0x5c6Ee304399DBdB9C8Ef030aB642B10820DB8F56
Arg [1] : _name (string): Vote Escrowed Balancer BPT
Arg [2] : _symbol (string): veBAL
Arg [3] : _authorizer_adaptor (address): 0x8F42aDBbA1B16EaAE3BB5754915E0D06059aDd75
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c6ee304399dbdb9c8ef030ab642b10820db8f56
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000008f42adbba1b16eaae3bb5754915e0d06059add75
Arg [4] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [5] : 566f746520457363726f7765642042616c616e63657220425054000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 766542414c000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $3.76 | 6,147,778.5218 | $23,115,647.24 |
Loading...
Loading
Loading...
Loading
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.