0%

Project-CoolErc20-burnable-燃烧通缩代币

Pre:

实现一个燃烧通缩的erc20代币
github仓库地址: https://github.com/jerrychan807/cool-erc20/tree/main/burnable

需求:

代币发生转移时:

  • 进行燃烧通缩(4%),TotalSupply减少

  • 税收(1%)留在合约里

  • 管理员可以从合约里提取代币

部署:

hardhat.config.ts里的编译器版本可以参考remix给出的版本

20220615100322

20220615100602

编写合约:

使用openzeppelin库:

OpenZeppelin 库是一个开发框架,可以简化智能合约和 Dapp 的开发,基于已经成熟(严格审计)的代码还能增加安全性,其代码库常年保持着较高的更新频率

使用感受:里面有很多轮子,用起来很方便,合约类直接继承很多工具类库,不用自己自定义多余的函数,在减少代码量的同时还保证了安全性。后面计划多熟悉一下这个库里的内容。

在solidity里的具体导入路径,可以参考他们github仓库里的文件夹结构

1
2
# solidity里import
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

20220615095423

合约接受代币:

1
receive() external payable {}

加上这个函数之后,合约才能正常接受代币

合约里提取代币:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";

contract Withdraw is Ownable, ReentrancyGuard {
event Withdrawal(address indexed sender, uint256 amount);

function withdrawToken(
IERC20 token,
address _to,
uint256 _value
) public onlyOwner nonReentrant {
require(token.balanceOf(address(this)) >= _value, "Not enough token");
SafeERC20.safeTransfer(token, _to, _value);
emit Withdrawal(_to, _value);
}
}

继承Withdraw,后面调用withdrawToken就可以从合约里提取指定数量的指定代币。

测试:

使用remix测试:

把代码copy到remix上,先做一些语法检查然后直接在remix上做一些简单的测试,再用hardhat编写测试脚本,提高复用率

使用hardhat环境测试:

fixture:

1
2
// it first ensure the deployment is executed and reset (use of evm_snaphost for fast test)
await deployments.fixture(["Token"]);

在每一部分测试前,都会调用到这个函数,相当于恢复快照到初始部署的时候。真实的测试网络就不支持该功能。

使用感受

x 感受
优点 相比真实的测试环境来说,速度快得多
缺点 真实测试环境可以借browser,tenderly Debug,直观一些

测试结果:

  • Deployment

  • Transactions

    • ,balance of contract
  • tokenOwner withdraw

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  Token contract
Deployment
✔ Should set the right owner (1127ms)
✔ Should assign the total supply of tokens to the owner (65ms)
Transactions
users0Balance: 100.0
✔ Should transfer tokens from tokenOwner to user (78ms)
users1ShouldGet: 47.5
totalSupplyBefore: 1000.0
totalSupplyAfter: 998.0
contractBalanceWei: 0.5
contractShouldGet: 0.5
✔ Should transfer tokens from user1 to user2 (139ms)
tokenOwner withdraw from contract
tokenOwnerBalanceWeiBefore: 900.0
contractBalanceWei: 0.5
contractBalanceWeiNow: 0.0
tokenOwnerBalanceWeiAfter: 900.5
tokenOwnerShouldGet: 900.5
✔ tokenOwner withdraw from contract (162ms)

5 passing (2s)

✨ Done in 5.62s.

Refs: