主页 > imtoken唯一官网 > openzeppelin的IERC20封装USDT的问题
openzeppelin的IERC20封装USDT的问题
imtoken唯一官网 2023-08-16 05:07:55
问题
使用openzeppelin的IERC20封装USDT,在合约中使用USDTtransfer方法失败!
原因
这是因为USDT的合约实现并不是标准ERC20代币的实现。 openzeppelin的ERC20传输协议是这样的
function transfer(address to, uint256 amount) external returns (bool);
而USDT的转账方式是这样的
function transfer(address to, uint value) public;
USDT的方法没有返回bool值,所以使用openzeppelin的IERC20接口包装USDT并使用transfer方法会失败。
解决方案
使用openzeppelin提供的SafeERC20提供的safeTransfer方法。 因为其他token或者solidity版本存在很多问题,没有按照标准协议实现,所以需要对ERC20 token的转账方式做一些安全处理。
具体步骤是:
导入 SafeERC20
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
使用 SafeERC20
using SafeERC20 for IERC20;
使用 safeTransfer 方法
_usdt.safeTransfer(to, amount);
完整代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract USDTTransfer {
address private _usdtAddr =
address(0xDbf8Bf15bb3438b7410d8f009d652508ffA97C7B);
constructor() {}
IERC20 private _usdt;
using SafeERC20 for IERC20;
function safeTransferUSDT(address to, uint256 amount)
public
returns (bool)
{
_usdt = IERC20(_usdtAddr);
_usdt.safeTransfer(to, amount);
return true;
}
}
我是 Victor合约交互可以转走usdt,Web3 爱好者! 希望能帮助更多人进入Web3的世界! 如有任何疑问合约交互可以转走usdt,请私信我!