如何解决如何与已部署的 ERC20openzeppelin ERC20 合约令牌交互并将令牌从用户地址 X 转移到地址 Y?
我创建了一个扩展 openzeppelin ERC20 的简单合约。 我正在尝试将令牌从一个地址转移到另一个地址。
合约代码如下:
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)
感谢您的帮助。
解决方法
如果您选中 Approve if erc20,则函数参数期望 address _spender,uint256 _value
作为参数。就您而言,您已批准 secondAccount
提取 200 个代币。
这意味着 secondAccount
可以将这些代币从 token
合约转移到他的帐户。为此,您可以尝试 await token.connect(secondAccount).transferFrom(token.address,secondAccount.address,100);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。