0%

Project-CoolErc20-pauseable-可暂停代币

Pre:

参考OpenZeppelin的ERC20Pausable.sol,实现一个可暂停的erc20代币
github仓库地址: https://github.com/jerrychan807/cool-erc20/tree/main/pauseable

需求:

  • 管理员可配置暂停开关

  • 暂停后无法正常transfer

  • 解除暂停后可正常transfer

业务场景:

出bug的时候,可以由管理员设置暂停开关,阻止代币的传输、铸造和燃烧等功能,相当于一个紧急停止机制。

部署:

编写合约:

可不写super关键字

1
2
3
4
5
// 父类
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
1
2
3
4
5
// 子类
function setPause() public onlyOwner() {
// super._pause();
_pause(); // 这两种写法都可以
}

调用父类的函数时,不一定都要写super,当在继承关系图谱中存在唯一的父类函数,这种情况下可以不显示写super关键字

测试:

简单合约的话,依旧是在remix上简单编写,做语法check
然后放到hardhat框架里写测试script

测试结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  Token contract
can't transfer after set pause,can transfer after set Unpause
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
Pause:
【Step 3】tokenOwner Set Pause:
【Step 3】paused Switch: true
After setting pause, try to transfer:
【Step 4】 expect : tokenOwner -> 100-> user0 to.be.reverted
【Step 4】userBalance(Ether): 100.0
UnPause:
【Step 5】tokenOwner Set UnPause:
【Step 5】paused Switch: false
After setting Unpause, try to transfer:
【Step 6】 expect : tokenOwner -> 100-> user0 to be not reverted
【Step 6】userBalance(Ether): 200.0
✔ (1446ms)


1 passing (1s)

✨ Done in 5.12s.

Refs: