Contract 0xba57440fa35fdb671e58f6f56c1a4447ab1f6c2b 3

 

Contract Overview

Hundred Finance: veHND
Balance:
0 ETH

ETH Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x861742af0229cd8512b924f398bad79be9069f35598211aa43603b05dbd30263Create_lock425942002022-12-01 2:46:425 days 21 hrs ago0x0fb20260d3e8b9d3023ca3a5d3423da7c316e6a8 IN  Hundred Finance: veHND0 ETH0.00005645
0x9d74867b8858fa3d379271515643631692c12259d50621412399384d776d0189Create_lock424010822022-11-30 9:48:436 days 14 hrs ago0x9d9827af75601cebf3eff1b93d0bf52d41e075ad IN  Hundred Finance: veHND0 ETH0.00004571
0x0ee180bbef6846aa1c6a9c53db0483038e8927453fea4d26fcb6d96856a129a0Create_lock421880712022-11-29 15:10:497 days 9 hrs ago0x47a76df5f20b7116a33b9715bc73092fb3690b36 IN  Hundred Finance: veHND0 ETH0.00004864
0x06af0b4c7f46f629e708701d6d56209cf7e41e62403900abbced7496661dd5f4Create_lock410914242022-11-25 12:40:4311 days 11 hrs ago0x4a17a3d7a3904d54d4fe0dd855d7d843082e3caa IN  Hundred Finance: veHND0 ETH0.00004509
0x4c78d594e1cafd838028a6abb28a7cee552b6ddc2535ef1463e9ed66ba700495Create_lock410914172022-11-25 12:40:4111 days 11 hrs ago0x15d659c60dacf06bcd781e5b673252844cc85869 IN  Hundred Finance: veHND0 ETH0.00004509
0x1aab5b0ec6284ce99ceee1e3b0cbbbefe64da39f3bb1de8499ebfb659120a675Create_lock410914112022-11-25 12:40:4011 days 11 hrs ago0xd48381bd9aa4f3bb124b03bd77743ec13a745b7e IN  Hundred Finance: veHND0 ETH0.00004509
0x8382177fca904a0a9ccabf29371719f959936b8429e10248cc7f8055df36d1c6Create_lock410914012022-11-25 12:40:3711 days 11 hrs ago0xa539e0884c9efab378e97a5e1302e88575c738c9 IN  Hundred Finance: veHND0 ETH0.00004509
0x519b703527bfeb67dcc18853b371ba4a0f4485f7e6f60bc627f7981a2d9c7401Create_lock410912822022-11-25 12:40:0211 days 11 hrs ago0x85ee2495fc1327673a606d63c84235d58e9d9b81 IN  Hundred Finance: veHND0 ETH0.00004509
0x2a1fea7e2c0ddb103400f5600293a3d20f89a166c15d3b5c78b1fe0485ab7059Create_lock410912762022-11-25 12:40:0011 days 11 hrs ago0xba279d6d1ea1ac55e3b871ebb79d9cc6c5d1c8c4 IN  Hundred Finance: veHND0 ETH0.00004509
0xb32f146e0f1175de8023cf35830c59a3671976fc029e09eea83a2f1ea52317dfCreate_lock410912652022-11-25 12:39:5711 days 11 hrs ago0x91c270d40c7a9f3159c96e2adc6b09179c9f95b2 IN  Hundred Finance: veHND0 ETH0.00004509
0x5e108f404544e8a3adf3656987a62f502ebad3f5c13a0218af27edf786718109Create_lock410912602022-11-25 12:39:5611 days 11 hrs ago0x380a27052ebc3cba1562a4770f42c183ff9e4ab3 IN  Hundred Finance: veHND0 ETH0.00004509
0xa1a7a4d7f498f2226d1c6357f97662bff20c2871dfb67d42248ac1605ca8b9c2Create_lock410912542022-11-25 12:39:5511 days 11 hrs ago0x8efa340f80bc3a7417836ee4c1ad0d614f0f9855 IN  Hundred Finance: veHND0 ETH0.00005404
0x9584668c973cf3ce3e13dc93298cb7490577d32b878f508af0347204d1de3515Create_lock402805142022-11-22 15:10:1814 days 9 hrs ago0x1028e9f9bc8bce25eb476fc08c8bcf4ea9222cda IN  Hundred Finance: veHND0 ETH0.00005542
0x200f910e1a3a3b8fdefc6c5732df477d6ea22836e2fd4cf5e401b67be73a956aCreate_lock402556682022-11-22 13:22:1614 days 10 hrs ago0xb21d1f8fd6c924a9773fec45e4c572b1fcec5ce7 IN  Hundred Finance: veHND0 ETH0.00005093
0x3c25ec6fe004a4ce3be92d8fda39831669a97938139bf3db6738bb4b97e09c54Create_lock392575092022-11-19 8:15:3917 days 15 hrs ago0x6df4c597045649b8407c60e2563778b1d2114e00 IN  Hundred Finance: veHND0 ETH0.00004609
0x7735063d41dde0a571f07da75f277a24c6757e31e752f3580b1bb8cdffea62a5Create_lock391033682022-11-18 16:45:0018 days 7 hrs ago0x4f0d41bdcbc009cbca3b79ff697bbdd5e3c7b91c IN  Hundred Finance: veHND0 ETH0.00007609
0xe403e8f3515cad420e2e6aec1089d0c1720241d5ad3ccf74b75d942f45c64789Create_lock390251872022-11-18 10:28:3018 days 13 hrs ago0x50cb26a76c60a20e29e560ecd35a2c4cea59fb65 IN  Hundred Finance: veHND0 ETH0.00004857
0xbec75eabc695a92fee0024e4056708a847d93f5fb261345e6883d62e14d7dad0Create_lock389235252022-11-17 23:45:1219 days 28 mins ago0xc81cb0c1d20953eac33db97bf961d33f988fcfea IN  Hundred Finance: veHND0 ETH0.00005234
0x7c7733047ce26d7329bbe012f3c90570511d918fe41b3eba4fd7fd87c3fefde8Create_lock388337122022-11-17 14:26:5919 days 9 hrs ago0x532744d3ee047210bde929fac52751739784ab42 IN  Hundred Finance: veHND0 ETH0.00006301
0x356e007da6d4b47a949ff1fc66f85642a77066387d62c005b35e071ec8879c3cCreate_lock385657122022-11-16 13:47:5320 days 10 hrs ago0xd2bc47f5123fef8144f79784da50a92bef5ead98 IN  Hundred Finance: veHND0 ETH0.00004777
0x83c6ea9eebdc175792ae536cee00ee4daf04452e31088019880c66274c6e3b6dCreate_lock385656302022-11-16 13:47:3020 days 10 hrs ago0x2b8c3d6e28992fcb38d49042953dfc9016f76b8a IN  Hundred Finance: veHND0 ETH0.00004777
0xcf7cd95c904b8b2ea746db5389a60c3608ed80085f7dbd480806ab845f81e1e5Create_lock385656222022-11-16 13:47:2820 days 10 hrs ago0x0782f638292883c7ee2d33f847431c483a7a63e8 IN  Hundred Finance: veHND0 ETH0.00004775
0xd55dd6fbe32e0e9a2c3f11a59595113d87cecfcb81c2cba54fc2d8c5669e6c69Create_lock385656202022-11-16 13:47:2820 days 10 hrs ago0xdaac82dfff0fb248274cec79678bf0f4a6edead7 IN  Hundred Finance: veHND0 ETH0.00004777
0x5b5e09d6ec36183199605bb7b39d8dc837d2760f02962ac488d8f5a53c68ca1eCreate_lock385656132022-11-16 13:47:2620 days 10 hrs ago0xaacc32418738a199e5ea98b91fe0274239822d4a IN  Hundred Finance: veHND0 ETH0.00004777
0x885ff574b18cc72c3d6ab49ae469ff82a6b97229c5397cc9d26c1226058cb1f1Create_lock385656102022-11-16 13:47:2520 days 10 hrs ago0x1c847fade083bdc25d50b718eb9922984a149b10 IN  Hundred Finance: veHND0 ETH0.00004775
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x3144dba32e9a88b7e8cefe162f1bb368e3269735151c9846607b8c466926e764439833122022-12-06 4:37:0319 hrs 36 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x3144dba32e9a88b7e8cefe162f1bb368e3269735151c9846607b8c466926e764439833122022-12-06 4:37:0319 hrs 36 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x3144dba32e9a88b7e8cefe162f1bb368e3269735151c9846607b8c466926e764439833122022-12-06 4:37:0319 hrs 36 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x3144dba32e9a88b7e8cefe162f1bb368e3269735151c9846607b8c466926e764439833122022-12-06 4:37:0319 hrs 36 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x3144dba32e9a88b7e8cefe162f1bb368e3269735151c9846607b8c466926e764439833122022-12-06 4:37:0319 hrs 36 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x3144dba32e9a88b7e8cefe162f1bb368e3269735151c9846607b8c466926e764439833122022-12-06 4:37:0319 hrs 36 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xb587ee3b8dde6042791be7242f818b0d99fd623d9fcbea73032f9ddf1f270dc1439831002022-12-06 4:35:4919 hrs 37 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xb587ee3b8dde6042791be7242f818b0d99fd623d9fcbea73032f9ddf1f270dc1439831002022-12-06 4:35:4919 hrs 37 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xd8f59ce2da6dc39dcee7e067321ec43c34def7fd579aed95be38471845c5418e439830292022-12-06 4:35:2519 hrs 38 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xd8f59ce2da6dc39dcee7e067321ec43c34def7fd579aed95be38471845c5418e439830292022-12-06 4:35:2519 hrs 38 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xd8f59ce2da6dc39dcee7e067321ec43c34def7fd579aed95be38471845c5418e439830292022-12-06 4:35:2519 hrs 38 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xd8f59ce2da6dc39dcee7e067321ec43c34def7fd579aed95be38471845c5418e439830292022-12-06 4:35:2519 hrs 38 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xd8f59ce2da6dc39dcee7e067321ec43c34def7fd579aed95be38471845c5418e439830292022-12-06 4:35:2519 hrs 38 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xd8f59ce2da6dc39dcee7e067321ec43c34def7fd579aed95be38471845c5418e439830292022-12-06 4:35:2519 hrs 38 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x9d0c3a538b56894c1f7b223cc8722f766f8facc3dfa8bda1b1eef0ff35fa9ce5439829562022-12-06 4:35:0019 hrs 38 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x9d0c3a538b56894c1f7b223cc8722f766f8facc3dfa8bda1b1eef0ff35fa9ce5439829562022-12-06 4:35:0019 hrs 38 mins ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x501eb926525230e7ed0e90875c6b2f9239b24c9c6c124370d2f8d88db94babf2438707912022-12-05 17:43:381 day 6 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x501eb926525230e7ed0e90875c6b2f9239b24c9c6c124370d2f8d88db94babf2438707912022-12-05 17:43:381 day 6 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x501eb926525230e7ed0e90875c6b2f9239b24c9c6c124370d2f8d88db94babf2438707912022-12-05 17:43:381 day 6 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x501eb926525230e7ed0e90875c6b2f9239b24c9c6c124370d2f8d88db94babf2438707912022-12-05 17:43:381 day 6 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x501eb926525230e7ed0e90875c6b2f9239b24c9c6c124370d2f8d88db94babf2438707912022-12-05 17:43:381 day 6 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x501eb926525230e7ed0e90875c6b2f9239b24c9c6c124370d2f8d88db94babf2438707912022-12-05 17:43:381 day 6 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xf77b611f4d8f818202f89b2e3dc33faecc8949f408f2d9f14513ac8fbe3479af438706832022-12-05 17:43:041 day 6 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0xf77b611f4d8f818202f89b2e3dc33faecc8949f408f2d9f14513ac8fbe3479af438706832022-12-05 17:43:041 day 6 hrs ago 0x6b5f15e939c8d797e6bd8d5ffda24edec655d08d Hundred Finance: veHND0 ETH
0x3d3f6daecb94aa89068e448508b8c3e579d4318ef1a2eb77d05850326cdc6d61437740512022-12-05 10:23:431 day 13 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
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.