【问题标题】:send ERC-20 tokens with solidity to user向用户发送具有可靠性的 ERC-20 代币
【发布时间】:2022-01-07 09:33:53
【问题描述】:

如您所知,ERC-20 网络有许多代币,例如 USDTSHIBLINK、。 . .

我想创建一个网站,当用户需要购买USDT 代币时,我应该将USDT 代币发送到他的钱包or 使用需要发送USDT 到区块链上的另一个钱包,我想做所有这些东西都进入了区块链,用户可以看到他的USDT交易的细节:

USDT Transactions

现在我有一个关于在 ERC-20 网络中转移代币的大问题。

我用 remix 和solidity 编写这些代码:

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol';

contract DEX {

    struct Token {
        string token;
        address contractAddress;
    }

    mapping(string => Token) public tokens;
    string[] public tokenLis;

    address public admin;

    constructor() {
        admin = msg.sender;
    }

    function addToken(string memory token, address contractAddress) external {
        tokens[token] = Token(ticker,contractAddress);
        tokenLis.push(ticker);
    }

    function getTokenAddress(string memory token) external view returns(address moemory) {
       return tokens[token].contractAddress;
    }

    function sendToken(string memory token, address from , uint256 amount)
     external
      {

        IERC20(tokens[token].contractAddress).transferFrom(
            from,
            address(this),
            amount
        );


    }

}

我想将动态令牌添加到我的websitesmart contract,为此编写以下代码:

  struct Token {
    string token;
    address contractAddress;
}

mapping(string => Token) public tokens;


function addToken(string memory token, address contractAddress) external {
    tokens[token] = Token(ticker,contractAddress);
    tokenLis.push(ticker);
}

我用这个信息打电话给addToken

Token:USDT

contractAddress: 0xdac17f958d2ee523a2206206994597c13d831ec7(USDT主网合约地址)

它的工作并在令牌中添加成功USDT

现在我想用这个功能(imported the openzepelin IERC20)向用户发送一些USDT

function sendToken(string memory ticker , address from , uint256 amount)
 external
  {

    IERC20(tokens[ticker].contractAddress).transferFrom(
        from,
        address(this),
        amount
    );
}

现在,当我想将金额从 remix 地址一转移到 remixaddress 到 USDT 合约地址时,它会显示这个错误:

问题 B:有什么问题?我该如何解决这个错误?

问题 A:最适合我的方案的方法是什么?使用智能合约还是用户 web3.js?

【问题讨论】:

    标签: solidity smartcontracts web3 remix


    【解决方案1】:
    1. 您的合约与 USDT 合约(以太坊主网)位于不同的网络(Remix VM 模拟器)上,因此它们无法交互。您可以从您的 Remix IDE 分叉主网并连接到分叉网络,请参阅this answer 了解更多详细信息。

    2. 那么您可能会在sendToken() 函数中遇到另一个问题(因为您没有在问题中涵盖它,我假设您没有执行此步骤)。为了成功调用transferFrom(),函数调用者(在这种情况下是你的合约地址)需要得到代币所有者(在这种情况下是from变量)的批准才能使用他们的代币。您可以在 ERC-20 specificationapprove() 函数中找到更多信息。

      总结:from 地址需要直接调用代币合约上的approve() 方法(而不是通过您或任何其他合约),将您的合约地址作为第一个参数传递给它,以便您的合约能够拉他们的代币。

    【讨论】:

    • 嗨。谢谢你回答我的问题。我对此有很多疑问。我在这里问他们。如果你能回答我。我应该执行以下步骤:A: 在 web3.js 我应该在这个 smartconract 中为用户创建钱包(USDT); B: 在智能合约中我应该调用 sendToken 函数 C: 在那个函数中我应该检查 sender 钱包地址的批准。 D: 如果成功,我应该将令牌从sender 钱包发送到reciver 钱包。 正确吗?
    • @Kianoush 正确,假设sender 已批准至少在步骤 C 中验证的发送金额,并且有足够的余额在步骤 D 中发送。
    • 谢谢你我的朋友
    猜你喜欢
    • 2018-12-28
    • 2021-10-17
    • 1970-01-01
    • 2022-11-13
    • 2022-12-15
    • 1970-01-01
    • 2021-05-17
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多