Solidity

我在將使用者的 erc20 代幣轉移到此智能合約時經常出錯

  • November 7, 2022

我收到此錯誤:氣體估算錯誤並顯示以下消息(見下文)。事務執行可能會失敗。是否要強制發送?execution reverted: ERC20: insufficient allowance { “originalError”: { “code”: 3, “data”: “0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001d45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000”, “message”: “execution reverted: ERC20: insufficient allowance” } }

這是我的程式碼:

address private sender; 

address private thiscontract = address(this);

function approveSmartcontract(IERC20 _token, address _sender, uint tokens)internal returns(bool)  {
   return _token.approve(thiscontract,tokens);
}
function transferfunds(address tokenadd,uint _tokens) public{
   sender = msg.sender;
   IERC20 token = IERC20(tokenadd);
   if (approveSmartcontract(token,sender,_tokens) == true ){
       token.transferFrom(sender,thiscontract,_tokens);
   }
}

}

為什麼我會收到這個錯誤有人可以在下面提供正確的程式碼嗎?請

在將代幣轉移到您應該呼叫的智能合約之前,您需要批准代幣的配額token.approve(sender, _tokens);

這將為 msg.sender 設置令牌的限額。

同樣的問題。同一個答案的人。當你打電話時approveSmartcontract,那msg.sender就是契約本身。這意味著當這個函式呼叫approveIERC20 合約中的函式時,msg.sender就是這個合約的地址,它正在呼叫這個函式。現在,approve 函式的工作方式是,您傳遞的參數獲得代表msg.snder. 這樣,當您呼叫approveSmartcontractthenmsg.sender和參數時,兩者都是相同的,即契約的地址。並且 transferfunds 功能正在嘗試將代幣從您的錢包地址發送到合約,並且再次msg.sender是合約的地址,當transferFrom函式在 ERC20 合約中被呼叫。而且由於您的合約地址未被批准代表錢包地址使用代幣,因此您會收到此錯誤。要執行此操作,您必須直接從 etherscan 呼叫 ERC20 批准合約,或者您可以編寫一個小腳本與合約對話。

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