@solana/mpp 0.1.1 → 0.2.0

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 (91) hide show
  1. package/dist/Methods.d.ts +1 -213
  2. package/dist/Methods.d.ts.map +1 -1
  3. package/dist/Methods.js +1 -158
  4. package/dist/Methods.js.map +1 -1
  5. package/dist/client/Methods.d.ts +0 -2
  6. package/dist/client/Methods.d.ts.map +1 -1
  7. package/dist/client/Methods.js +0 -2
  8. package/dist/client/Methods.js.map +1 -1
  9. package/dist/client/index.d.ts +0 -1
  10. package/dist/client/index.d.ts.map +1 -1
  11. package/dist/client/index.js +0 -1
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/index.d.ts +0 -3
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +0 -2
  16. package/dist/index.js.map +1 -1
  17. package/dist/server/Charge.d.ts +2 -2
  18. package/dist/server/Charge.d.ts.map +1 -1
  19. package/dist/server/Charge.js +4 -0
  20. package/dist/server/Charge.js.map +1 -1
  21. package/dist/server/Methods.d.ts +0 -2
  22. package/dist/server/Methods.d.ts.map +1 -1
  23. package/dist/server/Methods.js +0 -2
  24. package/dist/server/Methods.js.map +1 -1
  25. package/dist/server/index.d.ts +0 -1
  26. package/dist/server/index.d.ts.map +1 -1
  27. package/dist/server/index.js +0 -1
  28. package/dist/server/index.js.map +1 -1
  29. package/package.json +1 -9
  30. package/src/Methods.ts +1 -171
  31. package/src/client/Methods.ts +0 -3
  32. package/src/client/index.ts +0 -1
  33. package/src/index.ts +0 -29
  34. package/src/server/Charge.ts +7 -2
  35. package/src/server/Methods.ts +0 -3
  36. package/src/server/index.ts +0 -1
  37. package/dist/client/Session.d.ts +0 -195
  38. package/dist/client/Session.d.ts.map +0 -1
  39. package/dist/client/Session.js +0 -411
  40. package/dist/client/Session.js.map +0 -1
  41. package/dist/server/Session.d.ts +0 -171
  42. package/dist/server/Session.d.ts.map +0 -1
  43. package/dist/server/Session.js +0 -430
  44. package/dist/server/Session.js.map +0 -1
  45. package/dist/session/ChannelStore.d.ts +0 -12
  46. package/dist/session/ChannelStore.d.ts.map +0 -1
  47. package/dist/session/ChannelStore.js +0 -88
  48. package/dist/session/ChannelStore.js.map +0 -1
  49. package/dist/session/Types.d.ts +0 -179
  50. package/dist/session/Types.d.ts.map +0 -1
  51. package/dist/session/Types.js +0 -2
  52. package/dist/session/Types.js.map +0 -1
  53. package/dist/session/Voucher.d.ts +0 -7
  54. package/dist/session/Voucher.d.ts.map +0 -1
  55. package/dist/session/Voucher.js +0 -118
  56. package/dist/session/Voucher.js.map +0 -1
  57. package/dist/session/authorizers/BudgetAuthorizer.d.ts +0 -90
  58. package/dist/session/authorizers/BudgetAuthorizer.d.ts.map +0 -1
  59. package/dist/session/authorizers/BudgetAuthorizer.js +0 -398
  60. package/dist/session/authorizers/BudgetAuthorizer.js.map +0 -1
  61. package/dist/session/authorizers/SwigSessionAuthorizer.d.ts +0 -104
  62. package/dist/session/authorizers/SwigSessionAuthorizer.d.ts.map +0 -1
  63. package/dist/session/authorizers/SwigSessionAuthorizer.js +0 -522
  64. package/dist/session/authorizers/SwigSessionAuthorizer.js.map +0 -1
  65. package/dist/session/authorizers/UnboundedAuthorizer.d.ts +0 -36
  66. package/dist/session/authorizers/UnboundedAuthorizer.d.ts.map +0 -1
  67. package/dist/session/authorizers/UnboundedAuthorizer.js +0 -204
  68. package/dist/session/authorizers/UnboundedAuthorizer.js.map +0 -1
  69. package/dist/session/authorizers/index.d.ts +0 -5
  70. package/dist/session/authorizers/index.d.ts.map +0 -1
  71. package/dist/session/authorizers/index.js +0 -5
  72. package/dist/session/authorizers/index.js.map +0 -1
  73. package/dist/session/authorizers/makeSessionAuthorizer.d.ts +0 -19
  74. package/dist/session/authorizers/makeSessionAuthorizer.d.ts.map +0 -1
  75. package/dist/session/authorizers/makeSessionAuthorizer.js +0 -72
  76. package/dist/session/authorizers/makeSessionAuthorizer.js.map +0 -1
  77. package/dist/session/index.d.ts +0 -5
  78. package/dist/session/index.d.ts.map +0 -1
  79. package/dist/session/index.js +0 -5
  80. package/dist/session/index.js.map +0 -1
  81. package/src/client/Session.ts +0 -630
  82. package/src/server/Session.ts +0 -687
  83. package/src/session/ChannelStore.ts +0 -128
  84. package/src/session/Types.ts +0 -189
  85. package/src/session/Voucher.ts +0 -158
  86. package/src/session/authorizers/BudgetAuthorizer.ts +0 -574
  87. package/src/session/authorizers/SwigSessionAuthorizer.ts +0 -767
  88. package/src/session/authorizers/UnboundedAuthorizer.ts +0 -284
  89. package/src/session/authorizers/index.ts +0 -4
  90. package/src/session/authorizers/makeSessionAuthorizer.ts +0 -104
  91. package/src/session/index.ts +0 -4
@@ -1,430 +0,0 @@
1
- import { Method, Receipt, Store } from 'mppx';
2
- import { DEFAULT_RPC_URLS } from '../constants.js';
3
- import * as Methods from '../Methods.js';
4
- import * as ChannelStore from '../session/ChannelStore.js';
5
- import { parseVoucherFromPayload, verifyVoucherSignature } from '../session/Voucher.js';
6
- export function session(parameters) {
7
- const { recipient, network = 'mainnet-beta', asset, channelProgram, store = Store.memory() } = parameters;
8
- assertSessionParameters(parameters);
9
- const resolvedRpcUrl = parameters.rpcUrl ?? DEFAULT_RPC_URLS[network] ?? DEFAULT_RPC_URLS['mainnet-beta'];
10
- if (!resolvedRpcUrl) {
11
- throw new Error(`Unable to resolve RPC URL for network: ${network}`);
12
- }
13
- const channelStore = ChannelStore.fromStore(store);
14
- return Method.toServer(Methods.session, {
15
- defaults: {
16
- asset: { decimals: 9, kind: 'sol' },
17
- channelProgram: '',
18
- recipient: '',
19
- },
20
- request({ credential, request }) {
21
- if (credential) {
22
- return credential.challenge.request;
23
- }
24
- const verifierRequest = toVerifierRequest(parameters.verifier);
25
- return {
26
- ...request,
27
- asset,
28
- channelProgram,
29
- network,
30
- recipient,
31
- ...(parameters.pricing ? { pricing: parameters.pricing } : {}),
32
- ...(parameters.sessionDefaults ? { sessionDefaults: parameters.sessionDefaults } : {}),
33
- ...(verifierRequest ? { verifier: verifierRequest } : {}),
34
- };
35
- },
36
- respond({ credential }) {
37
- const payload = credential.payload;
38
- if (payload.action === 'close') {
39
- return new Response(null, { status: 204 });
40
- }
41
- if (payload.action === 'topup') {
42
- return new Response(null, { status: 204 });
43
- }
44
- return undefined;
45
- },
46
- async verify({ credential }) {
47
- const payload = credential.payload;
48
- const challenge = credential.challenge;
49
- const challengeId = challenge.id;
50
- switch (payload.action) {
51
- case 'open':
52
- return await handleOpen(channelStore, payload, challenge, recipient, parameters, challengeId);
53
- case 'update':
54
- return await handleUpdate(channelStore, payload, challenge, parameters, challengeId);
55
- case 'topup':
56
- return await handleTopup(channelStore, payload, parameters, challengeId);
57
- case 'close':
58
- return await handleClose(channelStore, payload, challenge, parameters, challengeId);
59
- default: {
60
- const exhaustive = payload;
61
- throw new Error(`Unknown session action: ${exhaustive.action}`);
62
- }
63
- }
64
- },
65
- });
66
- }
67
- async function handleOpen(channelStore, payload, challenge, configuredRecipient, parameters, challengeId) {
68
- const request = challenge.request;
69
- const voucher = parseVoucherFromPayload(payload);
70
- const depositAmount = parseNonNegativeAmount(payload.depositAmount, 'depositAmount');
71
- const cumulativeAmount = parseNonNegativeAmount(voucher.voucher.cumulativeAmount, 'voucher.cumulativeAmount');
72
- if (!payload.openTx.trim()) {
73
- throw new Error('openTx is required for session open');
74
- }
75
- await parameters.transactionVerifier?.verifyOpen?.(payload.channelId, payload.openTx, payload.depositAmount);
76
- if (voucher.voucher.channelId !== payload.channelId) {
77
- throw new Error('Voucher channelId mismatch for open action');
78
- }
79
- if (voucher.voucher.payer !== payload.payer) {
80
- throw new Error('Voucher payer mismatch for open action');
81
- }
82
- if (voucher.voucher.recipient !== configuredRecipient) {
83
- throw new Error('Voucher recipient does not match configured recipient');
84
- }
85
- if (voucher.voucher.recipient !== request.recipient) {
86
- throw new Error('Voucher recipient does not match challenge recipient');
87
- }
88
- if (voucher.voucher.channelProgram !== request.channelProgram) {
89
- throw new Error('Voucher channelProgram mismatch');
90
- }
91
- const expectedChainId = normalizeChainId(request.network ?? 'mainnet-beta');
92
- if (voucher.voucher.chainId !== expectedChainId) {
93
- throw new Error(`Voucher chainId mismatch: expected ${expectedChainId}, received ${voucher.voucher.chainId}`);
94
- }
95
- if (cumulativeAmount > depositAmount) {
96
- throw new Error('Voucher cumulative amount exceeds channel deposit');
97
- }
98
- if (parameters.verifier?.acceptAuthorizationModes &&
99
- !parameters.verifier.acceptAuthorizationModes.includes(payload.authorizationMode)) {
100
- throw new Error(`Authorization mode not accepted: ${payload.authorizationMode}`);
101
- }
102
- assertVoucherNotExpired(voucher, parameters.verifier?.maxClockSkewSeconds);
103
- const createdAt = new Date().toISOString();
104
- const expiresAtUnix = toUnixSeconds(payload.expiresAt ?? voucher.voucher.expiresAt);
105
- const nextState = {
106
- asset: {
107
- decimals: request.asset.decimals,
108
- kind: request.asset.kind,
109
- ...(request.asset.mint ? { mint: request.asset.mint } : {}),
110
- },
111
- authority: {
112
- wallet: payload.payer,
113
- ...(payload.authorizationMode === 'swig_session' ? { delegatedSessionKey: voucher.signer } : {}),
114
- },
115
- authorizationMode: payload.authorizationMode,
116
- channelId: payload.channelId,
117
- createdAt,
118
- escrowedAmount: depositAmount.toString(),
119
- expiresAtUnix,
120
- lastAuthorizedAmount: cumulativeAmount.toString(),
121
- lastSequence: voucher.voucher.sequence,
122
- openSlot: Date.now(),
123
- payer: payload.payer,
124
- recipient: request.recipient,
125
- serverNonce: voucher.voucher.serverNonce,
126
- settledAmount: '0',
127
- status: 'open',
128
- };
129
- await verifySignedVoucher(voucher, nextState, parameters.verifier?.voucherVerifier);
130
- await channelStore.updateChannel(payload.channelId, current => {
131
- if (current) {
132
- throw new Error(`Channel already exists: ${payload.channelId}`);
133
- }
134
- return nextState;
135
- });
136
- return toSuccessReceipt(payload.channelId, challengeId);
137
- }
138
- async function handleUpdate(channelStore, payload, challenge, parameters, challengeId) {
139
- const channel = await channelStore.getChannel(payload.channelId);
140
- if (!channel) {
141
- throw new Error(`Channel not found: ${payload.channelId}`);
142
- }
143
- assertChannelOpen(channel, parameters.verifier?.maxClockSkewSeconds);
144
- const voucher = parseVoucherFromPayload(payload);
145
- assertVoucherMatchesChannel(voucher, channel, challenge);
146
- assertVoucherNotExpired(voucher, parameters.verifier?.maxClockSkewSeconds);
147
- const cumulativeAmount = parseNonNegativeAmount(voucher.voucher.cumulativeAmount, 'voucher.cumulativeAmount');
148
- const escrowedAmount = parseNonNegativeAmount(channel.escrowedAmount, 'channel.escrowedAmount');
149
- const lastAuthorizedAmount = parseNonNegativeAmount(channel.lastAuthorizedAmount, 'channel.lastAuthorizedAmount');
150
- if (voucher.voucher.sequence <= channel.lastSequence) {
151
- throw new Error(`Voucher sequence replay detected. Last=${channel.lastSequence}, received=${voucher.voucher.sequence}`);
152
- }
153
- if (cumulativeAmount < lastAuthorizedAmount) {
154
- throw new Error('Voucher cumulative amount must be monotonically non-decreasing');
155
- }
156
- if (cumulativeAmount > escrowedAmount) {
157
- throw new Error('Voucher cumulative amount exceeds channel deposit');
158
- }
159
- await verifySignedVoucher(voucher, channel, parameters.verifier?.voucherVerifier);
160
- await channelStore.updateChannel(payload.channelId, current => {
161
- if (!current) {
162
- throw new Error(`Channel not found: ${payload.channelId}`);
163
- }
164
- assertChannelOpen(current, parameters.verifier?.maxClockSkewSeconds);
165
- if (voucher.voucher.sequence <= current.lastSequence) {
166
- throw new Error(`Voucher sequence replay detected. Last=${current.lastSequence}, received=${voucher.voucher.sequence}`);
167
- }
168
- const currentEscrowed = parseNonNegativeAmount(current.escrowedAmount, 'channel.escrowedAmount');
169
- const currentLastAuthorized = parseNonNegativeAmount(current.lastAuthorizedAmount, 'channel.lastAuthorizedAmount');
170
- if (cumulativeAmount < currentLastAuthorized) {
171
- throw new Error('Voucher cumulative amount must be monotonically non-decreasing');
172
- }
173
- if (cumulativeAmount > currentEscrowed) {
174
- throw new Error('Voucher cumulative amount exceeds channel deposit');
175
- }
176
- return {
177
- ...current,
178
- lastAuthorizedAmount: cumulativeAmount.toString(),
179
- lastSequence: voucher.voucher.sequence,
180
- };
181
- });
182
- return toSuccessReceipt(payload.channelId, challengeId);
183
- }
184
- async function handleTopup(channelStore, payload, parameters, challengeId) {
185
- const current = await channelStore.getChannel(payload.channelId);
186
- if (!current) {
187
- throw new Error(`Channel not found: ${payload.channelId}`);
188
- }
189
- assertChannelOpen(current);
190
- if (!payload.topupTx.trim()) {
191
- throw new Error('topupTx is required for session topup');
192
- }
193
- const additionalAmount = parseNonNegativeAmount(payload.additionalAmount, 'additionalAmount');
194
- await parameters.transactionVerifier?.verifyTopup?.(payload.channelId, payload.topupTx, payload.additionalAmount);
195
- await channelStore.updateChannel(payload.channelId, channel => {
196
- if (!channel) {
197
- throw new Error(`Channel not found: ${payload.channelId}`);
198
- }
199
- assertChannelOpen(channel);
200
- if (channel.channelId !== payload.channelId) {
201
- throw new Error('Channel id mismatch for topup action');
202
- }
203
- const escrowedAmount = parseNonNegativeAmount(channel.escrowedAmount, 'channel.escrowedAmount');
204
- const nextEscrowed = escrowedAmount + additionalAmount;
205
- return {
206
- ...channel,
207
- escrowedAmount: nextEscrowed.toString(),
208
- };
209
- });
210
- return toSuccessReceipt(payload.channelId, challengeId);
211
- }
212
- async function handleClose(channelStore, payload, challenge, parameters, challengeId) {
213
- const channel = await channelStore.getChannel(payload.channelId);
214
- if (!channel) {
215
- throw new Error(`Channel not found: ${payload.channelId}`);
216
- }
217
- if (channel.status === 'closed') {
218
- throw new Error(`Channel already closed: ${payload.channelId}`);
219
- }
220
- assertChannelOpen(channel, parameters.verifier?.maxClockSkewSeconds);
221
- const voucher = parseVoucherFromPayload(payload);
222
- assertVoucherMatchesChannel(voucher, channel, challenge);
223
- assertVoucherNotExpired(voucher, parameters.verifier?.maxClockSkewSeconds);
224
- const cumulativeAmount = parseNonNegativeAmount(voucher.voucher.cumulativeAmount, 'voucher.cumulativeAmount');
225
- const escrowedAmount = parseNonNegativeAmount(channel.escrowedAmount, 'channel.escrowedAmount');
226
- const lastAuthorizedAmount = parseNonNegativeAmount(channel.lastAuthorizedAmount, 'channel.lastAuthorizedAmount');
227
- if (voucher.voucher.sequence <= channel.lastSequence) {
228
- throw new Error(`Voucher sequence replay detected. Last=${channel.lastSequence}, received=${voucher.voucher.sequence}`);
229
- }
230
- if (cumulativeAmount < lastAuthorizedAmount) {
231
- throw new Error('Voucher cumulative amount must be monotonically non-decreasing');
232
- }
233
- if (cumulativeAmount > escrowedAmount) {
234
- throw new Error('Voucher cumulative amount exceeds channel deposit');
235
- }
236
- if (parameters.transactionVerifier?.verifyClose) {
237
- if (!payload.closeTx?.trim()) {
238
- throw new Error('closeTx is required for session close');
239
- }
240
- await parameters.transactionVerifier.verifyClose(payload.channelId, payload.closeTx, voucher.voucher.cumulativeAmount);
241
- }
242
- await verifySignedVoucher(voucher, channel, parameters.verifier?.voucherVerifier);
243
- await channelStore.updateChannel(payload.channelId, current => {
244
- if (!current) {
245
- throw new Error(`Channel not found: ${payload.channelId}`);
246
- }
247
- if (current.status === 'closed') {
248
- throw new Error(`Channel already closed: ${payload.channelId}`);
249
- }
250
- assertChannelOpen(current, parameters.verifier?.maxClockSkewSeconds);
251
- if (voucher.voucher.sequence <= current.lastSequence) {
252
- throw new Error(`Voucher sequence replay detected. Last=${current.lastSequence}, received=${voucher.voucher.sequence}`);
253
- }
254
- const currentEscrowed = parseNonNegativeAmount(current.escrowedAmount, 'channel.escrowedAmount');
255
- const currentLastAuthorized = parseNonNegativeAmount(current.lastAuthorizedAmount, 'channel.lastAuthorizedAmount');
256
- if (cumulativeAmount < currentLastAuthorized) {
257
- throw new Error('Voucher cumulative amount must be monotonically non-decreasing');
258
- }
259
- if (cumulativeAmount > currentEscrowed) {
260
- throw new Error('Voucher cumulative amount exceeds channel deposit');
261
- }
262
- return {
263
- ...current,
264
- lastAuthorizedAmount: cumulativeAmount.toString(),
265
- lastSequence: voucher.voucher.sequence,
266
- status: 'closed',
267
- };
268
- });
269
- return toSuccessReceipt(payload.closeTx ?? payload.channelId, challengeId);
270
- }
271
- function assertSessionParameters(parameters) {
272
- if (!parameters.recipient.trim()) {
273
- throw new Error('recipient is required');
274
- }
275
- if (!parameters.channelProgram.trim()) {
276
- throw new Error('channelProgram is required');
277
- }
278
- if (!Number.isInteger(parameters.asset.decimals) || parameters.asset.decimals < 0) {
279
- throw new Error('asset.decimals must be a non-negative integer');
280
- }
281
- if (parameters.asset.kind !== 'sol' && parameters.asset.kind !== 'spl') {
282
- throw new Error('asset.kind must be "sol" or "spl"');
283
- }
284
- if (parameters.asset.kind === 'spl' && !parameters.asset.mint) {
285
- throw new Error('asset.mint is required when asset.kind is "spl"');
286
- }
287
- if (parameters.verifier?.maxClockSkewSeconds !== undefined &&
288
- (!Number.isInteger(parameters.verifier.maxClockSkewSeconds) || parameters.verifier.maxClockSkewSeconds < 0)) {
289
- throw new Error('verifier.maxClockSkewSeconds must be a non-negative integer');
290
- }
291
- }
292
- function toVerifierRequest(verifier) {
293
- if (!verifier) {
294
- return undefined;
295
- }
296
- const requestVerifier = {
297
- ...(verifier.acceptAuthorizationModes ? { acceptAuthorizationModes: verifier.acceptAuthorizationModes } : {}),
298
- ...(verifier.maxClockSkewSeconds !== undefined ? { maxClockSkewSeconds: verifier.maxClockSkewSeconds } : {}),
299
- };
300
- if (!requestVerifier.acceptAuthorizationModes && requestVerifier.maxClockSkewSeconds === undefined) {
301
- return undefined;
302
- }
303
- return requestVerifier;
304
- }
305
- function normalizeChainId(network) {
306
- const normalized = network.trim();
307
- if (normalized.length === 0) {
308
- throw new Error('network must be a non-empty string');
309
- }
310
- return normalized.startsWith('solana:') ? normalized : `solana:${normalized}`;
311
- }
312
- function toUnixSeconds(expiresAt) {
313
- if (!expiresAt) {
314
- return null;
315
- }
316
- const unixMs = Date.parse(expiresAt);
317
- if (Number.isNaN(unixMs)) {
318
- throw new Error('expiresAt must be a valid ISO timestamp');
319
- }
320
- return Math.floor(unixMs / 1000);
321
- }
322
- function assertChannelOpen(channel, maxClockSkewSeconds = 0) {
323
- if (channel.status === 'closed') {
324
- throw new Error(`Channel is closed: ${channel.channelId}`);
325
- }
326
- if (channel.status === 'expired') {
327
- throw new Error(`Channel has expired: ${channel.channelId}`);
328
- }
329
- if (channel.status !== 'open') {
330
- throw new Error(`Channel must be open to accept this action. Current status=${channel.status}`);
331
- }
332
- if (channel.expiresAtUnix !== null) {
333
- const nowUnix = Math.floor(Date.now() / 1000);
334
- if (nowUnix > channel.expiresAtUnix + maxClockSkewSeconds) {
335
- throw new Error(`Channel has expired: ${channel.channelId}`);
336
- }
337
- }
338
- }
339
- function assertVoucherMatchesChannel(voucher, channel, challenge) {
340
- if (voucher.voucher.channelId !== channel.channelId) {
341
- throw new Error('Voucher channelId mismatch');
342
- }
343
- if (voucher.voucher.payer !== channel.payer) {
344
- throw new Error('Voucher payer mismatch');
345
- }
346
- if (voucher.voucher.recipient !== channel.recipient) {
347
- throw new Error('Voucher recipient mismatch');
348
- }
349
- if (voucher.voucher.serverNonce !== channel.serverNonce) {
350
- throw new Error('Voucher serverNonce mismatch');
351
- }
352
- if (voucher.voucher.channelProgram !== challenge.request.channelProgram) {
353
- throw new Error('Voucher channelProgram mismatch');
354
- }
355
- const expectedChainId = normalizeChainId(challenge.request.network ?? 'mainnet-beta');
356
- if (voucher.voucher.chainId !== expectedChainId) {
357
- throw new Error(`Voucher chainId mismatch: expected ${expectedChainId}, received ${voucher.voucher.chainId}`);
358
- }
359
- }
360
- function assertVoucherNotExpired(voucher, maxClockSkewSeconds = 0) {
361
- if (!voucher.voucher.expiresAt) {
362
- return;
363
- }
364
- const unixMs = Date.parse(voucher.voucher.expiresAt);
365
- if (Number.isNaN(unixMs)) {
366
- throw new Error('voucher.expiresAt must be a valid ISO timestamp');
367
- }
368
- if (Date.now() > unixMs + maxClockSkewSeconds * 1000) {
369
- throw new Error('Voucher has expired');
370
- }
371
- }
372
- async function verifySignedVoucher(voucher, channel, customVerifier) {
373
- // Bind signer to channel authority — reject rogue signers
374
- assertSignerAuthorized(voucher, channel);
375
- if (voucher.signatureType === 'ed25519' || voucher.signatureType === 'swig-session') {
376
- const valid = await verifyVoucherSignature(voucher);
377
- if (!valid) {
378
- throw new Error('Invalid voucher signature');
379
- }
380
- return;
381
- }
382
- if (!customVerifier) {
383
- throw new Error(`Unsupported voucher signatureType without custom verifier: ${String(voucher.signatureType)}`);
384
- }
385
- const valid = await customVerifier.verify(voucher, channel);
386
- if (!valid) {
387
- throw new Error('Invalid voucher signature');
388
- }
389
- }
390
- function assertSignerAuthorized(voucher, channel) {
391
- const signer = voucher.signer;
392
- if (channel.authorizationMode === 'swig_session') {
393
- // For swig_session mode, the signer must be the delegated session key
394
- const expectedKey = channel.authority.delegatedSessionKey;
395
- if (!expectedKey) {
396
- throw new Error('Channel uses swig_session authorization but no delegated session key is recorded');
397
- }
398
- if (signer !== expectedKey) {
399
- throw new Error(`Voucher signer ${signer} does not match delegated session key ${expectedKey}`);
400
- }
401
- return;
402
- }
403
- // For regular_budget and regular_unbounded, the signer must be the channel payer
404
- if (signer !== channel.payer && signer !== channel.authority.wallet) {
405
- throw new Error(`Voucher signer ${signer} does not match channel payer ${channel.payer}`);
406
- }
407
- }
408
- function parseNonNegativeAmount(value, field) {
409
- let parsed;
410
- try {
411
- parsed = BigInt(value);
412
- }
413
- catch {
414
- throw new Error(`${field} must be a valid integer string`);
415
- }
416
- if (parsed < 0n) {
417
- throw new Error(`${field} must be non-negative`);
418
- }
419
- return parsed;
420
- }
421
- function toSuccessReceipt(channelId, challengeId) {
422
- return Receipt.from({
423
- method: 'solana',
424
- ...(challengeId ? { challengeId } : {}),
425
- reference: channelId,
426
- status: 'success',
427
- timestamp: new Date().toISOString(),
428
- });
429
- }
430
- //# sourceMappingURL=Session.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Session.js","sourceRoot":"","sources":["../../src/server/Session.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import { Store } from 'mppx';
2
- import type { ChannelState } from './Types.js';
3
- export interface ChannelStore {
4
- getChannel(channelId: string): Promise<ChannelState | null>;
5
- updateChannel(channelId: string, updater: (current: ChannelState | null) => ChannelState | null): Promise<ChannelState | null>;
6
- }
7
- export declare function fromStore(store: Store.Store): ChannelStore;
8
- export declare function deductFromChannel(store: ChannelStore, channelId: string, amount: bigint): Promise<{
9
- channel: ChannelState;
10
- ok: boolean;
11
- }>;
12
- //# sourceMappingURL=ChannelStore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChannelStore.d.ts","sourceRoot":"","sources":["../../src/session/ChannelStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAK/C,MAAM,WAAW,YAAY;IACzB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAC5D,aAAa,CACT,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,KAAK,YAAY,GAAG,IAAI,GAC/D,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;CACnC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,GAAG,YAAY,CAsD1D;AAED,wBAAsB,iBAAiB,CACnC,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC;IAAE,OAAO,EAAE,YAAY,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CAwCjD"}
@@ -1,88 +0,0 @@
1
- const CHANNEL_KEY_PREFIX = 'solana-session:channel:';
2
- const storeCache = new WeakMap();
3
- export function fromStore(store) {
4
- const cached = storeCache.get(store);
5
- if (cached) {
6
- return cached;
7
- }
8
- const locks = new Map();
9
- async function update(channelId, updater) {
10
- const key = toStoreKey(channelId);
11
- while (locks.has(key)) {
12
- await locks.get(key);
13
- }
14
- let release;
15
- locks.set(key, new Promise(resolve => {
16
- release = resolve;
17
- }));
18
- try {
19
- const current = await store.get(key);
20
- const next = updater(current);
21
- if (next) {
22
- await store.put(key, next);
23
- }
24
- else {
25
- await store.delete(key);
26
- }
27
- return next;
28
- }
29
- finally {
30
- locks.delete(key);
31
- release();
32
- }
33
- }
34
- const channelStore = {
35
- async getChannel(channelId) {
36
- return await store.get(toStoreKey(channelId));
37
- },
38
- async updateChannel(channelId, updater) {
39
- return await update(channelId, updater);
40
- },
41
- };
42
- storeCache.set(store, channelStore);
43
- return channelStore;
44
- }
45
- export async function deductFromChannel(store, channelId, amount) {
46
- if (amount < 0n) {
47
- throw new Error('Deduction amount must be non-negative');
48
- }
49
- let deducted = false;
50
- const channel = await store.updateChannel(channelId, current => {
51
- deducted = false;
52
- if (!current) {
53
- return null;
54
- }
55
- const settledAmount = parseAtomicAmount(current.settledAmount, 'settledAmount');
56
- const authorizedAmount = parseAtomicAmount(current.lastAuthorizedAmount, 'lastAuthorizedAmount');
57
- const escrowedAmount = parseAtomicAmount(current.escrowedAmount, 'escrowedAmount');
58
- const spendCeiling = authorizedAmount < escrowedAmount ? authorizedAmount : escrowedAmount;
59
- const nextSettledAmount = settledAmount + amount;
60
- if (nextSettledAmount > spendCeiling) {
61
- return current;
62
- }
63
- deducted = true;
64
- return {
65
- ...current,
66
- settledAmount: nextSettledAmount.toString(),
67
- };
68
- });
69
- if (!channel) {
70
- throw new Error('channel not found');
71
- }
72
- return {
73
- channel,
74
- ok: deducted,
75
- };
76
- }
77
- function toStoreKey(channelId) {
78
- return `${CHANNEL_KEY_PREFIX}${channelId}`;
79
- }
80
- function parseAtomicAmount(value, field) {
81
- try {
82
- return BigInt(value);
83
- }
84
- catch {
85
- throw new Error(`Invalid atomic amount in ${field}: ${value}`);
86
- }
87
- }
88
- //# sourceMappingURL=ChannelStore.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChannelStore.js","sourceRoot":"","sources":["../../src/session/ChannelStore.ts"],"names":[],"mappings":"AAIA,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AACrD,MAAM,UAAU,GAAG,IAAI,OAAO,EAA6B,CAAC;AAU5D,MAAM,UAAU,SAAS,CAAC,KAAkB;IACxC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,EAAE,CAAC;QACT,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE/C,KAAK,UAAU,MAAM,CACjB,SAAiB,EACjB,OAA8D;QAE9D,MAAM,GAAG,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;QAElC,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;QAED,IAAI,OAAoB,CAAC;QACzB,KAAK,CAAC,GAAG,CACL,GAAG,EACH,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YACxB,OAAO,GAAG,OAAO,CAAC;QACtB,CAAC,CAAC,CACL,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,CAAsB,GAAG,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;YAE9B,IAAI,IAAI,EAAE,CAAC;gBACP,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACJ,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC5B,CAAC;YAED,OAAO,IAAI,CAAC;QAChB,CAAC;gBAAS,CAAC;YACP,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,EAAE,CAAC;QACd,CAAC;IACL,CAAC;IAED,MAAM,YAAY,GAAiB;QAC/B,KAAK,CAAC,UAAU,CAAC,SAAS;YACtB,OAAO,MAAM,KAAK,CAAC,GAAG,CAAsB,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QACvE,CAAC;QACD,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO;YAClC,OAAO,MAAM,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,CAAC;KACJ,CAAC;IAEF,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IACpC,OAAO,YAAY,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACnC,KAAmB,EACnB,SAAiB,EACjB,MAAc;IAEd,IAAI,MAAM,GAAG,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE;QAC3D,QAAQ,GAAG,KAAK,CAAC;QAEjB,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,aAAa,GAAG,iBAAiB,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;QAChF,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,OAAO,CAAC,oBAAoB,EAAE,sBAAsB,CAAC,CAAC;QACjG,MAAM,cAAc,GAAG,iBAAiB,CAAC,OAAO,CAAC,cAAc,EAAE,gBAAgB,CAAC,CAAC;QAEnF,MAAM,YAAY,GAAG,gBAAgB,GAAG,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,cAAc,CAAC;QAC3F,MAAM,iBAAiB,GAAG,aAAa,GAAG,MAAM,CAAC;QAEjD,IAAI,iBAAiB,GAAG,YAAY,EAAE,CAAC;YACnC,OAAO,OAAO,CAAC;QACnB,CAAC;QAED,QAAQ,GAAG,IAAI,CAAC;QAChB,OAAO;YACH,GAAG,OAAO;YACV,aAAa,EAAE,iBAAiB,CAAC,QAAQ,EAAE;SAC9C,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC;IAED,OAAO;QACH,OAAO;QACP,EAAE,EAAE,QAAQ;KACf,CAAC;AACN,CAAC;AAED,SAAS,UAAU,CAAC,SAAiB;IACjC,OAAO,GAAG,kBAAkB,GAAG,SAAS,EAAE,CAAC;AAC/C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,KAAa;IACnD,IAAI,CAAC;QACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;IACnE,CAAC;AACL,CAAC"}