Erc-20

錯誤 ERC20:餘量不足

  • February 14, 2022

我打算使用我的 erc20 代幣來支付鑄造 nft 的費用。但是當我呼叫 testPay 函式時,總是得到 ERC20:餘量不足錯誤。

已經在尋找答案但找不到答案。

有人可以告訴我我在這裡做錯了什麼嗎?

msg.sender 已經有一些 erc20 令牌。address(this) 沒有令牌。這個合約不是我真正的 nft 鑄幣合約,我只是想測試一下支付功能。

contract GameItem is ERC721URIStorage {
   using Counters for Counters.Counter;
   Counters.Counter private _tokenIds;

   ERC20 public GXGToken;

   constructor(address mytoken) ERC721("GameItem", "ITM") {
       GXGToken = ERC20(mytoken);
   }

   function awardItem(address player, string memory tokenURI)
       public
       returns (uint256)
   {
       _tokenIds.increment();

       uint256 newItemId = _tokenIds.current();
       _mint(player, newItemId);
       _setTokenURI(newItemId, tokenURI);

       return newItemId;
   }

   function approval(uint amount) public{
       GXGToken.approve(msg.sender,amount);
   }

   function myallowance() view public returns (uint){
       return GXGToken.allowance(msg.sender,address(this));
   }

   function testpay(uint _amount) public{
       GXGToken.approve(msg.sender,_amount);
       pay(_amount);
   }

   function pay(uint _amount) internal{
       GXGToken.transferFrom(msg.sender,address(this),_amount);
   }
}

編輯:好的,謝謝大家的回复。

這就是我正在做的事情。

所以我首先在erc20上呼叫approval函式,批准erc721地址和金額,然後在erc721合約上呼叫transferFrom,param1是sender,param2是erc721地址。

它正在工作。

msg.sender 必須先批准 GameItem 智能合約地址,然後 transferFrom 才能初始化工作,您試圖從發件人轉移,而發件人尚未批准契約地址,它將無法工作,您在這裡的聲明

GXGToken.approve(msg.sender,_amount);

GXGToken 通證具有批准功能,使用者必須直接與 GXGToken 通證合約地址互動並使用其批准功能在使用者(地址)之前批准 GameItem 智能合約地址,然後使用者(地址)才會呼叫該函式。

approve(GameItem smart contract address, _amount);

你的意圖是它會自動設置 msg.sender 來批准 GameItem 智能合約地址,它不會那樣工作。

這裡的解決方案可以明確說明 Approval 和 transferFrom的案例:ERC20 代幣合約中 transferFrom 函式的案例是什麼?

引用自:https://ethereum.stackexchange.com/questions/121479