Web3js

Gas Estimation Execution Reverted(ERC20:轉賬金額超過限額)

  • August 7, 2021

我想估算智能合約功能的 gas 成本。這是一種將使用者錢包中的USDT代幣帶入池中的存款功能。所以我應該先呼叫approve()函式來增加額度,然後再發送第二筆交易進行deposit()。

這是原始碼。(*效果很好。)

await tokenContract.methods.approve(poolAddress, amount).send({from: account});
await poolContract.methods.deposit(amount).send({from: account});

但是當我嘗試像這樣估計第二筆交易的天然氣成本時:

await tokenContract.methods.approve(poolAddress, amount).send({from: account});
await poolContract.methods.deposit(amount).estimateGas({from: account});

estimateGas() 失敗並出現以下錯誤:

Error: Error: Internal JSON-RPC error.
{
 "code": 3,
 "message": "execution reverted: ERC20: transfer amount exceeds allowance",
 "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002845524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365000000000000000000000000000000000000000000000000"
}

什麼原因?在呼叫 deposit.estimateGas() 之前,我已經呼叫了批准函式。像第一個範例一樣發送正常交易時,它執行良好,但estimateGas() 函式不起作用。

我又嘗試了一件事。當我在第一個函式(批准)和第二個函式(deposit.estimateGas)之間給出 15 秒的超時時間時,它的效果令人驚訝。因此,總而言之,它表示estimateGas() 函式不適用於同一塊本身中的交易。

這是正確的嗎?如果是這樣,為什麼?

這些事情的問題是交易不會立即被探勘。在執行第二行之前,您需要等待第一筆交易被開採。

您的第一個版本有效(沒有estimateGas)的原因是它連續發送兩個事務,因此第二個事務自動“等待”第一個事務完成。它們要麼在同一個區塊中開採,要麼在不同的區塊中開採,但無論如何,第一筆交易首先被處理。

您的第二個版本不起作用的原因是它發送一個事務,然後立即嘗試estimateGas. 工作原理estimateGas是它發送相同的事務,但作為本地呼叫,因此它不會向區塊鏈生成真正的事務,而只會生成只讀的本地呼叫,不會改變狀態。因為estimateGas是本地呼叫,它會立即執行,而第一行仍然等待被探勘。這就是為什麼您的 15 秒延遲也可以解決問題的原因。

我不確定如何在 web3js 中執行此操作,但在 ethers.js 中,您可以添加await tx.wait()以等待它被探勘。

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