Erc-20
錯誤 ERC20:餘量不足
我打算使用我的 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 函式的案例是什麼?