此篇文章主要介绍如何部署一个ERC20代币,和写一个智能合约的锁仓 ,释放功能,最后通过合约去管理,这些Token的流通。
在上一篇文章已经介绍并且部署成功了一个ERC20Token,现在开始实现锁仓,和释放的功能。
一般锁仓分两种模式:
- TimeLock
- Vesting
今天我们主要一TimeLock来实现:
主要实现逻辑:
- 先打开remix
- 然后编写锁仓,释放的业务功能(里面采用的利用区块的时间戳来做判断条件block.timestamp)
- 编写成功之后部署
- 编写机器人去定时触发合约执行某个功能
1.打开网页版Remix
2.创建新文件夹编写锁仓核心业务(TimeLock 锁仓方 式)
代码参考:ERC20/TokenTimelock.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/TokenTimelock.sol)
pragma solidity ^0.8.0;
import "./SafeERC20.sol";
import "./IERC20.sol";
contract TokenTimelock {
using SafeERC20 for IERC20;
// ERC20 basic token contract being held
IERC20 private immutable _token;
// beneficiary of tokens after they are released
address private immutable _beneficiary;
// timestamp when token release is enabled
uint256 private immutable _releaseTime;
constructor(
IERC20 token_,
address beneficiary_,
uint256 releaseTime_
) {
require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time");
_token = token_;
_beneficiary = beneficiary_;
_releaseTime = releaseTime_;
}
/**
* @return the token being held.
*/
function token() public view virtual returns (IERC20) {
return _token;
}
/**
* @return the beneficiary of the tokens.
*/
function beneficiary() public view virtual returns (address) {
return _beneficiary;
}
/**
* @return the time when the tokens are released.
*/
function releaseTime() public view virtual returns (uint256) {
return _releaseTime;
}
/**
* @notice Transfers tokens held by timelock to beneficiary.
*/
function release() public virtual {
require(block.timestamp >= releaseTime(), "TokenTimelock: current time is before release time");
uint256 amount = token().balanceOf(address(this));
require(amount > 0, "TokenTimelock: no tokens to release");
token().safeTransfer(beneficiary(), amount);
}
}
编写成功后
3.第三步
点击左上角的--Complie编译合约--编译通过后点击--左上角的DEPLOY部署自己的ERC20合约,在这里要注意先链接好自己的钱包地址,并且里面有测试代币等,最后点击部署即可完成全部操作。
接着合约就会按照你制定的规则执行。
4.第四步
编写智能合约调用的release方法,因为智能合约目前还有个天花板是不能自己触犯自己,必须要从外部触发,当合约里面的释放条件规则满足之后,他需要有机器人去触犯执行操作释放。
优点:
-
这种TimeLock锁仓方式简洁明了,
-
_releaseTime 时间到了之后调用 release() 就会把token发放到_beneficiary的账户中。
缺点:
-
不过TimeLock方式有局限性
-
例如需求是:锁仓4年,1年之后一次性解冻25%,后面按时间线性解冻
-
这样复杂的锁仓需求 TimeLock是搞不定的,这时候就要用 Vesting 方式,这种方式会下次在详细讲解。