ETH Price: $2,682.85 (-1.84%)

Contract

0x6021D8e7537d68bCEC9A438b2C134c24Cbcc1ce3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Create_lock203870652024-07-26 0:13:23207 days ago1721952803IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.000838442.48239594
Withdraw203870622024-07-26 0:12:47207 days ago1721952767IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.00571122.63817379
Increase_unlock_...193512282024-03-03 1:01:59352 days ago1709427719IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0105804341.9535443
Create_lock193502012024-03-02 21:35:11352 days ago1709415311IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0157803146.72258388
Withdraw193501972024-03-02 21:34:23352 days ago1709415263IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0165204640.64054174
Withdraw192534352024-02-18 8:14:35366 days ago1708244075IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.009830719.07574664
Withdraw191118132024-01-29 11:13:23385 days ago1706526803IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0036499910.99881602
Withdraw190674852024-01-23 6:06:23392 days ago1705989983IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0156106314.67378689
Withdraw186034532023-11-19 4:23:23457 days ago1700367803IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0095533715.73607904
Withdraw184132802023-10-23 13:31:23483 days ago1698067883IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0061362625.5566992
Withdraw183784612023-10-18 16:35:35488 days ago1697646935IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0039198716.32573739
Increase_amount183459722023-10-14 3:33:59493 days ago1697254439IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.002853795.13299349
Withdraw181601872023-09-18 3:32:23519 days ago1695007943IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.00198898.28350427
Withdraw181305112023-09-13 22:59:23523 days ago1694645963IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.002294389.55578269
Withdraw180985862023-09-09 11:38:35527 days ago1694259515IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0033252310.02021633
Withdraw180417872023-09-01 12:45:23535 days ago1693572323IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0044952813.62813477
Withdraw180093582023-08-27 23:46:11540 days ago1693179971IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0091440313.08442182
Withdraw177672152023-07-25 2:44:23574 days ago1690253063IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0068567430.74717877
Increase_amount177308312023-07-20 0:32:59579 days ago1689813179IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0043870315.36484089
Increase_unlock_...177308192023-07-20 0:30:35579 days ago1689813035IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0053509915.34366819
Create_lock177266582023-07-19 10:31:59579 days ago1689762719IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0050069115.6151482
Withdraw177266552023-07-19 10:31:23579 days ago1689762683IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0053394516.08983101
Withdraw176435752023-07-07 18:02:35591 days ago1688752955IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0112763546.96444327
Withdraw176423562023-07-07 13:55:11591 days ago1688738111IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.0108016832.54961635
Withdraw176085942023-07-02 20:06:47596 days ago1688328407IN
0x6021D8e7...4Cbcc1ce3
0 ETH0.004113712.39617715
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
145916392022-04-15 18:40:401039 days ago1650048040  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.4

Optimization Enabled:
N/A

Other Settings:
default evmVersion, 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


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 Shutdown:
    pass

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 Delegate:
    user: address
    delegate: address 


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)

# Functionality added to original Curve contract:

# 1) allow complete shutdown of this contract while
# allowing users to withdraw their locked deposits
is_shutdown: public(bool)

# 2) allow delegation for the `create_lock` functionality
# via a slightly modified `create_lock_for` function.
delegate_for: public(HashMap[address, 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

    self.is_shutdown = False


@external
def shutdown():
    """
    @notice Disable deposits but allow withdrawals regardless of lock

    Extension to original VotingEscrow
    """
    assert msg.sender == self.admin, "Admin only"  # dev: admin only
    self.is_shutdown = True
    log Shutdown()


@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
def assign_delegate(addr: address):
    """
    @notice Assign `addr` the power to create locks for `msg.sender`
    @param addr Address of lock delegate

    Extension to original VotingEscrow
    """
    self.delegate_for[msg.sender] = addr
    log Delegate(msg.sender, addr)


@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 not self.is_shutdown, "Contract is shutdown"
    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 not self.is_shutdown, "Contract is shutdown"
    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 create_lock_for(_addr: address, _value: uint256, _unlock_time: uint256):
    """
    @notice Deposit `_value` tokens for `_addr` and lock until `_unlock_time`
    @param _addr Address lock is for
    @param _value Amount to deposit
    @param _unlock_time Epoch time when tokens unlock, rounded down to whole weeks

    Extension to original VotingEscrow
    """
    unlock_time: uint256 = (_unlock_time / WEEK) * WEEK  # Locktime is rounded down to weeks
    _locked: LockedBalance = self.locked[_addr]

    assert not self.is_shutdown, "Contract is shutdown"
    assert msg.sender == self.delegate_for[_addr], "Delegate only"
    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(_addr, _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 not self.is_shutdown, "Contract is shutdown"
    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 not self.is_shutdown, "Contract is shutdown"
    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 or self.is_shutdown, "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
    if not self.is_shutdown:
        self._checkpoint(msg.sender, old_locked, _locked)

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

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


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

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


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


@external
@view
def balanceOfAt(addr: address, _block: uint256) -> uint256:
    """
    @notice Measure voting power of `addr` at block height `_block`
    @dev Adheres to MiniMe `balanceOfAt` interface: https://github.com/Giveth/minime
    @param addr User's wallet address
    @param _block Block to calculate the voting power at
    @return Voting power
    """
    # Copying and pasting totalSupply code because Vyper cannot pass by
    # reference yet
    assert _block <= block.number

    # Binary search
    _min: uint256 = 0
    _max: uint256 = self.user_point_epoch[addr]
    for i in range(128):  # Will be always enough for 128-bit numbers
        if _min >= _max:
            break
        _mid: uint256 = (_min + _max + 1) / 2
        if self.user_point_history[addr][_mid].blk <= _block:
            _min = _mid
        else:
            _max = _mid - 1

    upoint: Point = self.user_point_history[addr][_min]

    max_epoch: uint256 = self.epoch
    _epoch: uint256 = self.find_block_epoch(_block, max_epoch)
    point_0: Point = self.point_history[_epoch]
    d_block: uint256 = 0
    d_t: uint256 = 0
    if _epoch < max_epoch:
        point_1: Point = self.point_history[_epoch + 1]
        d_block = point_1.blk - point_0.blk
        d_t = point_1.ts - point_0.ts
    else:
        d_block = block.number - point_0.blk
        d_t = block.timestamp - point_0.ts
    block_time: uint256 = point_0.ts
    if d_block != 0:
        block_time += d_t * (_block - point_0.blk) / d_block

    upoint.bias -= upoint.slope * convert(block_time - upoint.ts, int128)
    if upoint.bias >= 0:
        return convert(upoint.bias, uint256)
    else:
        return 0


@internal
@view
def supply_at(point: Point, t: uint256) -> uint256:
    """
    @notice Calculate total voting power at some point in the past
    @param point The point (bias/slope) to start search from
    @param t Time to calculate the total voting power at
    @return Total voting power at that time
    """
    last_point: Point = point
    t_i: uint256 = (last_point.ts / WEEK) * WEEK
    for i in range(255):
        t_i += WEEK
        d_slope: int128 = 0
        if t_i > t:
            t_i = t
        else:
            d_slope = self.slope_changes[t_i]
        last_point.bias -= last_point.slope * convert(t_i - last_point.ts, int128)
        if t_i == t:
            break
        last_point.slope += d_slope
        last_point.ts = t_i

    if last_point.bias < 0:
        last_point.bias = 0
    return convert(last_point.bias, uint256)


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


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

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

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


# Dummy methods for compatibility with Aragon

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

Contract Security Audit

Contract ABI

[{"name":"Shutdown","inputs":[],"anonymous":false,"type":"event"},{"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":"Delegate","inputs":[{"type":"address","name":"user","indexed":false},{"type":"address","name":"delegate","indexed":false}],"anonymous":false,"type":"event"},{"outputs":[],"inputs":[{"type":"address","name":"token_addr"},{"type":"string","name":"_name"},{"type":"string","name":"_symbol"},{"type":"string","name":"_version"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"shutdown","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37026},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function","gas":37627},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":38527},{"name":"commit_smart_wallet_checker","outputs":[],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function","gas":36337},{"name":"apply_smart_wallet_checker","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37125},{"name":"assign_delegate","outputs":[],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function","gas":37582},{"name":"get_last_user_slope","outputs":[{"type":"int128","name":""}],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"view","type":"function","gas":2629},{"name":"user_point_history__ts","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_addr"},{"type":"uint256","name":"_idx"}],"stateMutability":"view","type":"function","gas":1732},{"name":"locked__end","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_addr"}],"stateMutability":"view","type":"function","gas":1653},{"name":"checkpoint","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37052462},{"name":"deposit_for","outputs":[],"inputs":[{"type":"address","name":"_addr"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":74281084},{"name":"create_lock","outputs":[],"inputs":[{"type":"uint256","name":"_value"},{"type":"uint256","name":"_unlock_time"}],"stateMutability":"nonpayable","type":"function","gas":74282689},{"name":"create_lock_for","outputs":[],"inputs":[{"type":"address","name":"_addr"},{"type":"uint256","name":"_value"},{"type":"uint256","name":"_unlock_time"}],"stateMutability":"nonpayable","type":"function","gas":74281027},{"name":"increase_amount","outputs":[],"inputs":[{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":74282084},{"name":"increase_unlock_time","outputs":[],"inputs":[{"type":"uint256","name":"_unlock_time"}],"stateMutability":"nonpayable","type":"function","gas":74282832},{"name":"withdraw","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37225413},{"name":"balanceOf","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"view","type":"function"},{"name":"balanceOf","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"addr"},{"type":"uint256","name":"_t"}],"stateMutability":"view","type":"function"},{"name":"balanceOfAt","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"addr"},{"type":"uint256","name":"_block"}],"stateMutability":"view","type":"function","gas":514513},{"name":"totalSupply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function"},{"name":"totalSupply","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"t"}],"stateMutability":"view","type":"function"},{"name":"totalSupplyAt","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"uint256","name":"_block"}],"stateMutability":"view","type":"function","gas":812830},{"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":"locked","outputs":[{"type":"int128","name":"amount"},{"type":"uint256","name":"end"}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":3449},{"name":"epoch","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2021},{"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":5640},{"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":6169},{"name":"user_point_epoch","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":2265},{"name":"slope_changes","outputs":[{"type":"int128","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2256},{"name":"controller","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2171},{"name":"transfersEnabled","outputs":[{"type":"bool","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2201},{"name":"name","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":8633},{"name":"symbol","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":7686},{"name":"version","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":7716},{"name":"decimals","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2321},{"name":"future_smart_wallet_checker","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2351},{"name":"smart_wallet_checker","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2381},{"name":"admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2411},{"name":"future_admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2441},{"name":"is_shutdown","outputs":[{"type":"bool","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2471},{"name":"delegate_for","outputs":[{"type":"address","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":2655}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a0526080613b716101403934156100a157600080fd5b6020613b7160c03960c05160205181106100ba57600080fd5b50606060206020613b710160c03960c051613b71016101c039604060206020613b710160c03960c0516004013511156100f257600080fd5b604060206040613b710160c03960c051613b710161024039602060206040613b710160c03960c05160040135111561012957600080fd5b604060206060613b710160c03960c051613b71016102a039602060206060613b710160c03960c05160040135111561016057600080fd5b3360105561014051600055436003600460c052602060c02060c052602060c0200155426002600460c052602060c02060c052602060c02001553360085560016009556020610380600463313ce5676103205261033c610140515afa6101c457600080fd5b601f3d116101d157600080fd5b600050610380516103005260ff6103005111156101ed57600080fd5b61030051600d556101c080600a60c052602060c020602082510161012060006003818352015b8261012051602002111561022657610248565b61012051602002850151610120518501555b8151600101808352811415610213575b50505050505061024080600b60c052602060c020602082510161012060006002818352015b82610120516020021115610280576102a2565b61012051602002850151610120518501555b815160010180835281141561026d575b5050505050506102a080600c60c052602060c020602082510161012060006002818352015b826101205160200211156102da576102fc565b61012051602002850151610120518501555b81516001018083528114156102c7575b5050505050506000601255613b5956600436101561000d57613847565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a05263fc0e74d160005114156101355734156100ba57600080fd5b6308c379a061014052602061016052600a610180527f41646d696e206f6e6c79000000000000000000000000000000000000000000006101a05261018050601054331461010857606461015cfd5b60016012557f4426aa1fb73e391071491fcfe21a88b5c38a0a0333a1f6e77161470439704cf860006000a1005b636b441a4060005114156101a457341561014e57600080fd5b600435602051811061015f57600080fd5b50601054331461016e57600080fd5b600435601155600435610140527f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e96020610140a1005b636a1c05ae600051141561021a5734156101bd57600080fd5b60105433146101cb57600080fd5b60115461014052600061014051186101e257600080fd5b6101405160105561014051610160527febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056020610160a1005b6357f901e2600051141561025b57341561023357600080fd5b600435602051811061024457600080fd5b50601054331461025357600080fd5b600435600e55005b638e5b490f600051141561028a57341561027457600080fd5b601054331461028257600080fd5b600e54600f55005b60001561037b575b61016052610140523261014051181561037557600f54610180526000610180511815610304576020610220602463c23697a86101a052610140516101c0526101bc6000610180515af16102e457600080fd5b601f3d116102f157600080fd5b60005061022051156103035761016051565b5b6308c379a06102605260206102805260256102a0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c6102c0527f6c6f7765640000000000000000000000000000000000000000000000000000006102e0526102a050600061037457608461027cfd5b5b61016051565b63e272447960005114156103ed57341561039457600080fd5b60043560205181106103a557600080fd5b5060043560133360e05260c052604060c020553361014052600435610160527fab7d75eccd27c9989942a3a6e4137e415df0ad90ec428751b16361f16fe8780f6040610140a1005b637c74a174600051141561047157341561040657600080fd5b600435602051811061041757600080fd5b50600660043560e05260c052604060c0205461014052600161014051633b9aca00811061044357600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f350005b63da020a1860005114156104df57341561048a57600080fd5b600435602051811061049b57600080fd5b506002602435633b9aca0081106104b157600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f350005b63adc6358960005114156105315734156104f857600080fd5b600435602051811061050957600080fd5b506001600260043560e05260c052604060c02060c052602060c020015460005260206000f350005b600015610e39575b6101e0526101405261016052610180526101a0526101c052608036610200376080366102803760006103005260006103205260035461034052600061014051181561074257426101805111156105955760006101605113610598565b60005b156106355761016051630784ce0060605181806105b457600080fd5b8305806040519013156105c657600080fd5b80919012156105d457600080fd5b9050905061022052610220516101805142808210156105f257600080fd5b8082039050905060405181111561060857600080fd5b6060518183028060405190131561061e57600080fd5b809190121561062c57600080fd5b90509050610200525b426101c051111561064c5760006101a0511361064f565b60005b156106ec576101a051630784ce00606051818061066b57600080fd5b83058060405190131561067d57600080fd5b809190121561068b57600080fd5b905090506102a0526102a0516101c05142808210156106a957600080fd5b808203905090506040518111156106bf57600080fd5b606051818302806040519013156106d557600080fd5b80919012156106e357600080fd5b90509050610280525b60076101805160e05260c052604060c020546103005260006101c051181561074157610180516101c0511415610729576103005161032052610740565b60076101c05160e05260c052604060c02054610320525b5b5b61036060008152600081602001524281604001524381606001525060006103405111156107d957610360610340516c01431e0fae6d7217caa0000000811061078957600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250505b6103a0516103e0526104006103608051825280602001518260200152806040015182604001528060600151826060015250506000610480526103a05142111561088857670de0b6b3a7640000436103c0518082101561083757600080fd5b80820390509050808202821582848304141761085257600080fd5b80905090509050426103a0518082101561086b57600080fd5b80820390509050808061087d57600080fd5b820490509050610480525b6103e05162093a80808061089b57600080fd5b82049050905062093a8080820282158284830414176108b957600080fd5b809050905090506104a0526104c0600060ff818352015b6104a0805162093a808181830110156108e857600080fd5b8082019050905081525060006104e052426104a051111561090d57426104a052610924565b60076104a05160e05260c052604060c020546104e0525b6103608051610380516104a0516103e0518082101561094257600080fd5b8082039050905060405181111561095857600080fd5b6060518183028060405190131561096e57600080fd5b809190121561097c57600080fd5b905090506060518183038060405190131561099657600080fd5b80919012156109a457600080fd5b9050905081525061038080516104e051606051818301806040519013156109ca57600080fd5b80919012156109d857600080fd5b9050905081525060006103605112156109f2576000610360525b6000610380511215610a05576000610380525b6104a0516103e0526104a0516103a05261046051610480516104a0516104405180821015610a3257600080fd5b808203905090508082028215828483041417610a4d57600080fd5b80905090509050670de0b6b3a76400008080610a6857600080fd5b820490509050818183011015610a7d57600080fd5b808201905090506103c05261034080516001818183011015610a9e57600080fd5b80820190509050815250426104a0511415610ac157436103c052610b2a56610b19565b610340516c01431e0fae6d7217caa00000008110610ade57600080fd5b600460c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550505b5b81516001018083528114156108d0575b5050610340516003556000610140511815610c265761038080516102a0516102205160605181830380604051901315610b6257600080fd5b8091901215610b7057600080fd5b9050905060605181830180604051901315610b8a57600080fd5b8091901215610b9857600080fd5b905090508152506103608051610280516102005160605181830380604051901315610bc257600080fd5b8091901215610bd057600080fd5b9050905060605181830180604051901315610bea57600080fd5b8091901215610bf857600080fd5b905090508152506000610380511215610c12576000610380525b6000610360511215610c25576000610360525b5b610340516c01431e0fae6d7217caa00000008110610c4357600080fd5b600460c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550506000610140511815610e335742610180511115610d225761030080516102205160605181830180604051901315610cb357600080fd5b8091901215610cc157600080fd5b90509050815250610180516101c0511415610d0b5761030080516102a05160605181830380604051901315610cf557600080fd5b8091901215610d0357600080fd5b905090508152505b6103005160076101805160e05260c052604060c020555b426101c0511115610d8757610180516101c0511115610d865761032080516102a05160605181830380604051901315610d5a57600080fd5b8091901215610d6857600080fd5b905090508152506103205160076101c05160e05260c052604060c020555b5b60066101405160e05260c052604060c020546001818183011015610daa57600080fd5b80820190509050610500526105005160066101405160e05260c052604060c02055426102c052436102e05261050051633b9aca008110610de957600080fd5b60056101405160e05260c052604060c02060c052602060c0200160c052602060c0206102808051825580602001516001830155806040015160028301558060600151600383015550505b6101e051565b6000156110db575b610200526101405261016052610180526101a0526101c0526101e0526102206101a080518252806020015182602001525050600154610260526102605161016051818183011015610e9157600080fd5b8082019050905060015561028061022080518252806020015182602001525050610220805161016051604051811115610ec957600080fd5b60605181830180604051901315610edf57600080fd5b8091901215610eed57600080fd5b905090508152506000610180511815610f095761018051610240525b60026101405160e05260c052604060c02060c052602060c020610220805182558060200151600183015550506101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015610f5f57610f3d565b610140516102e0526103006102808051825280602001518260200152505061034061022080518252806020015182602001525050610360516103405161032051610300516102e05160065801610539565b6102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515610fdb57610fb8565b600050600061016051181561104057602061048060646323b872dd6103c052610140516103e052306104005261016051610420526103dc60006000545af161102257600080fd5b601f3d1161102f57600080fd5b6000506104805161103f57600080fd5b5b610160516104a0526101e0516104c052426104e05261024051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d5960606104a0a3610260516105005261026051610160518181830110156110a357600080fd5b80820190509050610520527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6040610500a161020051565b63c2c4c5c1600051141561112a5734156110f457600080fd5b600061014052604036610160376040366101a0376101c0516101a05161018051610160516101405160065801610539565b600050005b633a46273e600051141561138d5762ffffff541561114757600080fd5b600162ffffff55341561115957600080fd5b600435602051811061116a57600080fd5b50610140600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101805260206101a05260146101c0527f436f6e74726163742069732073687574646f776e0000000000000000000000006101e0526101c050601254156111eb57606461019cfd5b6000602435116111fa57600080fd5b6308c379a0610220526020610240526016610260527f4e6f206578697374696e67206c6f636b20666f756e640000000000000000000061028052610260506000610140511361124a57606461023cfd5b6308c379a06102c05260206102e0526024610300527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610320527f647261770000000000000000000000000000000000000000000000000000000061034052610300504261016051116112be5760846102dcfd5b610140610380525b610380515160206103805101610380526103806103805110156112e8576112c6565b6004356103a0526024356103c05260006103e052610400600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506000610440526104405161042051610400516103e0516103c0516103a05160065801610e41565b610360610380525b61038051526020610380510361038052610140610380511015156113815761135e565b600050600062ffffff55005b6365fc387360005114156116785762ffffff54156113aa57600080fd5b600162ffffff5534156113bc57600080fd5b33610140526101405160065801610292565b60005060243562093a8080806113e357600080fd5b82049050905062093a80808202821582848304141761140157600080fd5b809050905090506101a0526101c060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a0610200526020610220526014610240527f436f6e74726163742069732073687574646f776e00000000000000000000000061026052610240506012541561148a57606461021cfd5b60006004351161149957600080fd5b6308c379a06102a05260206102c05260196102e0527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000610300526102e0506101c051156114e75760646102bcfd5b6308c379a0610340526020610360526026610380527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e20746865206103a0527f66757475726500000000000000000000000000000000000000000000000000006103c05261038050426101a0511161155b57608461035cfd5b6308c379a061040052602061042052601e610440527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610460526104405042630784ce008181830110156115ae57600080fd5b808201905090506101a05111156115c657606461041cfd5b6101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156115f0576115ce565b336104c0526004356104e0526101a051610500526105206101c080518252806020015182602001525050600161056052610560516105405161052051610500516104e0516104c05160065801610e41565b6104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561166c57611649565b600050600062ffffff55005b633e173b2960005114156119c05762ffffff541561169557600080fd5b600162ffffff5534156116a757600080fd5b60043560205181106116b857600080fd5b5060443562093a8080806116cb57600080fd5b82049050905062093a8080820282158284830414176116e957600080fd5b8090509050905061014052610160600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101a05260206101c05260146101e0527f436f6e74726163742069732073687574646f776e000000000000000000000000610200526101e050601254156117745760646101bcfd5b6308c379a061024052602061026052600d610280527f44656c6567617465206f6e6c79000000000000000000000000000000000000006102a05261028050601360043560e05260c052604060c0205433146117d057606461025cfd5b6000602435116117df57600080fd5b6308c379a06102e0526020610300526019610320527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006103405261032050610160511561182d5760646102fcfd5b6308c379a06103805260206103a05260266103c0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e20746865206103e0527f6675747572650000000000000000000000000000000000000000000000000000610400526103c0504261014051116118a157608461039cfd5b6308c379a061044052602061046052601e610480527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006104a0526104805042630784ce008181830110156118f457600080fd5b8082019050905061014051111561190c57606461045cfd5b6101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561193657611914565b600435610500526024356105205261014051610540526105606101608051825280602001518260200152505060016105a0526105a051610580516105605161054051610520516105005160065801610e41565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156119b457611991565b600050600062ffffff55005b634957677c6000511415611c055762ffffff54156119dd57600080fd5b600162ffffff5534156119ef57600080fd5b33610140526101405160065801610292565b6000506101a060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101e0526020610200526014610220527f436f6e74726163742069732073687574646f776e000000000000000000000000610240526102205060125415611a825760646101fcfd5b600060043511611a9157600080fd5b6308c379a06102805260206102a05260166102c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006102e0526102c05060006101a05113611ae157606461029cfd5b6308c379a0610320526020610340526024610360527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610380527f64726177000000000000000000000000000000000000000000000000000000006103a05261036050426101c05111611b5557608461033cfd5b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611b7f57611b5d565b3361040052600435610420526000610440526104606101a08051825280602001518260200152505060026104a0526104a051610480516104605161044051610420516104005160065801610e41565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611bf957611bd6565b600050600062ffffff55005b63eff7a6126000511415611f0f5762ffffff5415611c2257600080fd5b600162ffffff553415611c3457600080fd5b33610140526101405160065801610292565b6000506101a060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060043562093a808080611c8c57600080fd5b82049050905062093a808082028215828483041417611caa57600080fd5b809050905090506101e0526308c379a0610200526020610220526014610240527f436f6e74726163742069732073687574646f776e000000000000000000000000610260526102405060125415611d0257606461021cfd5b6308c379a06102a05260206102c052600c6102e0527f4c6f636b20657870697265640000000000000000000000000000000000000000610300526102e050426101c05111611d515760646102bcfd5b6308c379a0610340526020610360526011610380527f4e6f7468696e67206973206c6f636b65640000000000000000000000000000006103a0526103805060006101a05113611da157606461035cfd5b6308c379a06103e052602061040052601f610420527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e0061044052610420506101c0516101e05111611df35760646103fcfd5b6308c379a06104805260206104a052601e6104c0527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006104e0526104c05042630784ce00818183011015611e4657600080fd5b808201905090506101e0511115611e5e57606461049cfd5b610140610520525b61052051516020610520510161052052610520610520511015611e8857611e66565b33610540526000610560526101e051610580526105a06101a08051825280602001518260200152505060036105e0526105e0516105c0516105a05161058051610560516105405160065801610e41565b610500610520525b6105205152602061052051036105205261014061052051101515611f0357611ee0565b600050600062ffffff55005b633ccfd60b60005114156121e15762ffffff5415611f2c57600080fd5b600162ffffff553415611f3e57600080fd5b61014060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101805260206101a05260166101c0527f546865206c6f636b206469646e277420657870697265000000000000000000006101e0526101c0506101605142101515611fc0576001611fc4565b6012545b5b611fd057606461019cfd5b610140516000811215611fe257600080fd5b610220526102406101408051825280602001518260200152505060006101605260006101405260023360e05260c052604060c02060c052602060c020610140805182558060200151600183015550506001546102805261028051610220518082101561204d57600080fd5b808203905090506001556012541515612107576101406102a0525b6102a0515160206102a051016102a0526102a06102a051101561208a57612068565b336102c0526102e061024080518252806020015182602001525050610320610140805182528060200151826020015250506103405161032051610300516102e0516102c05160065801610539565b6102806102a0525b6102a0515260206102a051036102a0526101406102a051101515612103576120e0565b6000505b6020610440604463a9059cbb6103a052336103c052610220516103e0526103bc60006000545af161213757600080fd5b601f3d1161214457600080fd5b6000506104405161215457600080fd5b61022051610460524261048052337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686040610460a2610280516104a0526102805161022051808210156121a657600080fd5b808203905090506104c0527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c60406104a0a1600062ffffff55005b600015612300575b61018052610140526101605260006101a052610160516101c0526101e060006080818352015b6101c0516101a051101515612223576122ec565b6101a0516101c05181818301101561223a57600080fd5b80820190509050600181818301101561225257600080fd5b808201905090506002808061226657600080fd5b82049050905061020052610140516003610200516c01431e0fae6d7217caa0000000811061229357600080fd5b600460c052602060c0200160c052602060c02001541115156122bc57610200516101a0526122db565b610200516001808210156122cf57600080fd5b808203905090506101c0525b5b815160010180835281141561220f575b50506101a051600052600051610180515650005b6370a08231600051141561231857426101405261233d565b62fdd58e600051141561233557602060246101403760005061233d565b6000156124b5575b341561234857600080fd5b600435602051811061235957600080fd5b50600660043560e05260c052604060c020546101605261016051151561238957600060005260206000f3506124b3565b61018061016051633b9aca0081106123a057600080fd5b600560043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505061018080516101a051610140516101c0518082101561241b57600080fd5b8082039050905060405181111561243157600080fd5b6060518183028060405190131561244757600080fd5b809190121561245557600080fd5b905090506060518183038060405190131561246f57600080fd5b809190121561247d57600080fd5b905090508152506000610180511215612497576000610180525b6101805160008112156124a957600080fd5b60005260206000f3505b005b634ee2cd7e60005114156129c45734156124ce57600080fd5b60043560205181106124df57600080fd5b504360243511156124ef57600080fd5b600061014052600660043560e05260c052604060c020546101605261018060006080818352015b610160516101405110151561252a576125f7565b610140516101605181818301101561254157600080fd5b80820190509050600181818301101561255957600080fd5b808201905090506002808061256d57600080fd5b8204905090506101a05260243560036101a051633b9aca00811061259057600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001541115156125c7576101a051610140526125e6565b6101a0516001808210156125da57600080fd5b80820390509050610160525b5b8151600101808352811415612516575b50506101c061014051633b9aca00811061261057600080fd5b600560043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050600354610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516024356102a052610240516102c0526102c0516102a051600658016121e9565b61032052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103205161026052610340610260516c01431e0fae6d7217caa0000000811061271057600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006103c05260006103e052610240516102605110156128455761040061026051600181818301101561279157600080fd5b808201905090506c01431e0fae6d7217caa000000081106127b157600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610460516103a0518082101561281557600080fd5b808203905090506103c05261044051610380518082101561283557600080fd5b808203905090506103e052612880565b436103a0518082101561285757600080fd5b808203905090506103c05242610380518082101561287457600080fd5b808203905090506103e0525b610380516104805260006103c05118156129025761048080516103e0516024356103a051808210156128b157600080fd5b8082039050905080820282158284830414176128cc57600080fd5b809050905090506103c05180806128e257600080fd5b8204905090508181830110156128f757600080fd5b808201905090508152505b6101c080516101e05161048051610200518082101561292057600080fd5b8082039050905060405181111561293657600080fd5b6060518183028060405190131561294c57600080fd5b809190121561295a57600080fd5b905090506060518183038060405190131561297457600080fd5b809190121561298257600080fd5b9050905081525060006101c0511215156129b6576101c05160008112156129a857600080fd5b60005260206000f3506129c2565b600060005260206000f3505b005b600015612bcc575b6101e0526101405261016052610180526101a0526101c0526102006101408051825280602001518260200152806040015182604001528060600151826060015250506102405162093a808080612a2157600080fd5b82049050905062093a808082028215828483041417612a3f57600080fd5b80905090509050610280526102a0600060ff818352015b610280805162093a80818183011015612a6e57600080fd5b8082019050905081525060006102c0526101c051610280511115612a99576101c05161028052612ab0565b60076102805160e05260c052604060c020546102c0525b610200805161022051610280516102405180821015612ace57600080fd5b80820390509050604051811115612ae457600080fd5b60605181830280604051901315612afa57600080fd5b8091901215612b0857600080fd5b9050905060605181830380604051901315612b2257600080fd5b8091901215612b3057600080fd5b905090508152506101c051610280511415612b4a57612b97565b61022080516102c05160605181830180604051901315612b6957600080fd5b8091901215612b7757600080fd5b9050905081525061028051610240525b8151600101808352811415612a56575b50506000610200511215612bac576000610200525b610200516000811215612bbe57600080fd5b6000526000516101e0515650005b6318160ddd6000511415612be4574261014052612c0a565b63bd85b0396000511415612c02576020600461014037600050612c0a565b600015612d1d575b3415612c1557600080fd5b60035461016052610180610160516c01431e0fae6d7217caa00000008110612c3c57600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101405161016051610180516101a0516101c0516101e051610220610180805182528060200151826020015280604001518260400152806060015182606001525050610140516102a0526102a05161028051610260516102405161022051600658016129cc565b610300526101e0526101c0526101a0526101805261016052610140526103005160005260206000f350005b63981b24d06000511415613084573415612d3657600080fd5b436004351115612d4557600080fd5b6003546101405261014051610160516004356101a052610140516101c0526101c0516101a051600658016121e9565b6102205261016052610140526102205161016052610240610160516c01431e0fae6d7217caa00000008110612da857600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006102c05261014051610160511015612f29576102e0610160516001818183011015612e2357600080fd5b808201905090506c01431e0fae6d7217caa00000008110612e4357600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610340516102a0511815612f24576004356102a05180821015612eb457600080fd5b80820390509050610320516102805180821015612ed057600080fd5b808203905090508082028215828483041417612eeb57600080fd5b80905090509050610340516102a05180821015612f0757600080fd5b808203905090508080612f1957600080fd5b8204905090506102c0525b612fb3565b436102a0511815612fb2576004356102a05180821015612f4857600080fd5b80820390509050426102805180821015612f6157600080fd5b808203905090508082028215828483041417612f7c57600080fd5b80905090509050436102a05180821015612f9557600080fd5b808203905090508080612fa757600080fd5b8204905090506102c0525b5b610140610360525b610360515160206103605101610360526102e0610360511015612fdd57612fbb565b610380610240805182528060200151826020015280604001518260400152806060015182606001525050610280516102c05181818301101561301e57600080fd5b8082019050905061040052610400516103e0516103c0516103a05161038051600658016129cc565b610460526102c0610360525b610360515260206103605103610360526101406103605110151561307557613052565b6104605160005260206000f350005b633cebb82360005114156130c557341561309d57600080fd5b60043560205181106130ae57600080fd5b5060085433146130bd57600080fd5b600435600855005b63fc0c546a60005114156130ec5734156130de57600080fd5b60005460005260206000f350005b63047fc9aa600051141561311357341561310557600080fd5b60015460005260206000f350005b63cbf9fe5f600051141561319c57341561312c57600080fd5b600435602051811061313d57600080fd5b50610140808080600260043560e05260c052604060c02060c052602060c020548152505060208101905080806001600260043560e05260c052604060c02060c052602060c02001548152505060409050905060c05260c051610140f350005b63900cf0cf60005114156131c35734156131b557600080fd5b60035460005260206000f350005b63d1febfb960005114156132e65734156131dc57600080fd5b6101408080806004356c01431e0fae6d7217caa000000081106131fe57600080fd5b600460c052602060c0200160c052602060c0205481525050602081019050808060016004356c01431e0fae6d7217caa0000000811061323c57600080fd5b600460c052602060c0200160c052602060c020015481525050602081019050808060026004356c01431e0fae6d7217caa0000000811061327b57600080fd5b600460c052602060c0200160c052602060c020015481525050602081019050808060036004356c01431e0fae6d7217caa000000081106132ba57600080fd5b600460c052602060c0200160c052602060c02001548152505060809050905060c05260c051610140f350005b6328d09d47600051141561342f5734156132ff57600080fd5b600435602051811061331057600080fd5b50610140808080602435633b9aca00811061332a57600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020548152505060208101905080806001602435633b9aca00811061336d57600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060208101905080806002602435633b9aca0081106133b157600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060208101905080806003602435633b9aca0081106133f557600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060809050905060c05260c051610140f350005b63010ae757600051141561347657341561344857600080fd5b600435602051811061345957600080fd5b50600660043560e05260c052604060c0205460005260206000f350005b637119748460005114156134ab57341561348f57600080fd5b600760043560e05260c052604060c0205460005260206000f350005b63f77c479160005114156134d25734156134c457600080fd5b60085460005260206000f350005b63bef97c8760005114156134f95734156134eb57600080fd5b60095460005260206000f350005b6306fdde0360005114156135ad57341561351257600080fd5b600a8060c052602060c020610180602082540161012060006003818352015b8261012051602002111561354457613566565b61012051850154610120516020028501525b8151600101808352811415613531575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b4160005114156136615734156135c657600080fd5b600b8060c052602060c020610180602082540161012060006002818352015b826101205160200211156135f85761361a565b61012051850154610120516020028501525b81516001018083528114156135e5575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6354fd4d50600051141561371557341561367a57600080fd5b600c8060c052602060c020610180602082540161012060006002818352015b826101205160200211156136ac576136ce565b61012051850154610120516020028501525b8151600101808352811415613699575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce567600051141561373c57341561372e57600080fd5b600d5460005260206000f350005b638ff36fd1600051141561376357341561375557600080fd5b600e5460005260206000f350005b637175d4f7600051141561378a57341561377c57600080fd5b600f5460005260206000f350005b63f851a44060005114156137b15734156137a357600080fd5b60105460005260206000f350005b6317f7182a60005114156137d85734156137ca57600080fd5b60115460005260206000f350005b63943a7a5760005114156137ff5734156137f157600080fd5b60125460005260206000f350005b635e7f9a83600051141561384657341561381857600080fd5b600435602051811061382957600080fd5b50601360043560e05260c052604060c0205460005260206000f350005b5b60006000fd5b61030c613b590361030c60003961030c613b59036000f30000000000000000000000005a56da75c50aa2733f5fa9a2442aaefcbc60b2e6000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000f566f7465204c6f636b65642043584400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005766c4358440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005312e302e30000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x600436101561000d57613847565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a05263fc0e74d160005114156101355734156100ba57600080fd5b6308c379a061014052602061016052600a610180527f41646d696e206f6e6c79000000000000000000000000000000000000000000006101a05261018050601054331461010857606461015cfd5b60016012557f4426aa1fb73e391071491fcfe21a88b5c38a0a0333a1f6e77161470439704cf860006000a1005b636b441a4060005114156101a457341561014e57600080fd5b600435602051811061015f57600080fd5b50601054331461016e57600080fd5b600435601155600435610140527f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e96020610140a1005b636a1c05ae600051141561021a5734156101bd57600080fd5b60105433146101cb57600080fd5b60115461014052600061014051186101e257600080fd5b6101405160105561014051610160527febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056020610160a1005b6357f901e2600051141561025b57341561023357600080fd5b600435602051811061024457600080fd5b50601054331461025357600080fd5b600435600e55005b638e5b490f600051141561028a57341561027457600080fd5b601054331461028257600080fd5b600e54600f55005b60001561037b575b61016052610140523261014051181561037557600f54610180526000610180511815610304576020610220602463c23697a86101a052610140516101c0526101bc6000610180515af16102e457600080fd5b601f3d116102f157600080fd5b60005061022051156103035761016051565b5b6308c379a06102605260206102805260256102a0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c6102c0527f6c6f7765640000000000000000000000000000000000000000000000000000006102e0526102a050600061037457608461027cfd5b5b61016051565b63e272447960005114156103ed57341561039457600080fd5b60043560205181106103a557600080fd5b5060043560133360e05260c052604060c020553361014052600435610160527fab7d75eccd27c9989942a3a6e4137e415df0ad90ec428751b16361f16fe8780f6040610140a1005b637c74a174600051141561047157341561040657600080fd5b600435602051811061041757600080fd5b50600660043560e05260c052604060c0205461014052600161014051633b9aca00811061044357600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f350005b63da020a1860005114156104df57341561048a57600080fd5b600435602051811061049b57600080fd5b506002602435633b9aca0081106104b157600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f350005b63adc6358960005114156105315734156104f857600080fd5b600435602051811061050957600080fd5b506001600260043560e05260c052604060c02060c052602060c020015460005260206000f350005b600015610e39575b6101e0526101405261016052610180526101a0526101c052608036610200376080366102803760006103005260006103205260035461034052600061014051181561074257426101805111156105955760006101605113610598565b60005b156106355761016051630784ce0060605181806105b457600080fd5b8305806040519013156105c657600080fd5b80919012156105d457600080fd5b9050905061022052610220516101805142808210156105f257600080fd5b8082039050905060405181111561060857600080fd5b6060518183028060405190131561061e57600080fd5b809190121561062c57600080fd5b90509050610200525b426101c051111561064c5760006101a0511361064f565b60005b156106ec576101a051630784ce00606051818061066b57600080fd5b83058060405190131561067d57600080fd5b809190121561068b57600080fd5b905090506102a0526102a0516101c05142808210156106a957600080fd5b808203905090506040518111156106bf57600080fd5b606051818302806040519013156106d557600080fd5b80919012156106e357600080fd5b90509050610280525b60076101805160e05260c052604060c020546103005260006101c051181561074157610180516101c0511415610729576103005161032052610740565b60076101c05160e05260c052604060c02054610320525b5b5b61036060008152600081602001524281604001524381606001525060006103405111156107d957610360610340516c01431e0fae6d7217caa0000000811061078957600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250505b6103a0516103e0526104006103608051825280602001518260200152806040015182604001528060600151826060015250506000610480526103a05142111561088857670de0b6b3a7640000436103c0518082101561083757600080fd5b80820390509050808202821582848304141761085257600080fd5b80905090509050426103a0518082101561086b57600080fd5b80820390509050808061087d57600080fd5b820490509050610480525b6103e05162093a80808061089b57600080fd5b82049050905062093a8080820282158284830414176108b957600080fd5b809050905090506104a0526104c0600060ff818352015b6104a0805162093a808181830110156108e857600080fd5b8082019050905081525060006104e052426104a051111561090d57426104a052610924565b60076104a05160e05260c052604060c020546104e0525b6103608051610380516104a0516103e0518082101561094257600080fd5b8082039050905060405181111561095857600080fd5b6060518183028060405190131561096e57600080fd5b809190121561097c57600080fd5b905090506060518183038060405190131561099657600080fd5b80919012156109a457600080fd5b9050905081525061038080516104e051606051818301806040519013156109ca57600080fd5b80919012156109d857600080fd5b9050905081525060006103605112156109f2576000610360525b6000610380511215610a05576000610380525b6104a0516103e0526104a0516103a05261046051610480516104a0516104405180821015610a3257600080fd5b808203905090508082028215828483041417610a4d57600080fd5b80905090509050670de0b6b3a76400008080610a6857600080fd5b820490509050818183011015610a7d57600080fd5b808201905090506103c05261034080516001818183011015610a9e57600080fd5b80820190509050815250426104a0511415610ac157436103c052610b2a56610b19565b610340516c01431e0fae6d7217caa00000008110610ade57600080fd5b600460c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550505b5b81516001018083528114156108d0575b5050610340516003556000610140511815610c265761038080516102a0516102205160605181830380604051901315610b6257600080fd5b8091901215610b7057600080fd5b9050905060605181830180604051901315610b8a57600080fd5b8091901215610b9857600080fd5b905090508152506103608051610280516102005160605181830380604051901315610bc257600080fd5b8091901215610bd057600080fd5b9050905060605181830180604051901315610bea57600080fd5b8091901215610bf857600080fd5b905090508152506000610380511215610c12576000610380525b6000610360511215610c25576000610360525b5b610340516c01431e0fae6d7217caa00000008110610c4357600080fd5b600460c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550506000610140511815610e335742610180511115610d225761030080516102205160605181830180604051901315610cb357600080fd5b8091901215610cc157600080fd5b90509050815250610180516101c0511415610d0b5761030080516102a05160605181830380604051901315610cf557600080fd5b8091901215610d0357600080fd5b905090508152505b6103005160076101805160e05260c052604060c020555b426101c0511115610d8757610180516101c0511115610d865761032080516102a05160605181830380604051901315610d5a57600080fd5b8091901215610d6857600080fd5b905090508152506103205160076101c05160e05260c052604060c020555b5b60066101405160e05260c052604060c020546001818183011015610daa57600080fd5b80820190509050610500526105005160066101405160e05260c052604060c02055426102c052436102e05261050051633b9aca008110610de957600080fd5b60056101405160e05260c052604060c02060c052602060c0200160c052602060c0206102808051825580602001516001830155806040015160028301558060600151600383015550505b6101e051565b6000156110db575b610200526101405261016052610180526101a0526101c0526101e0526102206101a080518252806020015182602001525050600154610260526102605161016051818183011015610e9157600080fd5b8082019050905060015561028061022080518252806020015182602001525050610220805161016051604051811115610ec957600080fd5b60605181830180604051901315610edf57600080fd5b8091901215610eed57600080fd5b905090508152506000610180511815610f095761018051610240525b60026101405160e05260c052604060c02060c052602060c020610220805182558060200151600183015550506101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015610f5f57610f3d565b610140516102e0526103006102808051825280602001518260200152505061034061022080518252806020015182602001525050610360516103405161032051610300516102e05160065801610539565b6102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515610fdb57610fb8565b600050600061016051181561104057602061048060646323b872dd6103c052610140516103e052306104005261016051610420526103dc60006000545af161102257600080fd5b601f3d1161102f57600080fd5b6000506104805161103f57600080fd5b5b610160516104a0526101e0516104c052426104e05261024051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d5960606104a0a3610260516105005261026051610160518181830110156110a357600080fd5b80820190509050610520527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6040610500a161020051565b63c2c4c5c1600051141561112a5734156110f457600080fd5b600061014052604036610160376040366101a0376101c0516101a05161018051610160516101405160065801610539565b600050005b633a46273e600051141561138d5762ffffff541561114757600080fd5b600162ffffff55341561115957600080fd5b600435602051811061116a57600080fd5b50610140600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101805260206101a05260146101c0527f436f6e74726163742069732073687574646f776e0000000000000000000000006101e0526101c050601254156111eb57606461019cfd5b6000602435116111fa57600080fd5b6308c379a0610220526020610240526016610260527f4e6f206578697374696e67206c6f636b20666f756e640000000000000000000061028052610260506000610140511361124a57606461023cfd5b6308c379a06102c05260206102e0526024610300527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610320527f647261770000000000000000000000000000000000000000000000000000000061034052610300504261016051116112be5760846102dcfd5b610140610380525b610380515160206103805101610380526103806103805110156112e8576112c6565b6004356103a0526024356103c05260006103e052610400600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506000610440526104405161042051610400516103e0516103c0516103a05160065801610e41565b610360610380525b61038051526020610380510361038052610140610380511015156113815761135e565b600050600062ffffff55005b6365fc387360005114156116785762ffffff54156113aa57600080fd5b600162ffffff5534156113bc57600080fd5b33610140526101405160065801610292565b60005060243562093a8080806113e357600080fd5b82049050905062093a80808202821582848304141761140157600080fd5b809050905090506101a0526101c060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a0610200526020610220526014610240527f436f6e74726163742069732073687574646f776e00000000000000000000000061026052610240506012541561148a57606461021cfd5b60006004351161149957600080fd5b6308c379a06102a05260206102c05260196102e0527f5769746864726177206f6c6420746f6b656e7320666972737400000000000000610300526102e0506101c051156114e75760646102bcfd5b6308c379a0610340526020610360526026610380527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e20746865206103a0527f66757475726500000000000000000000000000000000000000000000000000006103c05261038050426101a0511161155b57608461035cfd5b6308c379a061040052602061042052601e610440527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610460526104405042630784ce008181830110156115ae57600080fd5b808201905090506101a05111156115c657606461041cfd5b6101406104a0525b6104a0515160206104a051016104a0526104a06104a05110156115f0576115ce565b336104c0526004356104e0526101a051610500526105206101c080518252806020015182602001525050600161056052610560516105405161052051610500516104e0516104c05160065801610e41565b6104806104a0525b6104a0515260206104a051036104a0526101406104a05110151561166c57611649565b600050600062ffffff55005b633e173b2960005114156119c05762ffffff541561169557600080fd5b600162ffffff5534156116a757600080fd5b60043560205181106116b857600080fd5b5060443562093a8080806116cb57600080fd5b82049050905062093a8080820282158284830414176116e957600080fd5b8090509050905061014052610160600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101a05260206101c05260146101e0527f436f6e74726163742069732073687574646f776e000000000000000000000000610200526101e050601254156117745760646101bcfd5b6308c379a061024052602061026052600d610280527f44656c6567617465206f6e6c79000000000000000000000000000000000000006102a05261028050601360043560e05260c052604060c0205433146117d057606461025cfd5b6000602435116117df57600080fd5b6308c379a06102e0526020610300526019610320527f5769746864726177206f6c6420746f6b656e73206669727374000000000000006103405261032050610160511561182d5760646102fcfd5b6308c379a06103805260206103a05260266103c0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e20746865206103e0527f6675747572650000000000000000000000000000000000000000000000000000610400526103c0504261014051116118a157608461039cfd5b6308c379a061044052602061046052601e610480527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006104a0526104805042630784ce008181830110156118f457600080fd5b8082019050905061014051111561190c57606461045cfd5b6101406104e0525b6104e0515160206104e051016104e0526104e06104e051101561193657611914565b600435610500526024356105205261014051610540526105606101608051825280602001518260200152505060016105a0526105a051610580516105605161054051610520516105005160065801610e41565b6104c06104e0525b6104e0515260206104e051036104e0526101406104e0511015156119b457611991565b600050600062ffffff55005b634957677c6000511415611c055762ffffff54156119dd57600080fd5b600162ffffff5534156119ef57600080fd5b33610140526101405160065801610292565b6000506101a060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101e0526020610200526014610220527f436f6e74726163742069732073687574646f776e000000000000000000000000610240526102205060125415611a825760646101fcfd5b600060043511611a9157600080fd5b6308c379a06102805260206102a05260166102c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006102e0526102c05060006101a05113611ae157606461029cfd5b6308c379a0610320526020610340526024610360527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610380527f64726177000000000000000000000000000000000000000000000000000000006103a05261036050426101c05111611b5557608461033cfd5b6101406103e0525b6103e0515160206103e051016103e0526103e06103e0511015611b7f57611b5d565b3361040052600435610420526000610440526104606101a08051825280602001518260200152505060026104a0526104a051610480516104605161044051610420516104005160065801610e41565b6103c06103e0525b6103e0515260206103e051036103e0526101406103e051101515611bf957611bd6565b600050600062ffffff55005b63eff7a6126000511415611f0f5762ffffff5415611c2257600080fd5b600162ffffff553415611c3457600080fd5b33610140526101405160065801610292565b6000506101a060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060043562093a808080611c8c57600080fd5b82049050905062093a808082028215828483041417611caa57600080fd5b809050905090506101e0526308c379a0610200526020610220526014610240527f436f6e74726163742069732073687574646f776e000000000000000000000000610260526102405060125415611d0257606461021cfd5b6308c379a06102a05260206102c052600c6102e0527f4c6f636b20657870697265640000000000000000000000000000000000000000610300526102e050426101c05111611d515760646102bcfd5b6308c379a0610340526020610360526011610380527f4e6f7468696e67206973206c6f636b65640000000000000000000000000000006103a0526103805060006101a05113611da157606461035cfd5b6308c379a06103e052602061040052601f610420527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e0061044052610420506101c0516101e05111611df35760646103fcfd5b6308c379a06104805260206104a052601e6104c0527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006104e0526104c05042630784ce00818183011015611e4657600080fd5b808201905090506101e0511115611e5e57606461049cfd5b610140610520525b61052051516020610520510161052052610520610520511015611e8857611e66565b33610540526000610560526101e051610580526105a06101a08051825280602001518260200152505060036105e0526105e0516105c0516105a05161058051610560516105405160065801610e41565b610500610520525b6105205152602061052051036105205261014061052051101515611f0357611ee0565b600050600062ffffff55005b633ccfd60b60005114156121e15762ffffff5415611f2c57600080fd5b600162ffffff553415611f3e57600080fd5b61014060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101805260206101a05260166101c0527f546865206c6f636b206469646e277420657870697265000000000000000000006101e0526101c0506101605142101515611fc0576001611fc4565b6012545b5b611fd057606461019cfd5b610140516000811215611fe257600080fd5b610220526102406101408051825280602001518260200152505060006101605260006101405260023360e05260c052604060c02060c052602060c020610140805182558060200151600183015550506001546102805261028051610220518082101561204d57600080fd5b808203905090506001556012541515612107576101406102a0525b6102a0515160206102a051016102a0526102a06102a051101561208a57612068565b336102c0526102e061024080518252806020015182602001525050610320610140805182528060200151826020015250506103405161032051610300516102e0516102c05160065801610539565b6102806102a0525b6102a0515260206102a051036102a0526101406102a051101515612103576120e0565b6000505b6020610440604463a9059cbb6103a052336103c052610220516103e0526103bc60006000545af161213757600080fd5b601f3d1161214457600080fd5b6000506104405161215457600080fd5b61022051610460524261048052337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686040610460a2610280516104a0526102805161022051808210156121a657600080fd5b808203905090506104c0527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c60406104a0a1600062ffffff55005b600015612300575b61018052610140526101605260006101a052610160516101c0526101e060006080818352015b6101c0516101a051101515612223576122ec565b6101a0516101c05181818301101561223a57600080fd5b80820190509050600181818301101561225257600080fd5b808201905090506002808061226657600080fd5b82049050905061020052610140516003610200516c01431e0fae6d7217caa0000000811061229357600080fd5b600460c052602060c0200160c052602060c02001541115156122bc57610200516101a0526122db565b610200516001808210156122cf57600080fd5b808203905090506101c0525b5b815160010180835281141561220f575b50506101a051600052600051610180515650005b6370a08231600051141561231857426101405261233d565b62fdd58e600051141561233557602060246101403760005061233d565b6000156124b5575b341561234857600080fd5b600435602051811061235957600080fd5b50600660043560e05260c052604060c020546101605261016051151561238957600060005260206000f3506124b3565b61018061016051633b9aca0081106123a057600080fd5b600560043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505061018080516101a051610140516101c0518082101561241b57600080fd5b8082039050905060405181111561243157600080fd5b6060518183028060405190131561244757600080fd5b809190121561245557600080fd5b905090506060518183038060405190131561246f57600080fd5b809190121561247d57600080fd5b905090508152506000610180511215612497576000610180525b6101805160008112156124a957600080fd5b60005260206000f3505b005b634ee2cd7e60005114156129c45734156124ce57600080fd5b60043560205181106124df57600080fd5b504360243511156124ef57600080fd5b600061014052600660043560e05260c052604060c020546101605261018060006080818352015b610160516101405110151561252a576125f7565b610140516101605181818301101561254157600080fd5b80820190509050600181818301101561255957600080fd5b808201905090506002808061256d57600080fd5b8204905090506101a05260243560036101a051633b9aca00811061259057600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001541115156125c7576101a051610140526125e6565b6101a0516001808210156125da57600080fd5b80820390509050610160525b5b8151600101808352811415612516575b50506101c061014051633b9aca00811061261057600080fd5b600560043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050600354610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516024356102a052610240516102c0526102c0516102a051600658016121e9565b61032052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103205161026052610340610260516c01431e0fae6d7217caa0000000811061271057600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006103c05260006103e052610240516102605110156128455761040061026051600181818301101561279157600080fd5b808201905090506c01431e0fae6d7217caa000000081106127b157600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610460516103a0518082101561281557600080fd5b808203905090506103c05261044051610380518082101561283557600080fd5b808203905090506103e052612880565b436103a0518082101561285757600080fd5b808203905090506103c05242610380518082101561287457600080fd5b808203905090506103e0525b610380516104805260006103c05118156129025761048080516103e0516024356103a051808210156128b157600080fd5b8082039050905080820282158284830414176128cc57600080fd5b809050905090506103c05180806128e257600080fd5b8204905090508181830110156128f757600080fd5b808201905090508152505b6101c080516101e05161048051610200518082101561292057600080fd5b8082039050905060405181111561293657600080fd5b6060518183028060405190131561294c57600080fd5b809190121561295a57600080fd5b905090506060518183038060405190131561297457600080fd5b809190121561298257600080fd5b9050905081525060006101c0511215156129b6576101c05160008112156129a857600080fd5b60005260206000f3506129c2565b600060005260206000f3505b005b600015612bcc575b6101e0526101405261016052610180526101a0526101c0526102006101408051825280602001518260200152806040015182604001528060600151826060015250506102405162093a808080612a2157600080fd5b82049050905062093a808082028215828483041417612a3f57600080fd5b80905090509050610280526102a0600060ff818352015b610280805162093a80818183011015612a6e57600080fd5b8082019050905081525060006102c0526101c051610280511115612a99576101c05161028052612ab0565b60076102805160e05260c052604060c020546102c0525b610200805161022051610280516102405180821015612ace57600080fd5b80820390509050604051811115612ae457600080fd5b60605181830280604051901315612afa57600080fd5b8091901215612b0857600080fd5b9050905060605181830380604051901315612b2257600080fd5b8091901215612b3057600080fd5b905090508152506101c051610280511415612b4a57612b97565b61022080516102c05160605181830180604051901315612b6957600080fd5b8091901215612b7757600080fd5b9050905081525061028051610240525b8151600101808352811415612a56575b50506000610200511215612bac576000610200525b610200516000811215612bbe57600080fd5b6000526000516101e0515650005b6318160ddd6000511415612be4574261014052612c0a565b63bd85b0396000511415612c02576020600461014037600050612c0a565b600015612d1d575b3415612c1557600080fd5b60035461016052610180610160516c01431e0fae6d7217caa00000008110612c3c57600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101405161016051610180516101a0516101c0516101e051610220610180805182528060200151826020015280604001518260400152806060015182606001525050610140516102a0526102a05161028051610260516102405161022051600658016129cc565b610300526101e0526101c0526101a0526101805261016052610140526103005160005260206000f350005b63981b24d06000511415613084573415612d3657600080fd5b436004351115612d4557600080fd5b6003546101405261014051610160516004356101a052610140516101c0526101c0516101a051600658016121e9565b6102205261016052610140526102205161016052610240610160516c01431e0fae6d7217caa00000008110612da857600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006102c05261014051610160511015612f29576102e0610160516001818183011015612e2357600080fd5b808201905090506c01431e0fae6d7217caa00000008110612e4357600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610340516102a0511815612f24576004356102a05180821015612eb457600080fd5b80820390509050610320516102805180821015612ed057600080fd5b808203905090508082028215828483041417612eeb57600080fd5b80905090509050610340516102a05180821015612f0757600080fd5b808203905090508080612f1957600080fd5b8204905090506102c0525b612fb3565b436102a0511815612fb2576004356102a05180821015612f4857600080fd5b80820390509050426102805180821015612f6157600080fd5b808203905090508082028215828483041417612f7c57600080fd5b80905090509050436102a05180821015612f9557600080fd5b808203905090508080612fa757600080fd5b8204905090506102c0525b5b610140610360525b610360515160206103605101610360526102e0610360511015612fdd57612fbb565b610380610240805182528060200151826020015280604001518260400152806060015182606001525050610280516102c05181818301101561301e57600080fd5b8082019050905061040052610400516103e0516103c0516103a05161038051600658016129cc565b610460526102c0610360525b610360515260206103605103610360526101406103605110151561307557613052565b6104605160005260206000f350005b633cebb82360005114156130c557341561309d57600080fd5b60043560205181106130ae57600080fd5b5060085433146130bd57600080fd5b600435600855005b63fc0c546a60005114156130ec5734156130de57600080fd5b60005460005260206000f350005b63047fc9aa600051141561311357341561310557600080fd5b60015460005260206000f350005b63cbf9fe5f600051141561319c57341561312c57600080fd5b600435602051811061313d57600080fd5b50610140808080600260043560e05260c052604060c02060c052602060c020548152505060208101905080806001600260043560e05260c052604060c02060c052602060c02001548152505060409050905060c05260c051610140f350005b63900cf0cf60005114156131c35734156131b557600080fd5b60035460005260206000f350005b63d1febfb960005114156132e65734156131dc57600080fd5b6101408080806004356c01431e0fae6d7217caa000000081106131fe57600080fd5b600460c052602060c0200160c052602060c0205481525050602081019050808060016004356c01431e0fae6d7217caa0000000811061323c57600080fd5b600460c052602060c0200160c052602060c020015481525050602081019050808060026004356c01431e0fae6d7217caa0000000811061327b57600080fd5b600460c052602060c0200160c052602060c020015481525050602081019050808060036004356c01431e0fae6d7217caa000000081106132ba57600080fd5b600460c052602060c0200160c052602060c02001548152505060809050905060c05260c051610140f350005b6328d09d47600051141561342f5734156132ff57600080fd5b600435602051811061331057600080fd5b50610140808080602435633b9aca00811061332a57600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020548152505060208101905080806001602435633b9aca00811061336d57600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060208101905080806002602435633b9aca0081106133b157600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060208101905080806003602435633b9aca0081106133f557600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060809050905060c05260c051610140f350005b63010ae757600051141561347657341561344857600080fd5b600435602051811061345957600080fd5b50600660043560e05260c052604060c0205460005260206000f350005b637119748460005114156134ab57341561348f57600080fd5b600760043560e05260c052604060c0205460005260206000f350005b63f77c479160005114156134d25734156134c457600080fd5b60085460005260206000f350005b63bef97c8760005114156134f95734156134eb57600080fd5b60095460005260206000f350005b6306fdde0360005114156135ad57341561351257600080fd5b600a8060c052602060c020610180602082540161012060006003818352015b8261012051602002111561354457613566565b61012051850154610120516020028501525b8151600101808352811415613531575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b4160005114156136615734156135c657600080fd5b600b8060c052602060c020610180602082540161012060006002818352015b826101205160200211156135f85761361a565b61012051850154610120516020028501525b81516001018083528114156135e5575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6354fd4d50600051141561371557341561367a57600080fd5b600c8060c052602060c020610180602082540161012060006002818352015b826101205160200211156136ac576136ce565b61012051850154610120516020028501525b8151600101808352811415613699575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce567600051141561373c57341561372e57600080fd5b600d5460005260206000f350005b638ff36fd1600051141561376357341561375557600080fd5b600e5460005260206000f350005b637175d4f7600051141561378a57341561377c57600080fd5b600f5460005260206000f350005b63f851a44060005114156137b15734156137a357600080fd5b60105460005260206000f350005b6317f7182a60005114156137d85734156137ca57600080fd5b60115460005260206000f350005b63943a7a5760005114156137ff5734156137f157600080fd5b60125460005260206000f350005b635e7f9a83600051141561384657341561381857600080fd5b600435602051811061382957600080fd5b50601360043560e05260c052604060c0205460005260206000f350005b5b60006000fd

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

0000000000000000000000005A56Da75c50aA2733F5Fa9A2442AaEfcBc60B2e6000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000f566f7465204c6f636b65642043584400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005766c4358440000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005312e302e30000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : token_addr (address): 0x5A56Da75c50aA2733F5Fa9A2442AaEfcBc60B2e6
Arg [1] : _name (string): Vote Locked CXD
Arg [2] : _symbol (string): vlCXD
Arg [3] : _version (string): 1.0.0

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000005A56Da75c50aA2733F5Fa9A2442AaEfcBc60B2e6
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [5] : 566f7465204c6f636b6564204358440000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 766c435844000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 312e302e30000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.