首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Solmate ERC20 SafeTransfer

Solmate ERC20 SafeTransfer
EN

Ethereum用户
提问于 2022-12-06 04:31:02
回答 1查看 274关注 0票数 0

实现ERC20Mintable,但safeTrans函数中的safeTransfer恢复TRANSFER_FAILED

想知道我在这里做错了什么。谢谢。

代码语言:javascript
复制
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);

  }

}
代码语言:javascript
复制
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)

    })
  })

})
EN

回答 1

Ethereum用户

回答已采纳

发布于 2022-12-06 05:19:13

好的,您的函数safeTrans()需要稍微修改一下。

  1. 不幸的是,您不能在这里使用safeApprove()进行审批,因为使用这个库,令牌契约就变成了msg.sender,并且批准也不是完美的。另外,您需要批准合同地址,而不是to地址。
  2. 我猜你需要用合同的功能把代币从一个用户的钱包转移到第二个?在这种情况下,您需要使用safeTranferFrom()。最后的代码将类似于:函数safeTrans(地址到,uint数量),公开{审批(地址(这个),数量);ERC20(这个).safeTransferFrom(msg.sender,to,amount);}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/140667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档