我相信我必须使用ERC20的transferFrom功能。但我没有获得成功。 我还想知道这种方法是否会显示我的合约地址的链上交易量,或者我需要将流程更改为 EOA->智能合约->EOA。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8;
interface IERC20 {
function transfer(address _to, uint256 _value) external returns (bool);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
contract MyContract {
function sendUSDT(address _from, address _to, uint256 _amount) external returns (bool) {
IERC20 usdt = IERC20(address(0x2F7b97837F2D14bA2eD3a4B2282e259126A9b848));// mumbai testnet
return usdt.transferFrom(_from, _to, _amount);
}
function approve(address spender, uint256 value) external returns(bool) {
IERC20 usdt = IERC20(address(0x2F7b97837F2D14bA2eD3a4B2282e259126A9b848));
return usdt.approve(spender, value);
}
function balanceOf(address account) external view returns (uint256){
IERC20 usdt = IERC20(address(0x2F7b97837F2D14bA2eD3a4B2282e259126A9b848));
return usdt.balanceOf(account);
}
}
我相信我必须使用ERC20的
功能transferFrom
正确。但在此之前,您的合约需要得到用户的批准才能使用他们的代币。所以这是一个两次交易的过程。
第一笔交易: 用户需要直接在代币合约上执行
approve()
功能——而不是通过你的合约。
第二笔交易:只有这样你才能通过合约将用户的代币
transferFrom()
转移到另一个地址。
按照您现在编写合同的方式,您实际上是在批准
spender
支出您的合同所拥有的 value
代币。