问题

使用openzeppelinIERC20封装USDT,在合约中使用 USDTtransfer方法失败!

原因

这是因为 USDT 的合约实现不是标准的ERC20代币的实现,openzeppelinERC20transfer协议是这样的

function transfer(address to, uint256 amount) external returns (bool);

而 USDT 的transfer方法是这样的

function transfer(address to, uint value) public;

USDT的方法没有返回 bool 值,所以用openzeppelinIERC20的接口去包装USDT使用transfer方法会失败。

解决方案

使用openzeppelin提供的SafeERC20提供的safeTransfer方法,因为有很多其他代币或者 solidity 版本的问题,不是按照标准协议实现的,所以需要对ERC20代币的transfer方法做一些安全处理。
具体步骤是:

  1. 导入SafeERC20

    import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
  2. 使用SafeERC20

    using SafeERC20 for IERC20;
  3. 使用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,Web3 爱好者!希望帮助更多人进入 Web3 的世界!

如果有任何问题,请私信我!


Victor
1 声望2 粉丝

Web3爱好者,希望把更多的人带入Web3的世界!