ETH Price: $3,300.40 (+1.54%)

Contract

0x629347824016530Fcd9a1990a30658ed9a04C834
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim153528602022-08-16 14:23:33878 days ago1660659813IN
0x62934782...d9a04C834
0 ETH0.0010700716.59835207
Claim153383572022-08-14 7:18:10880 days ago1660461490IN
0x62934782...d9a04C834
0 ETH0.000520048.06760463
Claim153256672022-08-12 7:22:53882 days ago1660288973IN
0x62934782...d9a04C834
0 ETH0.000586549.09915683
Claim153192792022-08-11 6:58:21883 days ago1660201101IN
0x62934782...d9a04C834
0 ETH0.0012131218.81952559
Claim153129572022-08-10 7:09:05884 days ago1660115345IN
0x62934782...d9a04C834
0 ETH0.000542248.41202743
Claim153001312022-08-08 7:08:43886 days ago1659942523IN
0x62934782...d9a04C834
0 ETH0.000626119.71315367
Claim152937652022-08-07 7:15:04887 days ago1659856504IN
0x62934782...d9a04C834
0 ETH0.000265214.11441503
Claim152873092022-08-06 7:08:29888 days ago1659769709IN
0x62934782...d9a04C834
0 ETH0.000479427.43750938
Claim152809552022-08-05 7:24:57889 days ago1659684297IN
0x62934782...d9a04C834
0 ETH0.0008797513.64780941
Claim152745832022-08-04 7:36:34890 days ago1659598594IN
0x62934782...d9a04C834
0 ETH0.0012102118.77440712
Claim152681032022-08-03 7:12:45891 days ago1659510765IN
0x62934782...d9a04C834
0 ETH0.000360835.59769315
Claim152616452022-08-02 7:08:15892 days ago1659424095IN
0x62934782...d9a04C834
0 ETH0.0006573210.19726553
Claim152552912022-08-01 7:32:39893 days ago1659339159IN
0x62934782...d9a04C834
0 ETH0.000641249.94777764
Claim152419462022-07-30 5:26:44895 days ago1659158804IN
0x62934782...d9a04C834
0 ETH0.00032675.06832253
Claim152355462022-07-29 5:37:27896 days ago1659073047IN
0x62934782...d9a04C834
0 ETH0.0008724913.53519678
Claim152293952022-07-28 6:33:22897 days ago1658990002IN
0x62934782...d9a04C834
0 ETH0.000614039.52565897
Claim152229952022-07-27 7:02:58898 days ago1658905378IN
0x62934782...d9a04C834
0 ETH0.0009922515.39314384
Claim152165012022-07-26 6:22:12899 days ago1658816532IN
0x62934782...d9a04C834
0 ETH0.0013674321.21334795
Claim152100252022-07-25 6:20:44900 days ago1658730044IN
0x62934782...d9a04C834
0 ETH0.000551458.5548375
Claim152039292022-07-24 7:17:17901 days ago1658647037IN
0x62934782...d9a04C834
0 ETH0.000396526.15145709
Claim151972352022-07-23 6:09:06902 days ago1658556546IN
0x62934782...d9a04C834
0 ETH0.000435286.75269912
Claim151905782022-07-22 5:33:37903 days ago1658468017IN
0x62934782...d9a04C834
0 ETH0.000492017.632717
Claim151715102022-07-19 6:41:24906 days ago1658212884IN
0x62934782...d9a04C834
0 ETH0.0008145412.63621087
Claim151458802022-07-15 7:24:39910 days ago1657869879IN
0x62934782...d9a04C834
0 ETH0.0009613714.91406869
Claim151392022022-07-14 6:54:09911 days ago1657781649IN
0x62934782...d9a04C834
0 ETH0.00060999.4615902
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block
From
To
106714332020-08-16 13:42:141608 days ago1597585334  Contract Creation0 ETH
Loading...
Loading

Minimal Proxy Contract for 0xa219008f38a698cc5df6074f0f147a5eab2a2ebe

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 Simple Vesting Escrow
@author Curve Finance
@license MIT
@notice Vests `ERC20CRV` 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 ToggleDisable:
    recipient: address
    disabled: bool

event CommitOwnership:
    admin: address

event ApplyOwnership:
    admin: address


token: public(address)
start_time: public(uint256)
end_time: public(uint256)
initial_locked: public(HashMap[address, uint256])
total_claimed: public(HashMap[address, uint256])

initial_locked_supply: public(uint256)

can_disable: public(bool)
disabled_at: public(HashMap[address, uint256])

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

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


@external
@nonreentrant('lock')
def initialize(
    _admin: address,
    _token: address,
    _recipient: address,
    _amount: uint256,
    _start_time: uint256,
    _end_time: uint256,
    _can_disable: bool
) -> 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 _can_disable Can admin disable recipient's ability to claim tokens?
    """
    assert self.admin == ZERO_ADDRESS  # dev: can only initialize once

    self.token = _token
    self.admin = _admin
    self.start_time = _start_time
    self.end_time = _end_time
    self.can_disable = _can_disable

    assert ERC20(_token).transferFrom(msg.sender, self, _amount)

    self.initial_locked[_recipient] = _amount
    self.initial_locked_supply = _amount
    log Fund(_recipient, _amount)

    return True


@external
def toggle_disable(_recipient: address):
    """
    @notice Disable or re-enable a vested address's ability to claim tokens
    @dev When disabled, the address is only unable to claim tokens which are still
         locked at the time of this call. It is not possible to block the claim
         of tokens which have already vested.
    @param _recipient Address to disable or enable
    """
    assert msg.sender == self.admin  # dev: admin only
    assert self.can_disable, "Cannot disable"

    is_disabled: bool = self.disabled_at[_recipient] == 0
    if is_disabled:
        self.disabled_at[_recipient] = block.timestamp
    else:
        self.disabled_at[_recipient] = 0

    log ToggleDisable(_recipient, is_disabled)


@external
def disable_can_disable():
    """
    @notice Disable the ability to call `toggle_disable`
    """
    assert msg.sender == self.admin  # dev: admin only
    self.can_disable = False


@internal
@view
def _total_vested_of(_recipient: address, _time: uint256 = block.timestamp) -> uint256:
    start: uint256 = self.start_time
    end: uint256 = self.end_time
    locked: uint256 = self.initial_locked[_recipient]
    if _time < start:
        return 0
    return min(locked * (_time - start) / (end - start), locked)


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


@external
@view
def vestedSupply() -> uint256:
    """
    @notice Get the total number of tokens which have vested, that are held
            by this contract
    """
    return self._total_vested()


@external
@view
def lockedSupply() -> uint256:
    """
    @notice Get the total number of tokens which are still locked
            (have not yet vested)
    """
    return self.initial_locked_supply - self._total_vested()


@external
@view
def vestedOf(_recipient: address) -> uint256:
    """
    @notice Get the number of tokens which have vested for a given address
    @param _recipient address to check
    """
    return self._total_vested_of(_recipient)


@external
@view
def balanceOf(_recipient: address) -> uint256:
    """
    @notice Get the number of unclaimed, vested tokens for a given address
    @param _recipient address to check
    """
    return self._total_vested_of(_recipient) - self.total_claimed[_recipient]


@external
@view
def lockedOf(_recipient: address) -> uint256:
    """
    @notice Get the number of locked tokens for a given address
    @param _recipient address to check
    """
    return self.initial_locked[_recipient] - self._total_vested_of(_recipient)


@external
@nonreentrant('lock')
def claim(addr: address = msg.sender):
    """
    @notice Claim tokens which have vested
    @param addr Address to claim tokens for
    """
    t: uint256 = self.disabled_at[addr]
    if t == 0:
        t = block.timestamp
    claimable: uint256 = self._total_vested_of(addr, t) - self.total_claimed[addr]
    self.total_claimed[addr] += claimable
    assert ERC20(self.token).transfer(addr, claimable)

    log Claim(addr, claimable)


@external
def commit_transfer_ownership(addr: address) -> bool:
    """
    @notice Transfer ownership of GaugeController 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)

    return True


@external
def apply_transfer_ownership() -> bool:
    """
    @notice Apply pending 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)

    return True

Contract ABI

[{"name":"Fund","inputs":[{"type":"address","name":"recipient","indexed":true},{"type":"uint256","name":"amount","indexed":false}],"anonymous":false,"type":"event"},{"name":"Claim","inputs":[{"type":"address","name":"recipient","indexed":true},{"type":"uint256","name":"claimed","indexed":false}],"anonymous":false,"type":"event"},{"name":"ToggleDisable","inputs":[{"type":"address","name":"recipient","indexed":false},{"type":"bool","name":"disabled","indexed":false}],"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"},{"outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"name":"initialize","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"_admin"},{"type":"address","name":"_token"},{"type":"address","name":"_recipient"},{"type":"uint256","name":"_amount"},{"type":"uint256","name":"_start_time"},{"type":"uint256","name":"_end_time"},{"type":"bool","name":"_can_disable"}],"stateMutability":"nonpayable","type":"function","gas":325328},{"name":"toggle_disable","outputs":[],"inputs":[{"type":"address","name":"_recipient"}],"stateMutability":"nonpayable","type":"function","gas":40250},{"name":"disable_can_disable","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":21265},{"name":"vestedSupply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":4348},{"name":"lockedSupply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":5345},{"name":"vestedOf","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_recipient"}],"stateMutability":"view","type":"function","gas":5043},{"name":"balanceOf","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_recipient"}],"stateMutability":"view","type":"function","gas":6155},{"name":"lockedOf","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"_recipient"}],"stateMutability":"view","type":"function","gas":6185},{"name":"claim","outputs":[],"inputs":[],"stateMutability":"nonpayable","type":"function"},{"name":"claim","outputs":[],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function"},{"name":"commit_transfer_ownership","outputs":[{"type":"bool","name":""}],"inputs":[{"type":"address","name":"addr"}],"stateMutability":"nonpayable","type":"function","gas":37972},{"name":"apply_transfer_ownership","outputs":[{"type":"bool","name":""}],"inputs":[],"stateMutability":"nonpayable","type":"function","gas":38872},{"name":"token","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1541},{"name":"start_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1571},{"name":"end_time","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1601},{"name":"initial_locked","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":1785},{"name":"total_claimed","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":1815},{"name":"initial_locked_supply","outputs":[{"type":"uint256","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1691},{"name":"can_disable","outputs":[{"type":"bool","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1721},{"name":"disabled_at","outputs":[{"type":"uint256","name":""}],"inputs":[{"type":"address","name":"arg0"}],"stateMutability":"view","type":"function","gas":1905},{"name":"admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1781},{"name":"future_admin","outputs":[{"type":"address","name":""}],"inputs":[],"stateMutability":"view","type":"function","gas":1811}]

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.