5 请问USDT合约的ERC20实现是有什么特殊的地方吗?为什么会在调用方法时出现异常

在solidity代码中调用USDC的transfer一切正常,但是在调用USDT的transfer方法时会回滚,报错代码如下

image.png 在上述代码中我使用IERC20接口并填入usdt的地址,调用transfer方法,向一个交易池发送本合约所有的usdt。但是报错信息如下

5867b963833a1035cdf08f6f2028dff.png

其中标记1处查询余额为10000000,之后在标记2处向地址0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc发送10000000个代币,之后报错回滚

这是我的IERC接口代码:

image.png

之后,在研究USDT源码时发现transfer方法为了防止短地址攻击,使用了onlyPayLoadSize修饰符,需要数据长度>=68 09ab33ad3695b3bba5849ae2e8e8732.png

但是在下方似乎还有一个还没有使用的transfer方法

image.png

请问各位大佬,究竟是我代码不满足数据data.length>=68这个条件,还是我调错方法了呢?这两个方法我在调用时究竟调用的是哪个方法呢?如果是data.length长度不够,我应该如何修改代码满足条件呢?

请先 登录 后评论

最佳答案 2023-03-24 10:08

USDT合约不是标准的ERC20合约,你用ERC20的transfer方法会报错,因为USDT的transfer接口定义没有返回值,解决方法如下:

  1. 修改transfer接口,删除external后面的returns (bool)
  2. 用低级调用call可兼容所有token
请先 登录 后评论

其它 2 个回答

Jzq
请先 登录 后评论
用户_13976
请先 登录 后评论
  • 4 关注
  • 0 收藏,2359 浏览
  • Jzq 提出于 2023-03-22 15:20