ETH Price: $2,916.95 (-3.74%)
Gas: 1 Gwei

Contract

0xb9C28C1f508Acd08dA22A3F9C580Dd18263f5927
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Claim201853732024-06-27 20:20:2310 days ago1719519623IN
0xb9C28C1f...8263f5927
0 ETH0.000445615.72818058
Claim201796212024-06-27 1:04:4711 days ago1719450287IN
0xb9C28C1f...8263f5927
0 ETH0.000286423.68224886
Claim201495452024-06-22 20:11:5915 days ago1719087119IN
0xb9C28C1f...8263f5927
0 ETH0.00016612.13540723
Claim201287052024-06-19 22:15:3518 days ago1718835335IN
0xb9C28C1f...8263f5927
0 ETH0.000639978.22738729
Claim201050642024-06-16 14:50:4721 days ago1718549447IN
0xb9C28C1f...8263f5927
0 ETH0.000289464.51542396
Claim200572432024-06-09 22:26:4728 days ago1717972007IN
0xb9C28C1f...8263f5927
0 ETH0.000409136.38213227
Claim199635332024-05-27 20:16:3541 days ago1716840995IN
0xb9C28C1f...8263f5927
0 ETH0.0014497422.61474015
Claim199206802024-05-21 20:30:3547 days ago1716323435IN
0xb9C28C1f...8263f5927
0 ETH0.0007363711.48683376
Claim198784632024-05-15 22:47:2353 days ago1715813243IN
0xb9C28C1f...8263f5927
0 ETH0.000308964.81957552
Claim198543002024-05-12 13:41:1156 days ago1715521271IN
0xb9C28C1f...8263f5927
0 ETH0.000240173.74653003
Claim197788962024-05-02 0:34:2367 days ago1714610063IN
0xb9C28C1f...8263f5927
0 ETH0.000303694.73739738
Claim197472242024-04-27 14:20:3571 days ago1714227635IN
0xb9C28C1f...8263f5927
0 ETH0.000559598.72915607
Claim196187502024-04-09 14:42:2389 days ago1712673743IN
0xb9C28C1f...8263f5927
0 ETH0.002416837.70014481
Claim195903342024-04-05 15:08:4793 days ago1712329727IN
0xb9C28C1f...8263f5927
0 ETH0.0020919932.63337228
Claim195275312024-03-27 19:01:47102 days ago1711566107IN
0xb9C28C1f...8263f5927
0 ETH0.0035324955.10392671
Claim194792832024-03-20 23:48:35109 days ago1710978515IN
0xb9C28C1f...8263f5927
0 ETH0.0020012131.21723723
Claim194159652024-03-12 2:17:23118 days ago1710209843IN
0xb9C28C1f...8263f5927
0 ETH0.0033191651.77612635
Claim193730722024-03-06 2:13:11124 days ago1709691191IN
0xb9C28C1f...8263f5927
0 ETH0.0034006553.04735433
Claim192939462024-02-24 0:45:11135 days ago1708735511IN
0xb9C28C1f...8263f5927
0 ETH0.0014575122.73603667
Claim191452562024-02-03 3:45:59156 days ago1706931959IN
0xb9C28C1f...8263f5927
0 ETH0.0009195814.34469431
Claim190583912024-01-21 23:19:35168 days ago1705879175IN
0xb9C28C1f...8263f5927
0 ETH0.0007512811.71938053
Claim189489182024-01-06 15:02:11183 days ago1704553331IN
0xb9C28C1f...8263f5927
0 ETH0.0017673627.56939673
Claim189056422023-12-31 13:04:47189 days ago1704027887IN
0xb9C28C1f...8263f5927
0 ETH0.0010732313.79725278
Claim188778202023-12-27 15:14:59193 days ago1703690099IN
0xb9C28C1f...8263f5927
0 ETH0.0045245358.16646977
Claim188448612023-12-23 0:10:59198 days ago1703290259IN
0xb9C28C1f...8263f5927
0 ETH0.001739922.36788349
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To Value
175758662023-06-28 5:53:59375 days ago1687931639  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:
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.