参考
参考资料
固定总量代币
首先,这里认为已经创建好了 truffle
solidity
项目。
npm install @openzeppelin/contracts@3.4.0
npm install @truffle/hdwallet-provider // 部署脚本
整个项目如下
--contracts
----ERC20FixedSupply.sol
--migrations
----2_deploy_ERC20FixedSupply.js
--.secret
--truffle-config.js
环境
"@openzeppelin/contracts": "^3.4.2",
"@truffle/hdwallet-provider": "^2.0.0",
"truffle": "^5.0.22"
其中,各文件内容如下
ERC20FixedSupply.sol
1 | pragma solidity >=0.4.22 <0.8.0; |
2_deploy_ERC20FixedSupply.js
1 | //固定总量代币 |
细节
我们主要说两种转移方式
transfer
transferFrom
放一下公共函数。
1 | function _transfer(address sender, address recipient, uint256 amount) internal { |
transfer
1 | function transfer(address recipient, uint256 amount) public virtual override returns (bool) { |
这个简单,不多说了。
transferFrom
1 | function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { |
transferForm
的意思是,把你的币的多少额度给一个账户,这个账户可以操纵你额度内的币。
上面的 transferForm
的执行顺序是
- 先执行
transfer
不管账户有没有额度 - 再执行
approve
校验,如果额度不足,则回滚交易
为什么会先执行 transfer
,再判断呢?
主要是可以节省 gas
,先看两个方法差异
先判断
- 先判断是否有额度
- 转移
- 进行额度减少
后判断
- 转移
- 额度减少「如果出错则会回滚」
其实,也可以先
- 额度减少
- 转移
这样,如果,额度不够,只会执行一步,更能减少 gas
。