使用flow-js-testing测试时如何获取交易手续费txFee
Flow-js-testing 获取交易手续费(txFee)的实现方法
问题场景
测试付费铸币交易时,预设余额校验逻辑如下:
usersBalanceAfterMinting == usersBalanceBeforeMinting - costOfMinting - txFee
实际调试中打印交易返回的事件列表,无法查询到feesDeducted事件,交易即时返回结果中也不包含任何交易成本相关信息,无法获取txFee数值完成校验。
具体操作步骤
- 放弃从交易返回事件、即时返回结果中取手续费的思路:Flow的交易手续费是交易执行完成后在结算层统一扣除的,相关扣费事件不会被纳入用户交易返回的事件列表,交易提交后的即时响应对象默认也不会携带手续费字段。
- 调用框架内置方法拉取最终交易结果取数:发送交易拿到交易ID后,先等待测试环境区块全部执行完成,再调用
getTransactionResult方法传入交易ID获取链上最终确认结果,结果对象中的totalFees字段就是该笔交易实际扣除的总手续费,数据类型为UFix64,直接对应校验公式中的txFee。
参考实现代码:// 发送铸币交易拿到txId const txId = await sendTransaction({ name: "mint_token", args: [/* 你的铸币交易入参 */], signers: [userAccount] }) // 等待所有待打包区块执行完成,本地测试环境必须执行这步否则拿不到最终结果 await executeAllBlocks() // 拉取最终交易结果 const finalTxResult = await getTransactionResult(txId) const txFee = finalTxResult.totalFees console.log("本次交易实际手续费:", txFee) - 余额校验注意事项:
- 拿到
totalFees后要先统一数值精度,和铸币成本、用户余额的单位保持一致后再代入公式计算,避免类型或精度不匹配导致校验失败 - 本地测试使用Flow Emulator时,确保模拟器版本不低于v0.45,旧版本模拟器的交易结果接口不会正确返回
totalFees字段 - 必须等区块执行完成后再拉取交易结果,交易刚提交时处于pending状态,返回结果不会填充手续费相关数据
- 拿到
内容的提问来源于stack exchange,提问作者pho_pho
相关产品推荐
相关产品推荐

