Contract 0x738BB24915A5F88103485844f5aD87EdEc102283

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc229a9df01d26b62e9fb5e19caca3245ae9a157cac2e5ed6790c59d81fc869d1Create_lock364865202022-12-06 6:59:5119 hrs 47 mins ago0xf93615a0c7338b028cee29aaa31259350b07d3b6 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.015549549701 30.118209555
0x61dd12ce4224d59cd513493994f9f70dd5cbfdc6ce365a560436634bcdf167aaIncrease_amount364805702022-12-06 3:33:5023 hrs 13 mins ago0xde59dde7c5428ba29c7461338f4a6f45637c792d IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.014274009078 33.835891241
0x98d78587979efb5a3f5ffa885c702254cda6f9c03916e68a6c90fe84e676cce4Increase_amount364593062022-12-05 15:08:001 day 11 hrs ago0x7d4763aa403338df475786cb7c4e2cf2b965e9bb IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.070285694704 164.734670942
0x0d5017f956eaf32e59b3bc7ef011c254979b1c26347a920d95f22bd5a824abf3Increase_amount364592322022-12-05 15:05:281 day 11 hrs ago0xbf26d56aca3a339af85956ab9ab922507c0f7e92 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.05493104462 128.746647495
0x3432b49847b62240a0ca37d5934d20d738c8464929322a5f7c9cc85472f28c57Increase_amount364225822022-12-04 17:17:042 days 9 hrs ago0xdd33a5911cff5898f4138fd92607b8a028d26615 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.015416018975 36.822111813
0x5e9d33141da88c07192574eea06bce80e92214d43f1702708581edf9cce6ce35Create_lock364223972022-12-04 17:10:422 days 9 hrs ago0x6ecc7e94fb7a097aef606593a322bf90c9241271 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.018614058672 37.288972948
0x3103bd71387fb53422be17dd94feb91a96ef3d8841738df65ab68ea6cdb2153dIncrease_amount364135472022-12-04 12:03:362 days 14 hrs ago0x91891721117b36268a4266922692ed380436bd8b IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.012703865693 30.000013445
0x1a62e61c87d7df5c2d48ec6e29fb129076ced26bca77347dad6f9a806159a6caCreate_lock364095722022-12-04 9:38:482 days 17 hrs ago0xff017d9cd92b57af4cd3d801739f72fe519cbbda IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.002728941485 55.808856923
0xbbea5f938d761f6e9d234dc510e62f3c3c9b4dee25079838e483b8df51f17448Create_lock364095692022-12-04 9:38:422 days 17 hrs ago0xff017d9cd92b57af4cd3d801739f72fe519cbbda IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.024720956573 50.003553054
0x6fac41206d5617eead762b1817125a4dfc3d7ae7b8718ced1a1d1ede543a02b0Increase_amount364094922022-12-04 9:33:232 days 17 hrs ago0xca98a7db93e53aa7381461f728a481a941a590b5 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.019899004821 47.529999908
0x6b8731ea9718570c1e55a7aee7a8f8a98fe6ebc4c2e00780a474c9811acdb806Create_lock364087702022-12-04 9:03:222 days 17 hrs ago0x80b635cc92b3b76b9cf0f1ee2eb307a0d75693e2 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.014831520076 30.000000155
0xe8e03f04b61764b028e245f398377d6a8961e83256ab4fba40b7ff8b5b163c7fCreate_lock364054592022-12-04 7:03:072 days 19 hrs ago0x4624db38ee5ac89aa3d29b21c7838829c171fe40 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.015825231463 32.009999238
0xf660289a1ca226eedc01df12e1813fe0fc88430d28f59d2f30f54b363222f223Increase_amount363998572022-12-04 3:39:102 days 23 hrs ago0xc86506a3b41b9deea87ac1bcfd90fefe1c909297 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.018166519842.9
0x9ec1d56fda4359c0e36f32921314120b9cd9e9a40fc17c4e85e0b83174daeaa0Create_lock363766272022-12-03 13:44:023 days 13 hrs ago0xfc7c3f825dbe211b9f39b2b66448071bbdfe27f5 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.026034623881 52.660733118
0x1b287b4bd027bb1ab435394e833e6fd5321ad53d327227aa00e5ad2714ce49adCreate_lock363735412022-12-03 11:57:413 days 14 hrs ago0xa98d58460052213353614c764e7bd22c6e19f008 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.035197781223 71.195227239
0x45859eb2b553ab5524d598f6293679fb3729d8b19d990ae7eced8df6faa8e863Increase_amount363598472022-12-03 3:41:003 days 23 hrs ago0x50b06aebcd35e8cea040d41348971ab1e1762f2b IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.012753916798 30.118208477
0xc92885ad23b7cea1c0b6b259fd5c590f407527613037a964b7a87ccfec3f86c1Create_lock363581602022-12-03 2:38:454 days 8 mins ago0xe441c45710f22983ecf9387cddfdb9d2dbf6ae93 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.014975520012 30.000000026
0xbeca234ec39c2d0d2f77eb740335b6f3300b69aedaf97b6b7b05f30562899f75Create_lock363401542022-12-02 15:53:234 days 10 hrs ago0x7e12fd034673d717d302ac5ddffb5b930e68f1e8 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.022966782588 46.455351688
0x52a303a38cc5177083b6b0281180d293419e02e829535f0e962ab3730611121fIncrease_amount363318442022-12-02 10:50:564 days 15 hrs ago0xede71d58eb92c4eb065d2709a08970f789e7084b IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.014259001996 34.058505421
0xbe1e60333739b47432e3f6c5926b35696816a1de92a883669f085a4af853888cCreate_lock363293752022-12-02 9:18:314 days 17 hrs ago0x77967fb7a954e286f124737e940f21be5b980f62 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.021194543795 42.870610286
0x42aef4b7e3deb8a4682d739a33069213a3fb0876267dd6ae1da96986f564f5c3Create_lock363293452022-12-02 9:17:314 days 17 hrs ago0x705b2424b680bc5a17ba0a752c6d2078a6c17486 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.021256329331 42.995585074
0x4065f62c150ef829f3105b4055aaf5a4e582f446016773d183db0a0ed8d27666Create_lock363267742022-12-02 7:42:354 days 19 hrs ago0xb8375e9c691a7625e88a560e51420ee555b26b87 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.014975524864 30.000009745
0xceabe858d5086b3804a4ff7c3901549b91043ef248f563d1e9899cd5f4c4bf84Create_lock363139522022-12-02 0:16:305 days 2 hrs ago0x0c5cfdcbb3f9eb810f0e023e391938be50170c43 IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.0178058932835.67
0xcca8ebe0495b25baccf1cab977543ae2c138ea2235cca31fc3ad9cac579a861bIncrease_amount363100262022-12-01 22:01:345 days 4 hrs ago0x81d27bd7715044b669fc3cf7d40f46d3613cefba IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.012977985609 30.647344058
0xcb500e138e9e5cd99de5df834c95afcc385bc3d5a87d805048efc2dd88ede411Create_lock363099792022-12-01 21:59:565 days 4 hrs ago0x81d27bd7715044b669fc3cf7d40f46d3613cefba IN  0x738bb24915a5f88103485844f5ad87edec1022830 MATIC0.016843733611 33.743346204
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.4

Optimization Enabled:
N/A

Other Settings:
, MIT license

Contract Source Code (Vyper language format)

# @version 0.2.4
"""
@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


struct LockHistory:
    amount: uint256
    user: address
    createdAt: uint256
    endTime: 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

event NewVotingPower:
    user: indexed(address)
    newVotingPower: 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)

nextIdLock: public(int128)
locks: public(HashMap[int128, LockHistory])

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):
    """
    @notice Contract constructor
    @param token_addr `MOBL` token address
    """
    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 = "Vote-escrowed MOBL"
    self.symbol = "VeMOBL"
    self.version = "1.0"

    self.nextIdLock = 0


@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



@external
@view
def get_next_lock_id() -> int128:
    """
    @notice Get next lock id
    @return int128 nextIdLock
    """
    return self.nextIdLock


@external
@view
def lock_history(_index: int128) -> LockHistory:
    """
    @notice Get timestamp when `id`'s lock finishes
    @param _index Index of lock
    @return Epoch time of the lock end
    """
    return self.locks[_index]



@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
@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

@internal
@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
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.locks[self.nextIdLock] = LockHistory({user: _addr, amount:_value, createdAt:block.timestamp, endTime: unlock_time})
    self.nextIdLock += 1
    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)
    log NewVotingPower(_addr, self._balanceOfAt(_addr,block.number) - self._balanceOfAt(_addr,block.number - 1))


@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.




@external
@view
def balanceOf(addr: address) -> 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
    @return User voting power
    """
    t: uint256 = block.timestamp
    _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() -> uint256:
    """
    @notice Calculate total voting power
    @dev Adheres to the ERC20 `totalSupply` interface for Aragon compatibility
    @return Total voting power
    """
    t: uint256 = block.timestamp
    _epoch: uint256 = self.epoch
    last_point: Point = self.point_history[_epoch]
    return self.supply_at(last_point, t)


@external
@view
def totalSupplyAt(_block: uint256) -> uint256:
    """
    @notice Calculate total voting power at some point in the past
    @param _block Block to calculate the total voting power at
    @return Total voting power at `_block`
    """
    assert _block <= block.number
    _epoch: uint256 = self.epoch
    target_epoch: uint256 = self.find_block_epoch(_block, _epoch)

    point: Point = self.point_history[target_epoch]
    dt: uint256 = 0
    if target_epoch < _epoch:
        point_next: Point = self.point_history[target_epoch + 1]
        if point.blk != point_next.blk:
            dt = (_block - point.blk) * (point_next.ts - point.ts) / (point_next.blk - point.blk)
    else:
        if point.blk != block.number:
            dt = (_block - point.blk) * (block.timestamp - point.ts) / (block.number - point.blk)
    # Now dt contains info on how far are we beyond point

    return self.supply_at(point, point.ts + dt)


# Dummy methods for compatibility with Aragon

@external
def changeController(_newController: address):
    """
    @dev Dummy method required for Aragon compatibility
    """
    assert msg.sender == self.controller
    self.controller = _newController

Contract Security Audit

Contract ABI

[{"name":"CommitOwnership","inputs":[{"type":"address","name":"admin","indexed":false}],"anonymous":false,"type":"event"},{"name":"ApplyOwnership","inputs":[{"type":"address","name":"admin","indexed":false}],"anonymous":false,"type":"event"},{"name":"Deposit","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"value","indexed":false},{"type":"uint256","name":"locktime","indexed":true},{"type":"int128","name":"type","indexed":false},{"type":"uint256","name":"ts","indexed":false}],"anonymous":false,"type":"event"},{"name":"Withdraw","inputs":[{"type":"address","name":"provider","indexed":true},{"type":"uint256","name":"value","indexed":false},{"type":"uint256","name":"ts","indexed":false}],"anonymous":false,"type":"event"},{"name":"Supply","inputs":[{"type":"uint256","name":"prevSupply","indexed":false},{"type":"uint256","name":"supply","indexed":false}],"anonymous":false,"type":"event"},{"name":"NewVotingPower","inputs":[{"type":"address","name":"user","indexed":true},{"type":"uint256","name":"newVotingPower","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address","name":"token_addr"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function","gas":37597},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":38497},{"name":"commit_smart_wallet_checker","outputs":[],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function","gas":36307},{"name":"apply_smart_wallet_checker","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37095},{"name":"get_last_user_slope","outputs":[{"type":"int128","name":""}],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"view","type":"function","gas":2569},{"name":"user_point_history__ts","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_addr"},{"type":"uint256","name":"_idx"}],"stateMutability":"view","type":"function","gas":1672},{"name":"locked__end","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_addr"}],"stateMutability":"view","type":"function","gas":1593},{"name":"get_next_lock_id","outputs":[{"type":"int128","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1391},{"name":"lock_history","outputs":[{"type":"uint256","name":"amount"},{"type":"address","name":"user"},{"type":"uint256","name":"createdAt"},{"type":"uint256","name":"endTime"}],"inputs":[{"type":"int128","name":"_index"}],"stateMutability":"view","type":"function","gas":5124},{"name":"checkpoint","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37052522},{"name":"deposit_for","outputs":[],"inputs":[{"type":"address","name":"_addr"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":77554101},{"name":"create_lock","outputs":[],"inputs":[{"type":"uint256","name":"_value"},{"type":"uint256","name":"_unlock_time"}],"stateMutability":"nonpayable","type":"function","gas":77555675},{"name":"increase_amount","outputs":[],"inputs":[{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":77555040},{"name":"increase_unlock_time","outputs":[],"inputs":[{"type":"uint256","name":"_unlock_time"}],"stateMutability":"nonpayable","type":"function","gas":77555788},{"name":"withdraw","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37223746},{"name":"balanceOf","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"view","type":"function","gas":6435},{"name":"balanceOfAt","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"addr"},{"type":"uint256","name":"_block"}],"stateMutability":"view","type":"function","gas":514273},{"name":"totalSupply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":559466},{"name":"totalSupplyAt","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_block"}],"stateMutability":"view","type":"function","gas":812590},{"name":"changeController","outputs":[],"inputs":[{"type":"address","name":"_newController"}],"stateMutability":"nonpayable","type":"function","gas":36997},{"name":"token","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1931},{"name":"supply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1961},{"name":"nextIdLock","outputs":[{"type":"int128","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1991},{"name":"locks","outputs":[{"type":"uint256","name":"amount"},{"type":"address","name":"user"},{"type":"uint256","name":"createdAt"},{"type":"uint256","name":"endTime"}],"inputs":[{"type":"int128","name":"arg0"}],"stateMutability":"view","type":"function","gas":5724},{"name":"locked","outputs":[{"type":"int128","name":"amount"},{"type":"uint256","name":"end"}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":3509},{"name":"epoch","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2081},{"name":"point_history","outputs":[{"type":"int128","name":"bias"},{"type":"int128","name":"slope"},{"type":"uint256","name":"ts"},{"type":"uint256","name":"blk"}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":5700},{"name":"user_point_history","outputs":[{"type":"int128","name":"bias"},{"type":"int128","name":"slope"},{"type":"uint256","name":"ts"},{"type":"uint256","name":"blk"}],"inputs":[{"type":"address","name":"arg0"},{"type":"uint256","name":"arg1"}],"stateMutability":"view","type":"function","gas":6229},{"name":"user_point_epoch","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":2325},{"name":"slope_changes","outputs":[{"type":"int128","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2316},{"name":"controller","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2231},{"name":"transfersEnabled","outputs":[{"type":"bool","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2261},{"name":"name","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":8693},{"name":"symbol","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":7746},{"name":"version","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":7776},{"name":"decimals","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2381},{"name":"future_smart_wallet_checker","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2411},{"name":"smart_wallet_checker","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2441},{"name":"admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2471},{"name":"future_admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2501}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526020613dd46101403934156100a157600080fd5b6020613dd460c03960c05160205181106100ba57600080fd5b503360125561014051600055436003600660c052602060c02060c052602060c0200155426002600660c052602060c02060c052602060c020015533600a556001600b5560206101e0600463313ce5676101805261019c610140515afa61011f57600080fd5b601f3d1161012c57600080fd5b6000506101e0516101605260ff61016051111561014857600080fd5b61016051600f556012610200527f566f74652d657363726f776564204d4f424c00000000000000000000000000006102205261020080600c60c052602060c020602082510161012060006002818352015b826101205160200211156101ac576101ce565b61012051602002850151610120518501555b8151600101808352811415610199575b5050505050506006610260527f56654d4f424c00000000000000000000000000000000000000000000000000006102805261026080600d60c052602060c020602082510161012060006002818352015b8261012051602002111561023157610253565b61012051602002850151610120518501555b815160010180835281141561021e575b50505050505060036102c0527f312e3000000000000000000000000000000000000000000000000000000000006102e0526102c080600e60c052602060c020602082510161012060006002818352015b826101205160200211156102b6576102d8565b61012051602002850151610120518501555b81516001018083528114156102a3575b5050505050506000600255613dbc56600436101561000d57613ace565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052636b441a4060005114156101105734156100ba57600080fd5b60043560205181106100cb57600080fd5b5060125433146100da57600080fd5b600435601355600435610140527f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e96020610140a1005b636a1c05ae600051141561018657341561012957600080fd5b601254331461013757600080fd5b601354610140526000610140511861014e57600080fd5b6101405160125561014051610160527febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056020610160a1005b6357f901e260005114156101c757341561019f57600080fd5b60043560205181106101b057600080fd5b5060125433146101bf57600080fd5b600435601055005b638e5b490f60005114156101f65734156101e057600080fd5b60125433146101ee57600080fd5b601054601155005b6000156102e7575b6101605261014052326101405118156102e157601154610180526000610180511815610270576020610220602463c23697a86101a052610140516101c0526101bc6000610180515af161025057600080fd5b601f3d1161025d57600080fd5b600050610220511561026f5761016051565b5b6308c379a06102605260206102805260256102a0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c6102c0527f6c6f7765640000000000000000000000000000000000000000000000000000006102e0526102a05060006102e057608461027cfd5b5b61016051565b637c74a174600051141561036b57341561030057600080fd5b600435602051811061031157600080fd5b50600860043560e05260c052604060c0205461014052600161014051633b9aca00811061033d57600080fd5b600760043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f350005b63da020a1860005114156103d957341561038457600080fd5b600435602051811061039557600080fd5b506002602435633b9aca0081106103ab57600080fd5b600760043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f350005b63adc63589600051141561042b5734156103f257600080fd5b600435602051811061040357600080fd5b506001600460043560e05260c052604060c02060c052602060c020015460005260206000f350005b63aa4635a3600051141561045257341561044457600080fd5b60025460005260206000f350005b63b4540047600051141561053e57341561046b57600080fd5b6060516004358060405190131561048157600080fd5b809190121561048f57600080fd5b50610140808080600360043560e05260c052604060c02060c052602060c020548152505060208101905080806001600360043560e05260c052604060c02060c052602060c02001548152505060208101905080806002600360043560e05260c052604060c02060c052602060c02001548152505060208101905080806003600360043560e05260c052604060c02060c052602060c02001548152505060809050905060c05260c051610140f350005b600015610e46575b6101e0526101405261016052610180526101a0526101c052608036610200376080366102803760006103005260006103205260055461034052600061014051181561074f57426101805111156105a257600061016051136105a5565b60005b156106425761016051630784ce0060605181806105c157600080fd5b8305806040519013156105d357600080fd5b80919012156105e157600080fd5b9050905061022052610220516101805142808210156105ff57600080fd5b8082039050905060405181111561061557600080fd5b6060518183028060405190131561062b57600080fd5b809190121561063957600080fd5b90509050610200525b426101c05111156106595760006101a0511361065c565b60005b156106f9576101a051630784ce00606051818061067857600080fd5b83058060405190131561068a57600080fd5b809190121561069857600080fd5b905090506102a0526102a0516101c05142808210156106b657600080fd5b808203905090506040518111156106cc57600080fd5b606051818302806040519013156106e257600080fd5b80919012156106f057600080fd5b90509050610280525b60096101805160e05260c052604060c020546103005260006101c051181561074e57610180516101c051141561073657610300516103205261074d565b60096101c05160e05260c052604060c02054610320525b5b5b61036060008152600081602001524281604001524381606001525060006103405111156107e657610360610340516c01431e0fae6d7217caa0000000811061079657600080fd5b600660c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250505b6103a0516103e0526104006103608051825280602001518260200152806040015182604001528060600151826060015250506000610480526103a05142111561089557670de0b6b3a7640000436103c0518082101561084457600080fd5b80820390509050808202821582848304141761085f57600080fd5b80905090509050426103a0518082101561087857600080fd5b80820390509050808061088a57600080fd5b820490509050610480525b6103e05162093a8080806108a857600080fd5b82049050905062093a8080820282158284830414176108c657600080fd5b809050905090506104a0526104c0600060ff818352015b6104a0805162093a808181830110156108f557600080fd5b8082019050905081525060006104e052426104a051111561091a57426104a052610931565b60096104a05160e05260c052604060c020546104e0525b6103608051610380516104a0516103e0518082101561094f57600080fd5b8082039050905060405181111561096557600080fd5b6060518183028060405190131561097b57600080fd5b809190121561098957600080fd5b90509050606051818303806040519013156109a357600080fd5b80919012156109b157600080fd5b9050905081525061038080516104e051606051818301806040519013156109d757600080fd5b80919012156109e557600080fd5b9050905081525060006103605112156109ff576000610360525b6000610380511215610a12576000610380525b6104a0516103e0526104a0516103a05261046051610480516104a0516104405180821015610a3f57600080fd5b808203905090508082028215828483041417610a5a57600080fd5b80905090509050670de0b6b3a76400008080610a7557600080fd5b820490509050818183011015610a8a57600080fd5b808201905090506103c05261034080516001818183011015610aab57600080fd5b80820190509050815250426104a0511415610ace57436103c052610b3756610b26565b610340516c01431e0fae6d7217caa00000008110610aeb57600080fd5b600660c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550505b5b81516001018083528114156108dd575b5050610340516005556000610140511815610c335761038080516102a0516102205160605181830380604051901315610b6f57600080fd5b8091901215610b7d57600080fd5b9050905060605181830180604051901315610b9757600080fd5b8091901215610ba557600080fd5b905090508152506103608051610280516102005160605181830380604051901315610bcf57600080fd5b8091901215610bdd57600080fd5b9050905060605181830180604051901315610bf757600080fd5b8091901215610c0557600080fd5b905090508152506000610380511215610c1f576000610380525b6000610360511215610c32576000610360525b5b610340516c01431e0fae6d7217caa00000008110610c5057600080fd5b600660c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550506000610140511815610e405742610180511115610d2f5761030080516102205160605181830180604051901315610cc057600080fd5b8091901215610cce57600080fd5b90509050815250610180516101c0511415610d185761030080516102a05160605181830380604051901315610d0257600080fd5b8091901215610d1057600080fd5b905090508152505b6103005160096101805160e05260c052604060c020555b426101c0511115610d9457610180516101c0511115610d935761032080516102a05160605181830380604051901315610d6757600080fd5b8091901215610d7557600080fd5b905090508152506103205160096101c05160e05260c052604060c020555b5b60086101405160e05260c052604060c020546001818183011015610db757600080fd5b80820190509050610500526105005160086101405160e05260c052604060c02055426102c052436102e05261050051633b9aca008110610df657600080fd5b60076101405160e05260c052604060c02060c052602060c0200160c052602060c0206102808051825580602001516001830155806040015160028301558060600151600383015550505b6101e051565b600015610f65575b61018052610140526101605260006101a052610160516101c0526101e060006080818352015b6101c0516101a051101515610e8857610f51565b6101a0516101c051818183011015610e9f57600080fd5b808201905090506001818183011015610eb757600080fd5b8082019050905060028080610ecb57600080fd5b82049050905061020052610140516003610200516c01431e0fae6d7217caa00000008110610ef857600080fd5b600660c052602060c0200160c052602060c0200154111515610f2157610200516101a052610f40565b61020051600180821015610f3457600080fd5b808203905090506101c0525b5b8151600101808352811415610e74575b50506101a051600052600051610180515650005b60001561146f575b61018052610140526101605243610160511115610f8957600080fd5b60006101a05260086101405160e05260c052604060c020546101c0526101e060006080818352015b6101c0516101a051101515610fc557611094565b6101a0516101c051818183011015610fdc57600080fd5b808201905090506001818183011015610ff457600080fd5b808201905090506002808061100857600080fd5b8204905090506102005261016051600361020051633b9aca00811061102c57600080fd5b60076101405160e05260c052604060c02060c052602060c0200160c052602060c020015411151561106457610200516101a052611083565b6102005160018082101561107757600080fd5b808203905090506101c0525b5b8151600101808352811415610fb1575b50506102206101a051633b9aca0081106110ad57600080fd5b60076101405160e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506005546102a0526101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561113c5761111a565b61016051610300526102a05161032052610320516103005160065801610e4e565b610380526102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561118c57611169565b610380516102c0526103a06102c0516c01431e0fae6d7217caa000000081106111b457600080fd5b600660c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506000610420526000610440526102a0516102c05110156112e9576104606102c051600181818301101561123557600080fd5b808201905090506c01431e0fae6d7217caa0000000811061125557600080fd5b600660c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506104c05161040051808210156112b957600080fd5b80820390509050610420526104a0516103e051808210156112d957600080fd5b8082039050905061044052611324565b4361040051808210156112fb57600080fd5b8082039050905061042052426103e0518082101561131857600080fd5b80820390509050610440525b6103e0516104e05260006104205118156113a7576104e080516104405161016051610400518082101561135657600080fd5b80820390509050808202821582848304141761137157600080fd5b8090509050905061042051808061138757600080fd5b82049050905081818301101561139c57600080fd5b808201905090508152505b6102208051610240516104e05161026051808210156113c557600080fd5b808203905090506040518111156113db57600080fd5b606051818302806040519013156113f157600080fd5b80919012156113ff57600080fd5b905090506060518183038060405190131561141957600080fd5b809190121561142757600080fd5b9050905081525060006102205112151561145e5761022051600081121561144d57600080fd5b60005260005161018051565061146d565b60006000526000516101805156505b005b6000156118c8575b610200526101405261016052610180526101a0526101c0526101e0526102206101a0805182528060200151826020015250506001546102605261026051610160518181830110156114c757600080fd5b80820190509050600155610280610220805182528060200151826020015250506102208051610160516040518111156114ff57600080fd5b6060518183018060405190131561151557600080fd5b809190121561152357600080fd5b90509050815250600061018051181561153f5761018051610240525b600360025460e05260c052604060c02060c052602060c020610160518155610140516001820155426002820155610180516003820155506002805460016060518183018060405190131561159257600080fd5b80919012156115a057600080fd5b9050905081555060046101405160e05260c052604060c02060c052602060c020610220805182558060200151600183015550506101406102c0525b6102c0515160206102c051016102c0526102c06102c05110156115fd576115db565b610140516102e0526103006102808051825280602001518260200152505061034061022080518252806020015182602001525050610360516103405161032051610300516102e05160065801610546565b6102a06102c0525b6102c0515260206102c051036102c0526101406102c05110151561167957611656565b60005060006101605118156116de57602061048060646323b872dd6103c052610140516103e052306104005261016051610420526103dc60006000545af16116c057600080fd5b601f3d116116cd57600080fd5b600050610480516116dd57600080fd5b5b610160516104a0526101e0516104c052426104e05261024051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d5960606104a0a36102605161050052610260516101605181818301101561174157600080fd5b80820190509050610520527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6040610500a1610140610560525b6105605151602061056051016105605261056061056051101561179d5761177b565b6101405161058052436105a0526105a0516105805160065801610f6d565b61060052610540610560525b61056051526020610560510361056052610140610560511015156117ea576117c7565b61060051610140610620525b61062051516020610620510161062052610620610620511015611818576117f6565b61014051610640524360018082101561183057600080fd5b8082039050905061066052610660516106405160065801610f6d565b6106c052610600610620525b610620515260206106205103610620526101406106205110151561187b57611858565b6106c0518082101561188c57600080fd5b8082039050905061054052610140517f50af8709af3fe0c9e2a58b31f829fba5687e6460a12d4355c7f653a3680e1e476020610540a261020051565b63c2c4c5c160005114156119175734156118e157600080fd5b600061014052604036610160376040366101a0376101c0516101a05161018051610160516101405160065801610546565b600050005b633a46273e6000511415611b2d5762ffffff541561193457600080fd5b600162ffffff55341561194657600080fd5b600435602051811061195757600080fd5b50610140600460043560e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060006024351161199a57600080fd5b6308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050600061014051136119ea57606461019cfd5b6308c379a0610220526020610240526024610260527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610280527f64726177000000000000000000000000000000000000000000000000000000006102a05261026050426101605111611a5e57608461023cfd5b6101406102e0525b6102e0515160206102e051016102e0526102e06102e0511015611a8857611a66565b6004356103005260243561032052600061034052610360600460043560e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060006103a0526103a051610380516103605161034051610320516103005160065801611477565b6102c06102e0525b6102e0515260206102e051036102e0526101406102e051101515611b2157611afe565b600050600062ffffff55005b6365fc38736000511415611dcb5762ffffff5415611b4a57600080fd5b600162ffffff553415611b5c57600080fd5b336101405261014051600658016101fe565b60005060243562093a808080611b8357600080fd5b82049050905062093a808082028215828483041417611ba157600080fd5b809050905090506101a0526101c060043360e05260c052604060c0208060c052602060c02054825260018160c052602060c020015482602001525050600060043511611bec57600080fd5b6308c379a0610200526020610220526019610240527f5769746864726177206f6c6420746f6b656e732066697273740000000000000061026052610240506101c05115611c3a57606461021cfd5b6308c379a06102a05260206102c05260266102e0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610300527f6675747572650000000000000000000000000000000000000000000000000000610320526102e050426101a05111611cae5760846102bcfd5b6308c379a061036052602061038052601e6103a0527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006103c0526103a05042630784ce00818183011015611d0157600080fd5b808201905090506101a0511115611d1957606461037cfd5b610140610400525b61040051516020610400510161040052610400610400511015611d4357611d21565b3361042052600435610440526101a051610460526104806101c08051825280602001518260200152505060016104c0526104c0516104a0516104805161046051610440516104205160065801611477565b6103e0610400525b6104005152602061040051036104005261014061040051101515611dbf57611d9c565b600050600062ffffff55005b634957677c6000511415611fc35762ffffff5415611de857600080fd5b600162ffffff553415611dfa57600080fd5b336101405261014051600658016101fe565b6000506101a060043360e05260c052604060c0208060c052602060c02054825260018160c052602060c020015482602001525050600060043511611e4f57600080fd5b6308c379a06101e0526020610200526016610220527f4e6f206578697374696e67206c6f636b20666f756e6400000000000000000000610240526102205060006101a05113611e9f5760646101fcfd5b6308c379a06102805260206102a05260246102c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686102e0527f6472617700000000000000000000000000000000000000000000000000000000610300526102c050426101c05111611f1357608461029cfd5b610140610340525b61034051516020610340510161034052610340610340511015611f3d57611f1b565b33610360526004356103805260006103a0526103c06101a080518252806020015182602001525050600261040052610400516103e0516103c0516103a051610380516103605160065801611477565b610320610340525b6103405152602061034051036103405261014061034051101515611fb757611f94565b600050600062ffffff55005b63eff7a61260005114156122805762ffffff5415611fe057600080fd5b600162ffffff553415611ff257600080fd5b336101405261014051600658016101fe565b6000506101a060043360e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060043562093a80808061204a57600080fd5b82049050905062093a80808202821582848304141761206857600080fd5b809050905090506101e0526308c379a061020052602061022052600c610240527f4c6f636b206578706972656400000000000000000000000000000000000000006102605261024050426101c051116120c257606461021cfd5b6308c379a06102a05260206102c05260116102e0527f4e6f7468696e67206973206c6f636b6564000000000000000000000000000000610300526102e05060006101a051136121125760646102bcfd5b6308c379a061034052602061036052601f610380527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006103a052610380506101c0516101e0511161216457606461035cfd5b6308c379a06103e052602061040052601e610420527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610440526104205042630784ce008181830110156121b757600080fd5b808201905090506101e05111156121cf5760646103fcfd5b610140610480525b610480515160206104805101610480526104806104805110156121f9576121d7565b336104a05260006104c0526101e0516104e0526105006101a0805182528060200151826020015250506003610540526105405161052051610500516104e0516104c0516104a05160065801611477565b610460610480525b610480515260206104805103610480526101406104805110151561227457612251565b600050600062ffffff55005b633ccfd60b60005114156125375762ffffff541561229d57600080fd5b600162ffffff5534156122af57600080fd5b61014060043360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101805260206101a05260166101c0527f546865206c6f636b206469646e277420657870697265000000000000000000006101e0526101c0506101605142101561233057606461019cfd5b61014051600081121561234257600080fd5b610220526102406101408051825280602001518260200152505060006101605260006101405260043360e05260c052604060c02060c052602060c02061014080518255806020015160018301555050600154610280526102805161022051808210156123ad57600080fd5b808203905090506001556101406102a0525b6102a0515160206102a051016102a0526102a06102a05110156123e1576123bf565b336102c0526102e061024080518252806020015182602001525050610320610140805182528060200151826020015250506103405161032051610300516102e0516102c05160065801610546565b6102806102a0525b6102a0515260206102a051036102a0526101406102a05110151561245a57612437565b6000506020610440604463a9059cbb6103a052336103c052610220516103e0526103bc60006000545af161248d57600080fd5b601f3d1161249a57600080fd5b600050610440516124aa57600080fd5b61022051610460524261048052337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686040610460a2610280516104a0526102805161022051808210156124fc57600080fd5b808203905090506104c0527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c60406104a0a1600062ffffff55005b6370a0823160005114156126c257341561255057600080fd5b600435602051811061256157600080fd5b504261014052600860043560e05260c052604060c020546101605261016051151561259657600060005260206000f3506126c0565b61018061016051633b9aca0081106125ad57600080fd5b600760043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505061018080516101a051610140516101c0518082101561262857600080fd5b8082039050905060405181111561263e57600080fd5b6060518183028060405190131561265457600080fd5b809190121561266257600080fd5b905090506060518183038060405190131561267c57600080fd5b809190121561268a57600080fd5b9050905081525060006101805112156126a4576000610180525b6101805160008112156126b657600080fd5b60005260206000f3505b005b634ee2cd7e6000511415612bd15734156126db57600080fd5b60043560205181106126ec57600080fd5b504360243511156126fc57600080fd5b600061014052600860043560e05260c052604060c020546101605261018060006080818352015b610160516101405110151561273757612804565b610140516101605181818301101561274e57600080fd5b80820190509050600181818301101561276657600080fd5b808201905090506002808061277a57600080fd5b8204905090506101a05260243560036101a051633b9aca00811061279d57600080fd5b600760043560e05260c052604060c02060c052602060c0200160c052602060c02001541115156127d4576101a051610140526127f3565b6101a0516001808210156127e757600080fd5b80820390509050610160525b5b8151600101808352811415612723575b50506101c061014051633b9aca00811061281d57600080fd5b600760043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050600554610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516024356102a052610240516102c0526102c0516102a05160065801610e4e565b61032052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103205161026052610340610260516c01431e0fae6d7217caa0000000811061291d57600080fd5b600660c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006103c05260006103e05261024051610260511015612a525761040061026051600181818301101561299e57600080fd5b808201905090506c01431e0fae6d7217caa000000081106129be57600080fd5b600660c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610460516103a05180821015612a2257600080fd5b808203905090506103c052610440516103805180821015612a4257600080fd5b808203905090506103e052612a8d565b436103a05180821015612a6457600080fd5b808203905090506103c052426103805180821015612a8157600080fd5b808203905090506103e0525b610380516104805260006103c0511815612b0f5761048080516103e0516024356103a05180821015612abe57600080fd5b808203905090508082028215828483041417612ad957600080fd5b809050905090506103c0518080612aef57600080fd5b820490509050818183011015612b0457600080fd5b808201905090508152505b6101c080516101e051610480516102005180821015612b2d57600080fd5b80820390509050604051811115612b4357600080fd5b60605181830280604051901315612b5957600080fd5b8091901215612b6757600080fd5b9050905060605181830380604051901315612b8157600080fd5b8091901215612b8f57600080fd5b9050905081525060006101c051121515612bc3576101c0516000811215612bb557600080fd5b60005260206000f350612bcf565b600060005260206000f3505b005b600015612dd9575b6101e0526101405261016052610180526101a0526101c0526102006101408051825280602001518260200152806040015182604001528060600151826060015250506102405162093a808080612c2e57600080fd5b82049050905062093a808082028215828483041417612c4c57600080fd5b80905090509050610280526102a0600060ff818352015b610280805162093a80818183011015612c7b57600080fd5b8082019050905081525060006102c0526101c051610280511115612ca6576101c05161028052612cbd565b60096102805160e05260c052604060c020546102c0525b610200805161022051610280516102405180821015612cdb57600080fd5b80820390509050604051811115612cf157600080fd5b60605181830280604051901315612d0757600080fd5b8091901215612d1557600080fd5b9050905060605181830380604051901315612d2f57600080fd5b8091901215612d3d57600080fd5b905090508152506101c051610280511415612d5757612da4565b61022080516102c05160605181830180604051901315612d7657600080fd5b8091901215612d8457600080fd5b9050905081525061028051610240525b8151600101808352811415612c63575b50506000610200511215612db9576000610200525b610200516000811215612dcb57600080fd5b6000526000516101e0515650005b6318160ddd6000511415612eff573415612df257600080fd5b426101405260055461016052610180610160516c01431e0fae6d7217caa00000008110612e1e57600080fd5b600660c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101405161016051610180516101a0516101c0516101e051610220610180805182528060200151826020015280604001518260400152806060015182606001525050610140516102a0526102a0516102805161026051610240516102205160065801612bd9565b610300526101e0526101c0526101a0526101805261016052610140526103005160005260206000f350005b63981b24d06000511415613266573415612f1857600080fd5b436004351115612f2757600080fd5b6005546101405261014051610160516004356101a052610140516101c0526101c0516101a05160065801610e4e565b6102205261016052610140526102205161016052610240610160516c01431e0fae6d7217caa00000008110612f8a57600080fd5b600660c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006102c0526101405161016051101561310b576102e061016051600181818301101561300557600080fd5b808201905090506c01431e0fae6d7217caa0000000811061302557600080fd5b600660c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610340516102a0511815613106576004356102a0518082101561309657600080fd5b808203905090506103205161028051808210156130b257600080fd5b8082039050905080820282158284830414176130cd57600080fd5b80905090509050610340516102a051808210156130e957600080fd5b8082039050905080806130fb57600080fd5b8204905090506102c0525b613195565b436102a0511815613194576004356102a0518082101561312a57600080fd5b8082039050905042610280518082101561314357600080fd5b80820390509050808202821582848304141761315e57600080fd5b80905090509050436102a0518082101561317757600080fd5b80820390509050808061318957600080fd5b8204905090506102c0525b5b610140610360525b610360515160206103605101610360526102e06103605110156131bf5761319d565b610380610240805182528060200151826020015280604001518260400152806060015182606001525050610280516102c05181818301101561320057600080fd5b8082019050905061040052610400516103e0516103c0516103a0516103805160065801612bd9565b610460526102c0610360525b610360515260206103605103610360526101406103605110151561325757613234565b6104605160005260206000f350005b633cebb82360005114156132a757341561327f57600080fd5b600435602051811061329057600080fd5b50600a54331461329f57600080fd5b600435600a55005b63fc0c546a60005114156132ce5734156132c057600080fd5b60005460005260206000f350005b63047fc9aa60005114156132f55734156132e757600080fd5b60015460005260206000f350005b635786fa56600051141561331c57341561330e57600080fd5b60025460005260206000f350005b63024a3d1a600051141561340857341561333557600080fd5b6060516004358060405190131561334b57600080fd5b809190121561335957600080fd5b50610140808080600360043560e05260c052604060c02060c052602060c020548152505060208101905080806001600360043560e05260c052604060c02060c052602060c02001548152505060208101905080806002600360043560e05260c052604060c02060c052602060c02001548152505060208101905080806003600360043560e05260c052604060c02060c052602060c02001548152505060809050905060c05260c051610140f350005b63cbf9fe5f600051141561349157341561342157600080fd5b600435602051811061343257600080fd5b50610140808080600460043560e05260c052604060c02060c052602060c020548152505060208101905080806001600460043560e05260c052604060c02060c052602060c02001548152505060409050905060c05260c051610140f350005b63900cf0cf60005114156134b85734156134aa57600080fd5b60055460005260206000f350005b63d1febfb960005114156135db5734156134d157600080fd5b6101408080806004356c01431e0fae6d7217caa000000081106134f357600080fd5b600660c052602060c0200160c052602060c0205481525050602081019050808060016004356c01431e0fae6d7217caa0000000811061353157600080fd5b600660c052602060c0200160c052602060c020015481525050602081019050808060026004356c01431e0fae6d7217caa0000000811061357057600080fd5b600660c052602060c0200160c052602060c020015481525050602081019050808060036004356c01431e0fae6d7217caa000000081106135af57600080fd5b600660c052602060c0200160c052602060c02001548152505060809050905060c05260c051610140f350005b6328d09d4760005114156137245734156135f457600080fd5b600435602051811061360557600080fd5b50610140808080602435633b9aca00811061361f57600080fd5b600760043560e05260c052604060c02060c052602060c0200160c052602060c020548152505060208101905080806001602435633b9aca00811061366257600080fd5b600760043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060208101905080806002602435633b9aca0081106136a657600080fd5b600760043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060208101905080806003602435633b9aca0081106136ea57600080fd5b600760043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060809050905060c05260c051610140f350005b63010ae757600051141561376b57341561373d57600080fd5b600435602051811061374e57600080fd5b50600860043560e05260c052604060c0205460005260206000f350005b637119748460005114156137a057341561378457600080fd5b600960043560e05260c052604060c0205460005260206000f350005b63f77c479160005114156137c75734156137b957600080fd5b600a5460005260206000f350005b63bef97c8760005114156137ee5734156137e057600080fd5b600b5460005260206000f350005b6306fdde0360005114156138a257341561380757600080fd5b600c8060c052602060c020610180602082540161012060006003818352015b826101205160200211156138395761385b565b61012051850154610120516020028501525b8151600101808352811415613826575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b4160005114156139565734156138bb57600080fd5b600d8060c052602060c020610180602082540161012060006002818352015b826101205160200211156138ed5761390f565b61012051850154610120516020028501525b81516001018083528114156138da575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6354fd4d506000511415613a0a57341561396f57600080fd5b600e8060c052602060c020610180602082540161012060006002818352015b826101205160200211156139a1576139c3565b61012051850154610120516020028501525b815160010180835281141561398e575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce5676000511415613a31573415613a2357600080fd5b600f5460005260206000f350005b638ff36fd16000511415613a58573415613a4a57600080fd5b60105460005260206000f350005b637175d4f76000511415613a7f573415613a7157600080fd5b60115460005260206000f350005b63f851a4406000511415613aa6573415613a9857600080fd5b60125460005260206000f350005b6317f7182a6000511415613acd573415613abf57600080fd5b60135460005260206000f350005b5b60006000fd5b6102e8613dbc036102e86000396102e8613dbc036000f30000000000000000000000005fef39b578deeefa4485a7e5944c7691677d5dd4

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

0000000000000000000000005fef39b578deeefa4485a7e5944c7691677d5dd4

-----Decoded View---------------
Arg [0] : token_addr (address): 0x5fef39b578deeefa4485a7e5944c7691677d5dd4

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005fef39b578deeefa4485a7e5944c7691677d5dd4


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.