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

最佳答案

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');

}

请先 登录 后评论

41483aa1f706211017ca7986ccd671d2.png

- 布道者

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值