参考资料
在区块链领域,Web3
初创公司会给团队分配代币,同时也会将代币低价出售给风投和私募。如果他们把这些低成本的代币同时提到交易所变现,币价将被砸穿,散户直接成为接盘侠。
所以,项目方一般会约定代币归属条款(token vesting
),在归属期内逐步释放代币,减缓抛压,并防止团队和资本方过早躺平。
线性释放指的是代币在归属期内匀速释放。举个例子,某私募持有 365,000
枚 ICU
代币,归属期为1
年(365
天),那么每天会释放 1,000
枚代币。
逻辑
- 创造一个
erc20
的合约 - 创造一个「线性释放」合约
erc20
合约向 「线性释放」传入固定数量的代币- 相关机构可以调用「线性释放」合约进行获得
线性释放合约
状态变量
线性释放合约中共有 4
个状态变量。
beneficiary
:受益人地址。start
:归属期起始时间戳。duration
:归属期,单位为秒。erc20Released
:代币地址->释放数量的映射,记录受益人已领取的代币数量。
1 | // 状态变量 |
函数
线性释放合约中共有 3
个函数。
- 构造函数:初始化受益人地址,归属期(秒), 起始时间戳。参数为受益人地址
beneficiaryAddress
和归属期durationSeconds
。为了方便,起始时间戳用的部署时的区块链时间戳block.timestamp
。 release()
:提取代币函数,将已释放的代币转账给受益人。调用了vestedAmount()
函数计算可提取的代币数量,释放ERC20Released
事件,然后将代币transfer
给受益人。参数为代币地址token
。vestedAmount()
:根据线性释放公式,查询已经释放的代币数量。开发者可以通过修改这个函数,自定义释放方式。参数为代币地址token
和查询的时间戳timestamp
。
1 | /** |
使用 @openzeppelin
首先使用 erc20
。
我们借助 @openzeppelin
import "@openzeppelin/contracts/finance/VestingWallet.sol";
代码如下
1 | pragma solidity ^0.8.0; |
- 使用账号
0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
- 部署好
erc20
- 合约地址
0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8
mint token
0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
的balanceof
为10000
- 合约地址
- 部署
WTFApe
- 参数
0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
- 当前时间戳
1000
- 合约地址
0xD7ACd2a9FD159E69Bb102A1ca21C9a3e3A5F771B
- 参数
0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
转移erc20
的币到WTFApe
合约中- 此时在
erc20
中查询0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
的balance
为0
- 此时在
- 等待一段时间
WTFApe
调用releasable
传入erc20
地址为0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8
- 返回
3000
- 返回
WTCApe
调用取回函数release(0xd8b934580fcE35a11B58C6D73aDeE468a2833fa8)
- 此时在
erc20
查询0x5B38Da6a701c568545dCfcB03FcB875f56beddC4
的balance
为3000