ETH Price: $4,044.69 (+3.78%)

Contract

0xC9464fB351D4Ce15eb38636398a1966Ec51b4Bd3
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim182184782023-09-26 7:31:11447 days ago1695713471IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000377647.00606212
Claim182184622023-09-26 7:27:59447 days ago1695713279IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000525277.03190331
Claim182157902023-09-25 22:29:59447 days ago1695680999IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0008732210.98411418
Claim182156162023-09-25 21:54:59447 days ago1695678899IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0011395714.33656062
Claim182155702023-09-25 21:45:35447 days ago1695678335IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0017048821.44856625
Claim182155172023-09-25 21:34:59447 days ago1695677699IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.001381617.37884326
Claim182150842023-09-25 20:08:11447 days ago1695672491IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0012715915.99750538
Claim182149932023-09-25 19:49:59447 days ago1695671399IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0013462316.93659962
Claim182149322023-09-25 19:37:47447 days ago1695670667IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0019489924.51596653
Claim182147802023-09-25 19:07:23447 days ago1695668843IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.00086610.89498475
Claim182147002023-09-25 18:51:23447 days ago1695667883IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000701868.82857677
Claim182143202023-09-25 17:34:59448 days ago1695663299IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0015739519.80137998
Claim182142172023-09-25 17:14:11448 days ago1695662051IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0019562324.6070089
Claim182140142023-09-25 16:33:35448 days ago1695659615IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0019656124.72505494
Claim182115582023-09-25 8:17:47448 days ago1695629867IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.00059147.43916448
Claim182114182023-09-25 7:49:47448 days ago1695628187IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000764329.61571912
Claim182113492023-09-25 7:35:59448 days ago1695627359IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.0008416310.5867144
Claim182111802023-09-25 7:01:47448 days ago1695625307IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000754239.48738466
Claim182109052023-09-25 6:06:23448 days ago1695621983IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000572427.20035378
Claim182105932023-09-25 5:03:11448 days ago1695618191IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000583577.34063239
Claim182104302023-09-25 4:30:23448 days ago1695616223IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000577267.26129533
Claim182102892023-09-25 4:01:59448 days ago1695614519IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000633897.97356236
Claim182097972023-09-25 2:22:23448 days ago1695608543IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000549616.91458596
Claim182096922023-09-25 2:01:11448 days ago1695607271IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000632337.95405806
Claim182095332023-09-25 1:29:23448 days ago1695605363IN
0xC9464fB3...Ec51b4Bd3
0 ETH0.000570267.17317779
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
181660382023-09-18 23:16:35454 days ago1695078995  Contract Creation0 ETH
Loading...
Loading

Minimal Proxy Contract for 0xb61915609e6dc7a7261b678073c53bac5875a8b4

Contract Name:
Vyper_contract

Compiler Version
vyper:0.2.16

Optimization Enabled:
N/A

Other Settings:
default evmVersion, MIT license

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