看到很多合约里面转token都用safeTransfer而不是transfer,有啥必要吗?

转账一般的问题就是余额不够吧,余额不够的时候有safeMath报错不就行了吗,为什么要用safeTransfer呢

请先 登录 后评论

最佳答案 2021-02-23 21:06

常规转账是这样:

bool success = token.transfer(addr, amount);

但是有一些 token 的 transfer 没有返回值(例如 USDT ),上面语句就会执行不了。

而使用下面的safeTransfer,就可以避免上述问题。

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }
请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 1 收藏,5293 浏览
  • 二毛 提出于 2021-02-23 14:37