【问题标题】:How to interact with the deployed ERC20(openzeppelin ERC20 contract) token and transfer token from user address X to address Y?如何与已部署的 ERC20(openzeppelin ERC20 合约)代币交互,将代币从用户地址 X 转移到地址 Y?
【发布时间】:2021-09-23 10:20:48
【问题描述】:

我创建了一个扩展 openzeppelin ERC20 的简单合约。 我正在尝试将令牌从一个地址转移到另一个地址。

合约代码如下:

文件名:Token.sol

pragma solidity ^0.7.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Token is ERC20 {
    uint256 public INITIAL_SUPPLY = 100000;

    constructor() ERC20("My Token", "MYT") {
        _mint(msg.sender, INITIAL_SUPPLY);
    }
}

测试文件中的代码:

const { expect } = require("chai");

describe("Send token from second address in the block", function () {

    it("Send 100 MYT to the third account", async function () {

        const Token = await ethers.getContractFactory("Token");
        const token = await Token.deploy();

        // get accounts from the network
        const [owner, secondAccount, thirdAccount] = await ethers.getSigners();

        // send some credit to the second account
        await token.transfer(secondAccount.address, 500);

        // Approve token transfer
        await token.approve(secondAccount.address, 200);

        // Transfer credit from second account to the third account (This step is not working)
        await token.transferFrom(secondAccount.address, thirdAccount.address, 100);
    });
});

收到错误:

     Error: VM Exception while processing transaction: reverted with reason string 'ERC20: transfer amount exceeds allowance'
      at Token.sub (@openzeppelin/contracts/math/SafeMath.sol:171)
      at Token.transferFrom (@openzeppelin/contracts/token/ERC20/ERC20.sol:154)
      at processTicksAndRejections (internal/process/task_queues.js:94:5)
      at runNextTicks (internal/process/task_queues.js:63:3)
      at listOnTimeout (internal/timers.js:501:9)
      at processTimers (internal/timers.js:475:7)
      at EthModule._estimateGasAction (node_modules/hardhat/src/internal/hardhat-network/provider/modules/eth.ts:421:9)
      at HardhatNetworkProvider.request (node_modules/hardhat/src/internal/hardhat-network/provider/provider.ts:105:18)
      at EthersProviderWrapper.send (node_modules/@nomiclabs/hardhat-ethers/src/internal/ethers-provider-wrapper.ts:13:20)

感谢您的帮助。

【问题讨论】:

    标签: ethereum smartcontracts erc20 openzeppelin


    【解决方案1】:

    如果您选中 Approve if erc20,则函数参数期望 address _spender, uint256 _value 作为参数。在您的情况下,您批准 secondAccount 提取 200 个令牌。

    这意味着secondAccount 可以将这些代币从token 合约转移到他的账户。为此,您可以尝试await token.connect(secondAccount).transferFrom(token.address,secondAccount.address,100);

    【讨论】:

    • 感谢 Aditya 的回答。你上面说的是正确的,但我正在尝试将令牌从第二个帐户转移到第三个帐户。告诉我是否需要添加或删除代码中的行。
    • 将令牌从secondAccount转移到thirdAccount。您首先必须将代币从token 合约转移到secondAccount,并从secondAccount 调用transfer 函数。或者secondAccount 可以访问thirdAccount,然后thirdAccount 可以调用transferFrom。
    猜你喜欢
    • 2020-07-24
    • 2020-01-23
    • 2021-09-17
    • 1970-01-01
    • 2021-08-10
    • 2018-08-01
    • 2018-01-03
    • 2021-07-18
    • 2021-08-06
    相关资源
    最近更新 更多