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: