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
@@ -340,6 +340,27 @@ describe.runIf(isLocalnet)('tryRecoverChannel', () => {
340
340
  expect(result!.opened).toBe(true)
341
341
  expect(result!.escrowContract).toBe(escrow)
342
342
  expect(result!.chainId).toBe(chain.id)
343
+ // Channel opened with a zero authorizedSigner: the escrow verifies
344
+ // vouchers against the payer, so the recovered authority is the payer.
345
+ expect(result!.authorizedSigner.toLowerCase()).toBe(payer.address.toLowerCase())
346
+ })
347
+
348
+ test('recovers the on-chain authorizedSigner when set', async () => {
349
+ const authorizedSigner = accounts[4].address
350
+ const { channelId: signerChannelId } = await openChannel({
351
+ escrow,
352
+ payer,
353
+ payee,
354
+ token: currency,
355
+ deposit: 10_000_000n,
356
+ salt: Hex.random(32) as `0x${string}`,
357
+ authorizedSigner,
358
+ })
359
+
360
+ const result = await tryRecoverChannel(client, escrow, signerChannelId, chain.id)
361
+
362
+ expect(result).not.toBeUndefined()
363
+ expect(result!.authorizedSigner.toLowerCase()).toBe(authorizedSigner.toLowerCase())
343
364
  })
344
365
 
345
366
  test('returns undefined for non-existent channel', async () => {
@@ -27,6 +27,8 @@ import { signVoucher } from '../session/Voucher.js'
27
27
 
28
28
  /** Cached channel metadata used by the legacy auto-driving session client. */
29
29
  export type ChannelEntry = {
30
+ /** Voucher authority the channel was opened with. */
31
+ authorizedSigner: Address
30
32
  /** Legacy contract-backed channel ID. */
31
33
  channelId: Hex.Hex
32
34
  /** Salt used to derive the channel ID. */
@@ -209,6 +211,7 @@ export async function createOpenPayload(
209
211
 
210
212
  return {
211
213
  entry: {
214
+ authorizedSigner,
212
215
  channelId,
213
216
  salt,
214
217
  cumulativeAmount: initialAmount,
@@ -249,6 +252,10 @@ export async function tryRecoverChannel(
249
252
 
250
253
  if (onChain.deposit > 0n && !onChain.finalized) {
251
254
  return {
255
+ // A zero on-chain authorizedSigner means the escrow verifies vouchers
256
+ // against the payer, so record the payer as the voucher authority.
257
+ authorizedSigner:
258
+ BigInt(onChain.authorizedSigner) === 0n ? onChain.payer : onChain.authorizedSigner,
252
259
  channelId,
253
260
  salt: '0x' as Hex.Hex,
254
261
  cumulativeAmount: onChain.settled,
@@ -1,7 +1,16 @@
1
1
  import { SignatureEnvelope } from 'ox/tempo'
2
- import { type Address, createClient, decodeFunctionData, erc20Abi, type Hex, http } from 'viem'
2
+ import {
3
+ type Address,
4
+ createClient,
5
+ custom,
6
+ decodeFunctionData,
7
+ erc20Abi,
8
+ type Hex,
9
+ http,
10
+ } from 'viem'
3
11
  import { privateKeyToAccount } from 'viem/accounts'
4
12
  import { Account as TempoAccount, Addresses, Transaction, WebCryptoP256 } from 'viem/tempo'
13
+ import { tempoModerato } from 'viem/tempo/chains'
5
14
  import { beforeAll, describe, expect, test } from 'vp/test'
6
15
  import { tempoNetwork } from '~test/config.js'
7
16
  import { deployEscrow, openChannel } from '~test/tempo/legacy/session.js'
@@ -374,6 +383,98 @@ describe('session (pure)', () => {
374
383
  expect(cred.source).toBe(`did:pkh:eip155:42431:${pureAccount.address}`)
375
384
  })
376
385
  })
386
+
387
+ describe('auto-manage channel reuse', () => {
388
+ const payerAccount = privateKeyToAccount(
389
+ '0x59c6995e998f97a5a0044966f09453863d462d2b3f1446a99f0a3d7b5d0f5a0d',
390
+ )
391
+ const signerA = TempoAccount.fromSecp256k1(
392
+ '0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a',
393
+ { access: payerAccount },
394
+ )
395
+ const signerB = TempoAccount.fromSecp256k1(
396
+ '0x7c852118294e51e653712a81e05800f419141751be58f605c371e15141b007a6',
397
+ { access: payerAccount },
398
+ )
399
+
400
+ function makeAutoClient(account: typeof signerA) {
401
+ return createClient({
402
+ account,
403
+ chain: tempoModerato,
404
+ transport: custom({
405
+ async request({ method }: { method: string }) {
406
+ if (method === 'eth_chainId') return `0x${tempoModerato.id.toString(16)}`
407
+ if (method === 'eth_fillTransaction')
408
+ return {
409
+ raw: '0x',
410
+ tx: {
411
+ chainId: `0x${tempoModerato.id.toString(16)}`,
412
+ from: payerAccount.address,
413
+ gas: '0x5208',
414
+ input: '0x',
415
+ maxFeePerGas: '0x1',
416
+ maxPriorityFeePerGas: '0x1',
417
+ nonce: '0x0',
418
+ to: escrowAddress,
419
+ type: '0x2',
420
+ value: '0x0',
421
+ },
422
+ }
423
+ throw new Error(`unexpected rpc request: ${method}`)
424
+ },
425
+ }),
426
+ })
427
+ }
428
+
429
+ test('reuses the cached channel while the voucher signer is unchanged', async () => {
430
+ const method = session({
431
+ getClient: () => makeAutoClient(signerA),
432
+ maxDeposit: '10',
433
+ })
434
+
435
+ const first = deserializePayload(
436
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
437
+ )
438
+ const second = deserializePayload(
439
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
440
+ )
441
+
442
+ expect(first.payload.action).toBe('open')
443
+ expect(second.payload.action).toBe('voucher')
444
+ expect(second.payload.channelId).toBe(first.payload.channelId)
445
+ })
446
+
447
+ test('opens a new channel instead of reusing when the authorizedSigner changes', async () => {
448
+ let account = signerA
449
+ const method = session({
450
+ getClient: () => makeAutoClient(account),
451
+ maxDeposit: '10',
452
+ })
453
+
454
+ const first = deserializePayload(
455
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
456
+ )
457
+
458
+ account = signerB
459
+
460
+ const second = deserializePayload(
461
+ await method.createCredential({ challenge: makeChallenge(), context: {} }),
462
+ )
463
+
464
+ expect(first.payload.action).toBe('open')
465
+ if (first.payload.action !== 'open') throw new Error('expected open payload')
466
+ expect(first.payload.authorizedSigner?.toLowerCase()).toBe(
467
+ signerA.accessKeyAddress.toLowerCase(),
468
+ )
469
+
470
+ expect(second.payload.action).toBe('open')
471
+ if (second.payload.action !== 'open') throw new Error('expected open payload')
472
+ expect(second.payload.authorizedSigner?.toLowerCase()).toBe(
473
+ signerB.accessKeyAddress.toLowerCase(),
474
+ )
475
+ expect(second.payload.channelId).not.toBe(first.payload.channelId)
476
+ })
477
+ })
377
478
  })
378
479
 
379
480
  describe.runIf(isLocalnet)('session (on-chain)', () => {
@@ -175,6 +175,16 @@ export function session(parameters: session.Parameters = {}) {
175
175
  }
176
176
  }
177
177
 
178
+ // A channel only admits vouchers from the authorizedSigner it was opened
179
+ // with, so a cached or recovered entry stops being reusable once the
180
+ // resolved signer changes. Fall through to open a fresh channel instead
181
+ // of emitting a voucher the escrow would reject.
182
+ if (
183
+ entry?.opened &&
184
+ entry.authorizedSigner.toLowerCase() !== getAccountSignerAddress(voucherSigner).toLowerCase()
185
+ )
186
+ entry = undefined
187
+
178
188
  let payload: LegacySessionCredentialPayload
179
189
 
180
190
  if (entry?.opened) {
@@ -0,0 +1,9 @@
1
+ import { expectTypeOf, test } from 'vp/test'
2
+
3
+ import type { session } from './Session.js'
4
+
5
+ test('legacy session exposes its resolved currency and decimals as defaults', () => {
6
+ type Defaults = session.DeriveDefaults<{}>
7
+ expectTypeOf<Defaults['currency']>().toEqualTypeOf<string>()
8
+ expectTypeOf<Defaults['decimals']>().toEqualTypeOf<number>()
9
+ })
@@ -399,11 +399,12 @@ export declare namespace session {
399
399
 
400
400
  type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
401
401
  parameters,
402
- Defaults
403
- > & {
404
- decimals: number
405
- escrowContract: Address
406
- }
402
+ Defaults,
403
+ {
404
+ currency: string
405
+ decimals: number
406
+ }
407
+ >
407
408
  }
408
409
 
409
410
  function assertSettlementSender(parameters: {
@@ -623,10 +623,12 @@ export declare namespace charge {
623
623
 
624
624
  type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
625
625
  parameters,
626
- Defaults
627
- > & {
628
- decimals: number
629
- }
626
+ Defaults,
627
+ {
628
+ currency: string
629
+ decimals: number
630
+ }
631
+ >
630
632
 
631
633
  type FeePayerPolicy = Partial<FeePayer.Policy>
632
634
  }
@@ -1,3 +1,4 @@
1
+ import type { NoExtraKeys } from '../../internal/types.js'
1
2
  import { session as sessionLegacy_, settle as settleLegacy_ } from '../legacy/server/index.js'
2
3
  import {
3
4
  charge as sessionCharge_,
@@ -37,16 +38,16 @@ function createChargeMethod<const parameters extends tempo.Parameters>(
37
38
  parameters: parameters | undefined,
38
39
  ) {
39
40
  // `tempo()` accepts the intersection of charge/session parameters, then
40
- // forwards only the fields each method understands. Keep the generic bridge
41
- // out of the public control-flow body.
42
- return tempo.charge(parameters as charge_.Parameters)
41
+ // forwards only the fields each method understands. Preserve the inferred
42
+ // parameter type so configured request defaults remain visible to handlers.
43
+ return tempo.charge(parameters as NoExtraKeys<parameters, charge_.Parameters> | undefined)
43
44
  }
44
45
 
45
46
  function createSessionMethod<const parameters extends tempo.Parameters>(
46
47
  parameters: parameters | undefined,
47
48
  ) {
48
49
  // See `createChargeMethod()`: session receives the same shared parameter bag.
49
- return sessionServer(parameters as session_.Parameters)
50
+ return sessionServer(parameters as NoExtraKeys<parameters, session_.Parameters> | undefined)
50
51
  }
51
52
 
52
53
  /**
@@ -1286,10 +1286,12 @@ export declare namespace subscription {
1286
1286
  /** Derived defaults after account and chain configuration are applied. */
1287
1287
  type DeriveDefaults<parameters extends Parameters> = types.DeriveDefaults<
1288
1288
  parameters,
1289
- Defaults
1290
- > & {
1291
- decimals: number
1292
- }
1289
+ Defaults,
1290
+ {
1291
+ currency: string
1292
+ decimals: number
1293
+ }
1294
+ >
1293
1295
  }
1294
1296
 
1295
1297
  function createContext<const parameters extends createContext.Parameters>(
@@ -4,5 +4,9 @@ export * as Ws from '../session/server/Ws.js'
4
4
  export { charge } from './Charge.js'
5
5
  export { sessionLegacy, settleLegacy, tempo } from './Methods.js'
6
6
  export { session, settle, settleBatch } from '../session/server/Session.js'
7
- export type { SettlementSchedule } from '../session/server/Session.js'
7
+ export type {
8
+ OnSessionSettlement,
9
+ SessionSettlementContext,
10
+ SettlementSchedule,
11
+ } from '../session/server/Session.js'
8
12
  export { renew as renewSubscription, subscription } from './Subscription.js'