You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何强制Keplr钱包采用前端设置的手续费,避免自动覆盖?

解决Keplr钱包覆盖前端手续费设置的问题

问题根源

Keplr钱包默认会优先使用自身配置的手续费参数,忽略你传入的"auto"或手动设置的费用值,导致合约要求的溢价未被纳入交易成本。

解决步骤

不要使用"auto"作为费用参数,手动计算并传入包含合约溢价的完整手续费金额,具体实现如下:

  1. 获取链的基础Gas价格
    通过链的auth模块或API查询当前基础Gas费率:

    // 示例:获取当前链的Gas价格
    const gasPrice = await signingClient.getGasPrices();
    
  2. 估算交易所需Gas量
    先模拟执行交易,得到实际Gas消耗,再额外预留10%-20%的缓冲量避免交易失败:

    // 模拟交易获取Gas估算值
    const gasEstimation = await signingClient.simulate(
        accounts[0].address,
        [msgAny],
        memo
    );
    // 增加缓冲后的Gas值
    const adjustedGas = Math.floor(gasEstimation * 1.2);
    
  3. 构造包含合约溢价的完整手续费
    将基础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()
    };
    
  4. 使用自定义手续费发起交易
    将signAndBroadcast中的"auto"替换为构造好的customFee:

    const broadcastResult = await signingClient.signAndBroadcast(
        accounts[0].address,
        [msgAny],
        customFee, // 传入包含合约溢价的完整手续费
        memo,
    );
    

额外注意事项

  • 需确保用户关闭Keplr钱包内的"自定义手续费"高级设置,否则钱包仍可能强制覆盖你的参数
  • 不同链的Gas计算逻辑存在差异,需根据目标链的官方文档调整估算和计算方式

内容的提问来源于stack exchange,提问作者user22306396

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:42:04