More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 16831903 | 527 days ago | IN | 0 ETH | 0.00124086 | ||||
Claim | 16599407 | 559 days ago | IN | 0 ETH | 0.00272355 | ||||
Claim | 16397129 | 588 days ago | IN | 0 ETH | 0.00097526 | ||||
Claim | 16090071 | 631 days ago | IN | 0 ETH | 0.00071062 | ||||
Claim | 15513296 | 712 days ago | IN | 0 ETH | 0.00035538 | ||||
Claim | 14877817 | 815 days ago | IN | 0 ETH | 0.00228353 | ||||
Claim | 14706029 | 842 days ago | IN | 0 ETH | 0.00358017 | ||||
Claim | 14411455 | 888 days ago | IN | 0 ETH | 0.00657548 | ||||
Claim | 14409744 | 889 days ago | IN | 0 ETH | 0.0037434 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14385322 | 892 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Minimal Proxy Contract for 0xa219008f38a698cc5df6074f0f147a5eab2a2ebe
Contract Name:
Vyper_contract
Compiler Version
vyper:0.2.4
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
[{"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}]
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.