0%

Project-CoolErc20-whitelist-具备白名单代币

Pre:

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

需求:

  • 白名单用户才能正常transfer

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

业务场景:

给白名单用户提供一些优惠的条件

  • 降低手续费、费率优惠

  • 设置某个区块时间内,只有白名单可以交易

不一定将白名单判断置于transfer的逻辑里,基于需求可以置于铸币、初始销售ido等流程里

但白名单有点非黑即白的感觉,如果遇到多级营销分红的场景,可能不太适用,需要使用贴合场景的数据结构。

部署:

编写合约:

白名单初始化:

1
2
3
4
// 构造函数
constructor() public ERC20("JToken", "JToken") {
_mint(msg.sender, _totalSupply);
}

由于一开始需要铸币给管理员地址,所以需要提前把管理员的地址加入白名单(看白名单具体的判定条件,可能0x00地址也需要加入白名单),不然deploy就会失败。

测试:

revert:

1
2
3
4
// 正确写法
await expect(users[0].Token.transfer(users[1].address, amountWei)).to.be.reverted;
// 错误写法
expect await(users[0].Token.transfer(users[1].address, amountWei)).to.be.reverted;

多查文档:Chai matchers

测试结果:

符合预期:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
   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
Transfer: user0 -> 100-> user1
【Step 3】user0 -> 100-> user1 to be reverted
Set whiteList:
【Step 4】tokenOwner Set user0 in WhiteList:
【Step 4】user0IfwhiteList: true
After setting whitelist, try to transfer:
【Step 5】 expect : users[0] -> 100-> user1 to be not reverted
【Step 5】user0Balance(Ether): 0.0
【Step 5】user1Balance(Ether): 100.0
✔ only transfer after setting whiteList (1253ms)

1 passing (1s)

Refs: