Finance
This document is better viewed at https://docs.openzeppelin.com/contracts/api/finance |
This directory includes primitives for financial systems:
-
VestingWallet
handles the vesting of Ether and ERC20 tokens for a given beneficiary. Custody of multiple tokens can be given to this contract, which will release the token to the beneficiary following a given, customizable, vesting schedule.
Contracts
VestingWallet
import "@openzeppelin/contracts/finance/VestingWallet.sol";
A vesting wallet is an ownable contract that can receive native currency and ERC20 tokens, and release these assets to the wallet owner, also referred to as "beneficiary", according to a vesting schedule.
Any assets transferred to this contract will follow the vesting schedule as if they were locked from the beginning. Consequently, if the vesting has already started, any amount of tokens sent to this contract will (at least partly) be immediately releasable.
By setting the duration to 0, one can configure this contract to behave like an asset timelock that hold tokens for a beneficiary until a specified time.
Since the wallet is Ownable , and ownership can be transferred, it is possible to sell unvested tokens.
Preventing this in a smart contract is difficult, considering that: 1) a beneficiary address could be a
counterfactually deployed contract, 2) there is likely to be a migration path for EOAs to become contracts in the
near future.
|
When using this contract with any token whose balance is adjusted automatically (i.e. a rebase token), make sure to account the supply/balance adjustment in the vesting schedule to ensure the vested amount is as intended. |
constructor(address beneficiary, uint64 startTimestamp, uint64 durationSeconds)
public
Sets the sender as the initial owner, the beneficiary as the pending owner, the start timestamp and the vesting duration of the vesting wallet.
releasable(address token) → uint256
public
Getter for the amount of releasable token
tokens. token
should be the address of an
IERC20 contract.
release()
public
Release the native token (ether) that have already vested.
Emits a EtherReleased
event.
release(address token)
public
Release the tokens that have already vested.
Emits a ERC20Released
event.
vestedAmount(uint64 timestamp) → uint256
public
Calculates the amount of ether that has already vested. Default implementation is a linear vesting curve.
vestedAmount(address token, uint64 timestamp) → uint256
public
Calculates the amount of tokens that has already vested. Default implementation is a linear vesting curve.