如何强制Keplr钱包采用前端设置的手续费,避免自动覆盖?
解决Keplr钱包覆盖前端手续费设置的问题
问题根源
Keplr钱包默认会优先使用自身配置的手续费参数,忽略你传入的"auto"或手动设置的费用值,导致合约要求的溢价未被纳入交易成本。
解决步骤
不要使用"auto"作为费用参数,手动计算并传入包含合约溢价的完整手续费金额,具体实现如下:
获取链的基础Gas价格
通过链的auth模块或API查询当前基础Gas费率:// 示例:获取当前链的Gas价格 const gasPrice = await signingClient.getGasPrices();估算交易所需Gas量
先模拟执行交易,得到实际Gas消耗,再额外预留10%-20%的缓冲量避免交易失败:// 模拟交易获取Gas估算值 const gasEstimation = await signingClient.simulate( accounts[0].address, [msgAny], memo ); // 增加缓冲后的Gas值 const adjustedGas = Math.floor(gasEstimation * 1.2);构造包含合约溢价的完整手续费
将基础Gas费用与合约溢价相加,生成符合链要求的StdFee对象:// 合约溢价,需替换为你的合约实际要求的数值(单位与链原生代币一致) const contractPremium = "100000"; // 计算总手续费金额 const totalAmount = (parseInt(gasPrice.amount) * adjustedGas + parseInt(contractPremium)).toString(); const customFee = { amount: [{ denom: gasPrice.denom, // 链原生代币标识,如"uatom" amount: totalAmount }], gas: adjustedGas.toString() };使用自定义手续费发起交易
将signAndBroadcast中的"auto"替换为构造好的customFee:const broadcastResult = await signingClient.signAndBroadcast( accounts[0].address, [msgAny], customFee, // 传入包含合约溢价的完整手续费 memo, );
额外注意事项
- 需确保用户关闭Keplr钱包内的"自定义手续费"高级设置,否则钱包仍可能强制覆盖你的参数
- 不同链的Gas计算逻辑存在差异,需根据目标链的官方文档调整估算和计算方式
内容的提问来源于stack exchange,提问作者user22306396
相关产品推荐
相关产品推荐

