排错:replacement fee too low

  • 胡键
  • 更新于 2023-08-02 18:06
  • 阅读 1741

排错:replacement fee too low

症状

调用合约方法却得到以下的错误信息:

Error: replacement fee too low (error={"reason":"processing response error","code":"SERVER_ERROR","body":"{\"jsonrpc\":\"2.0\",\"id\":109,\"error\":{\"code\":-32000,\"message\":\"replacement transaction underpriced\"}}","error":{"code":-32000},"requestBody":"{\"method\":\"eth_sendRawTransaction\",\"params\":[\"...\"],\"id\":109,\"jsonrpc\":\"2.0\"}","requestMethod":"POST","url":"..."}, method="sendTransaction", transaction="...", code=REPLACEMENT_UNDERPRICED, version=providers/5.5.2)
    at Logger.makeError (../node_modules/@ethersproject/logger/lib/index.js:199:1)
    at Logger.throwError (../node_modules/@ethersproject/logger/lib/index.js:208:1)
    at checkError (../node_modules/@ethersproject/providers/lib/json-rpc-provider.js:111:1)
    at InfuraProvider.<anonymous> (../node_modules/@ethersproject/providers/lib/json-rpc-provider.js:659:1)
    at step (../node_modules/@ethersproject/providers/lib/json-rpc-provider.js:48:1)
    at Object.throw (../node_modules/@ethersproject/providers/lib/json-rpc-provider.js:29:1)
    at rejected (../node_modules/@ethersproject/providers/lib/json-rpc-provider.js:21:1)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

原因

看似混乱的信息中(上面的错误消息已经做过必要的删减,但即使这样也让人看着头晕),其实已经有一个很明确的错误消息:replacement fee too low 。

导致它出现的存在两种可能:

  • 同一账户在较短时间内同时提交了两个 tx,导致前一个 tx 和后一个 tx 使用了同样的 nonce。
  • 在取消或加速 transaction 时,price 设置错误。

在 ethers 的这个 issue 链接中有对此的详细说明,请自行去了解。或者参见下面参考链接中的《Ethers.js 非权威开发指南(4)》,其中包含了关于 nonce、取消和加速 transaction,以及 gasPrice 的详细说明。

解决

一个简单解决方式就是想办法使之串行化或者降低提交 tx 的速度并设置合适的 gasPrice,等待 tx 完成(见下例)之后再提交下一个 tx。至于具体解法,只能具体情况具体分析了。

const tx = await contract.writeMethod(...);
await tx.wait();

【附】若对 ethers.js 不熟,可以参见:

\

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
胡键
胡键
CSM / 架构师 / 创业者,先后就职于中兴和 SAP,现专注于工业物联网、机器学习和区块链。同时,作为机器学习和区块链技术活动的组织者和分享者活跃于本地社区。