mppx 0.8.11 → 0.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +16 -1
  3. package/dist/cli/account.d.ts +88 -0
  4. package/dist/cli/account.d.ts.map +1 -1
  5. package/dist/cli/account.js +39 -9
  6. package/dist/cli/account.js.map +1 -1
  7. package/dist/cli/cli.d.ts +2 -1
  8. package/dist/cli/cli.d.ts.map +1 -1
  9. package/dist/cli/cli.js +59 -2
  10. package/dist/cli/cli.js.map +1 -1
  11. package/dist/cli/sessions/Manager.d.ts +31 -0
  12. package/dist/cli/sessions/Manager.d.ts.map +1 -0
  13. package/dist/cli/sessions/Manager.js +56 -0
  14. package/dist/cli/sessions/Manager.js.map +1 -0
  15. package/dist/cli/sessions/commands.d.ts +36 -0
  16. package/dist/cli/sessions/commands.d.ts.map +1 -0
  17. package/dist/cli/sessions/commands.js +407 -0
  18. package/dist/cli/sessions/commands.js.map +1 -0
  19. package/dist/cli/sessions/request.d.ts +35 -0
  20. package/dist/cli/sessions/request.d.ts.map +1 -0
  21. package/dist/cli/sessions/request.js +271 -0
  22. package/dist/cli/sessions/request.js.map +1 -0
  23. package/dist/cli/sessions/store.d.ts +134 -0
  24. package/dist/cli/sessions/store.d.ts.map +1 -0
  25. package/dist/cli/sessions/store.js +723 -0
  26. package/dist/cli/sessions/store.js.map +1 -0
  27. package/dist/cli/utils.d.ts +2 -0
  28. package/dist/cli/utils.d.ts.map +1 -1
  29. package/dist/cli/utils.js +12 -0
  30. package/dist/cli/utils.js.map +1 -1
  31. package/dist/cli/validate/index.d.ts.map +1 -1
  32. package/dist/cli/validate/index.js +12 -6
  33. package/dist/cli/validate/index.js.map +1 -1
  34. package/dist/cli/validate/messages.d.ts +2 -0
  35. package/dist/cli/validate/messages.d.ts.map +1 -0
  36. package/dist/cli/validate/messages.js +8 -0
  37. package/dist/cli/validate/messages.js.map +1 -0
  38. package/dist/client/internal/Fetch.d.ts.map +1 -1
  39. package/dist/client/internal/Fetch.js +35 -6
  40. package/dist/client/internal/Fetch.js.map +1 -1
  41. package/dist/client/internal/MethodResponse.d.ts +23 -0
  42. package/dist/client/internal/MethodResponse.d.ts.map +1 -0
  43. package/dist/client/internal/MethodResponse.js +15 -0
  44. package/dist/client/internal/MethodResponse.js.map +1 -0
  45. package/dist/client/node.d.ts +29 -0
  46. package/dist/client/node.d.ts.map +1 -0
  47. package/dist/client/node.js +177 -0
  48. package/dist/client/node.js.map +1 -0
  49. package/dist/internal/types.d.ts +24 -0
  50. package/dist/internal/types.d.ts.map +1 -1
  51. package/dist/stripe/server/Charge.d.ts +8 -4
  52. package/dist/stripe/server/Charge.d.ts.map +1 -1
  53. package/dist/stripe/server/Charge.js.map +1 -1
  54. package/dist/stripe/server/internal/html.gen.d.ts +1 -1
  55. package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
  56. package/dist/stripe/server/internal/html.gen.js +1 -1
  57. package/dist/stripe/server/internal/html.gen.js.map +1 -1
  58. package/dist/tempo/client/Methods.d.ts +1 -1
  59. package/dist/tempo/internal/types.d.ts +10 -1
  60. package/dist/tempo/internal/types.d.ts.map +1 -1
  61. package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -0
  62. package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -1
  63. package/dist/tempo/legacy/client/ChannelOps.js +4 -0
  64. package/dist/tempo/legacy/client/ChannelOps.js.map +1 -1
  65. package/dist/tempo/legacy/client/Session.d.ts +2 -2
  66. package/dist/tempo/legacy/client/Session.d.ts.map +1 -1
  67. package/dist/tempo/legacy/client/Session.js +7 -0
  68. package/dist/tempo/legacy/client/Session.js.map +1 -1
  69. package/dist/tempo/legacy/server/Session.d.ts +3 -3
  70. package/dist/tempo/legacy/server/Session.d.ts.map +1 -1
  71. package/dist/tempo/legacy/server/Session.js.map +1 -1
  72. package/dist/tempo/server/Charge.d.ts +3 -2
  73. package/dist/tempo/server/Charge.d.ts.map +1 -1
  74. package/dist/tempo/server/Charge.js.map +1 -1
  75. package/dist/tempo/server/Methods.d.ts +2 -23
  76. package/dist/tempo/server/Methods.d.ts.map +1 -1
  77. package/dist/tempo/server/Methods.js +2 -2
  78. package/dist/tempo/server/Methods.js.map +1 -1
  79. package/dist/tempo/server/Subscription.d.ts +3 -2
  80. package/dist/tempo/server/Subscription.d.ts.map +1 -1
  81. package/dist/tempo/server/Subscription.js.map +1 -1
  82. package/dist/tempo/server/index.d.ts +1 -1
  83. package/dist/tempo/server/index.d.ts.map +1 -1
  84. package/dist/tempo/server/index.js.map +1 -1
  85. package/dist/tempo/server/internal/html.gen.d.ts +1 -1
  86. package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
  87. package/dist/tempo/server/internal/html.gen.js +1 -1
  88. package/dist/tempo/server/internal/html.gen.js.map +1 -1
  89. package/dist/tempo/session/Snapshot.d.ts +9 -0
  90. package/dist/tempo/session/Snapshot.d.ts.map +1 -1
  91. package/dist/tempo/session/Snapshot.js +6 -0
  92. package/dist/tempo/session/Snapshot.js.map +1 -1
  93. package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -1
  94. package/dist/tempo/session/client/ChannelOps.js +11 -2
  95. package/dist/tempo/session/client/ChannelOps.js.map +1 -1
  96. package/dist/tempo/session/client/CredentialState.d.ts +21 -1
  97. package/dist/tempo/session/client/CredentialState.d.ts.map +1 -1
  98. package/dist/tempo/session/client/CredentialState.js +66 -1
  99. package/dist/tempo/session/client/CredentialState.js.map +1 -1
  100. package/dist/tempo/session/client/Session.d.ts +1 -1
  101. package/dist/tempo/session/client/Session.d.ts.map +1 -1
  102. package/dist/tempo/session/client/Session.js +53 -1
  103. package/dist/tempo/session/client/Session.js.map +1 -1
  104. package/dist/tempo/session/client/SessionManager.d.ts +2 -2
  105. package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
  106. package/dist/tempo/session/client/SessionManager.js +130 -30
  107. package/dist/tempo/session/client/SessionManager.js.map +1 -1
  108. package/dist/tempo/session/client/Transports.d.ts +21 -2
  109. package/dist/tempo/session/client/Transports.d.ts.map +1 -1
  110. package/dist/tempo/session/client/Transports.js +129 -18
  111. package/dist/tempo/session/client/Transports.js.map +1 -1
  112. package/dist/tempo/session/client/internal/SessionManager.d.ts +19 -0
  113. package/dist/tempo/session/client/internal/SessionManager.d.ts.map +1 -0
  114. package/dist/tempo/session/client/internal/SessionManager.js +13 -0
  115. package/dist/tempo/session/client/internal/SessionManager.js.map +1 -0
  116. package/dist/tempo/session/precompile/Chain.js +13 -4
  117. package/dist/tempo/session/precompile/Chain.js.map +1 -1
  118. package/dist/tempo/session/server/CredentialVerification.d.ts +3 -0
  119. package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -1
  120. package/dist/tempo/session/server/CredentialVerification.js +14 -0
  121. package/dist/tempo/session/server/CredentialVerification.js.map +1 -1
  122. package/dist/tempo/session/server/MeteredStream.d.ts +7 -1
  123. package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -1
  124. package/dist/tempo/session/server/MeteredStream.js +5 -4
  125. package/dist/tempo/session/server/MeteredStream.js.map +1 -1
  126. package/dist/tempo/session/server/RequestState.d.ts +5 -1
  127. package/dist/tempo/session/server/RequestState.d.ts.map +1 -1
  128. package/dist/tempo/session/server/RequestState.js +10 -4
  129. package/dist/tempo/session/server/RequestState.js.map +1 -1
  130. package/dist/tempo/session/server/Session.d.ts +21 -6
  131. package/dist/tempo/session/server/Session.d.ts.map +1 -1
  132. package/dist/tempo/session/server/Session.js +4 -1
  133. package/dist/tempo/session/server/Session.js.map +1 -1
  134. package/dist/tempo/session/server/Settlement.d.ts +20 -0
  135. package/dist/tempo/session/server/Settlement.d.ts.map +1 -1
  136. package/dist/tempo/session/server/Settlement.js +20 -0
  137. package/dist/tempo/session/server/Settlement.js.map +1 -1
  138. package/dist/tempo/session/server/Ws.d.ts +2 -0
  139. package/dist/tempo/session/server/Ws.d.ts.map +1 -1
  140. package/dist/tempo/session/server/Ws.js.map +1 -1
  141. package/dist/tempo/session/server/index.d.ts +1 -1
  142. package/dist/tempo/session/server/index.d.ts.map +1 -1
  143. package/dist/tempo/subscription/KeyAuthorization.d.ts +21 -21
  144. package/dist/validation/core.d.ts.map +1 -1
  145. package/dist/validation/core.js +6 -2
  146. package/dist/validation/core.js.map +1 -1
  147. package/dist/viem/Client.d.ts.map +1 -1
  148. package/dist/viem/Client.js +24 -17
  149. package/dist/viem/Client.js.map +1 -1
  150. package/package.json +6 -1
  151. package/src/cli/account.ts +45 -10
  152. package/src/cli/cli.test.ts +165 -70
  153. package/src/cli/cli.ts +67 -2
  154. package/src/cli/mcp.test.ts +11 -0
  155. package/src/cli/sessions/Manager.test.ts +249 -0
  156. package/src/cli/sessions/Manager.ts +93 -0
  157. package/src/cli/sessions/commands.ts +444 -0
  158. package/src/cli/sessions/request.test.ts +51 -0
  159. package/src/cli/sessions/request.ts +353 -0
  160. package/src/cli/sessions/store.test.ts +581 -0
  161. package/src/cli/sessions/store.ts +940 -0
  162. package/src/cli/utils.test.ts +23 -0
  163. package/src/cli/utils.ts +10 -0
  164. package/src/cli/validate/index.ts +12 -14
  165. package/src/cli/validate/messages.ts +7 -0
  166. package/src/cli/validate.test.ts +38 -5
  167. package/src/client/internal/Fetch.test.ts +29 -0
  168. package/src/client/internal/Fetch.ts +51 -6
  169. package/src/client/internal/MethodResponse.ts +39 -0
  170. package/src/client/node.test.ts +115 -0
  171. package/src/client/node.ts +247 -0
  172. package/src/internal/types.test-d.ts +21 -0
  173. package/src/internal/types.ts +33 -0
  174. package/src/server/Mppx.test-d.ts +42 -0
  175. package/src/stripe/Methods.test.ts +10 -0
  176. package/src/stripe/server/Charge.test-d.ts +66 -0
  177. package/src/stripe/server/Charge.ts +8 -5
  178. package/src/stripe/server/internal/html.gen.ts +1 -1
  179. package/src/tempo/internal/types.ts +13 -2
  180. package/src/tempo/legacy/client/ChannelOps.test.ts +21 -0
  181. package/src/tempo/legacy/client/ChannelOps.ts +7 -0
  182. package/src/tempo/legacy/client/Session.test.ts +102 -1
  183. package/src/tempo/legacy/client/Session.ts +10 -0
  184. package/src/tempo/legacy/server/Defaults.test-d.ts +9 -0
  185. package/src/tempo/legacy/server/Session.ts +6 -5
  186. package/src/tempo/server/Charge.ts +6 -4
  187. package/src/tempo/server/Methods.ts +5 -4
  188. package/src/tempo/server/Subscription.ts +6 -4
  189. package/src/tempo/server/index.ts +5 -1
  190. package/src/tempo/server/internal/html.gen.ts +1 -1
  191. package/src/tempo/session/README.md +201 -0
  192. package/src/tempo/session/Snapshot.ts +21 -0
  193. package/src/tempo/session/client/ChannelOps.test.ts +40 -0
  194. package/src/tempo/session/client/ChannelOps.ts +12 -2
  195. package/src/tempo/session/client/CredentialState.test.ts +2 -2
  196. package/src/tempo/session/client/CredentialState.ts +103 -1
  197. package/src/tempo/session/client/Session.test.ts +86 -4
  198. package/src/tempo/session/client/Session.ts +73 -1
  199. package/src/tempo/session/client/SessionManager.test.ts +137 -4
  200. package/src/tempo/session/client/SessionManager.ts +141 -33
  201. package/src/tempo/session/client/Transports.test.ts +225 -8
  202. package/src/tempo/session/client/Transports.ts +156 -21
  203. package/src/tempo/session/client/internal/SessionManager.ts +36 -0
  204. package/src/tempo/session/precompile/Chain.test.ts +26 -0
  205. package/src/tempo/session/precompile/Chain.ts +17 -4
  206. package/src/tempo/session/server/CredentialVerification.ts +18 -1
  207. package/src/tempo/session/server/MeteredStream.ts +12 -5
  208. package/src/tempo/session/server/RequestState.test.ts +39 -3
  209. package/src/tempo/session/server/RequestState.ts +13 -6
  210. package/src/tempo/session/server/Session.test.ts +461 -0
  211. package/src/tempo/session/server/Session.ts +31 -8
  212. package/src/tempo/session/server/Settlement.ts +45 -0
  213. package/src/tempo/session/server/Ws.test.ts +113 -0
  214. package/src/tempo/session/server/Ws.ts +2 -0
  215. package/src/tempo/session/server/index.ts +2 -0
  216. package/src/validation/core.ts +7 -1
  217. package/src/viem/Client.test.ts +44 -1
  218. package/src/viem/Client.ts +31 -17
@@ -1001,8 +1001,11 @@ async function sendPrecompileTransaction(
1001
1001
  label: string,
1002
1002
  options?: ChannelTransactionOptions,
1003
1003
  ): Promise<Hex> {
1004
- if (options?.feePayer) {
1005
- const account = options.account ?? client.account
1004
+ const account = options?.account ?? client.account
1005
+ const selfSponsored =
1006
+ account && options?.feePayer && isAddressEqual(account.address, options.feePayer.address)
1007
+
1008
+ if (options?.feePayer && !selfSponsored) {
1006
1009
  if (!account) throw new Error(`Cannot ${label} precompile channel: no account available.`)
1007
1010
  const feeToken =
1008
1011
  options.feeToken ??
@@ -1033,10 +1036,20 @@ async function sendPrecompileTransaction(
1033
1036
  return receipt.transactionHash
1034
1037
  }
1035
1038
 
1039
+ const feeToken =
1040
+ options?.feeToken ??
1041
+ (selfSponsored
1042
+ ? await resolveFeeToken({
1043
+ account: account.address,
1044
+ candidateTokens: options?.candidateFeeTokens,
1045
+ client,
1046
+ })
1047
+ : undefined)
1048
+
1036
1049
  return sendPrecompileContractCall(client, {
1037
- account: options?.account,
1050
+ account,
1038
1051
  to,
1039
1052
  data,
1040
- feeToken: options?.feeToken,
1053
+ feeToken,
1041
1054
  })
1042
1055
  }
@@ -30,7 +30,7 @@ import {
30
30
  import * as Voucher from '../precompile/Voucher.js'
31
31
  import * as ChannelStore from './ChannelStore.js'
32
32
  import { getChallengePaymentFields } from './RequestState.js'
33
- import { assertSettlementSender, getClientAccount } from './Settlement.js'
33
+ import { assertSettlementSender, getClientAccount, type OnSessionSettlement } from './Settlement.js'
34
34
 
35
35
  /** Returns the effective voucher signer for a TIP-1034 descriptor. */
36
36
  export function authorizedSigner(descriptor: Channel.ChannelDescriptor): Address {
@@ -344,6 +344,8 @@ export type VerifyCredentialPayloadParameters = {
344
344
  lastOnChainVerified: Map<Hex, number>
345
345
  /** Minimum allowed voucher delta in raw units. */
346
346
  minVoucherDelta: bigint
347
+ /** Callback invoked after an on-chain settlement or close transaction is confirmed. */
348
+ onSessionSettlement?: OnSessionSettlement | undefined
347
349
  /** Discriminated session credential payload to verify. */
348
350
  payload: SessionCredentialPayload
349
351
  /** Server-side channel store. */
@@ -747,6 +749,21 @@ async function handleCloseCredential(
747
749
  signature: payload.signature,
748
750
  }),
749
751
  )
752
+ if (parameters.onSessionSettlement && txHash) {
753
+ try {
754
+ await parameters.onSessionSettlement(
755
+ Object.freeze({
756
+ txHash,
757
+ channelId,
758
+ trigger: 'close' as const,
759
+ amount: settledToPayee,
760
+ delta: settledToPayee - state.settled,
761
+ }),
762
+ )
763
+ } catch {
764
+ // Errors are isolated — observers cannot break the settlement flow.
765
+ }
766
+ }
750
767
  return createSessionReceipt({
751
768
  challengeId: challenge.id,
752
769
  channelId,
@@ -12,8 +12,14 @@ export type SessionController = {
12
12
  * The reservation blocks until sufficient voucher headroom exists, but the
13
13
  * charge is only committed once a chunk is actually emitted. If the stream
14
14
  * ends or aborts before that emission, the reservation is dropped.
15
+ *
16
+ * Pass an explicit raw-unit `amount` for request-aware or otherwise dynamic
17
+ * pricing. When omitted, the session challenge's configured tick cost is
18
+ * used.
15
19
  */
16
- charge(): Promise<void>
20
+ charge(amount?: bigint): Promise<void>
21
+ /** Aborted when the client closes or requests the final session receipt. */
22
+ signal: AbortSignal
17
23
  }
18
24
 
19
25
  /** Async stream source accepted by paid session transports. */
@@ -49,7 +55,7 @@ export async function* meterIterable(options: MeteredStreamOptions): AsyncGenera
49
55
  let reservedAmount = 0n
50
56
  let reservedUnits = 0
51
57
 
52
- const charge = async () => {
58
+ const charge = async (amount = options.tickCost) => {
53
59
  if (prepaidUnits > 0) {
54
60
  prepaidUnits -= 1
55
61
  return
@@ -58,19 +64,20 @@ export async function* meterIterable(options: MeteredStreamOptions): AsyncGenera
58
64
  await reserveChargeOrWait({
59
65
  store: options.store,
60
66
  channelId: options.channelId,
61
- amount: options.tickCost,
67
+ amount,
62
68
  reservedAmount,
63
69
  emit: options.emitNeedVoucher,
64
70
  formatNeedVoucher: options.formatNeedVoucher,
65
71
  pollIntervalMs: options.pollIntervalMs,
66
72
  signal: options.signal,
67
73
  })
68
- reservedAmount += options.tickCost
74
+ reservedAmount += amount
69
75
  reservedUnits += 1
70
76
  }
71
77
 
78
+ const signal = options.signal ?? new AbortController().signal
72
79
  const iterable =
73
- typeof options.generate === 'function' ? options.generate({ charge }) : options.generate
80
+ typeof options.generate === 'function' ? options.generate({ charge, signal }) : options.generate
74
81
 
75
82
  for await (const value of iterable) {
76
83
  if (options.signal?.aborted) break
@@ -316,7 +316,11 @@ describe('SessionSnapshotHints', () => {
316
316
  escrowContract,
317
317
  expiringNonceHash: descriptor.expiringNonceHash,
318
318
  finalized: false,
319
- highestVoucher: null,
319
+ highestVoucher: {
320
+ channelId,
321
+ cumulativeAmount: 500n,
322
+ signature: `0x${'44'.repeat(64)}`,
323
+ },
320
324
  highestVoucherAmount: 500n,
321
325
  operator: descriptor.operator,
322
326
  payee: descriptor.payee,
@@ -451,6 +455,11 @@ describe('SessionSnapshotHints', () => {
451
455
  deposit: '1000',
452
456
  descriptor,
453
457
  escrow: escrowContract,
458
+ highestVoucher: {
459
+ channelId,
460
+ cumulativeAmount: '500',
461
+ signature: `0x${'44'.repeat(64)}`,
462
+ },
454
463
  requiredCumulative: '350',
455
464
  settled: '100',
456
465
  spent: '300',
@@ -458,7 +467,7 @@ describe('SessionSnapshotHints', () => {
458
467
  })
459
468
  })
460
469
 
461
- test('raises accepted cumulative when next request exceeds current authorization', async () => {
470
+ test('keeps accepted cumulative at the signed voucher when the next request needs more', async () => {
462
471
  const snapshot = await resolveSessionSnapshot({
463
472
  amount: 300n,
464
473
  channelId,
@@ -466,7 +475,34 @@ describe('SessionSnapshotHints', () => {
466
475
  })
467
476
 
468
477
  expect(snapshot?.requiredCumulative).toBe('600')
469
- expect(snapshot?.acceptedCumulative).toBe('600')
478
+ expect(snapshot?.acceptedCumulative).toBe('500')
479
+ expect(snapshot?.highestVoucher?.cumulativeAmount).toBe('500')
480
+ })
481
+
482
+ test('omits reusable channel hints without a matching signed highest voucher', async () => {
483
+ await expect(
484
+ resolveSessionSnapshot({
485
+ amount: 50n,
486
+ channelId,
487
+ store: store(channel({ highestVoucher: null })),
488
+ }),
489
+ ).resolves.toBeUndefined()
490
+
491
+ await expect(
492
+ resolveSessionSnapshot({
493
+ amount: 50n,
494
+ channelId,
495
+ store: store(
496
+ channel({
497
+ highestVoucher: {
498
+ channelId,
499
+ cumulativeAmount: 499n,
500
+ signature: `0x${'44'.repeat(64)}`,
501
+ },
502
+ }),
503
+ ),
504
+ }),
505
+ ).resolves.toBeUndefined()
470
506
  })
471
507
 
472
508
  test('omits reusable channel hints when payment fields do not match', async () => {
@@ -80,7 +80,11 @@ export type ResolveSessionChannelIdParameters = {
80
80
  store: ChannelStore.ChannelStore
81
81
  }
82
82
 
83
- /** Application hook for mapping request identity to an existing session channel. */
83
+ /**
84
+ * Application-owned lookup from authenticated identity and payment scope to an existing session
85
+ * channel. MPPx does not derive a storage key or scan the channel store; the returned channel ID is
86
+ * loaded and independently validated before its snapshot is advertised.
87
+ */
84
88
  export type ResolveSessionChannelId = (
85
89
  parameters: ResolveSessionChannelIdParameters,
86
90
  ) => Promise<string | null | undefined> | string | null | undefined
@@ -139,14 +143,12 @@ export async function resolveSessionSnapshot(
139
143
  const channel = await store.getChannel(ChannelStore.normalizeChannelId(channelId))
140
144
  if (!channel || !ChannelStore.isPrecompileState(channel)) return undefined
141
145
  if (channel.finalized) return undefined
146
+ if (!channel.highestVoucher) return undefined
147
+ if (channel.highestVoucher.cumulativeAmount !== channel.highestVoucherAmount) return undefined
142
148
  if (expected && !matchesSnapshotPaymentFields(channel, expected)) return undefined
143
149
  const requiredCumulative = channel.spent + amount
144
- const acceptedCumulative =
145
- channel.highestVoucherAmount > requiredCumulative
146
- ? channel.highestVoucherAmount
147
- : requiredCumulative
148
150
  return {
149
- acceptedCumulative: acceptedCumulative.toString(),
151
+ acceptedCumulative: channel.highestVoucherAmount.toString(),
150
152
  chainId: channel.chainId,
151
153
  channelId: channel.channelId,
152
154
  closeRequestedAt:
@@ -154,6 +156,11 @@ export async function resolveSessionSnapshot(
154
156
  deposit: channel.deposit.toString(),
155
157
  descriptor: channel.descriptor,
156
158
  escrow: channel.escrowContract,
159
+ highestVoucher: {
160
+ channelId: channel.highestVoucher.channelId,
161
+ cumulativeAmount: channel.highestVoucher.cumulativeAmount.toString(),
162
+ signature: channel.highestVoucher.signature,
163
+ },
157
164
  requiredCumulative: requiredCumulative.toString(),
158
165
  settled: channel.settledOnChain.toString(),
159
166
  spent: channel.spent.toString(),