实现ERC20Mintable,但safeTrans函数中的safeTransfer恢复TRANSFER_FAILED。
想知道我在这里做错了什么。谢谢。
pragma solidity 0.8.17;
import "solmate/src/tokens/ERC20.sol";
import "solmate/src/utils/SafeTransferLib.sol";
contract ERC20Mintable is ERC20 {
using SafeTransferLib for ERC20;
constructor (string memory name, string memory code, uint8 decimal)
ERC20(name, code, decimal)
{
}
function mint(address to, uint amount) public {
_mint(to, amount);
}
function safeTrans(address to, uint amount) public {
ERC20(this).safeApprove(to, amount);
ERC20(this).safeTransfer(to, amount);
}
}const { expect } = require("chai");
const { ethers } = require("hardhat");
const { TASK_COMPILE_SOLIDITY_HANDLE_COMPILATION_JOBS_FAILURES } = require("hardhat/builtin-tasks/task-names");
describe('ERC20Mntable', function() {
describe('test safetransfer', () => {
it('safetransfer', async () => {
const token0 = await ethers.getContractFactory("ERC20Mintable");
contract0 = await token0.deploy('token0', 'TOK0', 18);
const token1 = await ethers.getContractFactory("ERC20Mintable");
contract1 = await token1.deploy('token1', 'TOK1', 18);
[owner, addr1] = await ethers.getSigners();
await contract0.connect(owner).mint(owner.getAddress(), 1000)
await contract0.connect(addr1).mint(addr1.getAddress(), 1000)
await contract1.connect(owner).mint(owner.getAddress(), 1000)
await contract1.connect(addr1).mint(addr1.getAddress(), 1000)
await contract0.connect(owner).safeTrans(addr1.getAddress(), 500)
})
})
})发布于 2022-12-06 05:19:13
好的,您的函数safeTrans()需要稍微修改一下。
safeApprove()进行审批,因为使用这个库,令牌契约就变成了msg.sender,并且批准也不是完美的。另外,您需要批准合同地址,而不是to地址。safeTranferFrom()。最后的代码将类似于:函数safeTrans(地址到,uint数量),公开{审批(地址(这个),数量);ERC20(这个).safeTransferFrom(msg.sender,to,amount);}https://ethereum.stackexchange.com/questions/140667
复制相似问题