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() { _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: