Contract 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 7

 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x1d413b97dc73161f89dc6578aab23b379743fcdfdfbf2ee9c9cc680b78f92456Claim279293272022-10-02 7:36:5563 days 23 hrs ago0xd3d6b23cf945c3e5fd41ce2f04a4eab66364db55 IN 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b0 ETH0.00010082
0x821c973920db77384c5634787cb5154f8db685e7d83de6d92a96303153775500Claim274162412022-09-29 12:51:1366 days 18 hrs ago0xd3d6b23cf945c3e5fd41ce2f04a4eab66364db55 IN 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b0 ETH0.00017229
0xb4958d7af30580d0662e8e265a8593ef9c22409c0a87a1e586aefd8c12550562Claim259540512022-09-22 12:04:4973 days 19 hrs ago0xd3d6b23cf945c3e5fd41ce2f04a4eab66364db55 IN 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b0 ETH0.00012122
0xd0083f8608389bffe687ba958a4797d057dbce16f3c4e2018ff96db17bd16d08Claim253243602022-09-19 18:05:3276 days 13 hrs ago0xd3d6b23cf945c3e5fd41ce2f04a4eab66364db55 IN 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b0 ETH0.00058132
[ Download CSV Export 
Latest 12 internal transactions
Parent Txn Hash Block From To Value
0x1d413b97dc73161f89dc6578aab23b379743fcdfdfbf2ee9c9cc680b78f92456279293272022-10-02 7:36:5563 days 23 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x1d413b97dc73161f89dc6578aab23b379743fcdfdfbf2ee9c9cc680b78f92456279293272022-10-02 7:36:5563 days 23 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xb61915609e6dc7a7261b678073c53bac5875a8b40 ETH
0x821c973920db77384c5634787cb5154f8db685e7d83de6d92a96303153775500274162412022-09-29 12:51:1366 days 18 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x821c973920db77384c5634787cb5154f8db685e7d83de6d92a96303153775500274162412022-09-29 12:51:1366 days 18 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xb61915609e6dc7a7261b678073c53bac5875a8b40 ETH
0xb4958d7af30580d0662e8e265a8593ef9c22409c0a87a1e586aefd8c12550562259540512022-09-22 12:04:4973 days 19 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xb4958d7af30580d0662e8e265a8593ef9c22409c0a87a1e586aefd8c12550562259540512022-09-22 12:04:4973 days 19 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xb61915609e6dc7a7261b678073c53bac5875a8b40 ETH
0xd0083f8608389bffe687ba958a4797d057dbce16f3c4e2018ff96db17bd16d08253243602022-09-19 18:05:3276 days 13 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0xd0083f8608389bffe687ba958a4797d057dbce16f3c4e2018ff96db17bd16d08253243602022-09-19 18:05:3276 days 13 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xb61915609e6dc7a7261b678073c53bac5875a8b40 ETH
0x5dda689a9cdec1194ed1f33cf3081cb6617dc06da3257cd6197f3d6eac948788250617942022-09-18 0:25:1078 days 7 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xff970a61a04b1ca14834a43f5de4533ebddb5cc80 ETH
0x5dda689a9cdec1194ed1f33cf3081cb6617dc06da3257cd6197f3d6eac948788250617942022-09-18 0:25:1078 days 7 hrs ago 0xc4b0e90fcfbf4a2c23398588a788a33a5964679b 0xb61915609e6dc7a7261b678073c53bac5875a8b40 ETH
0x5dda689a9cdec1194ed1f33cf3081cb6617dc06da3257cd6197f3d6eac948788250617942022-09-18 0:25:1078 days 7 hrs ago 0xb93427b83573c8f27a08a909045c3e809610411a0xc4b0e90fcfbf4a2c23398588a788a33a5964679b0 ETH
0x5dda689a9cdec1194ed1f33cf3081cb6617dc06da3257cd6197f3d6eac948788250617942022-09-18 0:25:1078 days 7 hrs ago 0xb93427b83573c8f27a08a909045c3e809610411a  Contract Creation0 ETH
[ Download CSV Export 
Loading

Minimal Proxy Contract for 0xb61915609e6dc7a7261b678073c53bac5875a8b4

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.16

Optimization Enabled:
N/A

Other Settings:
, MIT license
Decompile ByteCode

Contract Source Code (Vyper language format)

# @version 0.2.16
"""
@title Simple Vesting Escrow
@author Curve Finance, Yearn Finance
@license MIT
@notice Vests ERC20 tokens for a single address
@dev Intended to be deployed many times via `VotingEscrowFactory`
"""

from vyper.interfaces import ERC20

event Fund:
    recipient: indexed(address)
    amount: uint256

event Claim:
    recipient: indexed(address)
    claimed: uint256

event RugPull:
    recipient: address
    rugged: uint256

event CommitOwnership:
    admin: address

event ApplyOwnership:
    admin: address

recipient: public(address)
token: public(ERC20)
start_time: public(uint256)
end_time: public(uint256)
cliff_length: public(uint256)
total_locked: public(uint256)
total_claimed: public(uint256)
disabled_at: public(uint256)
initialized: public(bool)

admin: public(address)
future_admin: public(address)

@external
def __init__():
    # ensure that the original contract cannot be initialized
    self.initialized = True


@external
@nonreentrant('lock')
def initialize(
    admin: address,
    token: address,
    recipient: address,
    amount: uint256,
    start_time: uint256,
    end_time: uint256,
    cliff_length: uint256,
) -> bool:
    """
    @notice Initialize the contract.
    @dev This function is seperate from `__init__` because of the factory pattern
         used in `VestingEscrowFactory.deploy_vesting_contract`. It may be called
         once per deployment.
    @param admin Admin address
    @param token Address of the ERC20 token being distributed
    @param recipient Address to vest tokens for
    @param amount Amount of tokens being vested for `recipient`
    @param start_time Epoch time at which token distribution starts
    @param end_time Time until everything should be vested
    @param cliff_length Duration after which the first portion vests
    """
    assert not self.initialized  # dev: can only initialize once
    self.initialized = True

    self.token = ERC20(token)
    self.admin = admin
    self.start_time = start_time
    self.end_time = end_time
    self.cliff_length = cliff_length

    assert self.token.transferFrom(msg.sender, self, amount)  # dev: could not fund escrow

    self.recipient = recipient
    self.disabled_at = end_time  # Set to maximum time
    self.total_locked = amount
    log Fund(recipient, amount)

    return True


@internal
@view
def _total_vested_at(time: uint256 = block.timestamp) -> uint256:
    start: uint256 = self.start_time
    end: uint256 = self.end_time
    locked: uint256 = self.total_locked
    if time < start + self.cliff_length:
        return 0
    return min(locked * (time - start) / (end - start), locked)


@internal
@view
def _unclaimed(time: uint256 = block.timestamp) -> uint256:
    return self._total_vested_at(time) - self.total_claimed


@external
@view
def unclaimed() -> uint256:
    """
    @notice Get the number of unclaimed, vested tokens for recipient
    """
    # NOTE: if `rug_pull` is activated, limit by the activation timestamp
    return self._unclaimed(min(block.timestamp, self.disabled_at))


@internal
@view
def _locked(time: uint256 = block.timestamp) -> uint256:
    return self.total_locked - self._total_vested_at(time)


@external
@view
def locked() -> uint256:
    """
    @notice Get the number of locked tokens for recipient
    """
    # NOTE: if `rug_pull` is activated, limit by the activation timestamp
    return self._locked(min(block.timestamp, self.disabled_at))


@external
def claim(beneficiary: address = msg.sender, amount: uint256 = MAX_UINT256):
    """
    @notice Claim tokens which have vested
    @param beneficiary Address to transfer claimed tokens to
    @param amount Amount of tokens to claim
    """
    assert msg.sender == self.recipient  # dev: not recipient

    claim_period_end: uint256 = min(block.timestamp, self.disabled_at)
    claimable: uint256 = min(self._unclaimed(claim_period_end), amount)
    self.total_claimed += claimable

    assert self.token.transfer(beneficiary, claimable)
    log Claim(beneficiary, claimable)


@external
def rug_pull():
    """
    @notice Disable further flow of tokens and clawback the unvested part to admin
    """
    assert msg.sender == self.admin  # dev: admin only
    # NOTE: Rugging more than once is futile

    self.disabled_at = block.timestamp
    ruggable: uint256 = self._locked()

    assert self.token.transfer(self.admin, ruggable)
    log RugPull(self.recipient, ruggable)


@external
def commit_transfer_ownership(addr: address):
    """
    @notice Transfer ownership of the 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 pending ownership transfer
    """
    assert msg.sender == self.future_admin  # dev: future admin only
    self.admin = msg.sender
    self.future_admin = ZERO_ADDRESS
    log ApplyOwnership(msg.sender)


@external
def renounce_ownership():
    """
    @notice Renounce admin control of the escrow
    """
    assert msg.sender == self.admin  # dev: admin only
    self.future_admin = ZERO_ADDRESS
    self.admin = ZERO_ADDRESS
    log ApplyOwnership(ZERO_ADDRESS)

@external
def collect_dust(token: address):
    assert msg.sender == self.recipient  # dev: recipient only
    assert (token != self.token.address or block.timestamp > self.disabled_at)
    assert ERC20(token).transfer(self.recipient, ERC20(token).balanceOf(self))

Contract ABI

[{"name":"Fund","inputs":[{"name":"recipient","type":"address","indexed":true},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"Claim","inputs":[{"name":"recipient","type":"address","indexed":true},{"name":"claimed","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"RugPull","inputs":[{"name":"recipient","type":"address","indexed":false},{"name":"rugged","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"CommitOwnership","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ApplyOwnership","inputs":[{"name":"admin","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"nonpayable","type":"constructor","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"initialize","inputs":[{"name":"admin","type":"address"},{"name":"token","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"start_time","type":"uint256"},{"name":"end_time","type":"uint256"},{"name":"cliff_length","type":"uint256"}],"outputs":[{"name":"","type":"bool"}],"gas":402331},{"stateMutability":"view","type":"function","name":"unclaimed","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":26060},{"stateMutability":"view","type":"function","name":"locked","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":26120},{"stateMutability":"nonpayable","type":"function","name":"claim","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"claim","inputs":[{"name":"beneficiary","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"claim","inputs":[{"name":"beneficiary","type":"address"},{"name":"amount","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"rug_pull","inputs":[],"outputs":[],"gas":72184},{"stateMutability":"nonpayable","type":"function","name":"commit_transfer_ownership","inputs":[{"name":"addr","type":"address"}],"outputs":[],"gas":39595},{"stateMutability":"nonpayable","type":"function","name":"apply_transfer_ownership","inputs":[],"outputs":[],"gas":59523},{"stateMutability":"nonpayable","type":"function","name":"renounce_ownership","inputs":[],"outputs":[],"gas":44555},{"stateMutability":"nonpayable","type":"function","name":"collect_dust","inputs":[{"name":"token","type":"address"}],"outputs":[],"gas":14120},{"stateMutability":"view","type":"function","name":"recipient","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2658},{"stateMutability":"view","type":"function","name":"token","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2688},{"stateMutability":"view","type":"function","name":"start_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2718},{"stateMutability":"view","type":"function","name":"end_time","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2748},{"stateMutability":"view","type":"function","name":"cliff_length","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2778},{"stateMutability":"view","type":"function","name":"total_locked","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2808},{"stateMutability":"view","type":"function","name":"total_claimed","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2838},{"stateMutability":"view","type":"function","name":"disabled_at","inputs":[],"outputs":[{"name":"","type":"uint256"}],"gas":2868},{"stateMutability":"view","type":"function","name":"initialized","inputs":[],"outputs":[{"name":"","type":"bool"}],"gas":2898},{"stateMutability":"view","type":"function","name":"admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2928},{"stateMutability":"view","type":"function","name":"future_admin","inputs":[],"outputs":[{"name":"","type":"address"}],"gas":2958}]

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