ERC20代币审计流程
本文ERC20涵盖 BEP20 HRC20 TRC20 等一切EVM虚拟机区块链的代币协议,其他区块链仅有EVM虚拟机的不做额外补充
1. 审计合约是否开源,各大已支持的evm公链查看代码地址如下:
对于未验证的合约,拒绝通过安审。
2. 检查合同是否为代理合约
如果为代理合约,则需要同时审计被代理访问的合约地址,一般情况下慎重通过安审,举个例子
https://polygonscan.com/address/0x695FC8B80F344411F34bDbCb4E621aA69AdA384b
在这里可以找到被代理的合约,然后去找代理合约第一次构造传入的参数
https://polygonscan.com/txs?a=0x695FC8B80F344411F34bDbCb4E621aA69AdA384b
核对完构造参数后,对被代理合约 0x6c69ef0e475566777294911b6658c002ae6ab2e6 进行审计
代理合约可以升级没法处理啊。风险是有的,需要酌情处理,给他们说明,跟项目方保持联系就好了
3. 检查是否设置发行量上限
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
require( _totalSupply.add(amount) < maxSupply );
_beforeTokenTransfer(address(0), account, amount);
_totalSupply = _totalSupply.add(amount);
_balances[account] = _balances[account].add(amount);
emit Transfer(address(0), account, amount);
}
一般来说设置了最大供应量的就没有问题了,** require( _totalSupply.add(amount) < maxSupply )**
如果未设置最大供应量,查看 _mint( 函数是否只在构造函数的时候调用,如果是的话,也没有问题了
最后如果有其他函数可以随意铸造(根据时间线性解锁份额的情况除外),需要满足以下条件才可以通过审核:
- 其他函数必须有鉴权,不是任何人都可以增发
- 权限控制必须为合约地址 | 单次增发存在时间锁 | 上过其他大交易所 3选1
4. 检查 onwer 是否权限过大
检查 onwer 是否权限过大, 通常来说允许 onwer冻结某个地址的代币以及冻结该项目所有转账,但是不允许如下情况发生:
- onwer 可以转移任意地址代币
- onwer 可以转移销毁地址代币
5. 转账不允许收取手续费
-
[[ https://bscscan.com/address/0xe98ac4c09a3fcc35be438681652602454f6745b7#code | $safemoon ]] , $babydoge 等币有燃烧机制,通常会在 _transfer( 函数中增加转账税给到所有持币人或者流动性池
-
[[ https://bscscan.com/address/0x3fda9383a84c05ec8f7630fe10adf1fac13241cc#code | $dego ]] 则是在转账时会将一部分金钱给到另外一个地址
对于此类代币,一般直接不给过。如果强烈要求,除非代码中包含可以按照 from/to 任意一个地址为白名单,则不扣除转账税 的逻辑, 并将所有归集地址添加至白名单中,否则不予通过
6. 检查是否有错误逻辑
- 代币增发时总量不增加
- 可以修改代币名称
此类错误逻辑会导致系统错乱,直接拒绝