TokenPocket安卓钱包添加测试链无法正确读取maxPriorityFeePerGas字段

安卓钱包版本: 2.1.3(GooglePlay) IOS没设备无法测试.
Geth版本: v1.13.15

复现过程:

  1. 本地通过geth, 启动一条开启了LondonBlock的测试节点, 开启1559 gas协议.
  2. tp钱包添加网络, 创建钱包.
  3. 发起转账, 能看到gas推荐估算的maxFeePerGas是14, 链的BaseFeePerGas是7, 刚好是basefee的2倍(符合标准), 但是maxPriorityFeePerGas是0, 标准读取的eth.maxPriorityFeePerGas是1Gwei, 通过接口也能获取到该值.

综上, 钱包中的gas price oracle的maxPriorityFeePerGas字段读取错误, 导致交易上链失败.

tp的chrome插件无此问题.
metamask无此问题.
ok钱包无此问题.

好的,反馈技术看看。

可以发一下测试节点吗

我在aws上部署了一个测试链, 你们可以进行测试:

链信息:
url: http前缀//18.162.154.166:8545
chainID: 22222

测试账号(有链币):
addr: 0x90a2770df6cb2b50A71C9Bd814ef97588dD0fd12
priv: 97456ed4a9437a0667b7c6b35f25d26e9eaa5a76a26ff35dedd2ea129d97fbd3

复现过程:

  1. 导入网络和私钥后, 直接发起转账操作
  2. 默认转账操作的maxPriorityFeePerGas为0, 直接会被轻节点抛弃.
  3. 加速交易, 最高gas设置为2gwei, 最高矿工费设置1gwei, 即可上链.
1 Like

→ POST http://18.162.154.166:8545/
请求参数:
{“jsonrpc”:“2.0”,“method”:“eth_feeHistory”,“params”:[“0x3”,“latest”,[5,50,80]],“id”:1715601860}

请求结果:
{“jsonrpc”:“2.0”,“id”:1715601860,“result”:{“oldestBlock”:“0xf0a6”,“reward”:[[“0x0”,“0x0”,“0x0”],[“0x0”,“0x0”,“0x0”],[“0x0”,“0x0”,“0x0”]],“baseFeePerGas”:[“0x7”,“0x7”,“0x7”,“0x7”],“gasUsedRatio”:[0,0,0]}} 。

从结果可以看到:通过“eth_feeHistory”获取得到的“maxPriorityFeePerGas”的值就是0。

另外您说的xx钱包可以,我们先调研确认下

看了metaMask的逻辑,metaMask通过节点请求eth_feeHistory,得到的数据也是0,但它搞了个默认值1.5。

TP目前是如何处理的:TP现在是通过节点拿到啥,就用啥,不会用默认值(此前也有个默认值,但后来去掉了)。

您如何解决:

  1. 在链设置上,允许交易的maxPriorityFeePerGas为0。
  2. 节点数据做相应修改,如将“ eth_feeHistory”请求返回的数据“reward”数组是非0的,即让maxPriorityFeePerGas的值大于0
节点数据做相应修改,如将“ eth_feeHistory”请求返回的数据“reward”数组是非0的,即让maxPriorityFeePerGas的值大于0

这里maxPriorityFeePerGas的值实际上是大于0的, 但是eth_feeHistory接口, 是依据历史区块数据, 无法修改与调整的.

而且很多新链, 刚开始没交易也很常见.

'eth_feeHistory` 返回的数据是基于过去的区块来统计的, 但是如果一个链, 上链交易过少, 会产生reward为0的结果, 但是如果单独调用如下接口, 则能获取到正确的值:

curl  "http://18.162.154.166:8545" --data '{"jsonrpc":"2.0","method":"eth_maxPriorityFeePerGas","params":[],"id":1}' --header 'accept: application/json'     --header 'content-type: application/json' 
{"jsonrpc":"2.0","id":1,"result":"0x3b9aca00"}

这里是否可以做个降级调用处理呢?

这里的降级调用处理是:如果 “eth_feeHistory” 拿到的reward是0,则再请求一下“eth_maxPriorityFeePerGas” ?

是的, 或者可以同步获取两个值, maxPriorityFeePerGas是节点建议值, feeHistory是历史经验值.

感谢你的反馈,后续我们会跟进