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.
- package/CHANGELOG.md +25 -0
- package/README.md +16 -1
- package/dist/cli/account.d.ts +88 -0
- package/dist/cli/account.d.ts.map +1 -1
- package/dist/cli/account.js +39 -9
- package/dist/cli/account.js.map +1 -1
- package/dist/cli/cli.d.ts +2 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +59 -2
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/sessions/Manager.d.ts +31 -0
- package/dist/cli/sessions/Manager.d.ts.map +1 -0
- package/dist/cli/sessions/Manager.js +56 -0
- package/dist/cli/sessions/Manager.js.map +1 -0
- package/dist/cli/sessions/commands.d.ts +36 -0
- package/dist/cli/sessions/commands.d.ts.map +1 -0
- package/dist/cli/sessions/commands.js +407 -0
- package/dist/cli/sessions/commands.js.map +1 -0
- package/dist/cli/sessions/request.d.ts +35 -0
- package/dist/cli/sessions/request.d.ts.map +1 -0
- package/dist/cli/sessions/request.js +271 -0
- package/dist/cli/sessions/request.js.map +1 -0
- package/dist/cli/sessions/store.d.ts +134 -0
- package/dist/cli/sessions/store.d.ts.map +1 -0
- package/dist/cli/sessions/store.js +723 -0
- package/dist/cli/sessions/store.js.map +1 -0
- package/dist/cli/utils.d.ts +2 -0
- package/dist/cli/utils.d.ts.map +1 -1
- package/dist/cli/utils.js +12 -0
- package/dist/cli/utils.js.map +1 -1
- package/dist/cli/validate/index.d.ts.map +1 -1
- package/dist/cli/validate/index.js +12 -6
- package/dist/cli/validate/index.js.map +1 -1
- package/dist/cli/validate/messages.d.ts +2 -0
- package/dist/cli/validate/messages.d.ts.map +1 -0
- package/dist/cli/validate/messages.js +8 -0
- package/dist/cli/validate/messages.js.map +1 -0
- package/dist/client/internal/Fetch.d.ts.map +1 -1
- package/dist/client/internal/Fetch.js +35 -6
- package/dist/client/internal/Fetch.js.map +1 -1
- package/dist/client/internal/MethodResponse.d.ts +23 -0
- package/dist/client/internal/MethodResponse.d.ts.map +1 -0
- package/dist/client/internal/MethodResponse.js +15 -0
- package/dist/client/internal/MethodResponse.js.map +1 -0
- package/dist/client/node.d.ts +29 -0
- package/dist/client/node.d.ts.map +1 -0
- package/dist/client/node.js +177 -0
- package/dist/client/node.js.map +1 -0
- package/dist/internal/types.d.ts +24 -0
- package/dist/internal/types.d.ts.map +1 -1
- package/dist/stripe/server/Charge.d.ts +8 -4
- package/dist/stripe/server/Charge.d.ts.map +1 -1
- package/dist/stripe/server/Charge.js.map +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts +1 -1
- package/dist/stripe/server/internal/html.gen.d.ts.map +1 -1
- package/dist/stripe/server/internal/html.gen.js +1 -1
- package/dist/stripe/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/client/Methods.d.ts +1 -1
- package/dist/tempo/internal/types.d.ts +10 -1
- package/dist/tempo/internal/types.d.ts.map +1 -1
- package/dist/tempo/legacy/client/ChannelOps.d.ts +2 -0
- package/dist/tempo/legacy/client/ChannelOps.d.ts.map +1 -1
- package/dist/tempo/legacy/client/ChannelOps.js +4 -0
- package/dist/tempo/legacy/client/ChannelOps.js.map +1 -1
- package/dist/tempo/legacy/client/Session.d.ts +2 -2
- package/dist/tempo/legacy/client/Session.d.ts.map +1 -1
- package/dist/tempo/legacy/client/Session.js +7 -0
- package/dist/tempo/legacy/client/Session.js.map +1 -1
- package/dist/tempo/legacy/server/Session.d.ts +3 -3
- package/dist/tempo/legacy/server/Session.d.ts.map +1 -1
- package/dist/tempo/legacy/server/Session.js.map +1 -1
- package/dist/tempo/server/Charge.d.ts +3 -2
- package/dist/tempo/server/Charge.d.ts.map +1 -1
- package/dist/tempo/server/Charge.js.map +1 -1
- package/dist/tempo/server/Methods.d.ts +2 -23
- package/dist/tempo/server/Methods.d.ts.map +1 -1
- package/dist/tempo/server/Methods.js +2 -2
- package/dist/tempo/server/Methods.js.map +1 -1
- package/dist/tempo/server/Subscription.d.ts +3 -2
- package/dist/tempo/server/Subscription.d.ts.map +1 -1
- package/dist/tempo/server/Subscription.js.map +1 -1
- package/dist/tempo/server/index.d.ts +1 -1
- package/dist/tempo/server/index.d.ts.map +1 -1
- package/dist/tempo/server/index.js.map +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts +1 -1
- package/dist/tempo/server/internal/html.gen.d.ts.map +1 -1
- package/dist/tempo/server/internal/html.gen.js +1 -1
- package/dist/tempo/server/internal/html.gen.js.map +1 -1
- package/dist/tempo/session/Snapshot.d.ts +9 -0
- package/dist/tempo/session/Snapshot.d.ts.map +1 -1
- package/dist/tempo/session/Snapshot.js +6 -0
- package/dist/tempo/session/Snapshot.js.map +1 -1
- package/dist/tempo/session/client/ChannelOps.d.ts.map +1 -1
- package/dist/tempo/session/client/ChannelOps.js +11 -2
- package/dist/tempo/session/client/ChannelOps.js.map +1 -1
- package/dist/tempo/session/client/CredentialState.d.ts +21 -1
- package/dist/tempo/session/client/CredentialState.d.ts.map +1 -1
- package/dist/tempo/session/client/CredentialState.js +66 -1
- package/dist/tempo/session/client/CredentialState.js.map +1 -1
- package/dist/tempo/session/client/Session.d.ts +1 -1
- package/dist/tempo/session/client/Session.d.ts.map +1 -1
- package/dist/tempo/session/client/Session.js +53 -1
- package/dist/tempo/session/client/Session.js.map +1 -1
- package/dist/tempo/session/client/SessionManager.d.ts +2 -2
- package/dist/tempo/session/client/SessionManager.d.ts.map +1 -1
- package/dist/tempo/session/client/SessionManager.js +130 -30
- package/dist/tempo/session/client/SessionManager.js.map +1 -1
- package/dist/tempo/session/client/Transports.d.ts +21 -2
- package/dist/tempo/session/client/Transports.d.ts.map +1 -1
- package/dist/tempo/session/client/Transports.js +129 -18
- package/dist/tempo/session/client/Transports.js.map +1 -1
- package/dist/tempo/session/client/internal/SessionManager.d.ts +19 -0
- package/dist/tempo/session/client/internal/SessionManager.d.ts.map +1 -0
- package/dist/tempo/session/client/internal/SessionManager.js +13 -0
- package/dist/tempo/session/client/internal/SessionManager.js.map +1 -0
- package/dist/tempo/session/precompile/Chain.js +13 -4
- package/dist/tempo/session/precompile/Chain.js.map +1 -1
- package/dist/tempo/session/server/CredentialVerification.d.ts +3 -0
- package/dist/tempo/session/server/CredentialVerification.d.ts.map +1 -1
- package/dist/tempo/session/server/CredentialVerification.js +14 -0
- package/dist/tempo/session/server/CredentialVerification.js.map +1 -1
- package/dist/tempo/session/server/MeteredStream.d.ts +7 -1
- package/dist/tempo/session/server/MeteredStream.d.ts.map +1 -1
- package/dist/tempo/session/server/MeteredStream.js +5 -4
- package/dist/tempo/session/server/MeteredStream.js.map +1 -1
- package/dist/tempo/session/server/RequestState.d.ts +5 -1
- package/dist/tempo/session/server/RequestState.d.ts.map +1 -1
- package/dist/tempo/session/server/RequestState.js +10 -4
- package/dist/tempo/session/server/RequestState.js.map +1 -1
- package/dist/tempo/session/server/Session.d.ts +21 -6
- package/dist/tempo/session/server/Session.d.ts.map +1 -1
- package/dist/tempo/session/server/Session.js +4 -1
- package/dist/tempo/session/server/Session.js.map +1 -1
- package/dist/tempo/session/server/Settlement.d.ts +20 -0
- package/dist/tempo/session/server/Settlement.d.ts.map +1 -1
- package/dist/tempo/session/server/Settlement.js +20 -0
- package/dist/tempo/session/server/Settlement.js.map +1 -1
- package/dist/tempo/session/server/Ws.d.ts +2 -0
- package/dist/tempo/session/server/Ws.d.ts.map +1 -1
- package/dist/tempo/session/server/Ws.js.map +1 -1
- package/dist/tempo/session/server/index.d.ts +1 -1
- package/dist/tempo/session/server/index.d.ts.map +1 -1
- package/dist/tempo/subscription/KeyAuthorization.d.ts +21 -21
- package/dist/validation/core.d.ts.map +1 -1
- package/dist/validation/core.js +6 -2
- package/dist/validation/core.js.map +1 -1
- package/dist/viem/Client.d.ts.map +1 -1
- package/dist/viem/Client.js +24 -17
- package/dist/viem/Client.js.map +1 -1
- package/package.json +6 -1
- package/src/cli/account.ts +45 -10
- package/src/cli/cli.test.ts +165 -70
- package/src/cli/cli.ts +67 -2
- package/src/cli/mcp.test.ts +11 -0
- package/src/cli/sessions/Manager.test.ts +249 -0
- package/src/cli/sessions/Manager.ts +93 -0
- package/src/cli/sessions/commands.ts +444 -0
- package/src/cli/sessions/request.test.ts +51 -0
- package/src/cli/sessions/request.ts +353 -0
- package/src/cli/sessions/store.test.ts +581 -0
- package/src/cli/sessions/store.ts +940 -0
- package/src/cli/utils.test.ts +23 -0
- package/src/cli/utils.ts +10 -0
- package/src/cli/validate/index.ts +12 -14
- package/src/cli/validate/messages.ts +7 -0
- package/src/cli/validate.test.ts +38 -5
- package/src/client/internal/Fetch.test.ts +29 -0
- package/src/client/internal/Fetch.ts +51 -6
- package/src/client/internal/MethodResponse.ts +39 -0
- package/src/client/node.test.ts +115 -0
- package/src/client/node.ts +247 -0
- package/src/internal/types.test-d.ts +21 -0
- package/src/internal/types.ts +33 -0
- package/src/server/Mppx.test-d.ts +42 -0
- package/src/stripe/Methods.test.ts +10 -0
- package/src/stripe/server/Charge.test-d.ts +66 -0
- package/src/stripe/server/Charge.ts +8 -5
- package/src/stripe/server/internal/html.gen.ts +1 -1
- package/src/tempo/internal/types.ts +13 -2
- package/src/tempo/legacy/client/ChannelOps.test.ts +21 -0
- package/src/tempo/legacy/client/ChannelOps.ts +7 -0
- package/src/tempo/legacy/client/Session.test.ts +102 -1
- package/src/tempo/legacy/client/Session.ts +10 -0
- package/src/tempo/legacy/server/Defaults.test-d.ts +9 -0
- package/src/tempo/legacy/server/Session.ts +6 -5
- package/src/tempo/server/Charge.ts +6 -4
- package/src/tempo/server/Methods.ts +5 -4
- package/src/tempo/server/Subscription.ts +6 -4
- package/src/tempo/server/index.ts +5 -1
- package/src/tempo/server/internal/html.gen.ts +1 -1
- package/src/tempo/session/README.md +201 -0
- package/src/tempo/session/Snapshot.ts +21 -0
- package/src/tempo/session/client/ChannelOps.test.ts +40 -0
- package/src/tempo/session/client/ChannelOps.ts +12 -2
- package/src/tempo/session/client/CredentialState.test.ts +2 -2
- package/src/tempo/session/client/CredentialState.ts +103 -1
- package/src/tempo/session/client/Session.test.ts +86 -4
- package/src/tempo/session/client/Session.ts +73 -1
- package/src/tempo/session/client/SessionManager.test.ts +137 -4
- package/src/tempo/session/client/SessionManager.ts +141 -33
- package/src/tempo/session/client/Transports.test.ts +225 -8
- package/src/tempo/session/client/Transports.ts +156 -21
- package/src/tempo/session/client/internal/SessionManager.ts +36 -0
- package/src/tempo/session/precompile/Chain.test.ts +26 -0
- package/src/tempo/session/precompile/Chain.ts +17 -4
- package/src/tempo/session/server/CredentialVerification.ts +18 -1
- package/src/tempo/session/server/MeteredStream.ts +12 -5
- package/src/tempo/session/server/RequestState.test.ts +39 -3
- package/src/tempo/session/server/RequestState.ts +13 -6
- package/src/tempo/session/server/Session.test.ts +461 -0
- package/src/tempo/session/server/Session.ts +31 -8
- package/src/tempo/session/server/Settlement.ts +45 -0
- package/src/tempo/session/server/Ws.test.ts +113 -0
- package/src/tempo/session/server/Ws.ts +2 -0
- package/src/tempo/session/server/index.ts +2 -0
- package/src/validation/core.ts +7 -1
- package/src/viem/Client.test.ts +44 -1
- 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
|
-
|
|
1005
|
-
|
|
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
|
|
1050
|
+
account,
|
|
1038
1051
|
to,
|
|
1039
1052
|
data,
|
|
1040
|
-
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
|
|
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 +=
|
|
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:
|
|
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('
|
|
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('
|
|
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
|
-
/**
|
|
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:
|
|
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(),
|