Pimlico操作一直等待:核状态、单项回执与gas费用
链小知 · 进阶 · 核验 · 依官方文档整理
用已有UserOp记录区分queued、submitted、included和success,避免把过期查询或超时当失败。
开始前准备
- 准备已有脱敏UserOp哈希、链与EntryPoint、时间戳、状态/回执及错误记录;保留原字段和最小单位。
1. 固定UserOp身份和查询范围
从原记录取userOpHash、链标识、EntryPoint与查询时间;UserOp哈希和bundle transactionHash是两个对象,不能用同一字段相互替换。主网/测试网、链与EntryPoint支持都应对原配置核。
公共bundler不要求key,但仅作测试/原型、20次/分钟/IP,主网paymaster需key。脱敏材料保留端点链标识,删去真实认证query;当前没有原回执就保持未知。
检查结果:UserOp、链、EntryPoint、端点角色与原查询时点明确。
2. 解释排队、重模拟失败与过期状态
queued表示nonce过高、尚在进入mempool前排队;not_submitted为已在mempool但未组成交易;submitted是bundle交易仍在等待。rejected是进入mempool后再模拟失败、从未送出该bundle。
not_found可是不认识哈希或初始验证被拒;状态只保存一小时,过期后也返回not_found。因此核原时间和先前记录,不能仅凭当前not_found断言从未送出或失败。
检查结果:状态原因与一小时保存窗口分别核,缺先前记录不猜。
3. 用单项回执核included与success
submitted返回的transactionHash可因bundler换一笔交易重提交而改变,原日志要保留每个时点。included表示已上链;failed表示bundle交易已上链但该bundle回滚,二者与单个UserOp的结果不同。
eth_getUserOperationReceipt无可用回执时返回null。已有回执应对userOpHash、sender、nonce、entryPoint及内层receipt.transactionHash,再看外层success与所需业务日志;bundle的receipt.status为成功不能替代该UserOp成功。
检查结果:bundle哈希变化、UserOp匹配和单项success分开,null不补结果。
4. 将客户端超时和gas估算错误分开
WaitForUserOperationReceiptTimeoutError表示等待或默认timeout不足,不直接表示链上失败。对既有记录核网络块时长、客户端timeout与后续回执;FAQ的超时示例chain为Sepolia但URL仍8453,不能照搬为正确链配置。
preVerificationGas不足可因估算dummy signature长度不同或bundler承诺已过期。官方承诺估值30秒;核估算/提交时点与签名长度,缺原参数就保留未知,不把加gas视为已修好。
检查结果:timeout、原链配置、估算时点和签名长度分别有记录或未知。
5. 以实际cost核账单而非bundle总gas
保留回执actualGasUsed、actualGasCost的原hex与数值解释;它们属于UserOp,内层receipt.gasUsed/cumulativeGasUsed属于交易,不能直接替代。
Pimlico按UserOperationEvent实际actualGasCost计算主网paymaster加价;10%时gas账单为actualGasCost×1.1,请求credits另计。定价表状态查询5 credits、回执查询10 credits;重复轮询不是免费或单次业务执行。
检查结果:单项gas、bundle gas、paymaster加价和API credits分别列示。
怎样确认完成
- 得到原UserOp状态、回执匹配与费用对照;官方方法已核,实际执行结果依原账户记录确认。
常见错误与边界
- 状态过期的not_found不等链上不存在;null回执不等执行失败。
- included和交易receipt.status不能替代单项UserOp.success及业务日志。
- 30秒估算承诺、等待timeout和一小时状态保留是三个不同窗口。