ETH Price: $3,049.60 (+0.42%)
 

Overview

Max Total Supply

52,952,132.141439256481319212 vMOONEY

Holders

0

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.3.0

Optimization Enabled:
N/A

Other Settings:
petersburg EvmVersion, MIT license

Contract Source Code (Vyper language format)

# @version 0.3.0
"""
@title Moondao Stake to Vote
@fork 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` (4 years).
"""

# 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 __init__(token_addr: address, _name: String[64], _symbol: String[32], _version: String[32]):
    """
    @notice Contract constructor
    @param token_addr `ERC20CRV` token address
    @param _name Token name
    @param _symbol Token symbol
    @param _version Contract version - required for Aragon compatibility
    """
    self.admin = msg.sender
    self.token = token_addr
    self.point_history[0].blk = block.number
    self.point_history[0].ts = block.timestamp
    self.controller = msg.sender
    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(_addr: address, _value: uint256, unlock_time: uint256, locked_balance: LockedBalance, type: int128):
    """
    @notice Deposit and lock tokens for a user
    @param _addr User's wallet address
    @param _value Amount to deposit
    @param unlock_time New time when to unlock the tokens, or 0 if unchanged
    @param locked_balance Previous locked amount / timestamp
    """
    _locked: LockedBalance = locked_balance
    supply_before: uint256 = self.supply

    self.supply = supply_before + _value
    old_locked: LockedBalance = _locked
    # Adding to existing lock, or if a lock is expired - creating a new one
    _locked.amount += convert(_value, int128)
    if unlock_time != 0:
        _locked.end = unlock_time
    self.locked[_addr] = _locked

    # Possibilities:
    # Both old_locked.end could be current or expired (>/< block.timestamp)
    # value == 0 (extend lock) or value > 0 (add to lock or extend lock)
    # _locked.end > block.timestamp (always)
    self._checkpoint(_addr, old_locked, _locked)

    if _value != 0:
        assert ERC20(self.token).transferFrom(_addr, self, _value)

    log Deposit(_addr, _value, _locked.end, type, block.timestamp)
    log Supply(supply_before, supply_before + _value)


@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 4 years max"

    self._deposit_for(msg.sender, _value, unlock_time, _locked, CREATE_LOCK_TYPE)


@external
@nonreentrant('lock')
def increase_amount(_value: uint256):
    """
    @notice Deposit `_value` additional tokens for `msg.sender`
            without modifying the unlock time
    @param _value Amount of tokens to deposit and add to the lock
    """
    self.assert_not_contract(msg.sender)
    _locked: LockedBalance = self.locked[msg.sender]

    assert _value > 0  # dev: need non-zero value
    assert _locked.amount > 0, "No existing lock found"
    assert _locked.end > block.timestamp, "Cannot add to expired lock. Withdraw"

    self._deposit_for(msg.sender, _value, 0, _locked, INCREASE_LOCK_AMOUNT)


@external
@nonreentrant('lock')
def increase_unlock_time(_unlock_time: uint256):
    """
    @notice Extend the unlock time for `msg.sender` to `_unlock_time`
    @param _unlock_time New epoch time for unlocking
    """
    self.assert_not_contract(msg.sender)
    _locked: LockedBalance = self.locked[msg.sender]
    unlock_time: uint256 = (_unlock_time / WEEK) * WEEK  # Locktime is rounded down to weeks

    assert _locked.end > block.timestamp, "Lock expired"
    assert _locked.amount > 0, "Nothing is locked"
    assert unlock_time > _locked.end, "Can only increase lock duration"
    assert unlock_time <= block.timestamp + MAXTIME, "Voting lock can be 4 years max"

    self._deposit_for(msg.sender, 0, unlock_time, _locked, INCREASE_UNLOCK_TIME)


@external
@nonreentrant('lock')
def withdraw():
    """
    @notice Withdraw all tokens for `msg.sender`
    @dev Only possible if the lock has expired
    """
    _locked: LockedBalance = self.locked[msg.sender]
    assert block.timestamp >= _locked.end, "The lock didn't expire"
    value: uint256 = convert(_locked.amount, uint256)

    old_locked: LockedBalance = _locked
    _locked.end = 0
    _locked.amount = 0
    self.locked[msg.sender] = _locked
    supply_before: uint256 = self.supply
    self.supply = supply_before - value

    # old_locked can have either expired <= timestamp or zero end
    # _locked has only 0 end
    # Both can have >= 0 amount
    self._checkpoint(msg.sender, old_locked, _locked)

    assert ERC20(self.token).transfer(msg.sender, value)

    log Withdraw(msg.sender, value, block.timestamp)
    log Supply(supply_before, supply_before - value)


# The following ERC20/minime-compatible methods are not real balanceOf and supply!
# They measure the weights for the purpose of voting, so they don't represent
# real coins.

@internal
@view
def find_block_epoch(_block: uint256, max_epoch: uint256) -> uint256:
    """
    @notice Binary search to estimate timestamp for block number
    @param _block Block to find
    @param max_epoch Don't go beyond this epoch
    @return Approximate timestamp for block
    """
    # Binary search
    _min: uint256 = 0
    _max: uint256 = max_epoch
    for i in range(128):  # Will be always enough for 128-bit numbers
        if _min >= _max:
            break
        _mid: uint256 = (_min + _max + 1) / 2
        if self.point_history[_mid].blk <= _block:
            _min = _mid
        else:
            _max = _mid - 1
    return _min


@external
@view
def balanceOf(addr: address, _t: uint256 = block.timestamp) -> uint256:
    """
    @notice Get the current voting power for `msg.sender`
    @dev Adheres to the ERC20 `balanceOf` interface for Aragon compatibility
    @param addr User wallet address
    @param _t Epoch time to return voting power at
    @return User voting power
    """
    _epoch: uint256 = self.user_point_epoch[addr]
    if _epoch == 0:
        return 0
    else:
        last_point: Point = self.user_point_history[addr][_epoch]
        last_point.bias -= last_point.slope * convert(_t - last_point.ts, int128)
        if last_point.bias < 0:
            last_point.bias = 0
        return convert(last_point.bias, uint256)


@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

Contract ABI

API
[{"name":"CommitOwnership","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ApplyOwnership","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"Deposit","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"value","type":"uint256","indexed":false},{"name":"locktime","type":"uint256","indexed":true},{"name":"type","type":"int128","indexed":false},{"name":"ts","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Withdraw","inputs":[{"name":"provider","type":"address","indexed":true},{"name":"value","type":"uint256","indexed":false},{"name":"ts","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Supply","inputs":[{"name":"prevSupply","type":"uint256","indexed":false},{"name":"supply","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"token_addr","type":"address"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_version","type":"string"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"addr","type":"address"}],"outputs":[],"gas":39482},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":41564},{"stateMutability":"nonpayable","type":"function","name":"commit_smart_wallet_checker","inputs":[{"name":"addr","type":"address"}],"outputs":[],"gas":37702},{"stateMutability":"nonpayable","type":"function","name":"apply_smart_wallet_checker","inputs":[],"outputs":[],"gas":39672},{"stateMutability":"view","type":"function","name":"get_last_user_slope","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"int128"}],"gas":5196},{"stateMutability":"view","type":"function","name":"user_point_history__ts","inputs":[{"name":"_addr","type":"address"},{"name":"_idx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":2999},{"stateMutability":"view","type":"function","name":"locked__end","inputs":[{"name":"_addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":2984},{"stateMutability":"nonpayable","type":"function","name":"checkpoint","inputs":[],"outputs":[],"gas":37379957},{"stateMutability":"nonpayable","type":"function","name":"deposit_for","inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[],"gas":37566028},{"stateMutability":"nonpayable","type":"function","name":"create_lock","inputs":[{"name":"_value","type":"uint256"},{"name":"_unlock_time","type":"uint256"}],"outputs":[],"gas":37567454},{"stateMutability":"nonpayable","type":"function","name":"increase_amount","inputs":[{"name":"_value","type":"uint256"}],"outputs":[],"gas":37566827},{"stateMutability":"nonpayable","type":"function","name":"increase_unlock_time","inputs":[{"name":"_unlock_time","type":"uint256"}],"outputs":[],"gas":37567549},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[],"outputs":[],"gas":37559313},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":12776},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"},{"name":"_t","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":12776},{"stateMutability":"view","type":"function","name":"balanceOfAt","inputs":[{"name":"addr","type":"address"},{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":836014},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":941448},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[{"name":"t","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":941448},{"stateMutability":"view","type":"function","name":"totalSupplyAt","inputs":[{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":1345764},{"stateMutability":"nonpayable","type":"function","name":"changeController","inputs":[{"name":"_newController","type":"address"}],"outputs":[],"gas":38152},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3066},{"stateMutability":"view","type":"function","name":"supply","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3096},{"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":5561},{"stateMutability":"view","type":"function","name":"epoch","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3156},{"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":9630},{"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":9932},{"stateMutability":"view","type":"function","name":"user_point_epoch","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3518},{"stateMutability":"view","type":"function","name":"slope_changes","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"int128"}],"gas":3391},{"stateMutability":"view","type":"function","name":"controller","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3306},{"stateMutability":"view","type":"function","name":"transfersEnabled","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3336},{"stateMutability":"view","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":13733},{"stateMutability":"view","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":11486},{"stateMutability":"view","type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":11516},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3456},{"stateMutability":"view","type":"function","name":"future_smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3486},{"stateMutability":"view","type":"function","name":"smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3516},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3546},{"stateMutability":"view","type":"function","name":"future_admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3576}]

6f7fffffffffffffffffffffffffffffff604052602061277360c03960c0518060a01c61276e5780905061014052602060206127730160c03960c05161277301604060208260c03960c0511161276e578060208160c03960c051602001808261016039505050602060406127730160c03960c05161277301602060208260c03960c0511161276e578060208160c03960c05160200180826101c039505050602060606127730160c03960c05161277301602060208260c03960c0511161276e578060208160c03960c051602001808261020039505050336c050c783eb9b5c8400000000018556101405160055543600c5542600b55336c050c783eb9b5c840000000000c5560016c050c783eb9b5c840000000000d5563313ce567610260526020610260600461027c610140515afa1561276e57601f3d111561276e57610260516102405260ff610240511161276e57610240516c050c783eb9b5c840000000001555610160806c050c783eb9b5c840000000000e602082510161012060006003818352015b82610120516020021115610198576101b9565b61012051602002850151610120518501558151600101808352811415610185575b5050505050506101c0806c050c783eb9b5c8400000000011602082510161012060006002818352015b826101205160200211156101f557610216565b610120516020028501516101205185015581516001018083528114156101e2575b505050505050610200806c050c783eb9b5c8400000000013602082510161012060006002818352015b8261012051602002111561025257610273565b6101205160200285015161012051850155815160010180835281141561023f575b50505050505061275656600436101561000d5761189c565b60046000601c376f7fffffffffffffffffffffffffffffff604052600051346124d357636b441a408114156100a8576004358060a01c6124d357809050610140526c050c783eb9b5c8400000000018543314156124d357610140516c050c783eb9b5c8400000000019557f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e961014051610160526020610160a1005b636a1c05ae81141561012d576c050c783eb9b5c8400000000018543314156124d3576c050c783eb9b5c8400000000019546101405260006101405118156124d357610140516c050c783eb9b5c8400000000018557febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a118910561014051610160526020610160a1005b6357f901e2811415610176576004358060a01c6124d357809050610140526c050c783eb9b5c8400000000018543314156124d357610140516c050c783eb9b5c840000000001655005b638e5b490f8114156101b8576c050c783eb9b5c8400000000018543314156124d3576c050c783eb9b5c8400000000016546c050c783eb9b5c840000000001755005b637c74a174811415610238576004358060a01c6124d357809050610140526c050c783eb9b5c840000000000a6101405160e05260c052604060c02054610160526001600461016051633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c020010154610180526020610180f35b63da020a18811415610295576004358060a01c6124d3578090506101405260026004602435633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c020010154610160526020610160f35b63adc635898114156102d3576004358060a01c6124d35780905061014052600160076101405160e05260c052604060c0200154610160526020610160f35b63c2c4c5c18114156102fd57600061014052604036610160376040366101a0376102fb611979565b005b633a46273e811415610462576004358060a01c6124d3578090506106c0526000546124d357600160005560076106c05160e05260c052604060c02080546106e05260018101546107005250600060243511156124d35760006106e051136103a3576308c379a0610720526020610740526016610760527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006107805261076050606461073cfd5b426107005111610417576308c379a0610720526020610740526024610760527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610780527f64726177000000000000000000000000000000000000000000000000000000006107a05261076050608461073cfd5b6106c0516104e0526024356105005260006105205260076106c05160e05260c052604060c0208054610540526001810154610560525060006105805261045b6120c0565b6000600055005b6365fc387381141561063d576001546124d357600160015533610140526104876118a2565b60243562093a808082049050905062093a808082028215828483041417156124d357809050905090506106c05260073360e05260c052604060c02080546106e05260018101546107005250600060043511156124d3576106e0511561052b576308c379a0610720526020610740526019610760527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006107805261076050606461073cfd5b426106c0511161059f576308c379a0610720526020610740526026610760527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610780527f66757475726500000000000000000000000000000000000000000000000000006107a05261076050608461073cfd5b42630784ce0081818301106124d357808201905090506106c0511115610604576308c379a061072052602061074052601e610760527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006107805261076050606461073cfd5b336104e052600435610500526106c051610520526106e0516105405261070051610560526001610580526106366120c0565b6000600155005b634957677c811415610786576002546124d357600160025533610140526106626118a2565b60073360e05260c052604060c02080546106c05260018101546106e05250600060043511156124d35760006106c051136106db576308c379a0610700526020610720526016610740527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006107605261074050606461071cfd5b426106e0511161074f576308c379a0610700526020610720526024610740527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610760527f64726177000000000000000000000000000000000000000000000000000000006107805261074050608461071cfd5b336104e052600435610500526000610520526106c051610540526106e0516105605260026105805261077f6120c0565b6000600255005b63eff7a612811415610984576003546124d357600160035533610140526107ab6118a2565b60073360e05260c052604060c02080546106c05260018101546106e0525060043562093a808082049050905062093a808082028215828483041417156124d3578090509050905061070052426106e05111610845576308c379a061072052602061074052600c610760527f4c6f636b206578706972656400000000000000000000000000000000000000006107805261076050606461073cfd5b60006106c05113610895576308c379a0610720526020610740526011610760527f4e6f7468696e67206973206c6f636b65640000000000000000000000000000006107805261076050606461073cfd5b6106e05161070051116108e7576308c379a061072052602061074052601f610760527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006107805261076050606461073cfd5b42630784ce0081818301106124d3578082019050905061070051111561094c576308c379a061072052602061074052601e610760527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006107805261076050606461073cfd5b336104e05260006105005261070051610520526106c051610540526106e0516105605260036105805261097d6120c0565b6000600355005b633ccfd60b811415610b64576004546124d357600160045560073360e05260c052604060c02080546104e0526001810154610500525061050051421015610a0a576308c379a0610520526020610540526016610560527f546865206c6f636b206469646e277420657870697265000000000000000000006105805261056050606461053cfd5b6104e051600081126124d357610520526104e05161054052610500516105605260006105005260006104e05260073360e05260c052604060c0206104e0518155610500516001820155506006546105805261058051610520518082106124d357808203905090506006553361014052610540516101605261056051610180526104e0516101a052610500516101c052610aa1611979565b63a9059cbb6105a052336105c052610520516105e05260206105a060446105bc60006005545af1156124d357601f3d11156124d3576105a051156124d357337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568610520516105a052426105c05260406105a0a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c610580516105a05261058051610520518082106124d357808203905090506105c05260406105a0a16000600455005b6370a08231811415610b7a574261016052610b8d565b62fdd58e811415610cbb57602435610160525b6004358060a01c6124d357809050610140526c050c783eb9b5c840000000000a6101405160e05260c052604060c020546101805261018051610bdd5760006101a05260206101a0610cb956610cb8565b600461018051633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c0200180546101a05260018101546101c05260028101546101e052600381015461020052506101a080516101c051610160516101e0518082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d3578090509050905080820380607f1d8160801d14156124d3578090509050905081525060006101a0511215610c9e5760006101a0525b6101a051600081126124d357610220526020610220610cb9565b5bf35b634ee2cd7e811415611066576004358060a01c6124d3578090506102005243602435116124d3576000610220526c050c783eb9b5c840000000000a6102005160e05260c052604060c020546102405261026060006080818352015b610240516102205110610d2857610dd2565b610220516102405181818301106124d35780820190509050600181818301106124d35780820190509050600280820490509050610280526024356003600461028051633b9aca008110156124d357026c050c783eb9b5c84000000000096102005160e05260c052604060c02001015411610da9576102805161022052610dc2565b6102805160018082106124d35780820390509050610240525b8151600101808352811415610d16575b5050600461022051633b9aca008110156124d357026c050c783eb9b5c84000000000096102005160e05260c052604060c0200180546102605260018101546102805260028101546102a05260038101546102c052506008546102e052602435610140526102e05161016052610e48610320612279565b61032051610300526004610300516c01431e0fae6d7217caa00000008110156124d35702600901805461032052600181015461034052600281015461036052600381015461038052506040366103a0376102e051610300511015610f3257600461030051600181818301106124d357808201905090506c01431e0fae6d7217caa00000008110156124d3570260090180546103e0526001810154610400526002810154610420526003810154610440525061044051610380518082106124d357808203905090506103a05261042051610360518082106124d357808203905090506103c052610f61565b43610380518082106124d357808203905090506103a05242610360518082106124d357808203905090506103c0525b610360516103e05260006103a0511815610fcf576103e080516103c051602435610380518082106124d357808203905090508082028215828483041417156124d357809050905090506103a0518080156124d35782049050905081818301106124d357808201905090508152505b6102608051610280516103e0516102a0518082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d3578090509050905080820380607f1d8160801d14156124d35780905090509050815250600061026051126110535761026051600081126124d35761040052602061040061106456611063565b6000610400526020610400611064565b5bf35b6318160ddd81141561107c57426102c052611090565b63bd85b03981141561111a576004356102c0525b6008546102e05260046102e0516c01431e0fae6d7217caa00000008110156124d3570260090180546103005260018101546103205260028101546103405260038101546103605250610300516101405261032051610160526103405161018052610360516101a0526102c0516101c05261110b610380612349565b610380516103a05260206103a0f35b63981b24d08114156113435743600435116124d3576008546102c052600435610140526102c05161016052611150610300612279565b610300516102e05260046102e0516c01431e0fae6d7217caa00000008110156124d35702600901805461030052600181015461032052600281015461034052600381015461036052506000610380526102c0516102e051101561127d5760046102e051600181818301106124d357808201905090506c01431e0fae6d7217caa00000008110156124d3570260090180546103a05260018101546103c05260028101546103e052600381015461040052506104005161036051181561127857600435610360518082106124d357808203905090506103e051610340518082106124d357808203905090508082028215828483041417156124d3578090509050905061040051610360518082106124d357808203905090508080156124d357820490509050610380525b6112ed565b436103605118156112ec57600435610360518082106124d3578082039050905042610340518082106124d357808203905090508082028215828483041417156124d3578090509050905043610360518082106124d357808203905090508080156124d357820490509050610380525b5b610300516101405261032051610160526103405161018052610360516101a052610340516103805181818301106124d357808201905090506101c0526113346103a0612349565b6103a0516103c05260206103c0f35b633cebb82381141561138c576004358060a01c6124d357809050610140526c050c783eb9b5c840000000000c543314156124d357610140516c050c783eb9b5c840000000000c55005b63fc0c546a8114156113a657600554610140526020610140f35b63047fc9aa8114156113c057600654610140526020610140f35b63cbf9fe5f811415611406576004358060a01c6124d3578090506101405260076101405160e05260c052604060c020805461016052600181015461018052506040610160f35b63900cf0cf81141561142057600854610140526020610140f35b63d1febfb98114156114735760046004356c01431e0fae6d7217caa00000008110156124d3570260090180546101405260018101546101605260028101546101805260038101546101a052506080610140f35b6328d09d478114156114ea576004358060a01c6124d357809050610140526004602435633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c0200180546101605260018101546101805260028101546101a05260038101546101c052506080610160f35b63010ae757811415611531576004358060a01c6124d357809050610140526c050c783eb9b5c840000000000a6101405160e05260c052604060c02054610160526020610160f35b6371197484811415611565576c050c783eb9b5c840000000000b60043560e05260c052604060c02054610140526020610140f35b63f77c479181141561158b576c050c783eb9b5c840000000000c54610140526020610140f35b63bef97c878114156115b1576c050c783eb9b5c840000000000d54610140526020610140f35b6306fdde0381141561166a57610140806020808252808301806c050c783eb9b5c840000000000e8082602082540161012060006003818352015b826101205160200211156115fe5761161f565b610120518501546101205160200285015281516001018083528114156115eb575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905080905090509050610140f35b6395d89b4181141561172357610140806020808252808301806c050c783eb9b5c84000000000118082602082540161012060006002818352015b826101205160200211156116b7576116d8565b610120518501546101205160200285015281516001018083528114156116a4575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905080905090509050610140f35b6354fd4d508114156117dc57610140806020808252808301806c050c783eb9b5c84000000000138082602082540161012060006002818352015b8261012051602002111561177057611791565b6101205185015461012051602002850152815160010180835281141561175d575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905080905090509050610140f35b63313ce567811415611802576c050c783eb9b5c840000000001554610140526020610140f35b638ff36fd1811415611828576c050c783eb9b5c840000000001654610140526020610140f35b637175d4f781141561184e576c050c783eb9b5c840000000001754610140526020610140f35b63f851a440811415611874576c050c783eb9b5c840000000001854610140526020610140f35b6317f7182a81141561189a576c050c783eb9b5c840000000001954610140526020610140f35b505b60006000fd5b32610140511815611976576c050c783eb9b5c84000000000175461016052600061016051181561190c5763c23697a861018052610140516101a0526020610180602461019c6000610160515af1156124d357601f3d11156124d357610180511561190b57611977565b5b6308c379a06101805260206101a05260256101c0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c6101e0527f6c6f776564000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b5b565b610140366101e037600854610320526000610140511815611b0457426101805111156119ab57600061016051136119ae565b60005b15611a155761016051630784ce0080820580607f1d8160801d14156124d35780905090509050610200526102005161018051428082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d357809050905090506101e0525b426101c0511115611a2c5760006101a05113611a2f565b60005b15611a96576101a051630784ce0080820580607f1d8160801d14156124d3578090509050905061028052610280516101c051428082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d35780905090509050610260525b6c050c783eb9b5c840000000000b6101805160e05260c052604060c020546102e05260006101c0511815611b0357610180516101c0511415611adf576102e05161030052611b02565b6c050c783eb9b5c840000000000b6101c05160e05260c052604060c02054610300525b5b5b604036610340374261038052436103a0526000610320511115611b63576004610320516c01431e0fae6d7217caa00000008110156124d3570260090180546103405260018101546103605260028101546103805260038101546103a052505b610380516103c052610340516103e052610360516104005261038051610420526103a0516104405260006104605261038051421115611bf457670de0b6b3a7640000436103a0518082106124d357808203905090508082028215828483041417156124d3578090509050905042610380518082106124d357808203905090508080156124d357820490509050610460525b6103c05162093a808082049050905062093a808082028215828483041417156124d35780905090509050610480526104a0600060ff818352015b610480805162093a8081818301106124d3578082019050905081525060006104c05242610480511115611c65574261048052611c88565b6c050c783eb9b5c840000000000b6104805160e05260c052604060c020546104c0525b610340805161036051610480516103c0518082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d3578090509050905080820380607f1d8160801d14156124d3578090509050905081525061036080516104c05180820180607f1d8160801d14156124d357809050905090508152506000610340511215611d1a576000610340525b6000610360511215611d2d576000610360525b610480516103c0526104805161038052610440516104605161048051610420518082106124d357808203905090508082028215828483041417156124d35780905090509050670de0b6b3a76400008082049050905081818301106124d357808201905090506103a0526103208051600181818301106124d3578082019050905081525042610480511415611dc957436103a052611e1b56611e0b565b6004610320516c01431e0fae6d7217caa00000008110156124d357026009016103405181556103605160018201556103805160028201556103a0516003820155505b8151600101808352811415611c2e575b5050610320516008556000610140511815611ed7576103608051610280516102005180820380607f1d8160801d14156124d3578090509050905080820180607f1d8160801d14156124d357809050905090508152506103408051610260516101e05180820380607f1d8160801d14156124d3578090509050905080820180607f1d8160801d14156124d357809050905090508152506000610360511215611ec3576000610360525b6000610340511215611ed6576000610340525b5b6004610320516c01431e0fae6d7217caa00000008110156124d357026009016103405181556103605160018201556103805160028201556103a05160038201555060006101405118156120be5742610180511115611fa9576102e080516102005180820180607f1d8160801d14156124d35780905090509050815250610180516101c0511415611f86576102e080516102805180820380607f1d8160801d14156124d357809050905090508152505b6102e0516c050c783eb9b5c840000000000b6101805160e05260c052604060c020555b426101c051111561200a57610180516101c05111156120095761030080516102805180820380607f1d8160801d14156124d35780905090509050815250610300516c050c783eb9b5c840000000000b6101c05160e05260c052604060c020555b5b6c050c783eb9b5c840000000000a6101405160e05260c052604060c02054600181818301106124d357808201905090506104a0526104a0516c050c783eb9b5c840000000000a6101405160e05260c052604060c02055426102a052436102c05260046104a051633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c020016102605181556102805160018201556102a05160028201556102c0516003820155505b565b610540516105a052610560516105c0526006546105e0526105e0516105005181818301106124d357808201905090506006556105a051610600526105c051610620526105a080516105005160405181116124d35780820180607f1d8160801d14156124d35780905090509050815250600061052051181561214457610520516105c0525b60076104e05160e05260c052604060c0206105a05181556105c0516001820155506104e05161014052610600516101605261062051610180526105a0516101a0526105c0516101c052612195611979565b60006105005118156121e8576323b872dd610640526104e051610660523061068052610500516106a0526020610640606461065c60006005545af1156124d357601f3d11156124d35761064051156124d3575b6105c0516104e0517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596105005161064052610580516106605242610680526060610640a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105e051610640526105e0516105005181818301106124d35780820190509050610660526040610640a1565b600061018052610160516101a0526101c060006080818352015b6101a05161018051106122a55761233e565b610180516101a05181818301106124d35780820190509050600181818301106124d357808201905090506002808204905090506101e05261014051600360046101e0516c01431e0fae6d7217caa00000008110156124d35702600901015411612315576101e0516101805261232e565b6101e05160018082106124d357808203905090506101a0525b8151600101808352811415612293575b505061018051815250565b610140516101e052610160516102005261018051610220526101a051610240526102205162093a808082049050905062093a808082028215828483041417156124d3578090509050905061026052610280600060ff818352015b610260805162093a8081818301106124d3578082019050905081525060006102a0526101c0516102605111156123e0576101c05161026052612403565b6c050c783eb9b5c840000000000b6102605160e05260c052604060c020546102a0525b6101e080516102005161026051610220518082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d3578090509050905080820380607f1d8160801d14156124d357809050905090508152506101c051610260511415612471576124ad565b61020080516102a05180820180607f1d8160801d14156124d35780905090509050815250610260516102205281516001018083528114156123a3575b505060006101e05112156124c25760006101e0525b6101e051600081126124d357815250565b600080fd5b61027e6127560361027e60003961027e612756036000f35b600080fd00000000000000000000000020d4db1946859e2adb0e5acc2eac58047ad41395000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000124d6f6f6e44414f5374616b65546f566f746500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007764d4f4f4e45590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x600436101561000d5761189c565b60046000601c376f7fffffffffffffffffffffffffffffff604052600051346124d357636b441a408114156100a8576004358060a01c6124d357809050610140526c050c783eb9b5c8400000000018543314156124d357610140516c050c783eb9b5c8400000000019557f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e961014051610160526020610160a1005b636a1c05ae81141561012d576c050c783eb9b5c8400000000018543314156124d3576c050c783eb9b5c8400000000019546101405260006101405118156124d357610140516c050c783eb9b5c8400000000018557febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a118910561014051610160526020610160a1005b6357f901e2811415610176576004358060a01c6124d357809050610140526c050c783eb9b5c8400000000018543314156124d357610140516c050c783eb9b5c840000000001655005b638e5b490f8114156101b8576c050c783eb9b5c8400000000018543314156124d3576c050c783eb9b5c8400000000016546c050c783eb9b5c840000000001755005b637c74a174811415610238576004358060a01c6124d357809050610140526c050c783eb9b5c840000000000a6101405160e05260c052604060c02054610160526001600461016051633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c020010154610180526020610180f35b63da020a18811415610295576004358060a01c6124d3578090506101405260026004602435633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c020010154610160526020610160f35b63adc635898114156102d3576004358060a01c6124d35780905061014052600160076101405160e05260c052604060c0200154610160526020610160f35b63c2c4c5c18114156102fd57600061014052604036610160376040366101a0376102fb611979565b005b633a46273e811415610462576004358060a01c6124d3578090506106c0526000546124d357600160005560076106c05160e05260c052604060c02080546106e05260018101546107005250600060243511156124d35760006106e051136103a3576308c379a0610720526020610740526016610760527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006107805261076050606461073cfd5b426107005111610417576308c379a0610720526020610740526024610760527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610780527f64726177000000000000000000000000000000000000000000000000000000006107a05261076050608461073cfd5b6106c0516104e0526024356105005260006105205260076106c05160e05260c052604060c0208054610540526001810154610560525060006105805261045b6120c0565b6000600055005b6365fc387381141561063d576001546124d357600160015533610140526104876118a2565b60243562093a808082049050905062093a808082028215828483041417156124d357809050905090506106c05260073360e05260c052604060c02080546106e05260018101546107005250600060043511156124d3576106e0511561052b576308c379a0610720526020610740526019610760527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006107805261076050606461073cfd5b426106c0511161059f576308c379a0610720526020610740526026610760527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610780527f66757475726500000000000000000000000000000000000000000000000000006107a05261076050608461073cfd5b42630784ce0081818301106124d357808201905090506106c0511115610604576308c379a061072052602061074052601e610760527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006107805261076050606461073cfd5b336104e052600435610500526106c051610520526106e0516105405261070051610560526001610580526106366120c0565b6000600155005b634957677c811415610786576002546124d357600160025533610140526106626118a2565b60073360e05260c052604060c02080546106c05260018101546106e05250600060043511156124d35760006106c051136106db576308c379a0610700526020610720526016610740527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006107605261074050606461071cfd5b426106e0511161074f576308c379a0610700526020610720526024610740527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610760527f64726177000000000000000000000000000000000000000000000000000000006107805261074050608461071cfd5b336104e052600435610500526000610520526106c051610540526106e0516105605260026105805261077f6120c0565b6000600255005b63eff7a612811415610984576003546124d357600160035533610140526107ab6118a2565b60073360e05260c052604060c02080546106c05260018101546106e0525060043562093a808082049050905062093a808082028215828483041417156124d3578090509050905061070052426106e05111610845576308c379a061072052602061074052600c610760527f4c6f636b206578706972656400000000000000000000000000000000000000006107805261076050606461073cfd5b60006106c05113610895576308c379a0610720526020610740526011610760527f4e6f7468696e67206973206c6f636b65640000000000000000000000000000006107805261076050606461073cfd5b6106e05161070051116108e7576308c379a061072052602061074052601f610760527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006107805261076050606461073cfd5b42630784ce0081818301106124d3578082019050905061070051111561094c576308c379a061072052602061074052601e610760527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006107805261076050606461073cfd5b336104e05260006105005261070051610520526106c051610540526106e0516105605260036105805261097d6120c0565b6000600355005b633ccfd60b811415610b64576004546124d357600160045560073360e05260c052604060c02080546104e0526001810154610500525061050051421015610a0a576308c379a0610520526020610540526016610560527f546865206c6f636b206469646e277420657870697265000000000000000000006105805261056050606461053cfd5b6104e051600081126124d357610520526104e05161054052610500516105605260006105005260006104e05260073360e05260c052604060c0206104e0518155610500516001820155506006546105805261058051610520518082106124d357808203905090506006553361014052610540516101605261056051610180526104e0516101a052610500516101c052610aa1611979565b63a9059cbb6105a052336105c052610520516105e05260206105a060446105bc60006005545af1156124d357601f3d11156124d3576105a051156124d357337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568610520516105a052426105c05260406105a0a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c610580516105a05261058051610520518082106124d357808203905090506105c05260406105a0a16000600455005b6370a08231811415610b7a574261016052610b8d565b62fdd58e811415610cbb57602435610160525b6004358060a01c6124d357809050610140526c050c783eb9b5c840000000000a6101405160e05260c052604060c020546101805261018051610bdd5760006101a05260206101a0610cb956610cb8565b600461018051633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c0200180546101a05260018101546101c05260028101546101e052600381015461020052506101a080516101c051610160516101e0518082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d3578090509050905080820380607f1d8160801d14156124d3578090509050905081525060006101a0511215610c9e5760006101a0525b6101a051600081126124d357610220526020610220610cb9565b5bf35b634ee2cd7e811415611066576004358060a01c6124d3578090506102005243602435116124d3576000610220526c050c783eb9b5c840000000000a6102005160e05260c052604060c020546102405261026060006080818352015b610240516102205110610d2857610dd2565b610220516102405181818301106124d35780820190509050600181818301106124d35780820190509050600280820490509050610280526024356003600461028051633b9aca008110156124d357026c050c783eb9b5c84000000000096102005160e05260c052604060c02001015411610da9576102805161022052610dc2565b6102805160018082106124d35780820390509050610240525b8151600101808352811415610d16575b5050600461022051633b9aca008110156124d357026c050c783eb9b5c84000000000096102005160e05260c052604060c0200180546102605260018101546102805260028101546102a05260038101546102c052506008546102e052602435610140526102e05161016052610e48610320612279565b61032051610300526004610300516c01431e0fae6d7217caa00000008110156124d35702600901805461032052600181015461034052600281015461036052600381015461038052506040366103a0376102e051610300511015610f3257600461030051600181818301106124d357808201905090506c01431e0fae6d7217caa00000008110156124d3570260090180546103e0526001810154610400526002810154610420526003810154610440525061044051610380518082106124d357808203905090506103a05261042051610360518082106124d357808203905090506103c052610f61565b43610380518082106124d357808203905090506103a05242610360518082106124d357808203905090506103c0525b610360516103e05260006103a0511815610fcf576103e080516103c051602435610380518082106124d357808203905090508082028215828483041417156124d357809050905090506103a0518080156124d35782049050905081818301106124d357808201905090508152505b6102608051610280516103e0516102a0518082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d3578090509050905080820380607f1d8160801d14156124d35780905090509050815250600061026051126110535761026051600081126124d35761040052602061040061106456611063565b6000610400526020610400611064565b5bf35b6318160ddd81141561107c57426102c052611090565b63bd85b03981141561111a576004356102c0525b6008546102e05260046102e0516c01431e0fae6d7217caa00000008110156124d3570260090180546103005260018101546103205260028101546103405260038101546103605250610300516101405261032051610160526103405161018052610360516101a0526102c0516101c05261110b610380612349565b610380516103a05260206103a0f35b63981b24d08114156113435743600435116124d3576008546102c052600435610140526102c05161016052611150610300612279565b610300516102e05260046102e0516c01431e0fae6d7217caa00000008110156124d35702600901805461030052600181015461032052600281015461034052600381015461036052506000610380526102c0516102e051101561127d5760046102e051600181818301106124d357808201905090506c01431e0fae6d7217caa00000008110156124d3570260090180546103a05260018101546103c05260028101546103e052600381015461040052506104005161036051181561127857600435610360518082106124d357808203905090506103e051610340518082106124d357808203905090508082028215828483041417156124d3578090509050905061040051610360518082106124d357808203905090508080156124d357820490509050610380525b6112ed565b436103605118156112ec57600435610360518082106124d3578082039050905042610340518082106124d357808203905090508082028215828483041417156124d3578090509050905043610360518082106124d357808203905090508080156124d357820490509050610380525b5b610300516101405261032051610160526103405161018052610360516101a052610340516103805181818301106124d357808201905090506101c0526113346103a0612349565b6103a0516103c05260206103c0f35b633cebb82381141561138c576004358060a01c6124d357809050610140526c050c783eb9b5c840000000000c543314156124d357610140516c050c783eb9b5c840000000000c55005b63fc0c546a8114156113a657600554610140526020610140f35b63047fc9aa8114156113c057600654610140526020610140f35b63cbf9fe5f811415611406576004358060a01c6124d3578090506101405260076101405160e05260c052604060c020805461016052600181015461018052506040610160f35b63900cf0cf81141561142057600854610140526020610140f35b63d1febfb98114156114735760046004356c01431e0fae6d7217caa00000008110156124d3570260090180546101405260018101546101605260028101546101805260038101546101a052506080610140f35b6328d09d478114156114ea576004358060a01c6124d357809050610140526004602435633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c0200180546101605260018101546101805260028101546101a05260038101546101c052506080610160f35b63010ae757811415611531576004358060a01c6124d357809050610140526c050c783eb9b5c840000000000a6101405160e05260c052604060c02054610160526020610160f35b6371197484811415611565576c050c783eb9b5c840000000000b60043560e05260c052604060c02054610140526020610140f35b63f77c479181141561158b576c050c783eb9b5c840000000000c54610140526020610140f35b63bef97c878114156115b1576c050c783eb9b5c840000000000d54610140526020610140f35b6306fdde0381141561166a57610140806020808252808301806c050c783eb9b5c840000000000e8082602082540161012060006003818352015b826101205160200211156115fe5761161f565b610120518501546101205160200285015281516001018083528114156115eb575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905080905090509050610140f35b6395d89b4181141561172357610140806020808252808301806c050c783eb9b5c84000000000118082602082540161012060006002818352015b826101205160200211156116b7576116d8565b610120518501546101205160200285015281516001018083528114156116a4575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905080905090509050610140f35b6354fd4d508114156117dc57610140806020808252808301806c050c783eb9b5c84000000000138082602082540161012060006002818352015b8261012051602002111561177057611791565b6101205185015461012051602002850152815160010180835281141561175d575b5050505050508051806020830101818260206001820306601f8201039050033682375050805160200160206001820306601f8201039050905090508101905080905090509050610140f35b63313ce567811415611802576c050c783eb9b5c840000000001554610140526020610140f35b638ff36fd1811415611828576c050c783eb9b5c840000000001654610140526020610140f35b637175d4f781141561184e576c050c783eb9b5c840000000001754610140526020610140f35b63f851a440811415611874576c050c783eb9b5c840000000001854610140526020610140f35b6317f7182a81141561189a576c050c783eb9b5c840000000001954610140526020610140f35b505b60006000fd5b32610140511815611976576c050c783eb9b5c84000000000175461016052600061016051181561190c5763c23697a861018052610140516101a0526020610180602461019c6000610160515af1156124d357601f3d11156124d357610180511561190b57611977565b5b6308c379a06101805260206101a05260256101c0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c6101e0527f6c6f776564000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b5b565b610140366101e037600854610320526000610140511815611b0457426101805111156119ab57600061016051136119ae565b60005b15611a155761016051630784ce0080820580607f1d8160801d14156124d35780905090509050610200526102005161018051428082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d357809050905090506101e0525b426101c0511115611a2c5760006101a05113611a2f565b60005b15611a96576101a051630784ce0080820580607f1d8160801d14156124d3578090509050905061028052610280516101c051428082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d35780905090509050610260525b6c050c783eb9b5c840000000000b6101805160e05260c052604060c020546102e05260006101c0511815611b0357610180516101c0511415611adf576102e05161030052611b02565b6c050c783eb9b5c840000000000b6101c05160e05260c052604060c02054610300525b5b5b604036610340374261038052436103a0526000610320511115611b63576004610320516c01431e0fae6d7217caa00000008110156124d3570260090180546103405260018101546103605260028101546103805260038101546103a052505b610380516103c052610340516103e052610360516104005261038051610420526103a0516104405260006104605261038051421115611bf457670de0b6b3a7640000436103a0518082106124d357808203905090508082028215828483041417156124d3578090509050905042610380518082106124d357808203905090508080156124d357820490509050610460525b6103c05162093a808082049050905062093a808082028215828483041417156124d35780905090509050610480526104a0600060ff818352015b610480805162093a8081818301106124d3578082019050905081525060006104c05242610480511115611c65574261048052611c88565b6c050c783eb9b5c840000000000b6104805160e05260c052604060c020546104c0525b610340805161036051610480516103c0518082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d3578090509050905080820380607f1d8160801d14156124d3578090509050905081525061036080516104c05180820180607f1d8160801d14156124d357809050905090508152506000610340511215611d1a576000610340525b6000610360511215611d2d576000610360525b610480516103c0526104805161038052610440516104605161048051610420518082106124d357808203905090508082028215828483041417156124d35780905090509050670de0b6b3a76400008082049050905081818301106124d357808201905090506103a0526103208051600181818301106124d3578082019050905081525042610480511415611dc957436103a052611e1b56611e0b565b6004610320516c01431e0fae6d7217caa00000008110156124d357026009016103405181556103605160018201556103805160028201556103a0516003820155505b8151600101808352811415611c2e575b5050610320516008556000610140511815611ed7576103608051610280516102005180820380607f1d8160801d14156124d3578090509050905080820180607f1d8160801d14156124d357809050905090508152506103408051610260516101e05180820380607f1d8160801d14156124d3578090509050905080820180607f1d8160801d14156124d357809050905090508152506000610360511215611ec3576000610360525b6000610340511215611ed6576000610340525b5b6004610320516c01431e0fae6d7217caa00000008110156124d357026009016103405181556103605160018201556103805160028201556103a05160038201555060006101405118156120be5742610180511115611fa9576102e080516102005180820180607f1d8160801d14156124d35780905090509050815250610180516101c0511415611f86576102e080516102805180820380607f1d8160801d14156124d357809050905090508152505b6102e0516c050c783eb9b5c840000000000b6101805160e05260c052604060c020555b426101c051111561200a57610180516101c05111156120095761030080516102805180820380607f1d8160801d14156124d35780905090509050815250610300516c050c783eb9b5c840000000000b6101c05160e05260c052604060c020555b5b6c050c783eb9b5c840000000000a6101405160e05260c052604060c02054600181818301106124d357808201905090506104a0526104a0516c050c783eb9b5c840000000000a6101405160e05260c052604060c02055426102a052436102c05260046104a051633b9aca008110156124d357026c050c783eb9b5c84000000000096101405160e05260c052604060c020016102605181556102805160018201556102a05160028201556102c0516003820155505b565b610540516105a052610560516105c0526006546105e0526105e0516105005181818301106124d357808201905090506006556105a051610600526105c051610620526105a080516105005160405181116124d35780820180607f1d8160801d14156124d35780905090509050815250600061052051181561214457610520516105c0525b60076104e05160e05260c052604060c0206105a05181556105c0516001820155506104e05161014052610600516101605261062051610180526105a0516101a0526105c0516101c052612195611979565b60006105005118156121e8576323b872dd610640526104e051610660523061068052610500516106a0526020610640606461065c60006005545af1156124d357601f3d11156124d35761064051156124d3575b6105c0516104e0517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d596105005161064052610580516106605242610680526060610640a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6105e051610640526105e0516105005181818301106124d35780820190509050610660526040610640a1565b600061018052610160516101a0526101c060006080818352015b6101a05161018051106122a55761233e565b610180516101a05181818301106124d35780820190509050600181818301106124d357808201905090506002808204905090506101e05261014051600360046101e0516c01431e0fae6d7217caa00000008110156124d35702600901015411612315576101e0516101805261232e565b6101e05160018082106124d357808203905090506101a0525b8151600101808352811415612293575b505061018051815250565b610140516101e052610160516102005261018051610220526101a051610240526102205162093a808082049050905062093a808082028215828483041417156124d3578090509050905061026052610280600060ff818352015b610260805162093a8081818301106124d3578082019050905081525060006102a0526101c0516102605111156123e0576101c05161026052612403565b6c050c783eb9b5c840000000000b6102605160e05260c052604060c020546102a0525b6101e080516102005161026051610220518082106124d3578082039050905060405181116124d35780820280607f1d8160801d14156124d3578090509050905080820380607f1d8160801d14156124d357809050905090508152506101c051610260511415612471576124ad565b61020080516102a05180820180607f1d8160801d14156124d35780905090509050815250610260516102205281516001018083528114156123a3575b505060006101e05112156124c25760006101e0525b6101e051600081126124d357815250565b600080fd

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000020d4db1946859e2adb0e5acc2eac58047ad41395000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000124d6f6f6e44414f5374616b65546f566f746500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007764d4f4f4e45590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000013100000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : token_addr (address): 0x20d4DB1946859E2Adb0e5ACC2eac58047aD41395
Arg [1] : _name (string): MoonDAOStakeToVote
Arg [2] : _symbol (string): vMOONEY
Arg [3] : _version (string): 1

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000020d4db1946859e2adb0e5acc2eac58047ad41395
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 4d6f6f6e44414f5374616b65546f566f74650000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 764d4f4f4e455900000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 3100000000000000000000000000000000000000000000000000000000000000


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.