为什么我不能将 USDT 转入我的智能合约?

Why can't I transfer USDT to my smartcontract?

当我调用转账 USDT 时,我得到了 'BEP20: transfer amount exceeds balance' 但我知道我有足够的资金。我想我在我的智能合约中遗漏了一些东西。这里是 bscscan 上的错误:

https://testnet.bscscan.com/tx/0x3a253a8c32ed19bdbed66499ec2f888eae5114d44eba7c2f28a185258e91641f

pragma solidity >=0.7.0 <0.9.0;

abstract contract IUSDT{
    function approve(address _spender, uint _value) virtual external returns (bool);
    function transferFrom(address _from, address _to, uint _value) virtual public;
    function transfer(address recipient, uint256 amount) virtual external returns (bool);
}

contract usdtTransfer{
    IUSDT TetherContract;
    
    function transferUSDT(uint256 amount) public {
        TetherContract.transfer(address(this),amount);
    }
    
    constructor(address _tetherAddress){
        TetherContract=IUSDT(_tetherAddress);
    }
}
TetherContract.transfer(address(this),amount);

此代码段试图将 amount(第二个参数)的代币转移到 address(this)(第一个参数)地址——这是 usdtTransfer 合约的地址。

并且由于它是从 usdtTransfer 合约执行的,它正试图从 发送代币 来自完全相同的 usdtTransfer 地址。

如果您的目标是将代币从用户发送到您的合约,用户需要首先在代币合约上执行 approve() 函数(从他们的地址,将您的地址作为 spender 参数).