合約 USDT 轉賬失敗的問題解決

Victor發表於2022-11-24

問題

使用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 的世界!

如果有任何問題,請私信我!

相關文章