最佳答案
5天前
常规转账是这样:
```
bool success = token.transfer(addr, amount);
```
但是有一些 token 的 transfer 没有返回值(例如 [USDT](https://learnblockchain.cn/2018/11/23/65a75ab1341e) ),上面语句就会执行不了。
而使用下面的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');
}
```
常规转账是这样:
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');
}
请先 登录 后评论

- 布道者
擅长:智能合约,以太坊 | 采纳率 45% | 回答于 6天前

被折叠的 条评论
为什么被折叠?



