Contract 0xBa57440fA35Fdb671E58F6F56c1A4447aB1f6C2B 4

 

Contract Overview

Hundred Finance: veHND
Balance:
0 ETH

ETH Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x09aad703a5502083d3a57a0f93e83275f186f57cf0b633a9dae2bf593fb8b336Increase_amount124361232022-05-19 0:18:437 days 14 hrs ago0xb46693883abc08863aca9cc141c23661744b945b IN  Hundred Finance: veHND0 ETH0.000340730597 ETH
0x5ca20d6540ecadd3a5fe975747787024a70a716bc463a9cc9fe66a0985cbb7b6Increase_amount124042232022-05-18 13:58:398 days 22 mins ago0xb46693883abc08863aca9cc141c23661744b945b IN  Hundred Finance: veHND0 ETH0.000242452379 ETH
0xaa256925591bf2ffc367acba9a7daec31a0635562235db815f8ebb182f0c073eIncrease_unlock_...123427232022-05-17 20:14:028 days 18 hrs ago0xcac59f91e4536bc0e79ab816a5cd54e89f10433c IN  Hundred Finance: veHND0 ETH0.000258761282 ETH
0xd63ec00520cabb91c3eb37dd24d441f2854e1080d83cefd6f475b0f568817c77Increase_amount123219772022-05-17 14:28:378 days 23 hrs ago0xc74ff56b8400ee7d68204854d3f6da536cf71a22 IN  Hundred Finance: veHND0 ETH0.000218494233 ETH
0x9edd5ba967381777daa4e5a7c24f1afb8c07d08f551ec0a2d69de24580ec77efCreate_lock122523612022-05-16 19:28:509 days 18 hrs ago0x90d600c1f743676c5eb677f064a44b15591770a5 IN  Hundred Finance: veHND0 ETH0.000328371426 ETH
0x771a6020335fb7c9a801c168f76bf91b85ed0fa434ee06aef3018404366d0f65Withdraw117849732022-05-11 10:38:2515 days 3 hrs ago0x8b1ca84c014c8483a3a38ff9d696a5a4bf53d964 IN  Hundred Finance: veHND0 ETH0.000407726808 ETH
0xe22fcac079afd3d35bc9f9564f240786e72a3946018af7e0d7c80ff9a87d712cWithdraw116943632022-05-10 11:35:2916 days 2 hrs ago0xe3361d7c12e752c1418fba76382c60b81357b809 IN  Hundred Finance: veHND0 ETH0.000676542584 ETH
0x5cdf6fc93558099cb937ea2951ee3ed20d77863b44ca66d03fa5df95363786d8Create_lock111333932022-05-03 23:36:2722 days 14 hrs ago0xb87ed741edcdeb0db4c1f4fbb663b8f3345a4cf6 IN  Hundred Finance: veHND0 ETH0.000601488189 ETH
0x4a9d51cfacb20f0c8eb9d5b11a80bd85551ba4c7b3e247fff60396f061c56981Increase_amount110691072022-05-03 1:53:5023 days 12 hrs ago0x25ed50054438a7ae7fe99bbe8c74f33f5f73df42 IN  Hundred Finance: veHND0 ETH0.000665000618 ETH
0x1ed14152ca3e224b40b059cec395dfb0b660199775f57a14f126820f3bee8066Create_lock110523162022-05-02 18:52:3723 days 19 hrs ago0xf3f06352f0bdcef01566f92b18f9201dbd3bf367 IN  Hundred Finance: veHND0 ETH0.000785307441 ETH
0xc204b61ec2c1242ea3cfe5f7e7f3f70c641f45dfb5702a1afb4888e519f69d4fIncrease_amount110515002022-05-02 18:38:3223 days 19 hrs ago0xcac59f91e4536bc0e79ab816a5cd54e89f10433c IN  Hundred Finance: veHND0 ETH0.000626263621 ETH
0x24adad792a705105f3b286de0aefa8604e4c2d0aff83656d4e690239848e94f3Increase_amount109773912022-05-01 16:07:1724 days 22 hrs ago0xd00f34e5c731e028913fbd3b1f66ccf43371f9b1 IN  Hundred Finance: veHND0 ETH0.001267657912 ETH
0xda62e0c5a6b8476c480cfb63ae9abf60a7c25ac6e2e2c4d915e38a3c2cbe00daIncrease_amount109738352022-05-01 14:41:4224 days 23 hrs ago0x1ef8019a1793ef3283742d7aa975b9a66133a2d0 IN  Hundred Finance: veHND0 ETH0.00131035556 ETH
0x9513dde20af70b2e8e41ffefc470362d0141245ed4b82689b15d830981be5160Increase_amount109550542022-05-01 5:18:1725 days 9 hrs ago0xd00f34e5c731e028913fbd3b1f66ccf43371f9b1 IN  Hundred Finance: veHND0 ETH0.001703432978 ETH
0x5fd048dada6d97b68d142c65bf3e4f5b00978df05a6d5fd751145944b3bf6380Increase_amount109335352022-04-30 20:47:1925 days 17 hrs ago0xb46693883abc08863aca9cc141c23661744b945b IN  Hundred Finance: veHND0 ETH0.000419091401 ETH
0xca8df8f9542c2e5995010073cbf1c0b2f789d5fe360a0cacb88f897306b9aa86Increase_unlock_...108973372022-04-30 10:40:5426 days 3 hrs ago0x6a018ad51de844243ce7fb743c3e5f4481df6858 IN  Hundred Finance: veHND0 ETH0.000388320167 ETH
0x78e7eb28f39e59b0d0fde3054a6b8d25f33f9d464d83b41de8bccc81f2540d9cIncrease_unlock_...108235032022-04-29 12:54:3827 days 1 hr ago0xcac59f91e4536bc0e79ab816a5cd54e89f10433c IN  Hundred Finance: veHND0 ETH0.000384731403 ETH
0xb11d5df881761b4f72c37110dd91cb65c09a6ea08cc72b1b8e1f08647535160cIncrease_amount108178562022-04-29 11:32:4427 days 2 hrs ago0xf948743fe1166b7a137c1aced5b9dca227254561 IN  Hundred Finance: veHND0 ETH0.000396301224 ETH
0xc14fccb9bb0ea4ae0a7aee64777e8b0150a0380dff286885ca998bb5772f6267Create_lock106964602022-04-28 0:23:4828 days 13 hrs ago0xae85dd2b44ccbd35e1c585d8359701ca52e29a3a IN  Hundred Finance: veHND0 ETH0.000649131018 ETH
0xa999261c35930977cba74850f56e188891e4bc78aa6a40135eabfa6ab4dbf788Increase_unlock_...105840362022-04-26 14:25:5229 days 23 hrs ago0xab8ae1155fc78779cd8e14fb91283865a5e21423 IN  Hundred Finance: veHND0 ETH0.00039081765 ETH
0xa3555568367a534a06a6db11fb9ea96937f717162d1c78279d3c6a6bc208520eIncrease_amount105759172022-04-26 11:33:5330 days 2 hrs ago0xb46693883abc08863aca9cc141c23661744b945b IN  Hundred Finance: veHND0 ETH0.000386694589 ETH
0xc3ebf9a37a31c2f5e1eaa1659b54c6a508fab534d89c21886219a33acc742cecIncrease_amount105575092022-04-26 3:03:5830 days 11 hrs ago0xf86520e8559ff8807ecfa5674f69f3725c25aa34 IN  Hundred Finance: veHND0 ETH0.000417333758 ETH
0xe14e9c754686a9dba8fd5dc28f93d84908bfcbcbb4f040aa31ee7a3c42384940Withdraw105393132022-04-25 18:57:2730 days 19 hrs ago0xbaa32387bd55553ec806622d524b12bbb8242a19 IN  Hundred Finance: veHND0 ETH0.000344043623 ETH
0x6e0b31ac9834c0928fac00424323231cdd4ab9640ae16b68363c294b90d8c7ffWithdraw104752762022-04-24 19:03:3431 days 19 hrs ago0x3aedab2104d86699b9266e26d801689c9eb8916c IN  Hundred Finance: veHND0 ETH0.000266402799 ETH
0x7ca2e092679123a977f549052f23f7bac7c255f9b0f5e8d6d2a1815938805484Create_lock102652942022-04-21 14:48:5534 days 23 hrs ago0x5a49d30d54d0f05b76b6e65f42d627da10eaf0c1 IN  Hundred Finance: veHND0 ETH0.00068456565 ETH
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc313ed043b7cb943f64f0b620dd29a75f159ff6fdbe1762f5dded8ebbdc4fb11129908452022-05-26 12:09:322 hrs 11 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xc313ed043b7cb943f64f0b620dd29a75f159ff6fdbe1762f5dded8ebbdc4fb11129908452022-05-26 12:09:322 hrs 11 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x9c6496fd712713579e7b2b5c5ef7d961ab5df8383cbd7aaacaf547c6d1f0a8d5129813582022-05-26 9:14:125 hrs 7 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x9c6496fd712713579e7b2b5c5ef7d961ab5df8383cbd7aaacaf547c6d1f0a8d5129813582022-05-26 9:14:125 hrs 7 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x13b473133380a7702647ea66090ec8f09befa5dddfc5dbf5be2df693ac71f9b7129797602022-05-26 8:50:315 hrs 30 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x13b473133380a7702647ea66090ec8f09befa5dddfc5dbf5be2df693ac71f9b7129797602022-05-26 8:50:315 hrs 30 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xb99c1df0acf149ff1edd6802392fd82afc713b51d2b345c1e42eb90085fde4ec129570602022-05-26 0:09:1614 hrs 12 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xb99c1df0acf149ff1edd6802392fd82afc713b51d2b345c1e42eb90085fde4ec129570602022-05-26 0:09:1614 hrs 12 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x957ea582cfb785419460edba043c75c767fa54f0aa3eca9bb376004bf8d69ebe129526002022-05-25 21:30:0916 hrs 51 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x957ea582cfb785419460edba043c75c767fa54f0aa3eca9bb376004bf8d69ebe129526002022-05-25 21:30:0916 hrs 51 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x67b53fe779e4ca60babdd696e8809217206158cba90d923347f84902cd371274129177402022-05-25 9:30:311 day 4 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x67b53fe779e4ca60babdd696e8809217206158cba90d923347f84902cd371274129177402022-05-25 9:30:311 day 4 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x67b53fe779e4ca60babdd696e8809217206158cba90d923347f84902cd371274129177402022-05-25 9:30:311 day 4 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x67b53fe779e4ca60babdd696e8809217206158cba90d923347f84902cd371274129177402022-05-25 9:30:311 day 4 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x67b53fe779e4ca60babdd696e8809217206158cba90d923347f84902cd371274129177402022-05-25 9:30:311 day 4 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x67b53fe779e4ca60babdd696e8809217206158cba90d923347f84902cd371274129177402022-05-25 9:30:311 day 4 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xd17edd3ea6ee5eba91d7fa96447aab94e67c96bdc7f7e353f157312d2bc41566128146972022-05-23 22:37:202 days 15 hrs ago Hundred Finance: hUSDC Gauge Hundred Finance: veHND0 ETH
0xd17edd3ea6ee5eba91d7fa96447aab94e67c96bdc7f7e353f157312d2bc41566128146972022-05-23 22:37:202 days 15 hrs ago Hundred Finance: hUSDC Gauge Hundred Finance: veHND0 ETH
0x5afecef12d83b2c9eacba626c1cd37fa18a8fc6a827f9257e6c448a80b49bf0c128146792022-05-23 22:36:192 days 15 hrs ago Hundred Finance: hUSDC Gauge Hundred Finance: veHND0 ETH
0x5afecef12d83b2c9eacba626c1cd37fa18a8fc6a827f9257e6c448a80b49bf0c128146792022-05-23 22:36:192 days 15 hrs ago Hundred Finance: hUSDC Gauge Hundred Finance: veHND0 ETH
0x736bed8e1f9a5b8cfb5bdf6360ca352431909bd82b446c33e33809c524d68d65128043502022-05-23 18:58:062 days 19 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x736bed8e1f9a5b8cfb5bdf6360ca352431909bd82b446c33e33809c524d68d65128043502022-05-23 18:58:062 days 19 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x736bed8e1f9a5b8cfb5bdf6360ca352431909bd82b446c33e33809c524d68d65128043502022-05-23 18:58:062 days 19 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x736bed8e1f9a5b8cfb5bdf6360ca352431909bd82b446c33e33809c524d68d65128043502022-05-23 18:58:062 days 19 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x736bed8e1f9a5b8cfb5bdf6360ca352431909bd82b446c33e33809c524d68d65128043502022-05-23 18:58:062 days 19 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.12

Optimization Enabled:
N/A

Other Settings:
, MIT license

Contract Source Code (Vyper language format)

# @version 0.2.12
"""
@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` (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 ABI

[{"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":38895},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":41034},{"stateMutability":"nonpayable","type":"function","name":"commit_smart_wallet_checker","inputs":[{"name":"addr","type":"address"}],"outputs":[],"gas":37605},{"stateMutability":"nonpayable","type":"function","name":"apply_smart_wallet_checker","inputs":[],"outputs":[],"gas":39632},{"stateMutability":"view","type":"function","name":"get_last_user_slope","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"int128"}],"gas":5137},{"stateMutability":"view","type":"function","name":"user_point_history__ts","inputs":[{"name":"_addr","type":"address"},{"name":"_idx","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":2940},{"stateMutability":"view","type":"function","name":"locked__end","inputs":[{"name":"_addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":2861},{"stateMutability":"nonpayable","type":"function","name":"checkpoint","inputs":[],"outputs":[],"gas":37460000},{"stateMutability":"nonpayable","type":"function","name":"deposit_for","inputs":[{"name":"_addr","type":"address"},{"name":"_value","type":"uint256"}],"outputs":[],"gas":75105101},{"stateMutability":"nonpayable","type":"function","name":"create_lock","inputs":[{"name":"_value","type":"uint256"},{"name":"_unlock_time","type":"uint256"}],"outputs":[],"gas":75106526},{"stateMutability":"nonpayable","type":"function","name":"increase_amount","inputs":[{"name":"_value","type":"uint256"}],"outputs":[],"gas":75105947},{"stateMutability":"nonpayable","type":"function","name":"increase_unlock_time","inputs":[{"name":"_unlock_time","type":"uint256"}],"outputs":[],"gas":75106594},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[],"outputs":[],"gas":37638691},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"balanceOf","inputs":[{"name":"addr","type":"address"},{"name":"_t","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"balanceOfAt","inputs":[{"name":"addr","type":"address"},{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":860361},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalSupply","inputs":[{"name":"t","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"totalSupplyAt","inputs":[{"name":"_block","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}],"gas":1388730},{"stateMutability":"nonpayable","type":"function","name":"changeController","inputs":[{"name":"_newController","type":"address"}],"outputs":[],"gas":38055},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2928},{"stateMutability":"view","type":"function","name":"supply","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2958},{"stateMutability":"view","type":"function","name":"locked","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"amount","type":"int128"},{"name":"end","type":"uint256"}],"gas":5737},{"stateMutability":"view","type":"function","name":"epoch","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3018},{"stateMutability":"view","type":"function","name":"point_history","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"bias","type":"int128"},{"name":"slope","type":"int128"},{"name":"ts","type":"uint256"},{"name":"blk","type":"uint256"}],"gas":10255},{"stateMutability":"view","type":"function","name":"user_point_history","inputs":[{"name":"arg0","type":"address"},{"name":"arg1","type":"uint256"}],"outputs":[{"name":"bias","type":"int128"},{"name":"slope","type":"int128"},{"name":"ts","type":"uint256"},{"name":"blk","type":"uint256"}],"gas":10500},{"stateMutability":"view","type":"function","name":"user_point_epoch","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"uint256"}],"gas":3323},{"stateMutability":"view","type":"function","name":"slope_changes","inputs":[{"name":"arg0","type":"uint256"}],"outputs":[{"name":"","type":"int128"}],"gas":3253},{"stateMutability":"view","type":"function","name":"controller","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3168},{"stateMutability":"view","type":"function","name":"transfersEnabled","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":3198},{"stateMutability":"view","type":"function","name":"name","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":13530},{"stateMutability":"view","type":"function","name":"symbol","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":11283},{"stateMutability":"view","type":"function","name":"version","inputs":[],"outputs":[{"name":"","type":"string"}],"gas":11313},{"stateMutability":"view","type":"function","name":"decimals","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":3318},{"stateMutability":"view","type":"function","name":"future_smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3348},{"stateMutability":"view","type":"function","name":"smart_wallet_checker","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3378},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3408},{"stateMutability":"view","type":"function","name":"future_admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":3438}]

6f7fffffffffffffffffffffffffffffff6040526080612f21610140396020612f2160c03960c05160a01c1561003457600080fd5b606060206020612f210160c03960c051612f21016101c039604060206020612f210160c03960c05160040135111561006b57600080fd5b604060206040612f210160c03960c051612f210161024039602060206040612f210160c03960c0516004013511156100a257600080fd5b604060206060612f210160c03960c051612f21016102a039602060206060612f210160c03960c0516004013511156100d957600080fd5b3360105561014051600055436003600460c052602060c02060c052602060c0200155426002600460c052602060c02060c052602060c02001553360085560016009556020610380600463313ce5676103205261033c610140515afa61013d57600080fd5b601f3d1161014a57600080fd5b600050610380516103005260ff61030051111561016657600080fd5b61030051600d556101c080600a60c052602060c020602082510161012060006003818352015b8261012051602002111561019f576101c1565b61012051602002850151610120518501555b815160010180835281141561018c575b50505050505061024080600b60c052602060c020602082510161012060006002818352015b826101205160200211156101f95761021b565b61012051602002850151610120518501555b81516001018083528114156101e6575b5050505050506102a080600c60c052602060c020602082510161012060006002818352015b8261012051602002111561025357610275565b61012051602002850151610120518501555b8151600101808352811415610240575b505050505050612f0956600436101561000d57611d99565b600035601c526f7fffffffffffffffffffffffffffffff604052600051341561003557600080fd5b636b441a408114156100955760043560a01c1561005157600080fd5b601054331461005f57600080fd5b600435601155600435610140527f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e96020610140a1005b636a1c05ae8114156100fe5760105433146100af57600080fd5b60115461014052600061014051186100c657600080fd5b6101405160105561014051610160527febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056020610160a1005b6357f901e28114156101305760043560a01c1561011a57600080fd5b601054331461012857600080fd5b600435600e55005b638e5b490f81141561015257601054331461014a57600080fd5b600e54600f55005b637c74a1748114156101c55760043560a01c1561016e57600080fd5b600660043560e05260c052604060c0205461014052600161014051633b9aca00811061019957600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f35b63da020a188114156102225760043560a01c156101e157600080fd5b6002602435633b9aca0081106101f657600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f35b63adc635898114156102635760043560a01c1561023e57600080fd5b6001600260043560e05260c052604060c02060c052602060c020015460005260206000f35b63c2c4c5c18114156102f15760403661014037604036610180376101405161016051610180516101a05160006101c0526101e061014080518252806020015182602001525050610220610180805182528060200151826020015250506102405161022051610200516101e0516101c05160065801611e80565b6101a052610180526101605261014052600050005b633a46273e8114156104ab576012541561030a57600080fd5b600160125560043560a01c1561031f57600080fd5b610140600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060006024351161036157600080fd5b6000610140511315156103b3576308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050606461019cfd5b4261016051111515610429576308c379a06101805260206101a05260246101c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686101e0527f6472617700000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b6101405161016051604060046101803760006101c0526101e0600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060006102205261022051610200516101e0516101c0516101a05161018051600658016126fb565b61016052610140526000506000601255005b6365fc38738114156106f557601254156104c457600080fd5b600160125533610140526101405160065801611d9f565b60005060243562093a808082049050905062093a80808202821582848304141761050457600080fd5b809050905090506101405261016060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060006004351161054f57600080fd5b6101605115151561059f576308c379a06101a05260206101c05260196101e0527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000610200526101e05060646101bcfd5b4261014051111515610615576308c379a06101a05260206101c05260266101e0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610200527f6675747572650000000000000000000000000000000000000000000000000000610220526101e05060846101bcfd5b42630784ce0081818301101561062a57600080fd5b808201905090506101405111151515610682576308c379a06101a05260206101c052601e6101e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610200526101e05060646101bcfd5b610140516101605161018051336101a0526004356101c052610140516101e052610200610160805182528060200151826020015250506001610240526102405161022051610200516101e0516101c0516101a051600658016126fb565b6101805261016052610140526000506000601255005b634957677c811415610899576012541561070e57600080fd5b600160125533610140526101405160065801611d9f565b60005061014060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060006004351161076857600080fd5b6000610140511315156107ba576308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050606461019cfd5b4261016051111515610830576308c379a06101805260206101a05260246101c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686101e0527f6472617700000000000000000000000000000000000000000000000000000000610200526101c050608461019cfd5b610140516101605133610180526004356101a05260006101c0526101e06101408051825280602001518260200152505060026102205261022051610200516101e0516101c0516101a05161018051600658016126fb565b61016052610140526000506000601255005b63eff7a612811415610b0457601254156108b257600080fd5b600160125533610140526101405160065801611d9f565b60005061014060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060043562093a808082049050905062093a80808202821582848304141761092357600080fd5b8090509050905061018052426101605111151561097f576308c379a06101a05260206101c052600c6101e0527f4c6f636b20657870697265640000000000000000000000000000000000000000610200526101e05060646101bcfd5b6000610140511315156109d1576308c379a06101a05260206101c05260116101e0527f4e6f7468696e67206973206c6f636b6564000000000000000000000000000000610200526101e05060646101bcfd5b6101605161018051111515610a25576308c379a06101a05260206101c052601f6101e0527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e00610200526101e05060646101bcfd5b42630784ce00818183011015610a3a57600080fd5b808201905090506101805111151515610a92576308c379a06101a05260206101c052601e6101e0527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610200526101e05060646101bcfd5b610140516101605161018051336101a05260006101c052610180516101e052610200610140805182528060200151826020015250506003610240526102405161022051610200516101e0516101c0516101a051600658016126fb565b6101805261016052610140526000506000601255005b633ccfd60b811415610d855760125415610b1d57600080fd5b600160125561014060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c020015482602001525050610160514210151515610ba5576308c379a06101805260206101a05260166101c0527f546865206c6f636b206469646e277420657870697265000000000000000000006101e0526101c050606461019cfd5b610140516000811215610bb757600080fd5b610180526101a06101408051825280602001518260200152505060006101605260006101405260023360e05260c052604060c02060c052602060c020610140805182558060200151600183015550506001546101e0526101e0516101805180821015610c2257600080fd5b808203905090506001556101405161016051610180516101a0516101c0516101e05133610200526102206101a08051825280602001518260200152505061026061014080518252806020015182602001525050610280516102605161024051610220516102005160065801611e80565b6101e0526101c0526101a05261018052610160526101405260005060206102a0604463a9059cbb610200523361022052610180516102405261021c60006000545af1610cdd57600080fd5b601f3d11610cea57600080fd5b6000506102a051610cfa57600080fd5b61018051610200524261022052337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686040610200a26101e051610200526101e0516101805180821015610d4c57600080fd5b80820390509050610220527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6040610200a16000601255005b6370a08231811415610d9b574261014052610dbb565b62fdd58e811415610db6576020602461014037600050610dbb565b610f1a565b60043560a01c15610dcb57600080fd5b600660043560e05260c052604060c0205461016052610160511515610df957600060005260206000f3610f18565b61018061016051633b9aca008110610e1057600080fd5b600560043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505061018080516101a051610140516101c05180821015610e8b57600080fd5b80820390509050604051811115610ea157600080fd5b80820280806000811215610eb157195b607f1c15610ebe57600080fd5b90509050905080820380806000811215610ed457195b607f1c15610ee157600080fd5b9050905090508152506000610180511215610efd576000610180525b610180516000811215610f0f57600080fd5b60005260206000f35b005b634ee2cd7e8114156113ee5760043560a01c15610f3657600080fd5b436024351115610f4557600080fd5b600061014052600660043560e05260c052604060c020546101605261018060006080818352015b6101605161014051101515610f8057611042565b6101405161016051818183011015610f9757600080fd5b808201905090506001818183011015610faf57600080fd5b808201905090506002808204905090506101a05260243560036101a051633b9aca008110610fdc57600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c0200154111515611013576101a05161014052611032565b6101a05160018082101561102657600080fd5b80820390509050610160525b8151600101808352811415610f6c575b505061018061014051633b9aca00811061105b57600080fd5b600560043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050600354610200526101405161016051610180516101a0516101c0516101e051610200516102205160243561024052610200516102605261026051610240516006580161299a565b6102c05261022052610200526101e0526101c0526101a0526101805261016052610140526102c05161022052610240610220516c01431e0fae6d7217caa0000000811061114b57600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506040366102c0376102005161022051101561127b576103006102205160018181830110156111c757600080fd5b808201905090506c01431e0fae6d7217caa000000081106111e757600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610360516102a0518082101561124b57600080fd5b808203905090506102c05261034051610280518082101561126b57600080fd5b808203905090506102e0526112b6565b436102a0518082101561128d57600080fd5b808203905090506102c0524261028051808210156112aa57600080fd5b808203905090506102e0525b610280516103005260006102c05118156113385761030080516102e0516024356102a051808210156112e757600080fd5b80820390509050808202821582848304141761130257600080fd5b809050905090506102c051808061131857600080fd5b82049050905081818301101561132d57600080fd5b808201905090508152505b61018080516101a051610300516101c0518082101561135657600080fd5b8082039050905060405181111561136c57600080fd5b8082028080600081121561137c57195b607f1c1561138957600080fd5b9050905090508082038080600081121561139f57195b607f1c156113ac57600080fd5b9050905090508152506000610180511215156113e1576101805160008112156113d457600080fd5b60005260206000f36113ec565b600060005260206000f35b005b6318160ddd811415611404574261014052611425565b63bd85b039811415611420576020600461014037600050611425565b61152b565b60035461016052610180610160516c01431e0fae6d7217caa0000000811061144c57600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101405161016051610180516101a0516101c0516101e0516102006101808051825280602001518260200152806040015182604001528060600151826060015250506101405161028052610280516102605161024051610220516102005160065801612aa4565b6102e0526101e0526101c0526101a0526101805261016052610140526102e05160005260206000f35b63981b24d08114156118655743600435111561154657600080fd5b60035461014052610140516101605160043561018052610140516101a0526101a051610180516006580161299a565b6102005261016052610140526102005161016052610180610160516c01431e0fae6d7217caa000000081106115a957600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506000610200526101405161016051101561172a5761022061016051600181818301101561162457600080fd5b808201905090506c01431e0fae6d7217caa0000000811061164457600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610280516101e0511815611725576004356101e051808210156116b557600080fd5b80820390509050610260516101c051808210156116d157600080fd5b8082039050905080820282158284830414176116ec57600080fd5b80905090509050610280516101e0518082101561170857600080fd5b80820390509050808061171a57600080fd5b820490509050610200525b6117b3565b436101e05118156117b3576004356101e0518082101561174957600080fd5b80820390509050426101c0518082101561176257600080fd5b80820390509050808202821582848304141761177d57600080fd5b80905090509050436101e0518082101561179657600080fd5b8082039050905080806117a857600080fd5b820490509050610200525b6101405161016051610180516101a0516101c0516101e051610200516102206101808051825280602001518260200152806040015182604001528060600151826060015250506101c0516102005181818301101561181057600080fd5b808201905090506102a0526102a0516102805161026051610240516102205160065801612aa4565b61030052610200526101e0526101c0526101a0526101805261016052610140526103005160005260206000f35b633cebb8238114156118975760043560a01c1561188157600080fd5b600854331461188f57600080fd5b600435600855005b63fc0c546a8114156118af5760005460005260206000f35b63047fc9aa8114156118c75760015460005260206000f35b63cbf9fe5f8114156119315760043560a01c156118e357600080fd5b600260043560e05260c052604060c0206101408080808460c052602060c0205481525050602081019050808060018560c052602060c02001548152505060409050905060c05260c051610140f35b63900cf0cf8114156119495760035460005260206000f35b63d1febfb98114156119ec576004356c01431e0fae6d7217caa0000000811061197157600080fd5b600460c052602060c020016101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c02001548152505060809050905060c05260c051610140f35b6328d09d47811415611aa45760043560a01c15611a0857600080fd5b602435633b9aca008110611a1b57600080fd5b600560043560e05260c052604060c02060c052602060c020016101408080808460c052602060c0205481525050602081019050808060018560c052602060c020015481525050602081019050808060028560c052602060c020015481525050602081019050808060038560c052602060c02001548152505060809050905060c05260c051610140f35b63010ae757811415611ada5760043560a01c15611ac057600080fd5b600660043560e05260c052604060c0205460005260206000f35b6371197484811415611b0057600760043560e05260c052604060c0205460005260206000f35b63f77c4791811415611b185760085460005260206000f35b63bef97c87811415611b305760095460005260206000f35b6306fdde03811415611bd557600a8060c052602060c020610180602082540161012060006003818352015b82610120516020021115611b6e57611b90565b61012051850154610120516020028501525b8151600101808352811415611b5b575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6395d89b41811415611c7a57600b8060c052602060c020610180602082540161012060006002818352015b82610120516020021115611c1357611c35565b61012051850154610120516020028501525b8151600101808352811415611c00575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b6354fd4d50811415611d1f57600c8060c052602060c020610180602082540161012060006002818352015b82610120516020021115611cb857611cda565b61012051850154610120516020028501525b8151600101808352811415611ca5575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f35b63313ce567811415611d3757600d5460005260206000f35b638ff36fd1811415611d4f57600e5460005260206000f35b637175d4f7811415611d6757600f5460005260206000f35b63f851a440811415611d7f5760105460005260206000f35b6317f7182a811415611d975760115460005260206000f35b505b60006000fd5b610160526101405232610140511815611e7a57600f54610180526000610180511815611e10576020610220602463c23697a86101a052610140516101c0526101bc6000610180515af1611df157600080fd5b601f3d11611dfe57600080fd5b6000506102205115611e105761016051565b6308c379a06101a05260206101c05260256101e0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c610200527f6c6f776564000000000000000000000000000000000000000000000000000000610220526101e05060846101bcfd5b61016051565b6101e0526101405261016052610180526101a0526101c052610140366102003760035461034052600061014051181561204d5742610180511115611eca5760006101605113611ecd565b60005b15611f565761016051630784ce0080820580806000811215611eeb57195b607f1c15611ef857600080fd5b9050905090506102205261022051610180514280821015611f1857600080fd5b80820390509050604051811115611f2e57600080fd5b80820280806000811215611f3e57195b607f1c15611f4b57600080fd5b905090509050610200525b426101c0511115611f6d5760006101a05113611f70565b60005b15611ff9576101a051630784ce0080820580806000811215611f8e57195b607f1c15611f9b57600080fd5b9050905090506102a0526102a0516101c0514280821015611fbb57600080fd5b80820390509050604051811115611fd157600080fd5b80820280806000811215611fe157195b607f1c15611fee57600080fd5b905090509050610280525b60076101805160e05260c052604060c020546103005260006101c051181561204d57610180516101c051141561203657610300516103205261204d565b60076101c05160e05260c052604060c02054610320525b61036060008152600081602001524281604001524381606001525060006103405111156120e457610360610340516c01431e0fae6d7217caa0000000811061209457600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250505b6103a0516103e0526104006103608051825280602001518260200152806040015182604001528060600151826060015250506000610480526103a05142111561219357670de0b6b3a7640000436103c0518082101561214257600080fd5b80820390509050808202821582848304141761215d57600080fd5b80905090509050426103a0518082101561217657600080fd5b80820390509050808061218857600080fd5b820490509050610480525b6103e05162093a808082049050905062093a8080820282158284830414176121ba57600080fd5b809050905090506104a0526104c0600060ff818352015b6104a0805162093a808181830110156121e957600080fd5b8082019050905081525060006104e052426104a051111561220e57426104a052612225565b60076104a05160e05260c052604060c020546104e0525b6103608051610380516104a0516103e0518082101561224357600080fd5b8082039050905060405181111561225957600080fd5b8082028080600081121561226957195b607f1c1561227657600080fd5b9050905090508082038080600081121561228c57195b607f1c1561229957600080fd5b90509050905081525061038080516104e051808201808060008112156122bb57195b607f1c156122c857600080fd5b90509050905081525060006103605112156122e4576000610360525b60006103805112156122f7576000610380525b6104a0516103e0526104a0516103a05261046051610480516104a051610440518082101561232457600080fd5b80820390509050808202821582848304141761233f57600080fd5b80905090509050670de0b6b3a76400008082049050905081818301101561236557600080fd5b808201905090506103c0526103408051600181818301101561238657600080fd5b80820190509050815250426104a05114156123a957436103c05261241156612401565b610340516c01431e0fae6d7217caa000000081106123c657600080fd5b600460c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550505b81516001018083528114156121d1575b50506103405160035560006101405118156124f85761038080516102a051610220518082038080600081121561244357195b607f1c1561245057600080fd5b9050905090508082018080600081121561246657195b607f1c1561247357600080fd5b905090509050815250610360805161028051610200518082038080600081121561249957195b607f1c156124a657600080fd5b905090509050808201808060008112156124bc57195b607f1c156124c957600080fd5b90509050905081525060006103805112156124e5576000610380525b60006103605112156124f8576000610360525b610340516c01431e0fae6d7217caa0000000811061251557600080fd5b600460c052602060c0200160c052602060c02061036080518255806020015160018301558060400151600283015580606001516003830155505060006101405118156126f557426101805111156125ea576103008051610220518082018080600081121561257f57195b607f1c1561258c57600080fd5b905090509050815250610180516101c05114156125d35761030080516102a051808203808060008112156125bc57195b607f1c156125c957600080fd5b9050905090508152505b6103005160076101805160e05260c052604060c020555b426101c051111561264957610180516101c05111156126495761032080516102a0518082038080600081121561261c57195b607f1c1561262957600080fd5b9050905090508152506103205160076101c05160e05260c052604060c020555b60066101405160e05260c052604060c02054600181818301101561266c57600080fd5b808201905090506104c0526104c05160066101405160e05260c052604060c02055426102c052436102e0526104c051633b9aca0081106126ab57600080fd5b60056101405160e05260c052604060c02060c052602060c0200160c052602060c0206102808051825580602001516001830155806040015160028301558060600151600383015550505b6101e051565b610200526101405261016052610180526101a0526101c0526101e0526102206101a08051825280602001518260200152505060015461026052610260516101605181818301101561274b57600080fd5b808201905090506001556102806102208051825280602001518260200152505061022080516101605160405181111561278357600080fd5b8082018080600081121561279357195b607f1c156127a057600080fd5b90509050905081525060006101805118156127be5761018051610240525b60026101405160e05260c052604060c02060c052602060c020610220805182558060200151600183015550506101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a051610140516102c0526102e061028080518252806020015182602001525050610320610220805182528060200151826020015250506103405161032051610300516102e0516102c05160065801611e80565b6102a05261028052610260526102405261022052610200526101e0526101c0526101a05261018052610160526101405260005060006101605118156128ff57602061038060646323b872dd6102c052610140516102e052306103005261016051610320526102dc60006000545af16128e257600080fd5b601f3d116128ef57600080fd5b600050610380516128ff57600080fd5b610160516102c0526101e0516102e052426103005261024051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d5960606102c0a3610260516102c052610260516101605181818301101561296257600080fd5b808201905090506102e0527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c60406102c0a161020051565b61018052610140526101605260006101a052610160516101c0526101e060006080818352015b6101c0516101a0511015156129d457612a92565b6101a0516101c0518181830110156129eb57600080fd5b808201905090506001818183011015612a0357600080fd5b8082019050905060028082049050905061020052610140516003610200516c01431e0fae6d7217caa00000008110612a3a57600080fd5b600460c052602060c0200160c052602060c0200154111515612a6357610200516101a052612a82565b61020051600180821015612a7657600080fd5b808203905090506101c0525b81516001018083528114156129c0575b50506101a05160005260005161018051565b6101e0526101405261016052610180526101a0526101c0526102006101408051825280602001518260200152806040015182604001528060600151826060015250506102405162093a808082049050905062093a808082028215828483041417612b0d57600080fd5b80905090509050610280526102a0600060ff818352015b610280805162093a80818183011015612b3c57600080fd5b8082019050905081525060006102c0526101c051610280511115612b67576101c05161028052612b7e565b60076102805160e05260c052604060c020546102c0525b610200805161022051610280516102405180821015612b9c57600080fd5b80820390509050604051811115612bb257600080fd5b80820280806000811215612bc257195b607f1c15612bcf57600080fd5b90509050905080820380806000811215612be557195b607f1c15612bf257600080fd5b9050905090508152506101c051610280511415612c0e57612c56565b61022080516102c05180820180806000811215612c2757195b607f1c15612c3457600080fd5b90509050905081525061028051610240525b8151600101808352811415612b24575b50506000610200511215612c6b576000610200525b610200516000811215612c7d57600080fd5b6000526000516101e051565b610280612f0903610280600039610280612f09036000f300000000000000000000000010010078a54396f62c96df8532dc2b4847d47ed3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000011566f74652d657363726f77656420484e4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057665484e44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7665484e445f312e302e30000000000000000000000000000000000000000000

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

00000000000000000000000010010078a54396f62c96df8532dc2b4847d47ed3000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000011566f74652d657363726f77656420484e4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057665484e44000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b7665484e445f312e302e30000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : token_addr (address): 0x10010078a54396f62c96df8532dc2b4847d47ed3
Arg [1] : _name (string): Vote-escrowed HND
Arg [2] : _symbol (string): veHND
Arg [3] : _version (string): veHND_1.0.0

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 00000000000000000000000010010078a54396f62c96df8532dc2b4847d47ed3
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [5] : 566f74652d657363726f77656420484e44000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 7665484e44000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [9] : 7665484e445f312e302e30000000000000000000000000000000000000000000


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.