问题
使用openzeppelin
的IERC20
封装USDT
,在合约中使用 USDTtransfer
方法失败!
原因
这是因为 USDT 的合约实现不是标准的ERC20
代币的实现,openzeppelin
的ERC20
的transfer
协议是这样的
function transfer(address to, uint256 amount) external returns (bool);
而 USDT 的transfer
方法是这样的
function transfer(address to, uint value) public;
USDT的方法没有返回 bool 值,所以用openzeppelin
的IERC20
的接口去包装USDT
使用transfer
方法会失败。
解决方案
使用openzeppelin
提供的SafeERC20
提供的safeTransfer
方法,因为有很多其他代币或者 solidity 版本的问题,不是按照标准协议实现的,所以需要对ERC20
代币的transfer
方法做一些安全处理。
具体步骤是:
导入
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;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。