0%

Project-CoolErc20-blacklist-具备黑名单代币

Pre:

实现一个具有黑名单功能的erc20代币
github仓库地址: https://github.com/jerrychan807/cool-erc20/tree/main/blacklist

需求:

  • 黑名单用户无法正常transfer

  • 管理员可配置黑名单里的地址

业务场景:

暂时能想到的

项目方 目的
好人 将恶意用户、抢跑用户、机器人、非正常渠道获得大量代币的用户加入黑名单,相当于冻结它的资产
坏人 rug、scam

还想到一个骚操作,如果把swap的地址加入黑名单列表。。🤣也可以使得该erc20代币 无法正常的与swap交互,无法买卖、添加移除流动性。

部署:

如果是在hardhat环境的话,不用先执行编译、部署了,可以直接yarn hardhat test,会默认执行前两步。

编写合约:

黑名单判断:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal override {
// 错误写法:只要一个为非黑名单即可
// require( !_blackList[from] || !_blackList[to], "ERC20: user in black list");

// 正确写法:同时都为非黑名单
// require( !_blackList[to], "ERC20: 'to' address in black list");
// require( !_blackList[from], "ERC20: 'from' address in black list");

// 正确写法:同时都为非黑名单
require( !_blackList[to] && !_blackList[from], "ERC20: 'to' or 'from' address in black list");
super._beforeTokenTransfer(from, to, amount);
}

一开始觉得这个erc20合约很简单,结果一写到黑名单判断的时候,第一次就写错了。。😅
还发现正确写法有两种,其中第一种可以更清晰地把错误原因写清楚。

看来还是要多code,多实践才行

测试:

Mocha测试框架

在写测试脚本时,有一个目前没接触过的测试需求:需要给用户设置黑名单后,给这个用户转账,然后希望这次转账报错。

1
2
// 希望该函数报错的写法
await expect(tokenOwner.Token.transfer(users[0].address, amountWei)).to.be.reverted;

在查文档的时候才知道。。hardhat用到的是一个叫Mocha的测试框架,后续如果还遇到新的测试需求可以查阅该文档。

Mocha是一个能够运行在Node和浏览器中的多功能的JavaScript测试框架,它让异步测试简单且有趣。

Mocha连续地运行测试,并给出灵活而精确的报告,同时能够将错误精确地映射到测试用例上。它托管在GitHub上。

测试结果:

符合预期:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  Token contract
Transfer
Before Transfer:
【Step 1】tokenOwnerBalance(Ether): 1000.0
【Step 1】userBalance(Ether): 0.0
Transfer:
【Step 2】tokenOwner -> 100-> user0:
【Step 2】tokenOwnerBalance(Ether): 900.0
【Step 2】userBalance(Ether): 100.0
Set blacklist:
【Step 3】tokenOwner Set user0 in blacklist:
【Step 3】user0IfBlackList: true
After setting blacklist, try :
【Step 4】tokenOwner Set user0 in blacklist and try to transfer:
【Step 4】 expect : tokenOwner -> 100-> user0 to.be.reverted
【Step 4】userBalance(Ether): 100.0
✔ can't transfer after setting blacklist (1351ms)

1 passing (1s)

Summary:

  • 看来还是要多code,多实践才行,再简单的需求,真正写起来的时候也很有可能出错。

  • hardhat测试脚本时,如果遇到没见过的测试需求,可以查阅mocha的文档

  • 比如平时有看到别的项目用hardhat构建的,可以参考里面的test脚本,学学别人的写法

  • 实践出真知🧐🧐🧐

  • 实践出真知🧐🧐🧐

  • 实践出真知🧐🧐🧐

Refs: