Contract 0xdB49A1190778623A872254ECca3a7bFD997223cb 1

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xa9f4b0f196abe8d8794eef72bc4bff6c7a8303cfb589f31d830d6f2677c90291Create_lock413896832022-06-26 15:09:203 days 9 hrs ago0xae1692d8d045716c948b707550e91dbd2c55169a IN  Creditum: veCREDIT Token0 FTM0.05805593144
0xe3880343bdbac958e37cddfffec92e4ecbd2052f2ba019bf559aab27488fb8e7Increase_amount413440882022-06-26 1:18:453 days 23 hrs ago0x422520399d2105887fba66416e958d252197b540 IN  Creditum: veCREDIT Token0 FTM0.000982854294
0x185e39701e50af27ccc15dd541f55c6559c4e422f2ead5396686b5cf53915c48Increase_amount413089482022-06-25 14:29:184 days 9 hrs ago0xf43d8f04e860db994dbd8f872e504bf300e684b9 IN  Creditum: veCREDIT Token0 FTM0.001485173968
0xe52fc646284ea0e680904cbadd0ad4955d980f491b60c30838d6fee9748308afIncrease_unlock_...412924722022-06-25 9:23:114 days 15 hrs ago0xfa537c114edd1d85a6019222c1c0e90707d2088d IN  Creditum: veCREDIT Token0 FTM0.001580052668
0x5d82ee8cea88e6bf7ea860f8cb8d7f9efa03f4c7a75e10f742f55971e435c871Increase_amount412041302022-06-24 5:17:385 days 19 hrs ago0x0e06386cc164e743f2750753a7cb823afe5a11b9 IN  Creditum: veCREDIT Token0 FTM0.02972805
0x8d96f71a0f06ced5c613395ee76e319ccea26a732eede44c6970d96f5bcbf7b6Increase_unlock_...412041022022-06-24 5:16:375 days 19 hrs ago0x0e06386cc164e743f2750753a7cb823afe5a11b9 IN  Creditum: veCREDIT Token0 FTM0.002744115
0x54c40698a01f13adb83b016a0af61833f209e4bd7af672aaaa54958a54c06be9Withdraw411509452022-06-23 11:43:206 days 12 hrs ago0x1ad4aeb696625115582a00348cb58fd07099ed4e IN  Creditum: veCREDIT Token0 FTM0.000572190629
0x20b6dff9f0bb1e1004e89cb5162b3375e6bea30095ac1c78e34d99a3cb9cd727Create_lock411420442022-06-23 8:51:556 days 15 hrs ago0x548b1019be16a8f989cd43c34c6ca9b530b9ed9d IN  Creditum: veCREDIT Token0 FTM0.0007754375
0xc8c9a33707b73b0f4706719f2df498dc0ac3f4fba222cc39ef2bad3888021bf0Withdraw411419262022-06-23 8:49:556 days 15 hrs ago0x548b1019be16a8f989cd43c34c6ca9b530b9ed9d IN  Creditum: veCREDIT Token0 FTM0.0005453675
0xfc7e45afd049ec13cd0f43e423ad5aa5bfd94b530750c4cc7d36327e7ed1cef7Increase_unlock_...411276902022-06-23 4:15:246 days 20 hrs ago0x41a6ac7f4e4dbffeb934f95f1db58b68c76dc4df IN  Creditum: veCREDIT Token0 FTM0.0006356625
0x598f3945e39d330d2d73522e9beb951a8cdfe55884874efe52092d2dcb73549fIncrease_unlock_...410959932022-06-22 18:10:307 days 6 hrs ago0xa502173e7ceabd3c90ede0164325e84323987796 IN  Creditum: veCREDIT Token0 FTM0.00270529663
0xd5306a7637599f01e5966d0f634fe5d72d8b8ca784226b4854d7570d5eccb73aWithdraw410747942022-06-22 10:57:287 days 13 hrs ago0x00718f1281cda7e673e82af18986466d7adb3117 IN  Creditum: veCREDIT Token0 FTM0.00122102764
0x6e14f6ceacd5ac4c0dff9280c30c5d16509b64b3ba34474e22a97e5988b54d00Increase_amount410533722022-06-22 3:59:407 days 20 hrs ago0x5c7ab8a5f02acc6bb9d1f5304c588bf8472ffc86 IN  Creditum: veCREDIT Token0 FTM0.001748763369
0x73d660d678f6bf29ce8750c540263d2a41f052e3748971174a3792a74b2d1224Increase_amount409912362022-06-21 7:07:058 days 17 hrs ago0x6e6cea0e277d9cfcef9094c5c8713bb52ed600e0 IN  Creditum: veCREDIT Token0 FTM0.005421479
0x6fa59ac108ef53f6fe6db4ee2bd06c98c2524d4534a088d50cd6f487e063eb8aIncrease_amount409494282022-06-20 17:28:089 days 6 hrs ago0xd3514dae634f500646130d2dc6ba29b352237101 IN  Creditum: veCREDIT Token0 FTM0.004607618454
0xc4e6328567956ced6986617d77e5555db407a64332f930fe21f8128c56d08654Increase_unlock_...409470672022-06-20 16:42:259 days 7 hrs ago0x5c7ab8a5f02acc6bb9d1f5304c588bf8472ffc86 IN  Creditum: veCREDIT Token0 FTM0.005007098287
0x6b56d7cd9e595f6ffb9ea8f0c28a15d19cd6ad096281220c7fe2710d8157c5fdIncrease_unlock_...409181022022-06-20 7:02:099 days 17 hrs ago0x6e6cea0e277d9cfcef9094c5c8713bb52ed600e0 IN  Creditum: veCREDIT Token0 FTM0.008310232
0xb7fc9a9e5dcf6a39611150b8e6b6122826c95d952b9c2198386589cf12fcb23bIncrease_unlock_...408816892022-06-19 19:06:3610 days 5 hrs ago0x19246d4cb92671d0f2166d00c9de687ead3206f8 IN  Creditum: veCREDIT Token0 FTM0.924059376721
0xe6a933dd8c6e3fb3be28429483147a8b6d85f5cb45b68eb35861596cd5139a84Increase_amount408816692022-06-19 19:05:5610 days 5 hrs ago0x19246d4cb92671d0f2166d00c9de687ead3206f8 IN  Creditum: veCREDIT Token0 FTM0.348705527148
0x9b0f92d20188e15fbd80417fe0af8a6c4f3c4637aeab8a4db31b25c4e3e9f41aIncrease_unlock_...408777962022-06-19 17:47:2610 days 6 hrs ago0x82e38f1a06fd2692ab9275bde75092341b8f187c IN  Creditum: veCREDIT Token0 FTM0.003642027715
0x137ba9a605367dbdad6a47a7e8a7c55ae3626c17f1356dda59a0bb96f96c48aeCreate_lock408751182022-06-19 16:56:2110 days 7 hrs ago0x5e79eec4cc6e2e8be8e7e5cac5419899ab02a32e IN  Creditum: veCREDIT Token0 FTM0.00481978492
0xb6355a4fce598a540a3fafec9b0ae85031274d609e2955031f09dc5eed0728e4Increase_amount408548062022-06-19 10:33:5210 days 13 hrs ago0xc00a6614b8030ce216302016e11c6b4140b5e499 IN  Creditum: veCREDIT Token0 FTM0.129419349427
0x691ebe3798e45bfe2197cfd8173e8ee9ce08cf2ef7d152633a28d4041fdf39c2Increase_amount408357252022-06-19 4:19:1610 days 20 hrs ago0x5c7ab8a5f02acc6bb9d1f5304c588bf8472ffc86 IN  Creditum: veCREDIT Token0 FTM0.012059334758
0x443cf6a1912e09c8fedd17ad1ffe0035b5b22fa16a9079eff74acbf037e13b78Increase_amount407431642022-06-17 21:23:4712 days 3 hrs ago0xa502173e7ceabd3c90ede0164325e84323987796 IN  Creditum: veCREDIT Token0 FTM0.004398515246
0xd3863d9d37406f7da912d8fdd8e3715e648219be5cdceee19a37c63583d4edc4Create_lock407426752022-06-17 21:14:1512 days 3 hrs ago0xadffc760edf4f6146dce89022b5ae7ebb7edd2b9 IN  Creditum: veCREDIT Token0 FTM0.005666141967
[ Download CSV Export 

OVERVIEW

Creditum is a lending & borrowing protocol that allows users to mint cUSD, a stablecoin pegged at $1, by supplying collateral.

Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x65f85c64c97455733f9444aa2b7f3a7a15afa9653fa7bf866b762ac6b76c340e304015792022-02-08 23:28:33141 days 55 mins ago Creditum: Deployer  Contract Creation0 FTM
[ Download CSV Export 
Loading

Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x27C9feA200BA19Fd75dd6c5714AA280F9D8089C2

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.4

Optimization Enabled:
N/A

Other Settings:
None 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 CommitOwnership:
    admin: address

event ApplyOwnership:
    admin: address

event Deposit:
    provider: indexed(address)
    value: uint256
    locktime: indexed(uint256)
    type: int128
    ts: uint256

event Withdraw:
    provider: indexed(address)
    value: uint256
    ts: uint256

event Supply:
    prevSupply: uint256
    supply: uint256


WEEK: constant(uint256) = 7 * 86400  # all future times are rounded by week
MAXTIME: constant(uint256) = 4 * 365 * 86400  # 4 years
MULTIPLIER: constant(uint256) = 10 ** 18

token: public(address)
supply: public(uint256)

locked: public(HashMap[address, LockedBalance])

epoch: public(uint256)
point_history: public(Point[100000000000000000000000000000])  # epoch -> unsigned point
user_point_history: public(HashMap[address, Point[1000000000]])  # user -> Point[user_epoch]
user_point_epoch: public(HashMap[address, uint256])
slope_changes: public(HashMap[uint256, int128])  # time -> signed slope change

# Aragon's view methods for compatibility
controller: public(address)
transfersEnabled: public(bool)

name: public(String[64])
symbol: public(String[32])
version: public(String[32])
decimals: public(uint256)

# Checker for whitelisted (smart contract) wallets which are allowed to deposit
# The goal is to prevent tokenizing the escrow
future_smart_wallet_checker: public(address)
smart_wallet_checker: public(address)

admin: public(address)  # Can and will be a smart contract
future_admin: public(address)


@external
def __init__(token_addr: address, _name: String[64], _symbol: String[32], _version: String[32]):
    """
    @notice Contract constructor
    @param token_addr `ERC20CRV` token address
    @param _name Token name
    @param _symbol Token symbol
    @param _version Contract version - required for Aragon compatibility
    """
    self.admin = msg.sender
    self.token = token_addr
    self.point_history[0].blk = block.number
    self.point_history[0].ts = block.timestamp
    self.controller = msg.sender
    self.transfersEnabled = True

    _decimals: uint256 = ERC20(token_addr).decimals()
    assert _decimals <= 255
    self.decimals = _decimals

    self.name = _name
    self.symbol = _symbol
    self.version = _version


@external
def commit_transfer_ownership(addr: address):
    """
    @notice Transfer ownership of VotingEscrow contract to `addr`
    @param addr Address to have ownership transferred to
    """
    assert msg.sender == self.admin  # dev: admin only
    self.future_admin = addr
    log CommitOwnership(addr)


@external
def apply_transfer_ownership():
    """
    @notice Apply ownership transfer
    """
    assert msg.sender == self.admin  # dev: admin only
    _admin: address = self.future_admin
    assert _admin != ZERO_ADDRESS  # dev: admin not set
    self.admin = _admin
    log ApplyOwnership(_admin)


@external
def commit_smart_wallet_checker(addr: address):
    """
    @notice Set an external contract to check for approved smart contract wallets
    @param addr Address of Smart contract checker
    """
    assert msg.sender == self.admin
    self.future_smart_wallet_checker = addr


@external
def apply_smart_wallet_checker():
    """
    @notice Apply setting external contract to check approved smart contract wallets
    """
    assert msg.sender == self.admin
    self.smart_wallet_checker = self.future_smart_wallet_checker


@internal
def assert_not_contract(addr: address):
    """
    @notice Check if the call is from a whitelisted smart contract, revert if not
    @param addr Address to be checked
    """
    if addr != tx.origin:
        checker: address = self.smart_wallet_checker
        if checker != ZERO_ADDRESS:
            if SmartWalletChecker(checker).check(addr):
                return
        raise "Smart contract depositors not allowed"


@external
@view
def get_last_user_slope(addr: address) -> int128:
    """
    @notice Get the most recently recorded rate of voting power decrease for `addr`
    @param addr Address of the user wallet
    @return Value of the slope
    """
    uepoch: uint256 = self.user_point_epoch[addr]
    return self.user_point_history[addr][uepoch].slope


@external
@view
def user_point_history__ts(_addr: address, _idx: uint256) -> uint256:
    """
    @notice Get the timestamp for checkpoint `_idx` for `_addr`
    @param _addr User wallet address
    @param _idx User epoch number
    @return Epoch time of the checkpoint
    """
    return self.user_point_history[_addr][_idx].ts


@external
@view
def locked__end(_addr: address) -> uint256:
    """
    @notice Get timestamp when `_addr`'s lock finishes
    @param _addr User wallet
    @return Epoch time of the lock end
    """
    return self.locked[_addr].end


@internal
def _checkpoint(addr: address, old_locked: LockedBalance, new_locked: LockedBalance):
    """
    @notice Record global and per-user data to checkpoint
    @param addr User's wallet address. No user checkpoint if 0x0
    @param old_locked Pevious locked amount / end lock time for the user
    @param new_locked New locked amount / end lock time for the user
    """
    u_old: Point = empty(Point)
    u_new: Point = empty(Point)
    old_dslope: int128 = 0
    new_dslope: int128 = 0
    _epoch: uint256 = self.epoch

    if addr != ZERO_ADDRESS:
        # Calculate slopes and biases
        # Kept at zero when they have to
        if old_locked.end > block.timestamp and old_locked.amount > 0:
            u_old.slope = old_locked.amount / MAXTIME
            u_old.bias = u_old.slope * convert(old_locked.end - block.timestamp, int128)
        if new_locked.end > block.timestamp and new_locked.amount > 0:
            u_new.slope = new_locked.amount / MAXTIME
            u_new.bias = u_new.slope * convert(new_locked.end - block.timestamp, int128)

        # Read values of scheduled changes in the slope
        # old_locked.end can be in the past and in the future
        # new_locked.end can ONLY by in the FUTURE unless everything expired: than zeros
        old_dslope = self.slope_changes[old_locked.end]
        if new_locked.end != 0:
            if new_locked.end == old_locked.end:
                new_dslope = old_dslope
            else:
                new_dslope = self.slope_changes[new_locked.end]

    last_point: Point = Point({bias: 0, slope: 0, ts: block.timestamp, blk: block.number})
    if _epoch > 0:
        last_point = self.point_history[_epoch]
    last_checkpoint: uint256 = last_point.ts
    # initial_last_point is used for extrapolation to calculate block number
    # (approximately, for *At methods) and save them
    # as we cannot figure that out exactly from inside the contract
    initial_last_point: Point = last_point
    block_slope: uint256 = 0  # dblock/dt
    if block.timestamp > last_point.ts:
        block_slope = MULTIPLIER * (block.number - last_point.blk) / (block.timestamp - last_point.ts)
    # If last point is already recorded in this block, slope=0
    # But that's ok b/c we know the block in such case

    # Go over weeks to fill history and calculate what the current point is
    t_i: uint256 = (last_checkpoint / WEEK) * WEEK
    for i in range(255):
        # Hopefully it won't happen that this won't get used in 5 years!
        # If it does, users will be able to withdraw but vote weight will be broken
        t_i += WEEK
        d_slope: int128 = 0
        if t_i > block.timestamp:
            t_i = block.timestamp
        else:
            d_slope = self.slope_changes[t_i]
        last_point.bias -= last_point.slope * convert(t_i - last_checkpoint, int128)
        last_point.slope += d_slope
        if last_point.bias < 0:  # This can happen
            last_point.bias = 0
        if last_point.slope < 0:  # This cannot happen - just in case
            last_point.slope = 0
        last_checkpoint = t_i
        last_point.ts = t_i
        last_point.blk = initial_last_point.blk + block_slope * (t_i - initial_last_point.ts) / MULTIPLIER
        _epoch += 1
        if t_i == block.timestamp:
            last_point.blk = block.number
            break
        else:
            self.point_history[_epoch] = last_point

    self.epoch = _epoch
    # Now point_history is filled until t=now

    if addr != ZERO_ADDRESS:
        # If last point was in this block, the slope change has been applied already
        # But in such case we have 0 slope(s)
        last_point.slope += (u_new.slope - u_old.slope)
        last_point.bias += (u_new.bias - u_old.bias)
        if last_point.slope < 0:
            last_point.slope = 0
        if last_point.bias < 0:
            last_point.bias = 0

    # Record the changed point into history
    self.point_history[_epoch] = last_point

    if addr != ZERO_ADDRESS:
        # Schedule the slope changes (slope is going down)
        # We subtract new_user_slope from [new_locked.end]
        # and add old_user_slope to [old_locked.end]
        if old_locked.end > block.timestamp:
            # old_dslope was <something> - u_old.slope, so we cancel that
            old_dslope += u_old.slope
            if new_locked.end == old_locked.end:
                old_dslope -= u_new.slope  # It was a new deposit, not extension
            self.slope_changes[old_locked.end] = old_dslope

        if new_locked.end > block.timestamp:
            if new_locked.end > old_locked.end:
                new_dslope -= u_new.slope  # old slope disappeared at this point
                self.slope_changes[new_locked.end] = new_dslope
            # else: we recorded it already in old_dslope

        # Now handle user history
        user_epoch: uint256 = self.user_point_epoch[addr] + 1

        self.user_point_epoch[addr] = user_epoch
        u_new.ts = block.timestamp
        u_new.blk = block.number
        self.user_point_history[addr][user_epoch] = u_new


@internal
def _deposit_for(_addr: address, _value: uint256, unlock_time: uint256, locked_balance: LockedBalance, type: int128):
    """
    @notice Deposit and lock tokens for a user
    @param _addr User's wallet address
    @param _value Amount to deposit
    @param unlock_time New time when to unlock the tokens, or 0 if unchanged
    @param locked_balance Previous locked amount / timestamp
    """
    _locked: LockedBalance = locked_balance
    supply_before: uint256 = self.supply

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

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

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

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


@external
def checkpoint():
    """
    @notice Record global data to checkpoint
    """
    self._checkpoint(ZERO_ADDRESS, empty(LockedBalance), empty(LockedBalance))


@external
@nonreentrant('lock')
def deposit_for(_addr: address, _value: uint256):
    """
    @notice Deposit `_value` tokens for `_addr` and add to the lock
    @dev Anyone (even a smart contract) can deposit for someone else, but
         cannot extend their locktime and deposit for a brand new user
    @param _addr User's wallet address
    @param _value Amount to add to user's lock
    """
    _locked: LockedBalance = self.locked[_addr]

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

    self._deposit_for(_addr, _value, 0, self.locked[_addr], DEPOSIT_FOR_TYPE)


@external
@nonreentrant('lock')
def create_lock(_value: uint256, _unlock_time: uint256):
    """
    @notice Deposit `_value` tokens for `msg.sender` and lock until `_unlock_time`
    @param _value Amount to deposit
    @param _unlock_time Epoch time when tokens unlock, rounded down to whole weeks
    """
    self.assert_not_contract(msg.sender)
    unlock_time: uint256 = (_unlock_time / WEEK) * WEEK  # Locktime is rounded down to weeks
    _locked: LockedBalance = self.locked[msg.sender]

    assert _value > 0  # dev: need non-zero value
    assert _locked.amount == 0, "Withdraw old tokens first"
    assert unlock_time > block.timestamp, "Can only lock until time in the future"
    assert unlock_time <= block.timestamp + MAXTIME, "Voting lock can be 4 years max"

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


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

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

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


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

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

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


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

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

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

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

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


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

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


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


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

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

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

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

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


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

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


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


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

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

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


# Dummy methods for compatibility with Aragon

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

Contract Security Audit

Contract ABI

[{"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"},{"outputs":[],"inputs":[{"type":"address","name":"token_addr"},{"type":"string","name":"_name"},{"type":"string","name":"_symbol"},{"type":"string","name":"_version"}],"stateMutability":"nonpayable","type":"constructor"},{"name":"commit_transfer_ownership","outputs":[],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function","gas":37597},{"name":"apply_transfer_ownership","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":38497},{"name":"commit_smart_wallet_checker","outputs":[],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function","gas":36307},{"name":"apply_smart_wallet_checker","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37095},{"name":"get_last_user_slope","outputs":[{"type":"int128","name":""}],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"view","type":"function","gas":2569},{"name":"user_point_history__ts","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_addr"},{"type":"uint256","name":"_idx"}],"stateMutability":"view","type":"function","gas":1672},{"name":"locked__end","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_addr"}],"stateMutability":"view","type":"function","gas":1593},{"name":"checkpoint","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37052342},{"name":"deposit_for","outputs":[],"inputs":[{"type":"address","name":"_addr"},{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":74279891},{"name":"create_lock","outputs":[],"inputs":[{"type":"uint256","name":"_value"},{"type":"uint256","name":"_unlock_time"}],"stateMutability":"nonpayable","type":"function","gas":74281465},{"name":"increase_amount","outputs":[],"inputs":[{"type":"uint256","name":"_value"}],"stateMutability":"nonpayable","type":"function","gas":74280830},{"name":"increase_unlock_time","outputs":[],"inputs":[{"type":"uint256","name":"_unlock_time"}],"stateMutability":"nonpayable","type":"function","gas":74281578},{"name":"withdraw","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":37223566},{"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":514333},{"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":812560},{"name":"changeController","outputs":[],"inputs":[{"type":"address","name":"_newController"}],"stateMutability":"nonpayable","type":"function","gas":36907},{"name":"token","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1841},{"name":"supply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1871},{"name":"locked","outputs":[{"type":"int128","name":"amount"},{"type":"uint256","name":"end"}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":3359},{"name":"epoch","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1931},{"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":5550},{"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":6079},{"name":"user_point_epoch","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":2175},{"name":"slope_changes","outputs":[{"type":"int128","name":""}],"inputs":[{"type":"uint256","name":"arg0"}],"stateMutability":"view","type":"function","gas":2166},{"name":"controller","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2081},{"name":"transfersEnabled","outputs":[{"type":"bool","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2111},{"name":"name","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":8543},{"name":"symbol","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":7596},{"name":"version","outputs":[{"type":"string","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":7626},{"name":"decimals","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2231},{"name":"future_smart_wallet_checker","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2261},{"name":"smart_wallet_checker","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2291},{"name":"admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2321},{"name":"future_admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":2351}]

740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a05260806135616101403934156100a157600080fd5b602061356160c03960c05160205181106100ba57600080fd5b506060602060206135610160c03960c051613561016101c0396040602060206135610160c03960c0516004013511156100f257600080fd5b6040602060406135610160c03960c05161356101610240396020602060406135610160c03960c05160040135111561012957600080fd5b6040602060606135610160c03960c051613561016102a0396020602060606135610160c03960c05160040135111561016057600080fd5b3360105561014051600055436003600460c052602060c02060c052602060c0200155426002600460c052602060c02060c052602060c02001553360085560016009556020610380600463313ce5676103205261033c610140515afa6101c457600080fd5b601f3d116101d157600080fd5b600050610380516103005260ff6103005111156101ed57600080fd5b61030051600d556101c080600a60c052602060c020602082510161012060006003818352015b8261012051602002111561022657610248565b61012051602002850151610120518501555b8151600101808352811415610213575b50505050505061024080600b60c052602060c020602082510161012060006002818352015b82610120516020021115610280576102a2565b61012051602002850151610120518501555b815160010180835281141561026d575b5050505050506102a080600c60c052602060c020602082510161012060006002818352015b826101205160200211156102da576102fc565b61012051602002850151610120518501555b81516001018083528114156102c7575b50505050505061354956600436101561000d5761323c565b600035601c52740100000000000000000000000000000000000000006020526f7fffffffffffffffffffffffffffffff6040527fffffffffffffffffffffffffffffffff8000000000000000000000000000000060605274012a05f1fffffffffffffffffffffffffdabf41c006080527ffffffffffffffffffffffffed5fa0e000000000000000000000000000000000060a052636b441a4060005114156101105734156100ba57600080fd5b60043560205181106100cb57600080fd5b5060105433146100da57600080fd5b600435601155600435610140527f2f56810a6bf40af059b96d3aea4db54081f378029a518390491093a7b67032e96020610140a1005b636a1c05ae600051141561018657341561012957600080fd5b601054331461013757600080fd5b601154610140526000610140511861014e57600080fd5b6101405160105561014051610160527febee2d5739011062cb4f14113f3b36bf0ffe3da5c0568f64189d1012a11891056020610160a1005b6357f901e260005114156101c757341561019f57600080fd5b60043560205181106101b057600080fd5b5060105433146101bf57600080fd5b600435600e55005b638e5b490f60005114156101f65734156101e057600080fd5b60105433146101ee57600080fd5b600e54600f55005b6000156102e7575b6101605261014052326101405118156102e157600f54610180526000610180511815610270576020610220602463c23697a86101a052610140516101c0526101bc6000610180515af161025057600080fd5b601f3d1161025d57600080fd5b600050610220511561026f5761016051565b5b6308c379a06102605260206102805260256102a0527f536d61727420636f6e7472616374206465706f7369746f7273206e6f7420616c6102c0527f6c6f7765640000000000000000000000000000000000000000000000000000006102e0526102a05060006102e057608461027cfd5b5b61016051565b637c74a174600051141561036b57341561030057600080fd5b600435602051811061031157600080fd5b50600660043560e05260c052604060c0205461014052600161014051633b9aca00811061033d57600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f350005b63da020a1860005114156103d957341561038457600080fd5b600435602051811061039557600080fd5b506002602435633b9aca0081106103ab57600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015460005260206000f350005b63adc63589600051141561042b5734156103f257600080fd5b600435602051811061040357600080fd5b506001600260043560e05260c052604060c02060c052602060c020015460005260206000f350005b600015610d33575b6101e0526101405261016052610180526101a0526101c052608036610200376080366102803760006103005260006103205260035461034052600061014051181561063c574261018051111561048f5760006101605113610492565b60005b1561052f5761016051630784ce0060605181806104ae57600080fd5b8305806040519013156104c057600080fd5b80919012156104ce57600080fd5b9050905061022052610220516101805142808210156104ec57600080fd5b8082039050905060405181111561050257600080fd5b6060518183028060405190131561051857600080fd5b809190121561052657600080fd5b90509050610200525b426101c05111156105465760006101a05113610549565b60005b156105e6576101a051630784ce00606051818061056557600080fd5b83058060405190131561057757600080fd5b809190121561058557600080fd5b905090506102a0526102a0516101c05142808210156105a357600080fd5b808203905090506040518111156105b957600080fd5b606051818302806040519013156105cf57600080fd5b80919012156105dd57600080fd5b90509050610280525b60076101805160e05260c052604060c020546103005260006101c051181561063b57610180516101c051141561062357610300516103205261063a565b60076101c05160e05260c052604060c02054610320525b5b5b61036060008152600081602001524281604001524381606001525060006103405111156106d357610360610340516c01431e0fae6d7217caa0000000811061068357600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250505b6103a0516103e0526104006103608051825280602001518260200152806040015182604001528060600151826060015250506000610480526103a05142111561078257670de0b6b3a7640000436103c0518082101561073157600080fd5b80820390509050808202821582848304141761074c57600080fd5b80905090509050426103a0518082101561076557600080fd5b80820390509050808061077757600080fd5b820490509050610480525b6103e05162093a80808061079557600080fd5b82049050905062093a8080820282158284830414176107b357600080fd5b809050905090506104a0526104c0600060ff818352015b6104a0805162093a808181830110156107e257600080fd5b8082019050905081525060006104e052426104a051111561080757426104a05261081e565b60076104a05160e05260c052604060c020546104e0525b6103608051610380516104a0516103e0518082101561083c57600080fd5b8082039050905060405181111561085257600080fd5b6060518183028060405190131561086857600080fd5b809190121561087657600080fd5b905090506060518183038060405190131561089057600080fd5b809190121561089e57600080fd5b9050905081525061038080516104e051606051818301806040519013156108c457600080fd5b80919012156108d257600080fd5b9050905081525060006103605112156108ec576000610360525b60006103805112156108ff576000610380525b6104a0516103e0526104a0516103a05261046051610480516104a051610440518082101561092c57600080fd5b80820390509050808202821582848304141761094757600080fd5b80905090509050670de0b6b3a7640000808061096257600080fd5b82049050905081818301101561097757600080fd5b808201905090506103c0526103408051600181818301101561099857600080fd5b80820190509050815250426104a05114156109bb57436103c052610a2456610a13565b610340516c01431e0fae6d7217caa000000081106109d857600080fd5b600460c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550505b5b81516001018083528114156107ca575b5050610340516003556000610140511815610b205761038080516102a0516102205160605181830380604051901315610a5c57600080fd5b8091901215610a6a57600080fd5b9050905060605181830180604051901315610a8457600080fd5b8091901215610a9257600080fd5b905090508152506103608051610280516102005160605181830380604051901315610abc57600080fd5b8091901215610aca57600080fd5b9050905060605181830180604051901315610ae457600080fd5b8091901215610af257600080fd5b905090508152506000610380511215610b0c576000610380525b6000610360511215610b1f576000610360525b5b610340516c01431e0fae6d7217caa00000008110610b3d57600080fd5b600460c052602060c0200160c052602060c0206103608051825580602001516001830155806040015160028301558060600151600383015550506000610140511815610d2d5742610180511115610c1c5761030080516102205160605181830180604051901315610bad57600080fd5b8091901215610bbb57600080fd5b90509050815250610180516101c0511415610c055761030080516102a05160605181830380604051901315610bef57600080fd5b8091901215610bfd57600080fd5b905090508152505b6103005160076101805160e05260c052604060c020555b426101c0511115610c8157610180516101c0511115610c805761032080516102a05160605181830380604051901315610c5457600080fd5b8091901215610c6257600080fd5b905090508152506103205160076101c05160e05260c052604060c020555b5b60066101405160e05260c052604060c020546001818183011015610ca457600080fd5b80820190509050610500526105005160066101405160e05260c052604060c02055426102c052436102e05261050051633b9aca008110610ce357600080fd5b60056101405160e05260c052604060c02060c052602060c0200160c052602060c0206102808051825580602001516001830155806040015160028301558060600151600383015550505b6101e051565b600015610fd5575b610200526101405261016052610180526101a0526101c0526101e0526102206101a080518252806020015182602001525050600154610260526102605161016051818183011015610d8b57600080fd5b8082019050905060015561028061022080518252806020015182602001525050610220805161016051604051811115610dc357600080fd5b60605181830180604051901315610dd957600080fd5b8091901215610de757600080fd5b905090508152506000610180511815610e035761018051610240525b60026101405160e05260c052604060c02060c052602060c020610220805182558060200151600183015550506101406102c0525b6102c0515160206102c051016102c0526102c06102c0511015610e5957610e37565b610140516102e0526103006102808051825280602001518260200152505061034061022080518252806020015182602001525050610360516103405161032051610300516102e05160065801610433565b6102a06102c0525b6102c0515260206102c051036102c0526101406102c051101515610ed557610eb2565b6000506000610160511815610f3a57602061048060646323b872dd6103c052610140516103e052306104005261016051610420526103dc60006000545af1610f1c57600080fd5b601f3d11610f2957600080fd5b60005061048051610f3957600080fd5b5b610160516104a0526101e0516104c052426104e05261024051610140517f4566dfc29f6f11d13a418c26a02bef7c28bae749d4de47e4e6a7cddea6730d5960606104a0a361026051610500526102605161016051818183011015610f9d57600080fd5b80820190509050610520527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c6040610500a161020051565b63c2c4c5c16000511415611024573415610fee57600080fd5b600061014052604036610160376040366101a0376101c0516101a05161018051610160516101405160065801610433565b600050005b633a46273e600051141561123a5762ffffff541561104157600080fd5b600162ffffff55341561105357600080fd5b600435602051811061106457600080fd5b50610140600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506000602435116110a757600080fd5b6308c379a06101805260206101a05260166101c0527f4e6f206578697374696e67206c6f636b20666f756e64000000000000000000006101e0526101c050600061014051136110f757606461019cfd5b6308c379a0610220526020610240526024610260527f43616e6e6f742061646420746f2065787069726564206c6f636b2e2057697468610280527f64726177000000000000000000000000000000000000000000000000000000006102a0526102605042610160511161116b57608461023cfd5b6101406102e0525b6102e0515160206102e051016102e0526102e06102e051101561119557611173565b6004356103005260243561032052600061034052610360600260043560e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060006103a0526103a051610380516103605161034051610320516103005160065801610d3b565b6102c06102e0525b6102e0515260206102e051036102e0526101406102e05110151561122e5761120b565b600050600062ffffff55005b6365fc387360005114156114d85762ffffff541561125757600080fd5b600162ffffff55341561126957600080fd5b336101405261014051600658016101fe565b60005060243562093a80808061129057600080fd5b82049050905062093a8080820282158284830414176112ae57600080fd5b809050905090506101a0526101c060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506000600435116112f957600080fd5b6308c379a0610200526020610220526019610240527f5769746864726177206f6c6420746f6b656e732066697273740000000000000061026052610240506101c0511561134757606461021cfd5b6308c379a06102a05260206102c05260266102e0527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e2074686520610300527f6675747572650000000000000000000000000000000000000000000000000000610320526102e050426101a051116113bb5760846102bcfd5b6308c379a061036052602061038052601e6103a0527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006103c0526103a05042630784ce0081818301101561140e57600080fd5b808201905090506101a051111561142657606461037cfd5b610140610400525b610400515160206104005101610400526104006104005110156114505761142e565b3361042052600435610440526101a051610460526104806101c08051825280602001518260200152505060016104c0526104c0516104a0516104805161046051610440516104205160065801610d3b565b6103e0610400525b61040051526020610400510361040052610140610400511015156114cc576114a9565b600050600062ffffff55005b634957677c60005114156116d05762ffffff54156114f557600080fd5b600162ffffff55341561150757600080fd5b336101405261014051600658016101fe565b6000506101a060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060006004351161155c57600080fd5b6308c379a06101e0526020610200526016610220527f4e6f206578697374696e67206c6f636b20666f756e6400000000000000000000610240526102205060006101a051136115ac5760646101fcfd5b6308c379a06102805260206102a05260246102c0527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686102e0527f6472617700000000000000000000000000000000000000000000000000000000610300526102c050426101c0511161162057608461029cfd5b610140610340525b6103405151602061034051016103405261034061034051101561164a57611628565b33610360526004356103805260006103a0526103c06101a080518252806020015182602001525050600261040052610400516103e0516103c0516103a051610380516103605160065801610d3b565b610320610340525b61034051526020610340510361034052610140610340511015156116c4576116a1565b600050600062ffffff55005b63eff7a612600051141561198d5762ffffff54156116ed57600080fd5b600162ffffff5534156116ff57600080fd5b336101405261014051600658016101fe565b6000506101a060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c02001548260200152505060043562093a80808061175757600080fd5b82049050905062093a80808202821582848304141761177557600080fd5b809050905090506101e0526308c379a061020052602061022052600c610240527f4c6f636b206578706972656400000000000000000000000000000000000000006102605261024050426101c051116117cf57606461021cfd5b6308c379a06102a05260206102c05260116102e0527f4e6f7468696e67206973206c6f636b6564000000000000000000000000000000610300526102e05060006101a0511361181f5760646102bcfd5b6308c379a061034052602061036052601f610380527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006103a052610380506101c0516101e0511161187157606461035cfd5b6308c379a06103e052602061040052601e610420527f566f74696e67206c6f636b2063616e2062652034207965617273206d61780000610440526104205042630784ce008181830110156118c457600080fd5b808201905090506101e05111156118dc5760646103fcfd5b610140610480525b61048051516020610480510161048052610480610480511015611906576118e4565b336104a05260006104c0526101e0516104e0526105006101a0805182528060200151826020015250506003610540526105405161052051610500516104e0516104c0516104a05160065801610d3b565b610460610480525b61048051526020610480510361048052610140610480511015156119815761195e565b600050600062ffffff55005b633ccfd60b6000511415611c445762ffffff54156119aa57600080fd5b600162ffffff5534156119bc57600080fd5b61014060023360e05260c052604060c0208060c052602060c02054825260018160c052602060c0200154826020015250506308c379a06101805260206101a05260166101c0527f546865206c6f636b206469646e277420657870697265000000000000000000006101e0526101c05061016051421015611a3d57606461019cfd5b610140516000811215611a4f57600080fd5b610220526102406101408051825280602001518260200152505060006101605260006101405260023360e05260c052604060c02060c052602060c0206101408051825580602001516001830155505060015461028052610280516102205180821015611aba57600080fd5b808203905090506001556101406102a0525b6102a0515160206102a051016102a0526102a06102a0511015611aee57611acc565b336102c0526102e061024080518252806020015182602001525050610320610140805182528060200151826020015250506103405161032051610300516102e0516102c05160065801610433565b6102806102a0525b6102a0515260206102a051036102a0526101406102a051101515611b6757611b44565b6000506020610440604463a9059cbb6103a052336103c052610220516103e0526103bc60006000545af1611b9a57600080fd5b601f3d11611ba757600080fd5b60005061044051611bb757600080fd5b61022051610460524261048052337ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686040610460a2610280516104a052610280516102205180821015611c0957600080fd5b808203905090506104c0527f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c60406104a0a1600062ffffff55005b600015611d63575b61018052610140526101605260006101a052610160516101c0526101e060006080818352015b6101c0516101a051101515611c8657611d4f565b6101a0516101c051818183011015611c9d57600080fd5b808201905090506001818183011015611cb557600080fd5b8082019050905060028080611cc957600080fd5b82049050905061020052610140516003610200516c01431e0fae6d7217caa00000008110611cf657600080fd5b600460c052602060c0200160c052602060c0200154111515611d1f57610200516101a052611d3e565b61020051600180821015611d3257600080fd5b808203905090506101c0525b5b8151600101808352811415611c72575b50506101a051600052600051610180515650005b6370a082316000511415611d7b574261014052611da0565b62fdd58e6000511415611d98576020602461014037600050611da0565b600015611f18575b3415611dab57600080fd5b6004356020518110611dbc57600080fd5b50600660043560e05260c052604060c0205461016052610160511515611dec57600060005260206000f350611f16565b61018061016051633b9aca008110611e0357600080fd5b600560043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505061018080516101a051610140516101c05180821015611e7e57600080fd5b80820390509050604051811115611e9457600080fd5b60605181830280604051901315611eaa57600080fd5b8091901215611eb857600080fd5b9050905060605181830380604051901315611ed257600080fd5b8091901215611ee057600080fd5b905090508152506000610180511215611efa576000610180525b610180516000811215611f0c57600080fd5b60005260206000f3505b005b634ee2cd7e6000511415612427573415611f3157600080fd5b6004356020518110611f4257600080fd5b50436024351115611f5257600080fd5b600061014052600660043560e05260c052604060c020546101605261018060006080818352015b6101605161014051101515611f8d5761205a565b6101405161016051818183011015611fa457600080fd5b808201905090506001818183011015611fbc57600080fd5b8082019050905060028080611fd057600080fd5b8204905090506101a05260243560036101a051633b9aca008110611ff357600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020015411151561202a576101a05161014052612049565b6101a05160018082101561203d57600080fd5b80820390509050610160525b5b8151600101808352811415611f79575b50506101c061014051633b9aca00811061207357600080fd5b600560043560e05260c052604060c02060c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050600354610240526101405161016051610180516101a0516101c0516101e051610200516102205161024051610260516024356102a052610240516102c0526102c0516102a05160065801611c4c565b61032052610260526102405261022052610200526101e0526101c0526101a0526101805261016052610140526103205161026052610340610260516c01431e0fae6d7217caa0000000811061217357600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006103c05260006103e052610240516102605110156122a8576104006102605160018181830110156121f457600080fd5b808201905090506c01431e0fae6d7217caa0000000811061221457600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610460516103a0518082101561227857600080fd5b808203905090506103c05261044051610380518082101561229857600080fd5b808203905090506103e0526122e3565b436103a051808210156122ba57600080fd5b808203905090506103c0524261038051808210156122d757600080fd5b808203905090506103e0525b610380516104805260006103c05118156123655761048080516103e0516024356103a0518082101561231457600080fd5b80820390509050808202821582848304141761232f57600080fd5b809050905090506103c051808061234557600080fd5b82049050905081818301101561235a57600080fd5b808201905090508152505b6101c080516101e05161048051610200518082101561238357600080fd5b8082039050905060405181111561239957600080fd5b606051818302806040519013156123af57600080fd5b80919012156123bd57600080fd5b90509050606051818303806040519013156123d757600080fd5b80919012156123e557600080fd5b9050905081525060006101c051121515612419576101c051600081121561240b57600080fd5b60005260206000f350612425565b600060005260206000f3505b005b60001561262f575b6101e0526101405261016052610180526101a0526101c0526102006101408051825280602001518260200152806040015182604001528060600151826060015250506102405162093a80808061248457600080fd5b82049050905062093a8080820282158284830414176124a257600080fd5b80905090509050610280526102a0600060ff818352015b610280805162093a808181830110156124d157600080fd5b8082019050905081525060006102c0526101c0516102805111156124fc576101c05161028052612513565b60076102805160e05260c052604060c020546102c0525b61020080516102205161028051610240518082101561253157600080fd5b8082039050905060405181111561254757600080fd5b6060518183028060405190131561255d57600080fd5b809190121561256b57600080fd5b905090506060518183038060405190131561258557600080fd5b809190121561259357600080fd5b905090508152506101c0516102805114156125ad576125fa565b61022080516102c051606051818301806040519013156125cc57600080fd5b80919012156125da57600080fd5b9050905081525061028051610240525b81516001018083528114156124b9575b5050600061020051121561260f576000610200525b61020051600081121561262157600080fd5b6000526000516101e0515650005b6318160ddd600051141561264757426101405261266d565b63bd85b039600051141561266557602060046101403760005061266d565b600015612780575b341561267857600080fd5b60035461016052610180610160516c01431e0fae6d7217caa0000000811061269f57600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c0200154826060015250506101405161016051610180516101a0516101c0516101e051610220610180805182528060200151826020015280604001518260400152806060015182606001525050610140516102a0526102a051610280516102605161024051610220516006580161242f565b610300526101e0526101c0526101a0526101805261016052610140526103005160005260206000f350005b63981b24d06000511415612ae757341561279957600080fd5b4360043511156127a857600080fd5b6003546101405261014051610160516004356101a052610140516101c0526101c0516101a05160065801611c4c565b6102205261016052610140526102205161016052610240610160516c01431e0fae6d7217caa0000000811061280b57600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c02001548260600152505060006102c0526101405161016051101561298c576102e061016051600181818301101561288657600080fd5b808201905090506c01431e0fae6d7217caa000000081106128a657600080fd5b600460c052602060c020018060c052602060c02054825260018160c052602060c0200154826020015260028160c052602060c0200154826040015260038160c052602060c020015482606001525050610340516102a0511815612987576004356102a0518082101561291757600080fd5b8082039050905061032051610280518082101561293357600080fd5b80820390509050808202821582848304141761294e57600080fd5b80905090509050610340516102a0518082101561296a57600080fd5b80820390509050808061297c57600080fd5b8204905090506102c0525b612a16565b436102a0511815612a15576004356102a051808210156129ab57600080fd5b808203905090504261028051808210156129c457600080fd5b8082039050905080820282158284830414176129df57600080fd5b80905090509050436102a051808210156129f857600080fd5b808203905090508080612a0a57600080fd5b8204905090506102c0525b5b610140610360525b610360515160206103605101610360526102e0610360511015612a4057612a1e565b610380610240805182528060200151826020015280604001518260400152806060015182606001525050610280516102c051818183011015612a8157600080fd5b8082019050905061040052610400516103e0516103c0516103a051610380516006580161242f565b610460526102c0610360525b6103605152602061036051036103605261014061036051101515612ad857612ab5565b6104605160005260206000f350005b633cebb8236000511415612b28573415612b0057600080fd5b6004356020518110612b1157600080fd5b506008543314612b2057600080fd5b600435600855005b63fc0c546a6000511415612b4f573415612b4157600080fd5b60005460005260206000f350005b63047fc9aa6000511415612b76573415612b6857600080fd5b60015460005260206000f350005b63cbf9fe5f6000511415612bff573415612b8f57600080fd5b6004356020518110612ba057600080fd5b50610140808080600260043560e05260c052604060c02060c052602060c020548152505060208101905080806001600260043560e05260c052604060c02060c052602060c02001548152505060409050905060c05260c051610140f350005b63900cf0cf6000511415612c26573415612c1857600080fd5b60035460005260206000f350005b63d1febfb96000511415612d49573415612c3f57600080fd5b6101408080806004356c01431e0fae6d7217caa00000008110612c6157600080fd5b600460c052602060c0200160c052602060c0205481525050602081019050808060016004356c01431e0fae6d7217caa00000008110612c9f57600080fd5b600460c052602060c0200160c052602060c020015481525050602081019050808060026004356c01431e0fae6d7217caa00000008110612cde57600080fd5b600460c052602060c0200160c052602060c020015481525050602081019050808060036004356c01431e0fae6d7217caa00000008110612d1d57600080fd5b600460c052602060c0200160c052602060c02001548152505060809050905060c05260c051610140f350005b6328d09d476000511415612e92573415612d6257600080fd5b6004356020518110612d7357600080fd5b50610140808080602435633b9aca008110612d8d57600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c020548152505060208101905080806001602435633b9aca008110612dd057600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060208101905080806002602435633b9aca008110612e1457600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060208101905080806003602435633b9aca008110612e5857600080fd5b600560043560e05260c052604060c02060c052602060c0200160c052602060c02001548152505060809050905060c05260c051610140f350005b63010ae7576000511415612ed9573415612eab57600080fd5b6004356020518110612ebc57600080fd5b50600660043560e05260c052604060c0205460005260206000f350005b63711974846000511415612f0e573415612ef257600080fd5b600760043560e05260c052604060c0205460005260206000f350005b63f77c47916000511415612f35573415612f2757600080fd5b60085460005260206000f350005b63bef97c876000511415612f5c573415612f4e57600080fd5b60095460005260206000f350005b6306fdde036000511415613010573415612f7557600080fd5b600a8060c052602060c020610180602082540161012060006003818352015b82610120516020021115612fa757612fc9565b61012051850154610120516020028501525b8151600101808352811415612f94575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6395d89b4160005114156130c457341561302957600080fd5b600b8060c052602060c020610180602082540161012060006002818352015b8261012051602002111561305b5761307d565b61012051850154610120516020028501525b8151600101808352811415613048575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b6354fd4d5060005114156131785734156130dd57600080fd5b600c8060c052602060c020610180602082540161012060006002818352015b8261012051602002111561310f57613131565b61012051850154610120516020028501525b81516001018083528114156130fc575b50505050505061018051806101a001818260206001820306601f82010390500336823750506020610160526040610180510160206001820306601f8201039050610160f350005b63313ce567600051141561319f57341561319157600080fd5b600d5460005260206000f350005b638ff36fd160005114156131c65734156131b857600080fd5b600e5460005260206000f350005b637175d4f760005114156131ed5734156131df57600080fd5b600f5460005260206000f350005b63f851a440600051141561321457341561320657600080fd5b60105460005260206000f350005b6317f7182a600051141561323b57341561322d57600080fd5b60115460005260206000f350005b5b60006000fd5b61030761354903610307600039610307613549036000f30000000000000000000000001e7b1bd0490dde12f6e3d09766beb05552afe27a000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000a6d6f636b2076654352560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066d7665435256000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000027631000000000000000000000000000000000000000000000000000000000000

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.