如何使用web3js避

14

我目前正在将一个使用React JS开发的以太坊dApp升级,以符合新的EIP-1559标准(也称为伦敦硬分叉)。该应用程序使用web3.js(v1.5.2)来发起交易,交易形式类似于:

const contract = new web3.eth.Contract(
  contractABI,
  CONTRACT_ADDRESS,
);

await contract.methods
  .deposit(recepient, amount)
  .send({ from: account, value })

我们鼓励用户使用MetaMask与我们的应用程序进行接口交互。

尽管我在发送交易时没有指定gasPricegasLimit或等效的EIP-1559规定的maxPriorityFeePerGasmaxFeePerGas,但MetaMask仍然警告(在我的本地测试环境中) “localhost suggested gas fee”和“Unknown processing time”,以及可能存在巨额费用。

点击“编辑”后出现另一个警告消息,更糟糕的是,我(或我猜测是web3)据称“建议”的值根据MetaMask的估算并不合理。

是否有一种使用web3与MetaMask进行接口交互的方法,可以接受MetaMask建议的值,消除这些MetaMask警告,并确保正确计算费用?我注意到在https://app.uniswap.org/查看时,虽然MetaMask仍然显示第一个“app.unswap.org suggested gas fee”警告,但txn时间已经正确计算,并且单击“编辑”不会出现任何进一步的警告。 Uniswap如何更合理地与MetaMask交互,是否可以使用web3.js复制它们的方法?

1个回答

19

好的,我已经弄清楚了。

如果对于特定的交易,未定义maxPriorityFeePerGasmaxFeePerGas,web3会生成自己的值。令人失望的是,生成的值相当糟糕,并将在MetaMask中触发警告。解决方案(在撰写本文时完全没有记录)是将maxPriorityFeePerGasmaxFeePerGas设置为null而不是undefined。这将向web3发出信号,表明您不希望它将这些值传递给提供程序。

因此,代码应该看起来像:

const contract = new web3.eth.Contract(
  contractABI,
  CONTRACT_ADDRESS,
);

await contract.methods
  .deposit(recepient, amount)
  .send({ 
    from: account, 
    value, 
    maxPriorityFeePerGas: null,
    maxFeePerGas: null, 
  });

同时,请确保您正在使用最新版本的web3,因为EIP-1559支持仅在v1.5中添加。


我可以确认添加这些字段解决了“未知处理时间”警告消息。 - mhrsalehi
将两个字段设置为“null”确实可以消除“此燃气费是由...建议”的消息,但是在MetaMask中的燃气费仍然高达10,000美元。对于类似的Uniswap交易,目前大约为72美元。是什么导致了这个荒谬的高估?我没有在我的代码中指定任何燃气费用。 - jspru
更新 - 以下设置让我的情况变得更加合理:resp = await faucetContract.methods.withdraw().send({ from: accounts[0], gas: 300000, gasPrice: null, }) - jspru
我认为这个没有记录,因为它很可能是web3.eth.Contract中的一个bug。 - Dave Sumter
1
非常有用!可以确认这个技巧在2023年4月仍然有效。 - Paintoshi
如果你想在MetaMask中使用“市场”燃气价格而不是自己预先计算燃气费用,那么这样做非常完美。 - Alexandre Desroches

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接