@gatewayfm/ups-sdk 0.1.14 → 0.1.16

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 (41) hide show
  1. package/dist/account/index.d.mts +1 -1
  2. package/dist/account/index.d.ts +1 -1
  3. package/dist/account/index.js +2 -2
  4. package/dist/account/index.mjs +1 -1
  5. package/dist/{chunk-2S2KS5ZI.js → chunk-6S7HWY3Z.js} +17 -11
  6. package/dist/chunk-6S7HWY3Z.js.map +1 -0
  7. package/dist/{chunk-PMX24TXY.js → chunk-7M4ZN7F3.js} +50 -4
  8. package/dist/chunk-7M4ZN7F3.js.map +1 -0
  9. package/dist/{chunk-BUSFZFJS.mjs → chunk-EONLKSST.mjs} +11 -10
  10. package/dist/chunk-EONLKSST.mjs.map +1 -0
  11. package/dist/{chunk-VORGSH76.mjs → chunk-ULP4VMHK.mjs} +50 -5
  12. package/dist/chunk-ULP4VMHK.mjs.map +1 -0
  13. package/dist/{chunk-XKQI2VMJ.js → chunk-XFJ6SPQN.js} +11 -10
  14. package/dist/chunk-XFJ6SPQN.js.map +1 -0
  15. package/dist/{chunk-S65V52WZ.mjs → chunk-ZVB256ZP.mjs} +17 -11
  16. package/dist/chunk-ZVB256ZP.mjs.map +1 -0
  17. package/dist/{index-D_ytPgEV.d.ts → index-0emNrQ4Y.d.ts} +1 -1
  18. package/dist/{index-Csrh5-dl.d.mts → index-BEjQJc66.d.mts} +35 -4
  19. package/dist/{index-Csrh5-dl.d.ts → index-BEjQJc66.d.ts} +35 -4
  20. package/dist/{index-1p5DSytk.d.mts → index-bErQcXnC.d.mts} +1 -1
  21. package/dist/index.d.mts +35 -4
  22. package/dist/index.d.ts +35 -4
  23. package/dist/index.js +77 -33
  24. package/dist/index.js.map +1 -1
  25. package/dist/index.mjs +70 -30
  26. package/dist/index.mjs.map +1 -1
  27. package/dist/payment/index.d.mts +14 -2
  28. package/dist/payment/index.d.ts +14 -2
  29. package/dist/payment/index.js +2 -2
  30. package/dist/payment/index.mjs +1 -1
  31. package/dist/wallet/index.d.mts +2 -2
  32. package/dist/wallet/index.d.ts +2 -2
  33. package/dist/wallet/index.js +2 -2
  34. package/dist/wallet/index.mjs +1 -1
  35. package/package.json +1 -1
  36. package/dist/chunk-2S2KS5ZI.js.map +0 -1
  37. package/dist/chunk-BUSFZFJS.mjs.map +0 -1
  38. package/dist/chunk-PMX24TXY.js.map +0 -1
  39. package/dist/chunk-S65V52WZ.mjs.map +0 -1
  40. package/dist/chunk-VORGSH76.mjs.map +0 -1
  41. package/dist/chunk-XKQI2VMJ.js.map +0 -1
package/dist/index.mjs CHANGED
@@ -1,20 +1,12 @@
1
- import { AccountModule } from './chunk-BUSFZFJS.mjs';
2
- export { AccountModule } from './chunk-BUSFZFJS.mjs';
3
- import { PaymentModule } from './chunk-VORGSH76.mjs';
4
- export { PaymentModule } from './chunk-VORGSH76.mjs';
5
- import { WalletModule } from './chunk-S65V52WZ.mjs';
6
- export { WalletModule } from './chunk-S65V52WZ.mjs';
1
+ import { AccountModule } from './chunk-EONLKSST.mjs';
2
+ export { AccountModule } from './chunk-EONLKSST.mjs';
3
+ import { PaymentModule } from './chunk-ULP4VMHK.mjs';
4
+ export { PaymentModule, PaymentType } from './chunk-ULP4VMHK.mjs';
5
+ import { WalletModule } from './chunk-ZVB256ZP.mjs';
6
+ export { WalletModule } from './chunk-ZVB256ZP.mjs';
7
7
  import { AuthError, NetworkError, UPSError, WalletError } from './chunk-BH5YEAE6.mjs';
8
8
  export { AuthError, NetworkError, PaymentError, RateLimitError, UPSError, WalletError } from './chunk-BH5YEAE6.mjs';
9
9
 
10
- // src/types/index.ts
11
- var PaymentType = /* @__PURE__ */ ((PaymentType2) => {
12
- PaymentType2["UNSPECIFIED"] = "UNSPECIFIED";
13
- PaymentType2["DIRECT"] = "DIRECT";
14
- PaymentType2["ESCROW"] = "ESCROW";
15
- return PaymentType2;
16
- })(PaymentType || {});
17
-
18
10
  // src/core/http-client.ts
19
11
  var HttpClient = class {
20
12
  baseUrl;
@@ -24,7 +16,7 @@ var HttpClient = class {
24
16
  constructor(config) {
25
17
  this.baseUrl = config.baseUrl.replace(/\/$/, "");
26
18
  this.timeout = config.timeout || 3e4;
27
- this.retryAttempts = config.retryAttempts || 3;
19
+ this.retryAttempts = config.retryAttempts ?? 3;
28
20
  this.getToken = config.getToken;
29
21
  }
30
22
  async request(path, options = {}) {
@@ -85,10 +77,11 @@ var HttpClient = class {
85
77
  if (error instanceof AuthError) {
86
78
  throw error;
87
79
  }
88
- if (error.name === "AbortError") {
89
- lastError = new NetworkError("Request timed out", error);
90
- } else if (!(error instanceof NetworkError) && !(error instanceof UPSError)) {
91
- lastError = new NetworkError(error.message || "Unknown error", error);
80
+ const e = error;
81
+ if (e.name === "AbortError") {
82
+ lastError = new NetworkError("Request timed out", e);
83
+ } else if (!(e instanceof NetworkError) && !(e instanceof UPSError)) {
84
+ lastError = new NetworkError(e.message || "Unknown error", e);
92
85
  }
93
86
  if (attempt < this.retryAttempts) {
94
87
  const waitTime = Math.pow(2, attempt) * 1e3;
@@ -205,7 +198,7 @@ var AuthManager = class {
205
198
  }, { skipAuth: true });
206
199
  const authResult = {
207
200
  token: result.token,
208
- expiresAt: result.expires_at || result.expiresAt
201
+ expiresAt: result.expires_at || result.expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1e3).toISOString()
209
202
  };
210
203
  this.handleAuthSuccess(authResult, walletAddress);
211
204
  return authResult;
@@ -251,11 +244,12 @@ var AuthManager = class {
251
244
  }
252
245
  }
253
246
  mapUser(data) {
247
+ const d = data;
254
248
  return {
255
- id: data.id,
256
- walletAddress: data.wallet_address,
257
- status: data.status,
258
- createdAt: data.created_at
249
+ id: d.id,
250
+ walletAddress: d.wallet_address,
251
+ status: d.status,
252
+ createdAt: d.created_at
259
253
  };
260
254
  }
261
255
  logout() {
@@ -333,6 +327,48 @@ var EscrowModule = class {
333
327
  }
334
328
  };
335
329
 
330
+ // src/invoice/index.ts
331
+ var InvoiceModule = class {
332
+ constructor(http) {
333
+ this.http = http;
334
+ }
335
+ /**
336
+ * Create a new invoice
337
+ * @param request Invoice creation details
338
+ */
339
+ async create(request) {
340
+ return this.http.post("/invoices", request);
341
+ }
342
+ /**
343
+ * Get invoice by ID
344
+ * @param id Invoice ID
345
+ */
346
+ async get(id) {
347
+ return this.http.get(`/invoices/${id}`);
348
+ }
349
+ /**
350
+ * List invoices
351
+ * @param params Filter parameters
352
+ */
353
+ async list(params) {
354
+ const query = new URLSearchParams();
355
+ if (params?.merchant) query.append("merchant", params.merchant);
356
+ if (params?.payer) query.append("payer", params.payer);
357
+ if (params?.page_size) query.append("page_size", params.page_size.toString());
358
+ if (params?.page_token) query.append("page_token", params.page_token);
359
+ const queryString = query.toString();
360
+ const path = queryString ? `/invoices?${queryString}` : "/invoices";
361
+ return this.http.get(path);
362
+ }
363
+ /**
364
+ * Cancel invoice
365
+ * @param id Invoice ID
366
+ */
367
+ async cancel(id) {
368
+ return this.http.post(`/invoices/${id}/cancel`, {});
369
+ }
370
+ };
371
+
336
372
  // src/user/index.ts
337
373
  var UserModule = class {
338
374
  constructor(http) {
@@ -347,11 +383,12 @@ var UserModule = class {
347
383
  return this.mapUser(response.user);
348
384
  }
349
385
  mapUser(data) {
386
+ const d = data;
350
387
  return {
351
- id: data.id,
352
- walletAddress: data.wallet_address,
353
- status: data.status,
354
- createdAt: data.created_at
388
+ id: d.id,
389
+ walletAddress: d.wallet_address,
390
+ status: d.status,
391
+ createdAt: d.created_at
355
392
  };
356
393
  }
357
394
  };
@@ -364,6 +401,7 @@ var UPSClient = class {
364
401
  account;
365
402
  payment;
366
403
  escrow;
404
+ invoice;
367
405
  user;
368
406
  http;
369
407
  eventBus;
@@ -384,6 +422,7 @@ var UPSClient = class {
384
422
  this.account = new AccountModule(this.http);
385
423
  this.payment = new PaymentModule(this.http, this.wallet);
386
424
  this.escrow = new EscrowModule(this.http);
425
+ this.invoice = new InvoiceModule(this.http);
387
426
  this.user = new UserModule(this.http);
388
427
  }
389
428
  async connect(provider) {
@@ -420,7 +459,8 @@ var UPSClient = class {
420
459
  const signature = await this.wallet.signMessage(loginMessage);
421
460
  await this.auth.login(address, loginMessage, signature);
422
461
  } catch (error) {
423
- const isAuthError = error.status === 404 || error.status === 401 || error.status === 400 || error.message?.includes("not found") || error.details?.message?.includes("not found");
462
+ const e = error;
463
+ const isAuthError = e.status === 404 || e.status === 401 || e.status === 400 || e.message?.includes?.("not found") || e.details?.message?.includes?.("not found");
424
464
  if (isAuthError) {
425
465
  const registerMessage = `Register for UPSx402`;
426
466
  const signature = await this.wallet.signMessage(registerMessage);
@@ -440,6 +480,6 @@ var UPSClient = class {
440
480
  }
441
481
  };
442
482
 
443
- export { AuthManager, EscrowModule, EventBus, HttpClient, PaymentType, UPSClient, UserModule };
483
+ export { AuthManager, EscrowModule, EventBus, HttpClient, InvoiceModule, UPSClient, UserModule };
444
484
  //# sourceMappingURL=index.mjs.map
445
485
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/index.ts","../src/core/http-client.ts","../src/core/event-bus.ts","../src/core/auth-manager.ts","../src/escrow/index.ts","../src/user/index.ts","../src/client.ts"],"names":["PaymentType"],"mappings":";;;;;;;;;;AAiGO,IAAK,WAAA,qBAAAA,YAAAA,KAAL;AACH,EAAAA,aAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,aAAA,QAAA,CAAA,GAAS,QAAA;AACT,EAAAA,aAAA,QAAA,CAAA,GAAS,QAAA;AAHD,EAAA,OAAAA,YAAAA;AAAA,CAAA,EAAA,WAAA,IAAA,EAAA;;;ACpFL,IAAM,aAAN,MAAiB;AAAA,EACZ,OAAA;AAAA,EACA,OAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EAER,YAAY,MAAA,EAA0B;AAClC,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,OAAO,EAAE,CAAA;AAC/C,IAAA,IAAA,CAAK,OAAA,GAAU,OAAO,OAAA,IAAW,GAAA;AACjC,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAO,aAAA,IAAiB,CAAA;AAC7C,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,QAAA;AAAA,EAC3B;AAAA,EAEA,MAAM,OAAA,CAAW,IAAA,EAAc,OAAA,GAA0B,EAAC,EAAe;AACrE,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,OAAO,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,GAAO,GAAA,GAAM,IAAI,CAAA,CAAA;AACtE,IAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAE3C,IAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,gBAAgB,kBAAkB,CAAA;AAAA,IAClD;AAEA,IAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,IAAA,CAAK,QAAA,EAAU;AACpC,MAAA,MAAM,KAAA,GAAQ,KAAK,QAAA,EAAS;AAC5B,MAAA,IAAI,KAAA,EAAO;AACP,QAAA,OAAA,CAAQ,GAAA,CAAI,eAAA,EAAiB,CAAA,OAAA,EAAU,KAAK,CAAA,CAAE,CAAA;AAAA,MAClD;AAAA,IACJ;AAEA,IAAA,MAAM,MAAA,GAAsB;AAAA,MACxB,GAAG,OAAA;AAAA,MACH;AAAA,KACJ;AAEA,IAAA,IAAI,SAAA,GAA0B,IAAA;AAC9B,IAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,IAAA,CAAK,eAAe,OAAA,EAAA,EAAW;AAC5D,MAAA,IAAI;AACA,QAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,QAAA,MAAM,YAAY,UAAA,CAAW,MAAM,WAAW,KAAA,EAAM,EAAG,KAAK,OAAO,CAAA;AAEnE,QAAA,IAAI;AACA,UAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,YAC9B,GAAG,MAAA;AAAA,YACH,QAAQ,UAAA,CAAW;AAAA,WACtB,CAAA;AAED,UAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AACzB,YAAA,MAAM,UAAA,GAAa,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,YAAA,MAAM,QAAA,GAAW,UAAA,GAAa,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA,GAAI,GAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,GAAI,GAAA;AACvF,YAAA,MAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AACzB,YAAA;AAAA,UACJ;AAEA,UAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AACzB,YAAA,MAAM,IAAI,UAAU,uBAAuB,CAAA;AAAA,UAC/C;AAEA,UAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AACd,YAAA,IAAI,YAAA;AACJ,YAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,YAAA,IAAI;AACA,cAAA,YAAA,GAAe,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,YAClC,CAAA,CAAA,MAAQ;AACJ,cAAA,YAAA,GAAe,IAAA;AAAA,YACnB;AACA,YAAA,MAAM,aAAa,OAAO,YAAA,KAAiB,WAAW,YAAA,GAAe,IAAA,CAAK,UAAU,YAAY,CAAA;AAChG,YAAA,MAAM,IAAI,YAAA,CAAa,CAAA,2BAAA,EAA8B,QAAA,CAAS,MAAM,KAAK,UAAU,CAAA,CAAA,EAAI,YAAA,EAAc,QAAA,CAAS,MAAM,CAAA;AAAA,UACxH;AAGA,UAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AACzB,YAAA,OAAO,KAAA,CAAA;AAAA,UACX;AAEA,UAAA,OAAO,MAAM,SAAS,IAAA,EAAK;AAAA,QAC/B,CAAA,SAAE;AACE,UAAA,YAAA,CAAa,SAAS,CAAA;AAAA,QAC1B;AAAA,MACJ,SAAS,KAAA,EAAY;AACjB,QAAA,SAAA,GAAY,KAAA;AAEZ,QAAA,IAAI,iBAAiB,SAAA,EAAW;AAC5B,UAAA,MAAM,KAAA;AAAA,QACV;AAEA,QAAA,IAAI,KAAA,CAAM,SAAS,YAAA,EAAc;AAC7B,UAAA,SAAA,GAAY,IAAI,YAAA,CAAa,mBAAA,EAAqB,KAAK,CAAA;AAAA,QAC3D,WAAW,EAAE,KAAA,YAAiB,YAAA,CAAA,IAAiB,EAAE,iBAAiB,QAAA,CAAA,EAAW;AAEzE,UAAA,SAAA,GAAY,IAAI,YAAA,CAAa,KAAA,CAAM,OAAA,IAAW,iBAAiB,KAAK,CAAA;AAAA,QACxE;AAEA,QAAA,IAAI,OAAA,GAAU,KAAK,aAAA,EAAe;AAC9B,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,GAAI,GAAA;AACxC,UAAA,MAAM,IAAA,CAAK,MAAM,QAAQ,CAAA;AACzB,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,IAAA,MAAM,SAAA,IAAa,IAAI,YAAA,CAAa,8BAA8B,CAAA;AAAA,EACtE;AAAA,EAEA,MAAM,GAAA,CAAO,IAAA,EAAc,OAAA,EAAsC;AAC7D,IAAA,OAAO,IAAA,CAAK,QAAW,IAAA,EAAM,EAAE,GAAG,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,EAC9D;AAAA,EAEA,MAAM,IAAA,CAAQ,IAAA,EAAc,IAAA,EAAgB,OAAA,EAAsC;AAC9E,IAAA,OAAO,IAAA,CAAK,QAAW,IAAA,EAAM;AAAA,MACzB,GAAG,OAAA;AAAA,MACH,MAAA,EAAQ,MAAA;AAAA,MACR,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,IAAI;AAAA,KAC5B,CAAA;AAAA,EACL;AAAA,EAEQ,MAAM,EAAA,EAA2B;AACrC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,YAAY,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,EAC3D;AACJ;;;AC/HO,IAAM,WAAN,MAAe;AAAA,EACV,SAAA,uBAA4C,GAAA,EAAI;AAAA,EAExD,IAAA,CAAQ,OAAe,OAAA,EAAkB;AACrC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC1C,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,SAAA,CAAU,OAAA,CAAQ,CAAC,QAAA,KAAa;AAC5B,QAAA,IAAI;AACA,UAAA,QAAA,CAAS,OAAO,CAAA;AAAA,QACpB,SAAS,KAAA,EAAO;AACZ,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,2BAAA,EAA8B,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAA;AAAA,QAC/D;AAAA,MACJ,CAAC,CAAA;AAAA,IACL;AAAA,EACJ;AAAA,EAEA,EAAA,CAAM,OAAe,QAAA,EAAoC;AACrD,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,EAAG;AAC5B,MAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IACvC;AACA,IAAA,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AAEvC,IAAA,OAAO,MAAM,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,IAAA,CAAQ,OAAe,QAAA,EAAoC;AACvD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,EAAA,CAAM,KAAA,EAAO,CAAC,OAAA,KAAY;AAC/C,MAAA,WAAA,EAAY;AACZ,MAAA,QAAA,CAAS,OAAO,CAAA;AAAA,IACpB,CAAC,CAAA;AACD,IAAA,OAAO,WAAA;AAAA,EACX;AAAA,EAEA,GAAA,CAAI,OAAe,QAAA,EAA0B;AACzC,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,GAAA,CAAI,KAAK,CAAA;AAC1C,IAAA,IAAI,SAAA,EAAW;AACX,MAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACtB,QAAA,IAAA,CAAK,SAAA,CAAU,OAAO,KAAK,CAAA;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,KAAA,GAAc;AACV,IAAA,IAAA,CAAK,UAAU,KAAA,EAAM;AAAA,EACzB;AACJ;;;AC7CO,IAAM,cAAN,MAAkB;AAAA,EAUrB,WAAA,CACY,IAAA,EACA,QAAA,EACR,eAAA,GAA0B,GAAA,EAC5B;AAHU,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AACA,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAGR,IAAA,IAAA,CAAK,eAAA,GAAkB,eAAA;AAAA,EAC3B;AAAA,EAfQ,MAAA,GAAoB;AAAA,IACxB,eAAA,EAAiB,KAAA;AAAA,IACjB,KAAA,EAAO,IAAA;AAAA,IACP,SAAA,EAAW,IAAA;AAAA,IACX,OAAA,EAAS;AAAA,GACb;AAAA,EACQ,YAAA,GAAsC,IAAA;AAAA,EACtC,eAAA;AAAA,EAUR,IAAI,KAAA,GAAmB;AACnB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAQ,aAAA,EAAuB,OAAA,EAAiB,SAAA,EAA2C;AAC7F,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,KAAU,eAAA,EAAiB;AAAA,MACtD,cAAA,EAAgB,aAAA;AAAA,MAChB,OAAA;AAAA,MACA;AAAA,KACJ,EAAG,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA;AAErB,IAAA,MAAM,aAAA,GAA+B;AAAA,MACjC,IAAA,EAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,MAC9B,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,WAAW,MAAA,CAAO,UAAA;AAAA,MAClB,SAAA,EAAW,OAAO,WAAA,IAAe;AAAA,KACrC;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,EAAE,KAAA,EAAO,MAAA,CAAO,OAAO,SAAA,EAAW,MAAA,CAAO,UAAA,EAAW,EAAG,aAAa,CAAA;AAC3F,IAAA,OAAO,aAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,CAAM,aAAA,EAAuB,OAAA,EAAiB,SAAA,EAAwC;AACxF,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,KAAU,aAAA,EAAe;AAAA,MACpD,cAAA,EAAgB,aAAA;AAAA,MAChB,OAAA;AAAA,MACA;AAAA,KACJ,EAAG,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA;AAErB,IAAA,MAAM,UAAA,GAAyB;AAAA,MAC3B,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,SAAA,EAAW,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO;AAAA,KAC3C;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,YAAY,aAAa,CAAA;AAChD,IAAA,OAAO,UAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAA,CAAS,aAAA,EAAuB,OAAA,EAAiB,SAAA,EAAwC;AAC3F,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,KAAU,gBAAA,EAAkB;AAAA,MACvD,cAAA,EAAgB,aAAA;AAAA,MAChB,OAAA;AAAA,MACA;AAAA,KACJ,EAAG,EAAE,QAAA,EAAU,IAAA,EAAM,CAAA;AAErB,IAAA,MAAM,UAAA,GAAyB;AAAA,MAC3B,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,SAAA,EAAW,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,aAAa,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,KAAQ,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,GAAI,EAAE,WAAA;AAAY,KAC/G;AAEA,IAAA,IAAA,CAAK,iBAAA,CAAkB,YAAY,aAAa,CAAA;AAChD,IAAA,OAAO,UAAA;AAAA,EACX;AAAA,EAEQ,iBAAA,CAAkB,QAAoB,aAAA,EAAuB;AACjE,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACb,eAAA,EAAiB,IAAA;AAAA,MACjB,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA;AAAA,MACpC,OAAA,EAAS;AAAA,KACZ,CAAA;AACD,IAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,EACzB;AAAA,EAEA,MAAM,OAAA,GAAyB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO;AAExB,IAAA,IAAI;AACA,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,IAAA,CAAK,KAA4C,eAAe,CAAA;AAE1F,MAAA,IAAA,CAAK,WAAA,CAAY;AAAA,QACb,GAAG,IAAA,CAAK,MAAA;AAAA,QACR,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,SAAA,EAAW,IAAI,IAAA,CAAK,MAAA,CAAO,UAAU;AAAA,OACxC,CAAA;AAED,MAAA,IAAA,CAAK,eAAA,EAAgB;AAAA,IACzB,SAAS,KAAA,EAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAK,CAAA;AAC5C,MAAA,IAAA,CAAK,MAAA,EAAO;AAAA,IAChB;AAAA,EACJ;AAAA,EAEQ,QAAQ,IAAA,EAAiB;AAC7B,IAAA,OAAO;AAAA,MACH,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,eAAe,IAAA,CAAK,cAAA;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK;AAAA,KACpB;AAAA,EACJ;AAAA,EAEA,MAAA,GAAe;AACX,IAAA,IAAI,KAAK,YAAA,EAAc;AACnB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACxB;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACb,eAAA,EAAiB,KAAA;AAAA,MACjB,KAAA,EAAO,IAAA;AAAA,MACP,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACZ,CAAA;AAAA,EACL;AAAA,EAEA,QAAA,GAA0B;AACtB,IAAA,OAAO,KAAK,MAAA,CAAO,KAAA;AAAA,EACvB;AAAA,EAEA,eAAA,GAA2B;AACvB,IAAA,OAAO,KAAK,MAAA,CAAO,eAAA;AAAA,EACvB;AAAA,EAEA,cAAc,QAAA,EAAkD;AAC5D,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,QAAQ,CAAA;AAAA,EACpD;AAAA,EAEQ,YAAY,QAAA,EAAqB;AACrC,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,cAAA,EAAgB,IAAA,CAAK,MAAM,CAAA;AAAA,EAClD;AAAA,EAEQ,eAAA,GAAkB;AACtB,IAAA,IAAI,KAAK,YAAA,EAAc;AACnB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW;AAE5B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,SAAA,CAAU,OAAA,EAAQ;AAChD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAGrB,IAAA,IAAI,aAAa,GAAA,EAAK;AAClB,MAAA;AAAA,IACJ;AAIA,IAAA,MAAM,kBAAkB,SAAA,GAAY,GAAA;AACpC,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,eAAA,EAAiB,kBAAkB,GAAK,CAAA;AAE1E,IAAA,IAAI,cAAc,CAAA,EAAG;AACjB,MAAA,IAAA,CAAK,eAAe,UAAA,CAAW,MAAM,IAAA,CAAK,OAAA,IAAW,WAAW,CAAA;AAAA,IACpE;AAAA,EACJ;AACJ;;;AChLO,IAAM,eAAN,MAAmB;AAAA,EACtB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxC,MAAM,IAAI,QAAA,EAAmC;AACzC,IAAA,OAAO,IAAA,CAAK,KAAK,GAAA,CAAY,CAAA,aAAA,EAAgB,QAAQ,CAAA,CAAA,EAAI,EAAE,QAAA,EAAU,KAAA,EAAO,CAAA;AAAA,EAChF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAA,CAAQ,QAAA,EAAkB,OAAA,EAAgD;AAC5E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA2B,CAAA,aAAA,EAAgB,QAAQ,CAAA,QAAA,CAAA,EAAY;AAAA,MAC5E;AAAA,KACH,CAAA;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,MAAA,CAAO,QAAA,EAAkB,OAAA,EAAgD;AAC3E,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAA2B,CAAA,aAAA,EAAgB,QAAQ,CAAA,OAAA,CAAA,EAAW;AAAA,MAC3E;AAAA,KACH,CAAA;AAAA,EACL;AACJ;;;ACrBO,IAAM,aAAN,MAAiB;AAAA,EACpB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxC,MAAM,cAAA,GAAgC;AAClC,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAmB,WAAW,CAAA;AAC/D,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAA;AAAA,EACrC;AAAA,EAEQ,QAAQ,IAAA,EAAiB;AAC7B,IAAA,OAAO;AAAA,MACH,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,eAAe,IAAA,CAAK,cAAA;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK;AAAA,KACpB;AAAA,EACJ;AACJ;;;ACrBO,IAAM,YAAN,MAAgB;AAAA,EACV,MAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,IAAA;AAAA,EAED,IAAA;AAAA,EACA,QAAA;AAAA,EAER,YAAY,MAAA,EAAmB;AAC3B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,IAAI,CAAC,KAAK,MAAA,CAAO,OAAA,IAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACnE,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,IACxE;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW,IAAI,QAAA,EAAS;AAE7B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW;AAAA,MACvB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,eAAe,MAAA,CAAO,aAAA;AAAA,MACtB,QAAA,EAAU,MAAM,IAAA,CAAK,IAAA,CAAK,QAAA;AAAS,KACtC,CAAA;AAED,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,WAAA,CAAY,IAAA,CAAK,MAAM,IAAA,CAAK,QAAA,EAAU,OAAO,eAAe,CAAA;AAC5E,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAC5C,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,aAAA,CAAc,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,IAAA,CAAK,UAAU,IAAI,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,KAAK,MAAM,CAAA;AACvD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AACxC,IAAA,IAAA,CAAK,IAAA,GAAO,IAAI,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,QAAQ,QAAA,EAAqD;AAC/D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAA,GAAuC;AACzC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,IAAI,YAAY,0CAA0C,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,YAAY,6BAA6B,CAAA;AAEjE,IAAA,MAAM,OAAA,GAAU,CAAA,kBAAA,CAAA;AAChB,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,MAAA,CAAO,YAAY,OAAO,CAAA;AAEvD,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,SAAS,SAAS,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,kBAAA,GAAoC;AACtC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAA,EAAY,EAAG;AAC5B,MAAA,MAAM,IAAI,YAAY,0CAA0C,CAAA;AAAA,IACpE;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,UAAA,EAAW;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,YAAY,6BAA6B,CAAA;AAGjE,IAAA,MAAM,YAAA,GAAe,CAAA,gBAAA,CAAA;AACrB,IAAA,IAAI;AACA,MAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,MAAA,CAAO,YAAY,YAAY,CAAA;AAC5D,MAAA,MAAM,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,cAAc,SAAS,CAAA;AAAA,IAC1D,SAAS,KAAA,EAAY;AAEjB,MAAA,MAAM,cAAc,KAAA,CAAM,MAAA,KAAW,OAAO,KAAA,CAAM,MAAA,KAAW,OAAO,KAAA,CAAM,MAAA,KAAW,OAAO,KAAA,CAAM,OAAA,EAAS,SAAS,WAAW,CAAA,IAAK,MAAM,OAAA,EAAS,OAAA,EAAS,SAAS,WAAW,CAAA;AAEhL,MAAA,IAAI,WAAA,EAAa;AACb,QAAA,MAAM,eAAA,GAAkB,CAAA,oBAAA,CAAA;AACxB,QAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,MAAA,CAAO,YAAY,eAAe,CAAA;AAC/D,QAAA,MAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,iBAAiB,SAAS,CAAA;AAAA,MAChE,CAAA,MAAO;AACH,QAAA,MAAM,KAAA;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,UAAA,GAA4B;AAC9B,IAAA,MAAM,IAAA,CAAK,OAAO,UAAA,EAAW;AAC7B,IAAA,IAAA,CAAK,KAAK,MAAA,EAAO;AAAA,EACrB;AAAA,EAEA,OAAA,GAAgB;AACZ,IAAA,IAAA,CAAK,KAAK,MAAA,EAAO;AACjB,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AAAA,EACxB;AACJ","file":"index.mjs","sourcesContent":["export interface UPSConfig {\n baseUrl: string; // API base URL\n network: string; // CAIP-2 format: \"eip155:737998412\"\n chainId?: number; // Optional, parsed from network if not provided\n timeout?: number; // Request timeout (default: 30000)\n retryAttempts?: number; // Retry count (default: 3)\n refreshInterval?: number; // Token refresh interval in ms (default: 60000 = 1 min)\n}\n\n// Authentication\nexport interface AuthState {\n isAuthenticated: boolean;\n token: string | null;\n expiresAt: Date | null;\n address: string | null;\n}\n\nexport interface AuthResult {\n token: string;\n expiresAt: string;\n}\n\n// User (from /auth/connect and /users/me)\nexport interface User {\n id: string;\n walletAddress: string;\n status: string;\n createdAt: string;\n}\n\n// Connect auth result (unified auth flow)\nexport interface ConnectResult {\n user: User;\n token: string;\n expiresAt: string;\n isNewUser: boolean;\n}\n\n// Wallet\nexport type EIP1193Provider = {\n request: (args: { method: string; params?: unknown[] }) => Promise<unknown>;\n on?: (event: string, handler: (...args: any[]) => void) => void;\n removeListener?: (event: string, handler: (...args: any[]) => void) => void;\n};\n\nexport interface WalletState {\n isConnected: boolean;\n address: string | null;\n chainId: number | null;\n provider: EIP1193Provider | null;\n}\n\nexport interface ConnectedWallet {\n address: string;\n chainId: number;\n provider: EIP1193Provider;\n}\n\n// Account\nexport type AccountStatus = 'pending' | 'kyc_in_progress' | 'active' | 'frozen' | 'closed';\n\nexport interface Account {\n id: string;\n ownerAddress: string;\n walletAddress: string;\n status: AccountStatus;\n kycLevel: number;\n userId?: string;\n createdAt: string;\n updatedAt?: string;\n}\n\nexport interface CreateAccountParams {\n ownerAddress: string;\n salt: string; // 0x-prefixed 32-byte hex\n}\n\nexport interface CreateAccountResponse {\n account: Account;\n txHash: string;\n}\n\n// Payment (x402)\nexport interface PaymentRequirements {\n scheme: string;\n network: string;\n maxAmountRequired: string;\n asset: string;\n payTo: string;\n maxTimeoutSeconds: number;\n resource?: string;\n description?: string;\n\n extra?: PaymentExtra;\n from?: string;\n}\n\nexport enum PaymentType {\n UNSPECIFIED = 'UNSPECIFIED',\n DIRECT = 'DIRECT',\n ESCROW = 'ESCROW'\n}\n\nexport interface PaymentExtra {\n name?: string;\n version?: string;\n payment_type?: PaymentType; // snake_case from API\n arbiter?: string;\n release_time?: number; // snake_case from API\n payee?: string; // intended recipient for escrow\n}\n\nexport interface PaymentAuthorization {\n from: string;\n to: string;\n value: string;\n validAfter: number;\n validBefore: number;\n nonce: string; // bytes32 hex\n}\n\nexport interface SignedAuthorization extends PaymentAuthorization {\n signature: string;\n}\n\nexport interface VerifyResponse {\n isValid: boolean;\n invalidReason?: string;\n payer?: string;\n}\n\nexport interface SettleResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n payer?: string;\n}\n\n// x402 Supported Schemes\nexport interface SupportedScheme {\n x402Version: number;\n scheme: string;\n network: string;\n}\n\nexport interface SupportedSchemesResponse {\n kinds: SupportedScheme[];\n extensions?: string[];\n signers?: Record<string, string[]>;\n}\n\n// EIP-712 Typed Data\nexport interface EIP712Domain {\n name: string;\n version: string;\n chainId: number;\n verifyingContract: string;\n}\n\nexport interface EIP712Type {\n name: string;\n type: string;\n}\n\nexport interface EIP712TypedData {\n domain: EIP712Domain;\n types: Record<string, EIP712Type[]>;\n primaryType: string;\n message: Record<string, unknown>;\n}\n\n// Escrow\nexport interface Escrow {\n escrowId: string;\n payer: string;\n payee: string;\n amount: string;\n arbiter: string;\n releaseTime: number;\n status: EscrowStatus;\n}\n\nexport type EscrowStatus = 'ACTIVE' | 'RELEASED' | 'REFUNDED';\n\nexport interface EscrowActionResponse {\n success: boolean;\n errorReason?: string;\n transaction?: string;\n network?: string;\n}\n\n\n","import { NetworkError, AuthError, UPSError } from './errors';\n\ninterface HttpClientConfig {\n baseUrl: string;\n timeout?: number;\n retryAttempts?: number;\n getToken?: () => string | null;\n}\n\ninterface RequestOptions extends RequestInit {\n skipAuth?: boolean;\n}\n\nexport class HttpClient {\n private baseUrl: string;\n private timeout: number;\n private retryAttempts: number;\n private getToken?: () => string | null;\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n this.retryAttempts = config.retryAttempts || 3;\n this.getToken = config.getToken;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const url = `${this.baseUrl}${path.startsWith('/') ? path : '/' + path}`;\n const headers = new Headers(options.headers);\n\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n\n if (!options.skipAuth && this.getToken) {\n const token = this.getToken();\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n }\n\n const config: RequestInit = {\n ...options,\n headers,\n };\n\n let lastError: Error | null = null;\n for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...config,\n signal: controller.signal,\n });\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1000 : Math.pow(2, attempt) * 1000;\n await this.delay(waitTime);\n continue;\n }\n\n if (response.status === 401) {\n throw new AuthError('Authentication failed');\n }\n\n if (!response.ok) {\n let errorDetails;\n const text = await response.text();\n try {\n errorDetails = JSON.parse(text);\n } catch {\n errorDetails = text;\n }\n const detailsStr = typeof errorDetails === 'string' ? errorDetails : JSON.stringify(errorDetails);\n throw new NetworkError(`Request failed with status ${response.status}: ${detailsStr}`, errorDetails, response.status);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as unknown as T;\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error: any) {\n lastError = error;\n\n if (error instanceof AuthError) {\n throw error;\n }\n\n if (error.name === 'AbortError') {\n lastError = new NetworkError('Request timed out', error);\n } else if (!(error instanceof NetworkError) && !(error instanceof UPSError)) {\n // Wrap unknown errors\n lastError = new NetworkError(error.message || 'Unknown error', error);\n }\n\n if (attempt < this.retryAttempts) {\n const waitTime = Math.pow(2, attempt) * 1000;\n await this.delay(waitTime);\n continue;\n }\n }\n }\n\n throw lastError || new NetworkError('Request failed after retries');\n }\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' });\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(path, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","type Callback<T = any> = (payload: T) => void;\ntype Unsubscribe = () => void;\n\nexport class EventBus {\n private listeners: Map<string, Set<Callback>> = new Map();\n\n emit<T>(event: string, payload: T): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(payload);\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error);\n }\n });\n }\n }\n\n on<T>(event: string, callback: Callback<T>): Unsubscribe {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n\n return () => this.off(event, callback);\n }\n\n once<T>(event: string, callback: Callback<T>): Unsubscribe {\n const unsubscribe = this.on<T>(event, (payload) => {\n unsubscribe();\n callback(payload);\n });\n return unsubscribe;\n }\n\n off(event: string, callback: Callback): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { HttpClient } from './http-client';\nimport { EventBus } from './event-bus';\nimport { AuthState, AuthResult, ConnectResult, User } from '../types';\n\nexport class AuthManager {\n private _state: AuthState = {\n isAuthenticated: false,\n token: null,\n expiresAt: null,\n address: null,\n };\n private refreshTimer: NodeJS.Timeout | null = null;\n private refreshInterval: number;\n\n constructor(\n private http: HttpClient,\n private eventBus: EventBus,\n refreshInterval: number = 60000 // Default 1 minute\n ) {\n this.refreshInterval = refreshInterval;\n }\n\n get state(): AuthState {\n return { ...this._state };\n }\n\n /**\n * Unified connect method - creates user if new, authenticates if existing\n * This is the preferred authentication method.\n */\n async connect(walletAddress: string, message: string, signature: string): Promise<ConnectResult> {\n const result = await this.http.post<any>('/auth/connect', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const connectResult: ConnectResult = {\n user: this.mapUser(result.user),\n token: result.token,\n expiresAt: result.expires_at,\n isNewUser: result.is_new_user ?? false,\n };\n\n this.handleAuthSuccess({ token: result.token, expiresAt: result.expires_at }, walletAddress);\n return connectResult;\n }\n\n /**\n * @deprecated Use connect() instead\n */\n async login(walletAddress: string, message: string, signature: string): Promise<AuthResult> {\n const result = await this.http.post<any>('/auth/login', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const authResult: AuthResult = {\n token: result.token,\n expiresAt: result.expires_at || result.expiresAt,\n };\n\n this.handleAuthSuccess(authResult, walletAddress);\n return authResult;\n }\n\n /**\n * @deprecated Use connect() instead\n */\n async register(walletAddress: string, message: string, signature: string): Promise<AuthResult> {\n const result = await this.http.post<any>('/auth/register', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const authResult: AuthResult = {\n token: result.token,\n expiresAt: result.expires_at || result.expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n };\n\n this.handleAuthSuccess(authResult, walletAddress);\n return authResult;\n }\n\n private handleAuthSuccess(result: AuthResult, walletAddress: string) {\n this.updateState({\n isAuthenticated: true,\n token: result.token,\n expiresAt: new Date(result.expiresAt),\n address: walletAddress,\n });\n this.scheduleRefresh();\n }\n\n async refresh(): Promise<void> {\n if (!this._state.token) return;\n\n try {\n const result = await this.http.post<{ token: string; expires_at: string }>('/auth/refresh');\n\n this.updateState({\n ...this._state,\n token: result.token,\n expiresAt: new Date(result.expires_at),\n });\n\n this.scheduleRefresh();\n } catch (error) {\n console.error('Token refresh failed:', error);\n this.logout();\n }\n }\n\n private mapUser(data: any): User {\n return {\n id: data.id,\n walletAddress: data.wallet_address,\n status: data.status,\n createdAt: data.created_at,\n };\n }\n\n logout(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n this.updateState({\n isAuthenticated: false,\n token: null,\n expiresAt: null,\n address: null,\n });\n }\n\n getToken(): string | null {\n return this._state.token;\n }\n\n isAuthenticated(): boolean {\n return this._state.isAuthenticated;\n }\n\n onStateChange(callback: (state: AuthState) => void): () => void {\n return this.eventBus.on('auth:changed', callback);\n }\n\n private updateState(newState: AuthState) {\n this._state = newState;\n this.eventBus.emit('auth:changed', this._state);\n }\n\n private scheduleRefresh() {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n if (!this._state.expiresAt) return;\n\n const expiresAt = this._state.expiresAt.getTime();\n const now = Date.now();\n\n // If token is already expired, don't schedule refresh\n if (expiresAt <= now) {\n return;\n }\n\n // Schedule refresh at the configured interval (e.g., 1 hour)\n // But ensure we refresh before the token expires\n const timeUntilExpiry = expiresAt - now;\n const refreshTime = Math.min(this.refreshInterval, timeUntilExpiry - 60000); // At least 1 min buffer\n\n if (refreshTime > 0) {\n this.refreshTimer = setTimeout(() => this.refresh(), refreshTime);\n }\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport { Escrow, EscrowActionResponse } from '../types';\n\nexport class EscrowModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Get escrow details by ID\n * @param escrowId Escrow ID\n */\n async get(escrowId: string): Promise<Escrow> {\n return this.http.get<Escrow>(`/x402/escrow/${escrowId}`, { skipAuth: false });\n }\n\n /**\n * Release escrow funds (Payer or Arbiter only)\n * @param escrowId Escrow ID\n */\n async release(escrowId: string, network: string): Promise<EscrowActionResponse> {\n return this.http.post<EscrowActionResponse>(`/x402/escrow/${escrowId}/release`, {\n network\n });\n }\n\n /**\n * Refund escrow funds (Arbiter only)\n * @param escrowId Escrow ID\n */\n async refund(escrowId: string, network: string): Promise<EscrowActionResponse> {\n return this.http.post<EscrowActionResponse>(`/x402/escrow/${escrowId}/refund`, {\n network\n });\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport { User } from '../types';\n\n/**\n * UserModule provides access to user profile operations.\n * \n * @example\n * ```typescript\n * const user = await client.user.getCurrentUser();\n * console.log(user.id, user.walletAddress);\n * ```\n */\nexport class UserModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Get the current authenticated user's profile.\n * Requires authentication.\n */\n async getCurrentUser(): Promise<User> {\n const response = await this.http.get<{ user: any }>('/users/me');\n return this.mapUser(response.user);\n }\n\n private mapUser(data: any): User {\n return {\n id: data.id,\n walletAddress: data.wallet_address,\n status: data.status,\n createdAt: data.created_at,\n };\n }\n}\n","import { HttpClient } from './core/http-client';\nimport { EventBus } from './core/event-bus';\nimport { AuthManager } from './core/auth-manager';\nimport { WalletModule } from './wallet';\nimport { AccountModule } from './account';\nimport { PaymentModule } from './payment';\nimport { EscrowModule } from './escrow';\nimport { UserModule } from './user';\nimport { UPSConfig, ConnectedWallet, EIP1193Provider, ConnectResult } from './types';\nimport { WalletError } from './core/errors';\n\nexport class UPSClient {\n readonly config: UPSConfig;\n readonly wallet: WalletModule;\n readonly auth: AuthManager;\n readonly account: AccountModule;\n readonly payment: PaymentModule;\n readonly escrow: EscrowModule;\n readonly user: UserModule;\n\n private http: HttpClient;\n private eventBus: EventBus;\n\n constructor(config: UPSConfig) {\n this.config = config;\n\n // Parse chainId if not provided but network is \"eip155:123\"\n if (!this.config.chainId && this.config.network.startsWith('eip155:')) {\n this.config.chainId = parseInt(this.config.network.split(':')[1], 10);\n }\n\n this.eventBus = new EventBus();\n\n this.http = new HttpClient({\n baseUrl: config.baseUrl,\n timeout: config.timeout,\n retryAttempts: config.retryAttempts,\n getToken: () => this.auth.getToken(),\n });\n\n this.auth = new AuthManager(this.http, this.eventBus, config.refreshInterval);\n this.wallet = new WalletModule(this.eventBus);\n this.account = new AccountModule(this.http);\n this.payment = new PaymentModule(this.http, this.wallet);\n this.escrow = new EscrowModule(this.http);\n this.user = new UserModule(this.http);\n }\n\n async connect(provider: EIP1193Provider): Promise<ConnectedWallet> {\n return this.wallet.connect(provider);\n }\n\n /**\n * Authenticate with the UPS backend using the unified /auth/connect endpoint.\n * This will create a new user if one doesn't exist, or authenticate an existing user.\n * \n * @returns ConnectResult containing user info and whether this is a new user\n */\n async authenticate(): Promise<ConnectResult> {\n if (!this.wallet.isConnected()) {\n throw new WalletError('Wallet must be connected to authenticate');\n }\n\n const address = this.wallet.getAddress();\n if (!address) throw new WalletError('No wallet address available');\n\n const message = `Connect to UPSx402`;\n const signature = await this.wallet.signMessage(message);\n\n return this.auth.connect(address, message, signature);\n }\n\n /**\n * @deprecated Use authenticate() instead which uses the unified /auth/connect endpoint.\n * This method uses the legacy login/register flow.\n */\n async authenticateLegacy(): Promise<void> {\n if (!this.wallet.isConnected()) {\n throw new WalletError('Wallet must be connected to authenticate');\n }\n\n const address = this.wallet.getAddress();\n if (!address) throw new WalletError('No wallet address available');\n\n // Try Login\n const loginMessage = `Login to UPSx402`;\n try {\n const signature = await this.wallet.signMessage(loginMessage);\n await this.auth.login(address, loginMessage, signature);\n } catch (error: any) {\n // If related to \"User not found\" or 404/401/400, try Register\n const isAuthError = error.status === 404 || error.status === 401 || error.status === 400 || error.message?.includes('not found') || error.details?.message?.includes('not found');\n\n if (isAuthError) {\n const registerMessage = `Register for UPSx402`;\n const signature = await this.wallet.signMessage(registerMessage);\n await this.auth.register(address, registerMessage, signature);\n } else {\n throw error;\n }\n }\n }\n\n async disconnect(): Promise<void> {\n await this.wallet.disconnect();\n this.auth.logout();\n }\n\n destroy(): void {\n this.auth.logout(); // Clears refresh timer\n this.eventBus.clear();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/core/http-client.ts","../src/core/event-bus.ts","../src/core/auth-manager.ts","../src/escrow/index.ts","../src/invoice/index.ts","../src/user/index.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { NetworkError, AuthError, UPSError } from './errors';\n\ninterface HttpClientConfig {\n baseUrl: string;\n timeout?: number;\n retryAttempts?: number;\n getToken?: () => string | null;\n}\n\ninterface RequestOptions extends RequestInit {\n skipAuth?: boolean;\n}\n\nexport class HttpClient {\n private baseUrl: string;\n private timeout: number;\n private retryAttempts: number;\n private getToken?: () => string | null;\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '');\n this.timeout = config.timeout || 30000;\n this.retryAttempts = config.retryAttempts ?? 3;\n this.getToken = config.getToken;\n }\n\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const url = `${this.baseUrl}${path.startsWith('/') ? path : '/' + path}`;\n const headers = new Headers(options.headers);\n\n if (!headers.has('Content-Type')) {\n headers.set('Content-Type', 'application/json');\n }\n\n if (!options.skipAuth && this.getToken) {\n const token = this.getToken();\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n }\n\n const config: RequestInit = {\n ...options,\n headers,\n };\n\n let lastError: Error | null = null;\n for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n try {\n const response = await fetch(url, {\n ...config,\n signal: controller.signal,\n });\n\n if (response.status === 429) {\n const retryAfter = response.headers.get('Retry-After');\n const waitTime = retryAfter ? parseInt(retryAfter, 10) * 1000 : Math.pow(2, attempt) * 1000;\n await this.delay(waitTime);\n continue;\n }\n\n if (response.status === 401) {\n throw new AuthError('Authentication failed');\n }\n\n if (!response.ok) {\n let errorDetails;\n const text = await response.text();\n try {\n errorDetails = JSON.parse(text);\n } catch {\n errorDetails = text;\n }\n const detailsStr = typeof errorDetails === 'string' ? errorDetails : JSON.stringify(errorDetails);\n throw new NetworkError(`Request failed with status ${response.status}: ${detailsStr}`, errorDetails, response.status);\n }\n\n // Handle 204 No Content\n if (response.status === 204) {\n return undefined as unknown as T;\n }\n\n return await response.json();\n } finally {\n clearTimeout(timeoutId);\n }\n } catch (error: unknown) {\n lastError = error as Error;\n\n if (error instanceof AuthError) {\n throw error;\n }\n\n const e = error as Error;\n\n if (e.name === 'AbortError') {\n lastError = new NetworkError('Request timed out', e);\n } else if (!(e instanceof NetworkError) && !(e instanceof UPSError)) {\n // Wrap unknown errors\n lastError = new NetworkError(e.message || 'Unknown error', e);\n }\n\n if (attempt < this.retryAttempts) {\n const waitTime = Math.pow(2, attempt) * 1000;\n await this.delay(waitTime);\n continue;\n }\n }\n }\n\n throw lastError || new NetworkError('Request failed after retries');\n }\n\n async get<T>(path: string, options?: RequestOptions): Promise<T> {\n return this.request<T>(path, { ...options, method: 'GET' });\n }\n\n async post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T> {\n return this.request<T>(path, {\n ...options,\n method: 'POST',\n body: JSON.stringify(body),\n });\n }\n\n private delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n","type Callback<T = any> = (payload: T) => void;\ntype Unsubscribe = () => void;\n\nexport class EventBus {\n private listeners: Map<string, Set<Callback>> = new Map();\n\n emit<T>(event: string, payload: T): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.forEach((callback) => {\n try {\n callback(payload);\n } catch (error) {\n console.error(`Error in event handler for ${event}:`, error);\n }\n });\n }\n }\n\n on<T>(event: string, callback: Callback<T>): Unsubscribe {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(callback);\n\n return () => this.off(event, callback);\n }\n\n once<T>(event: string, callback: Callback<T>): Unsubscribe {\n const unsubscribe = this.on<T>(event, (payload) => {\n unsubscribe();\n callback(payload);\n });\n return unsubscribe;\n }\n\n off(event: string, callback: Callback): void {\n const callbacks = this.listeners.get(event);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n clear(): void {\n this.listeners.clear();\n }\n}\n","import { HttpClient } from './http-client';\nimport { EventBus } from './event-bus';\nimport { AuthState, AuthResult, ConnectResult, User } from '../types';\n\nexport class AuthManager {\n private _state: AuthState = {\n isAuthenticated: false,\n token: null,\n expiresAt: null,\n address: null,\n };\n private refreshTimer: NodeJS.Timeout | null = null;\n private refreshInterval: number;\n\n constructor(\n private http: HttpClient,\n private eventBus: EventBus,\n refreshInterval: number = 60000 // Default 1 minute\n ) {\n this.refreshInterval = refreshInterval;\n }\n\n get state(): AuthState {\n return { ...this._state };\n }\n\n /**\n * Unified connect method - creates user if new, authenticates if existing\n * This is the preferred authentication method.\n */\n async connect(walletAddress: string, message: string, signature: string): Promise<ConnectResult> {\n const result = await this.http.post<{ user: unknown; token: string; expires_at: string; is_new_user?: boolean }>('/auth/connect', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const connectResult: ConnectResult = {\n user: this.mapUser(result.user),\n token: result.token,\n expiresAt: result.expires_at,\n isNewUser: result.is_new_user ?? false,\n };\n\n this.handleAuthSuccess({ token: result.token, expiresAt: result.expires_at }, walletAddress);\n return connectResult;\n }\n\n /**\n * @deprecated Use connect() instead\n */\n async login(walletAddress: string, message: string, signature: string): Promise<AuthResult> {\n const result = await this.http.post<{ token: string; expires_at?: string; expiresAt?: string }>('/auth/login', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const authResult: AuthResult = {\n token: result.token,\n expiresAt: result.expires_at || result.expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n };\n\n this.handleAuthSuccess(authResult, walletAddress);\n return authResult;\n }\n\n /**\n * @deprecated Use connect() instead\n */\n async register(walletAddress: string, message: string, signature: string): Promise<AuthResult> {\n const result = await this.http.post<{ token: string; expires_at?: string; expiresAt?: string }>('/auth/register', {\n wallet_address: walletAddress,\n message,\n signature,\n }, { skipAuth: true });\n\n const authResult: AuthResult = {\n token: result.token,\n expiresAt: result.expires_at || result.expiresAt || new Date(Date.now() + 24 * 60 * 60 * 1000).toISOString(),\n };\n\n this.handleAuthSuccess(authResult, walletAddress);\n return authResult;\n }\n\n private handleAuthSuccess(result: AuthResult, walletAddress: string) {\n this.updateState({\n isAuthenticated: true,\n token: result.token,\n expiresAt: new Date(result.expiresAt),\n address: walletAddress,\n });\n this.scheduleRefresh();\n }\n\n async refresh(): Promise<void> {\n if (!this._state.token) return;\n\n try {\n const result = await this.http.post<{ token: string; expires_at: string }>('/auth/refresh');\n\n this.updateState({\n ...this._state,\n token: result.token,\n expiresAt: new Date(result.expires_at),\n });\n\n this.scheduleRefresh();\n } catch (error) {\n console.error('Token refresh failed:', error);\n this.logout();\n }\n }\n\n private mapUser(data: any): User {\n const d = data as any;\n return {\n id: d.id,\n walletAddress: d.wallet_address,\n status: d.status,\n createdAt: d.created_at,\n };\n }\n\n logout(): void {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = null;\n }\n\n this.updateState({\n isAuthenticated: false,\n token: null,\n expiresAt: null,\n address: null,\n });\n }\n\n getToken(): string | null {\n return this._state.token;\n }\n\n isAuthenticated(): boolean {\n return this._state.isAuthenticated;\n }\n\n onStateChange(callback: (state: AuthState) => void): () => void {\n return this.eventBus.on('auth:changed', callback);\n }\n\n private updateState(newState: AuthState) {\n this._state = newState;\n this.eventBus.emit('auth:changed', this._state);\n }\n\n private scheduleRefresh() {\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n if (!this._state.expiresAt) return;\n\n const expiresAt = this._state.expiresAt.getTime();\n const now = Date.now();\n\n // If token is already expired, don't schedule refresh\n if (expiresAt <= now) {\n return;\n }\n\n // Schedule refresh at the configured interval (e.g., 1 hour)\n // But ensure we refresh before the token expires\n const timeUntilExpiry = expiresAt - now;\n const refreshTime = Math.min(this.refreshInterval, timeUntilExpiry - 60000); // At least 1 min buffer\n\n if (refreshTime > 0) {\n this.refreshTimer = setTimeout(() => this.refresh(), refreshTime);\n }\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport { Escrow, EscrowActionResponse } from '../types';\n\nexport class EscrowModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Get escrow details by ID\n * @param escrowId Escrow ID\n */\n async get(escrowId: string): Promise<Escrow> {\n return this.http.get<Escrow>(`/x402/escrow/${escrowId}`, { skipAuth: false });\n }\n\n /**\n * Release escrow funds (Payer or Arbiter only)\n * @param escrowId Escrow ID\n */\n async release(escrowId: string, network: string): Promise<EscrowActionResponse> {\n return this.http.post<EscrowActionResponse>(`/x402/escrow/${escrowId}/release`, {\n network\n });\n }\n\n /**\n * Refund escrow funds (Arbiter only)\n * @param escrowId Escrow ID\n */\n async refund(escrowId: string, network: string): Promise<EscrowActionResponse> {\n return this.http.post<EscrowActionResponse>(`/x402/escrow/${escrowId}/refund`, {\n network\n });\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport {\n CreateInvoiceRequest,\n InvoiceResponse,\n InvoiceListResponse\n} from '../types';\n\nexport class InvoiceModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Create a new invoice\n * @param request Invoice creation details\n */\n async create(request: CreateInvoiceRequest): Promise<InvoiceResponse> {\n return this.http.post<InvoiceResponse>('/invoices', request);\n }\n\n /**\n * Get invoice by ID\n * @param id Invoice ID\n */\n async get(id: string): Promise<InvoiceResponse> {\n return this.http.get<InvoiceResponse>(`/invoices/${id}`);\n }\n\n /**\n * List invoices\n * @param params Filter parameters\n */\n async list(params?: { merchant?: string; payer?: string; page_size?: number; page_token?: string }): Promise<InvoiceListResponse> {\n const query = new URLSearchParams();\n if (params?.merchant) query.append('merchant', params.merchant);\n if (params?.payer) query.append('payer', params.payer);\n if (params?.page_size) query.append('page_size', params.page_size.toString());\n if (params?.page_token) query.append('page_token', params.page_token);\n\n const queryString = query.toString();\n const path = queryString ? `/invoices?${queryString}` : '/invoices';\n\n return this.http.get<InvoiceListResponse>(path);\n }\n\n /**\n * Cancel invoice\n * @param id Invoice ID\n */\n async cancel(id: string): Promise<InvoiceResponse> {\n return this.http.post<InvoiceResponse>(`/invoices/${id}/cancel`, {});\n }\n}\n","import { HttpClient } from '../core/http-client';\nimport { User } from '../types';\n\n/**\n * UserModule provides access to user profile operations.\n * \n * @example\n * ```typescript\n * const user = await client.user.getCurrentUser();\n * console.log(user.id, user.walletAddress);\n * ```\n */\nexport class UserModule {\n constructor(private http: HttpClient) { }\n\n /**\n * Get the current authenticated user's profile.\n * Requires authentication.\n */\n async getCurrentUser(): Promise<User> {\n const response = await this.http.get<{ user: unknown }>('/users/me');\n return this.mapUser(response.user);\n }\n\n private mapUser(data: any): User {\n const d = data as any;\n return {\n id: d.id,\n walletAddress: d.wallet_address,\n status: d.status,\n createdAt: d.created_at,\n };\n }\n}\n","import { HttpClient } from './core/http-client';\nimport { EventBus } from './core/event-bus';\nimport { AuthManager } from './core/auth-manager';\nimport { WalletModule } from './wallet';\nimport { AccountModule } from './account';\nimport { PaymentModule } from './payment';\nimport { EscrowModule } from './escrow';\nimport { InvoiceModule } from './invoice';\nimport { UserModule } from './user';\nimport { UPSConfig, ConnectedWallet, EIP1193Provider, ConnectResult } from './types';\nimport { WalletError } from './core/errors';\n\nexport class UPSClient {\n readonly config: UPSConfig;\n readonly wallet: WalletModule;\n readonly auth: AuthManager;\n readonly account: AccountModule;\n readonly payment: PaymentModule;\n readonly escrow: EscrowModule;\n readonly invoice: InvoiceModule;\n readonly user: UserModule;\n\n private http: HttpClient;\n private eventBus: EventBus;\n\n constructor(config: UPSConfig) {\n this.config = config;\n\n // Parse chainId if not provided but network is \"eip155:123\"\n if (!this.config.chainId && this.config.network.startsWith('eip155:')) {\n this.config.chainId = parseInt(this.config.network.split(':')[1], 10);\n }\n\n this.eventBus = new EventBus();\n\n this.http = new HttpClient({\n baseUrl: config.baseUrl,\n timeout: config.timeout,\n retryAttempts: config.retryAttempts,\n getToken: () => this.auth.getToken(),\n });\n\n this.auth = new AuthManager(this.http, this.eventBus, config.refreshInterval);\n this.wallet = new WalletModule(this.eventBus);\n this.account = new AccountModule(this.http);\n this.payment = new PaymentModule(this.http, this.wallet);\n this.escrow = new EscrowModule(this.http);\n this.invoice = new InvoiceModule(this.http);\n this.user = new UserModule(this.http);\n }\n\n async connect(provider: EIP1193Provider): Promise<ConnectedWallet> {\n return this.wallet.connect(provider);\n }\n\n /**\n * Authenticate with the UPS backend using the unified /auth/connect endpoint.\n * This will create a new user if one doesn't exist, or authenticate an existing user.\n * \n * @returns ConnectResult containing user info and whether this is a new user\n */\n async authenticate(): Promise<ConnectResult> {\n if (!this.wallet.isConnected()) {\n throw new WalletError('Wallet must be connected to authenticate');\n }\n\n const address = this.wallet.getAddress();\n if (!address) throw new WalletError('No wallet address available');\n\n const message = `Connect to UPSx402`;\n const signature = await this.wallet.signMessage(message);\n\n return this.auth.connect(address, message, signature);\n }\n\n /**\n * @deprecated Use authenticate() instead which uses the unified /auth/connect endpoint.\n * This method uses the legacy login/register flow.\n */\n async authenticateLegacy(): Promise<void> {\n if (!this.wallet.isConnected()) {\n throw new WalletError('Wallet must be connected to authenticate');\n }\n\n const address = this.wallet.getAddress();\n if (!address) throw new WalletError('No wallet address available');\n\n // Try Login\n const loginMessage = `Login to UPSx402`;\n try {\n const signature = await this.wallet.signMessage(loginMessage);\n await this.auth.login(address, loginMessage, signature);\n } catch (error: unknown) {\n // If related to \"User not found\" or 404/401/400, try Register\n const e = error as any; // Cast to any to check specific properties safely\n const isAuthError = e.status === 404 || e.status === 401 || e.status === 400 ||\n e.message?.includes?.('not found') ||\n e.details?.message?.includes?.('not found');\n\n if (isAuthError) {\n const registerMessage = `Register for UPSx402`;\n const signature = await this.wallet.signMessage(registerMessage);\n await this.auth.register(address, registerMessage, signature);\n } else {\n throw error;\n }\n }\n }\n\n async disconnect(): Promise<void> {\n await this.wallet.disconnect();\n this.auth.logout();\n }\n\n destroy(): void {\n this.auth.logout(); // Clears refresh timer\n this.eventBus.clear();\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  import { H as HttpClient } from '../http-client-D9JtkvUx.mjs';
2
- import { W as WalletModule } from '../index-1p5DSytk.mjs';
3
- import { o as PaymentRequirements, S as SettleResponse, P as PaymentAuthorization, q as SignedAuthorization, V as VerifyResponse, s as SupportedSchemesResponse } from '../index-Csrh5-dl.mjs';
2
+ import { W as WalletModule } from '../index-bErQcXnC.mjs';
3
+ import { s as PaymentRequirements, S as SettleResponse, p as Invoice, P as PaymentAuthorization, u as SignedAuthorization, V as VerifyResponse, w as SupportedSchemesResponse } from '../index-BEjQJc66.mjs';
4
4
 
5
5
  declare class PaymentModule {
6
6
  private http;
@@ -10,6 +10,18 @@ declare class PaymentModule {
10
10
  requirements: PaymentRequirements;
11
11
  from?: string;
12
12
  }): Promise<SettleResponse>;
13
+ /**
14
+ * Pay an invoice
15
+ * @param invoice The invoice to pay
16
+ * @param params Payment parameters (amount, asset, network)
17
+ */
18
+ payInvoice(invoice: Invoice, params: {
19
+ amount: string;
20
+ asset: string;
21
+ network: string;
22
+ payTo?: string;
23
+ from?: string;
24
+ }): Promise<SettleResponse>;
13
25
  buildAuthorization(requirements: PaymentRequirements, from: string): PaymentAuthorization;
14
26
  signAuthorization(authorization: PaymentAuthorization, requirements: PaymentRequirements): Promise<SignedAuthorization>;
15
27
  encodePaymentHeader(signed: SignedAuthorization, requirements: PaymentRequirements): string;
@@ -1,6 +1,6 @@
1
1
  import { H as HttpClient } from '../http-client-D9JtkvUx.js';
2
- import { W as WalletModule } from '../index-D_ytPgEV.js';
3
- import { o as PaymentRequirements, S as SettleResponse, P as PaymentAuthorization, q as SignedAuthorization, V as VerifyResponse, s as SupportedSchemesResponse } from '../index-Csrh5-dl.js';
2
+ import { W as WalletModule } from '../index-0emNrQ4Y.js';
3
+ import { s as PaymentRequirements, S as SettleResponse, p as Invoice, P as PaymentAuthorization, u as SignedAuthorization, V as VerifyResponse, w as SupportedSchemesResponse } from '../index-BEjQJc66.js';
4
4
 
5
5
  declare class PaymentModule {
6
6
  private http;
@@ -10,6 +10,18 @@ declare class PaymentModule {
10
10
  requirements: PaymentRequirements;
11
11
  from?: string;
12
12
  }): Promise<SettleResponse>;
13
+ /**
14
+ * Pay an invoice
15
+ * @param invoice The invoice to pay
16
+ * @param params Payment parameters (amount, asset, network)
17
+ */
18
+ payInvoice(invoice: Invoice, params: {
19
+ amount: string;
20
+ asset: string;
21
+ network: string;
22
+ payTo?: string;
23
+ from?: string;
24
+ }): Promise<SettleResponse>;
13
25
  buildAuthorization(requirements: PaymentRequirements, from: string): PaymentAuthorization;
14
26
  signAuthorization(authorization: PaymentAuthorization, requirements: PaymentRequirements): Promise<SignedAuthorization>;
15
27
  encodePaymentHeader(signed: SignedAuthorization, requirements: PaymentRequirements): string;
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkPMX24TXY_js = require('../chunk-PMX24TXY.js');
3
+ var chunk7M4ZN7F3_js = require('../chunk-7M4ZN7F3.js');
4
4
  require('../chunk-G525R6AV.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "PaymentModule", {
9
9
  enumerable: true,
10
- get: function () { return chunkPMX24TXY_js.PaymentModule; }
10
+ get: function () { return chunk7M4ZN7F3_js.PaymentModule; }
11
11
  });
12
12
  //# sourceMappingURL=index.js.map
13
13
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { PaymentModule } from '../chunk-VORGSH76.mjs';
1
+ export { PaymentModule } from '../chunk-ULP4VMHK.mjs';
2
2
  import '../chunk-BH5YEAE6.mjs';
3
3
  //# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,2 +1,2 @@
1
- import '../index-Csrh5-dl.mjs';
2
- export { W as WalletModule } from '../index-1p5DSytk.mjs';
1
+ import '../index-BEjQJc66.mjs';
2
+ export { W as WalletModule } from '../index-bErQcXnC.mjs';
@@ -1,2 +1,2 @@
1
- import '../index-Csrh5-dl.js';
2
- export { W as WalletModule } from '../index-D_ytPgEV.js';
1
+ import '../index-BEjQJc66.js';
2
+ export { W as WalletModule } from '../index-0emNrQ4Y.js';
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunk2S2KS5ZI_js = require('../chunk-2S2KS5ZI.js');
3
+ var chunk6S7HWY3Z_js = require('../chunk-6S7HWY3Z.js');
4
4
  require('../chunk-G525R6AV.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "WalletModule", {
9
9
  enumerable: true,
10
- get: function () { return chunk2S2KS5ZI_js.WalletModule; }
10
+ get: function () { return chunk6S7HWY3Z_js.WalletModule; }
11
11
  });
12
12
  //# sourceMappingURL=index.js.map
13
13
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { WalletModule } from '../chunk-S65V52WZ.mjs';
1
+ export { WalletModule } from '../chunk-ZVB256ZP.mjs';
2
2
  import '../chunk-BH5YEAE6.mjs';
3
3
  //# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gatewayfm/ups-sdk",
3
- "version": "0.1.14",
3
+ "version": "0.1.16",
4
4
  "description": "Core SDK for UPS x402 Protocol",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/wallet/index.ts"],"names":["mainnet","base","baseSepolia","WalletError","createWalletClient","custom"],"mappings":"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","file":"chunk-2S2KS5ZI.js","sourcesContent":["import { createWalletClient, custom, WalletClient } from 'viem';\nimport { mainnet, base, baseSepolia } from 'viem/chains';\nimport { WalletState, ConnectedWallet, EIP1193Provider, EIP712TypedData } from '../types';\nimport { EventBus } from '../core/event-bus';\nimport { WalletError } from '../core/errors';\n\nexport class WalletModule {\n private _state: WalletState = {\n isConnected: false,\n address: null,\n chainId: null,\n provider: null,\n };\n private client: WalletClient | null = null;\n private chains = [mainnet, base, baseSepolia];\n\n constructor(private eventBus: EventBus) { }\n\n get state(): WalletState {\n return { ...this._state };\n }\n\n async connect(provider: EIP1193Provider): Promise<ConnectedWallet> {\n try {\n this.setupListeners(provider);\n\n const addresses = (await provider.request({ method: 'eth_requestAccounts' })) as string[];\n if (!addresses || addresses.length === 0) {\n throw new WalletError('No accounts found');\n }\n\n const chainIdHex = (await provider.request({ method: 'eth_chainId' })) as string;\n const chainId = parseInt(chainIdHex, 16);\n\n this.client = createWalletClient({\n chain: this.getChain(chainId),\n transport: custom(provider),\n });\n\n const address = addresses[0];\n\n this.updateState({\n isConnected: true,\n address,\n chainId,\n provider,\n });\n\n this.eventBus.emit('wallet:connected', this._state);\n\n return {\n address,\n chainId,\n provider,\n };\n } catch (error: any) {\n if (error.code === 4001) {\n throw new WalletError('User rejected connection');\n }\n throw new WalletError(`Connection failed: ${error.message}`, error);\n }\n }\n\n async disconnect(): Promise<void> {\n // Remove listeners if needed (not easily possible with just EIP1193Provider standard without storing internal listener refs, but we can clear state)\n // Actually standard providers like Metamask don't really 'disconnect' via API, but we act as if we did.\n if (this._state.provider && this._state.provider.removeListener) {\n // We should ideally remove listeners we added.\n // For simplicity in this scope, we just resetting state.\n }\n\n this.updateState({\n isConnected: false,\n address: null,\n chainId: null,\n provider: null\n });\n this.client = null;\n this.eventBus.emit('wallet:disconnected', undefined);\n }\n\n getAddress(): string | null {\n return this._state.address;\n }\n\n getChainId(): number | null {\n return this._state.chainId;\n }\n\n isConnected(): boolean {\n return this._state.isConnected;\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.client || !this._state.address) {\n throw new WalletError('Wallet not connected');\n }\n try {\n return await this.client.signMessage({\n account: this._state.address as `0x${string}`,\n message,\n });\n } catch (error: any) {\n if (error.code === 4001) throw new WalletError('User rejected signing');\n throw new WalletError(`Sign message failed: ${error.message}`, error);\n }\n }\n\n async signTypedData(typedData: EIP712TypedData): Promise<string> {\n if (!this.client || !this._state.address) {\n throw new WalletError('Wallet not connected');\n }\n try {\n // viem expects exact structure\n return await this.client.signTypedData({\n account: this._state.address as `0x${string}`,\n domain: typedData.domain as any,\n types: typedData.types as any,\n primaryType: typedData.primaryType,\n message: typedData.message,\n });\n } catch (error: any) {\n if (error.code === 4001) throw new WalletError('User rejected signing');\n throw new WalletError(`Sign typed data failed: ${error.message}`, error);\n }\n }\n\n async switchChain(chainId: number): Promise<void> {\n if (!this._state.provider) throw new WalletError('Provider not available');\n try {\n await this._state.provider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }],\n });\n } catch (error: any) {\n throw new WalletError(`Switch chain failed: ${error.message}`, error);\n }\n }\n\n onStateChange(callback: (state: WalletState) => void): () => void {\n const unsub1 = this.eventBus.on('wallet:connected', () => callback(this._state));\n // subscribe to other events if needed, or just general updates\n // The requirement says \"onStateChange(callback): Unsubscribe\".\n // We can emit a generic 'wallet:stateChanged' internal event\n return unsub1;\n }\n\n private updateState(newState: WalletState) {\n this._state = newState;\n // We could emit a generic event here too used by onStateChange\n }\n\n private setupListeners(provider: EIP1193Provider) {\n if (!provider.on) return;\n\n provider.on('accountsChanged', (accounts: string[]) => {\n if (accounts.length === 0) {\n this.disconnect();\n } else {\n this.updateState({ ...this._state, address: accounts[0] });\n this.eventBus.emit('wallet:accountsChanged', accounts);\n }\n });\n\n provider.on('chainChanged', (chainId: string) => {\n const id = parseInt(chainId, 16);\n this.updateState({ ...this._state, chainId: id });\n // Update client chain if possible or recreate?\n // For now just update state\n this.eventBus.emit('wallet:chainChanged', id);\n });\n\n provider.on('disconnect', () => {\n this.disconnect();\n });\n }\n\n private getChain(chainId: number) {\n return this.chains.find(c => c.id === chainId);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/account/index.ts"],"names":[],"mappings":";AAGO,IAAM,gBAAN,MAAoB;AAAA,EACvB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAoB;AAAA,EAExC,MAAM,IAAI,EAAA,EAA8B;AACpC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAsB,CAAA,UAAA,EAAa,EAAE,CAAA,CAAE,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,YAAY,OAAA,EAAmC;AAMjD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,EAAK;AACjC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,WAAA,EAAY,KAAM,OAAA,CAAQ,WAAA,EAAa,CAAA;AAC1F,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,MAAM,IAAA,GAA2B;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAyB,WAAW,CAAA;AACrE,IAAA,OAAO,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,OAAO,MAAA,EAA6D;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAU,WAAA,EAAa;AAAA,MACpD,eAAe,MAAA,CAAO,YAAA;AAAA,MACtB,MAAM,MAAA,CAAO;AAAA,KAChB,CAAA;AAED,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,MACzC,QAAQ,QAAA,CAAS;AAAA,KACrB;AAAA,EACJ;AAAA,EAEA,MAAM,eAAe,MAAA,EAAiE;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAiC,mBAAA,EAAqB;AAAA,MACnF,eAAe,MAAA,CAAO,YAAA;AAAA,MACtB,MAAM,MAAA,CAAO;AAAA,KAChB,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,cAAA;AAAA,EACpB;AAAA,EAEQ,WAAW,IAAA,EAAoB;AAEnC,IAAA,OAAO;AAAA,MACH,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,eAAe,IAAA,CAAK,cAAA;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAA,EAAU,KAAK,SAAA,IAAa,CAAA;AAAA,MAC5B,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KACpB;AAAA,EACJ;AACJ","file":"chunk-BUSFZFJS.mjs","sourcesContent":["import { HttpClient } from '../core/http-client';\nimport { Account, CreateAccountParams, CreateAccountResponse } from '../types';\n\nexport class AccountModule {\n constructor(private http: HttpClient) { }\n\n async get(id: string): Promise<Account> {\n const response = await this.http.get<{ account: any }>(`/accounts/${id}`);\n return this.mapAccount(response.account);\n }\n\n async getByWallet(address: string): Promise<Account> {\n // Assuming API supports query param or specific endpoint. \n // The task list says \"GET /accounts -> { accounts: [...] }\". \n // It doesn't explicitly have a \"get by wallet\" endpoint, but usually list filters.\n // Or maybe we filter the list.\n // \"GET /accounts\" implies listing current user's accounts usually?\n const response = await this.list();\n const account = response.find(a => a.walletAddress.toLowerCase() === address.toLowerCase());\n if (!account) {\n throw new Error('Account not found for wallet');\n }\n return account;\n }\n\n async list(): Promise<Account[]> {\n const response = await this.http.get<{ accounts: any[] }>('/accounts');\n return response.accounts.map(this.mapAccount);\n }\n\n async create(params: CreateAccountParams): Promise<CreateAccountResponse> {\n const response = await this.http.post<any>('/accounts', {\n owner_address: params.ownerAddress,\n salt: params.salt,\n });\n\n return {\n account: this.mapAccount(response.account),\n txHash: response.tx_hash,\n };\n }\n\n async predictAddress(params: { ownerAddress: string; salt: string }): Promise<string> {\n const response = await this.http.post<{ wallet_address: string }>('/accounts/predict', {\n owner_address: params.ownerAddress,\n salt: params.salt,\n });\n return response.wallet_address;\n }\n\n private mapAccount(data: any): Account {\n // Map snake_case to camelCase\n return {\n id: data.id,\n ownerAddress: data.owner_address,\n walletAddress: data.wallet_address,\n status: data.status,\n kycLevel: data.kyc_level ?? 0,\n userId: data.user_id,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/payment/index.ts"],"names":["PaymentError"],"mappings":"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","file":"chunk-PMX24TXY.js","sourcesContent":["import { HttpClient } from '../core/http-client';\nimport { WalletModule } from '../wallet';\nimport {\n PaymentRequirements,\n PaymentAuthorization,\n SignedAuthorization,\n VerifyResponse,\n SettleResponse,\n SupportedSchemesResponse,\n EIP712TypedData\n} from '../types';\nimport { PaymentError } from '../core/errors';\n\nexport class PaymentModule {\n constructor(\n private http: HttpClient,\n private wallet: WalletModule\n ) { }\n\n async pay(request: { requirements: PaymentRequirements; from?: string }): Promise<SettleResponse> {\n const from = request.from || request.requirements.from || this.wallet.getAddress();\n if (!from) throw new PaymentError('No sender address provided');\n\n // Create requirements with `from` set for EIP-1271 Smart Account signature verification\n const requirementsWithFrom: PaymentRequirements = {\n ...request.requirements,\n from, // Critical: backend needs to know which Smart Account is the payer\n };\n\n const auth = this.buildAuthorization(requirementsWithFrom, from);\n const signed = await this.signAuthorization(auth, requirementsWithFrom);\n\n const verification = await this.verify(signed, requirementsWithFrom);\n if (!verification.isValid) {\n throw new PaymentError(`Payment verification failed: ${verification.invalidReason}`);\n }\n\n return this.settle(signed, requirementsWithFrom);\n }\n\n buildAuthorization(requirements: PaymentRequirements, from: string): PaymentAuthorization {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const nonce = '0x' + Array.from(array).map(b => b.toString(16).padStart(2, '0')).join('');\n\n const now = Math.floor(Date.now() / 1000);\n\n return {\n from,\n to: requirements.payTo,\n value: requirements.maxAmountRequired,\n validAfter: now - 60, // 60s buffer\n validBefore: now + requirements.maxTimeoutSeconds,\n nonce\n };\n }\n\n async signAuthorization(authorization: PaymentAuthorization, requirements: PaymentRequirements): Promise<SignedAuthorization> {\n let chainId: number;\n const network = requirements.network;\n if (network.startsWith('eip155:')) {\n chainId = parseInt(network.split(':')[1], 10);\n } else {\n chainId = parseInt(network, 10);\n }\n\n if (isNaN(chainId)) throw new PaymentError('Invalid chain ID');\n\n // EIP-712 requires uint256 values as BigInt for proper encoding\n const typedData: EIP712TypedData = {\n domain: {\n name: requirements.extra?.name || \"x402 Payment Token\",\n version: requirements.extra?.version || \"1\",\n chainId,\n verifyingContract: requirements.asset\n },\n types: {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" }\n ]\n },\n primaryType: \"TransferWithAuthorization\",\n message: {\n from: authorization.from,\n to: authorization.to,\n // CRITICAL: viem requires BigInt for uint256 types\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce\n }\n };\n\n const signature = await this.wallet.signTypedData(typedData);\n return { ...authorization, signature };\n }\n\n encodePaymentHeader(signed: SignedAuthorization, requirements: PaymentRequirements): string {\n const authorization = {\n from: signed.from,\n to: signed.to,\n value: signed.value,\n nonce: signed.nonce,\n validAfter: signed.validAfter.toString(),\n validBefore: signed.validBefore.toString(),\n };\n\n const accepted = {\n scheme: requirements.scheme,\n network: requirements.network,\n amount: requirements.maxAmountRequired,\n asset: requirements.asset,\n payTo: requirements.payTo,\n maxTimeoutSeconds: requirements.maxTimeoutSeconds,\n };\n\n const paymentPayload = {\n x402Version: 1,\n accepted,\n payload: {\n authorization,\n signature: signed.signature,\n },\n };\n\n const jsonStr = JSON.stringify(paymentPayload);\n const b64Str = btoa(jsonStr);\n return `x402 ${b64Str}`;\n }\n\n async verify(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<VerifyResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n return this.http.post<VerifyResponse>('/x402/verify', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n }\n\n async settle(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<SettleResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n return this.http.post<SettleResponse>('/x402/settle', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n }\n\n /**\n * Get supported payment schemes from the facilitator.\n * This endpoint does not require authentication.\n */\n async getSupportedSchemes(): Promise<SupportedSchemesResponse> {\n return this.http.get<SupportedSchemesResponse>('/x402/supported', { skipAuth: true });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/wallet/index.ts"],"names":[],"mappings":";;;;AAMO,IAAM,eAAN,MAAmB;AAAA,EAUtB,YAAoB,QAAA,EAAoB;AAApB,IAAA,IAAA,CAAA,QAAA,GAAA,QAAA;AAAA,EAAsB;AAAA,EATlC,MAAA,GAAsB;AAAA,IAC1B,WAAA,EAAa,KAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,OAAA,EAAS,IAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACd;AAAA,EACQ,MAAA,GAA8B,IAAA;AAAA,EAC9B,MAAA,GAAS,CAAC,OAAA,EAAS,IAAA,EAAM,WAAW,CAAA;AAAA,EAI5C,IAAI,KAAA,GAAqB;AACrB,IAAA,OAAO,EAAE,GAAG,IAAA,CAAK,MAAA,EAAO;AAAA,EAC5B;AAAA,EAEA,MAAM,QAAQ,QAAA,EAAqD;AAC/D,IAAA,IAAI;AACA,MAAA,IAAA,CAAK,eAAe,QAAQ,CAAA;AAE5B,MAAA,MAAM,YAAa,MAAM,QAAA,CAAS,QAAQ,EAAE,MAAA,EAAQ,uBAAuB,CAAA;AAC3E,MAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACtC,QAAA,MAAM,IAAI,YAAY,mBAAmB,CAAA;AAAA,MAC7C;AAEA,MAAA,MAAM,aAAc,MAAM,QAAA,CAAS,QAAQ,EAAE,MAAA,EAAQ,eAAe,CAAA;AACpE,MAAA,MAAM,OAAA,GAAU,QAAA,CAAS,UAAA,EAAY,EAAE,CAAA;AAEvC,MAAA,IAAA,CAAK,SAAS,kBAAA,CAAmB;AAAA,QAC7B,KAAA,EAAO,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA;AAAA,QAC5B,SAAA,EAAW,OAAO,QAAQ;AAAA,OAC7B,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,UAAU,CAAC,CAAA;AAE3B,MAAA,IAAA,CAAK,WAAA,CAAY;AAAA,QACb,WAAA,EAAa,IAAA;AAAA,QACb,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACH,CAAA;AAED,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,kBAAA,EAAoB,IAAA,CAAK,MAAM,CAAA;AAElD,MAAA,OAAO;AAAA,QACH,OAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACJ;AAAA,IACJ,SAAS,KAAA,EAAY;AACjB,MAAA,IAAI,KAAA,CAAM,SAAS,IAAA,EAAM;AACrB,QAAA,MAAM,IAAI,YAAY,0BAA0B,CAAA;AAAA,MACpD;AACA,MAAA,MAAM,IAAI,WAAA,CAAY,CAAA,mBAAA,EAAsB,KAAA,CAAM,OAAO,IAAI,KAAK,CAAA;AAAA,IACtE;AAAA,EACJ;AAAA,EAEA,MAAM,UAAA,GAA4B;AAG9B,IAAA,IAAI,KAAK,MAAA,CAAO,QAAA,IAAY,IAAA,CAAK,MAAA,CAAO,SAAS,cAAA,EAAgB;AAKjE,IAAA,IAAA,CAAK,WAAA,CAAY;AAAA,MACb,WAAA,EAAa,KAAA;AAAA,MACb,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACb,CAAA;AACD,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,qBAAA,EAAuB,MAAS,CAAA;AAAA,EACvD;AAAA,EAEA,UAAA,GAA4B;AACxB,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,EACvB;AAAA,EAEA,UAAA,GAA4B;AACxB,IAAA,OAAO,KAAK,MAAA,CAAO,OAAA;AAAA,EACvB;AAAA,EAEA,WAAA,GAAuB;AACnB,IAAA,OAAO,KAAK,MAAA,CAAO,WAAA;AAAA,EACvB;AAAA,EAEA,MAAM,YAAY,OAAA,EAAkC;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,OAAO,OAAA,EAAS;AACtC,MAAA,MAAM,IAAI,YAAY,sBAAsB,CAAA;AAAA,IAChD;AACA,IAAA,IAAI;AACA,MAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY;AAAA,QACjC,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB;AAAA,OACH,CAAA;AAAA,IACL,SAAS,KAAA,EAAY;AACjB,MAAA,IAAI,MAAM,IAAA,KAAS,IAAA,EAAM,MAAM,IAAI,YAAY,uBAAuB,CAAA;AACtE,MAAA,MAAM,IAAI,WAAA,CAAY,CAAA,qBAAA,EAAwB,KAAA,CAAM,OAAO,IAAI,KAAK,CAAA;AAAA,IACxE;AAAA,EACJ;AAAA,EAEA,MAAM,cAAc,SAAA,EAA6C;AAC7D,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,IAAA,CAAK,OAAO,OAAA,EAAS;AACtC,MAAA,MAAM,IAAI,YAAY,sBAAsB,CAAA;AAAA,IAChD;AACA,IAAA,IAAI;AAEA,MAAA,OAAO,MAAM,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc;AAAA,QACnC,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,QAAQ,SAAA,CAAU,MAAA;AAAA,QAClB,OAAO,SAAA,CAAU,KAAA;AAAA,QACjB,aAAa,SAAA,CAAU,WAAA;AAAA,QACvB,SAAS,SAAA,CAAU;AAAA,OACtB,CAAA;AAAA,IACL,SAAS,KAAA,EAAY;AACjB,MAAA,IAAI,MAAM,IAAA,KAAS,IAAA,EAAM,MAAM,IAAI,YAAY,uBAAuB,CAAA;AACtE,MAAA,MAAM,IAAI,WAAA,CAAY,CAAA,wBAAA,EAA2B,KAAA,CAAM,OAAO,IAAI,KAAK,CAAA;AAAA,IAC3E;AAAA,EACJ;AAAA,EAEA,MAAM,YAAY,OAAA,EAAgC;AAC9C,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,UAAU,MAAM,IAAI,YAAY,wBAAwB,CAAA;AACzE,IAAA,IAAI;AACA,MAAA,MAAM,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ;AAAA,QAC/B,MAAA,EAAQ,4BAAA;AAAA,QACR,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,CAAA,EAAA,EAAK,QAAQ,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,OACpD,CAAA;AAAA,IACL,SAAS,KAAA,EAAY;AACjB,MAAA,MAAM,IAAI,WAAA,CAAY,CAAA,qBAAA,EAAwB,KAAA,CAAM,OAAO,IAAI,KAAK,CAAA;AAAA,IACxE;AAAA,EACJ;AAAA,EAEA,cAAc,QAAA,EAAoD;AAC9D,IAAA,MAAM,MAAA,GAAS,KAAK,QAAA,CAAS,EAAA,CAAG,oBAAoB,MAAM,QAAA,CAAS,IAAA,CAAK,MAAM,CAAC,CAAA;AAI/E,IAAA,OAAO,MAAA;AAAA,EACX;AAAA,EAEQ,YAAY,QAAA,EAAuB;AACvC,IAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AAAA,EAElB;AAAA,EAEQ,eAAe,QAAA,EAA2B;AAC9C,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAElB,IAAA,QAAA,CAAS,EAAA,CAAG,iBAAA,EAAmB,CAAC,QAAA,KAAuB;AACnD,MAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,UAAA,EAAW;AAAA,MACpB,CAAA,MAAO;AACH,QAAA,IAAA,CAAK,WAAA,CAAY,EAAE,GAAG,IAAA,CAAK,QAAQ,OAAA,EAAS,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA;AACzD,QAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,wBAAA,EAA0B,QAAQ,CAAA;AAAA,MACzD;AAAA,IACJ,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAC,OAAA,KAAoB;AAC7C,MAAA,MAAM,EAAA,GAAK,QAAA,CAAS,OAAA,EAAS,EAAE,CAAA;AAC/B,MAAA,IAAA,CAAK,YAAY,EAAE,GAAG,KAAK,MAAA,EAAQ,OAAA,EAAS,IAAI,CAAA;AAGhD,MAAA,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,qBAAA,EAAuB,EAAE,CAAA;AAAA,IAChD,CAAC,CAAA;AAED,IAAA,QAAA,CAAS,EAAA,CAAG,cAAc,MAAM;AAC5B,MAAA,IAAA,CAAK,UAAA,EAAW;AAAA,IACpB,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,SAAS,OAAA,EAAiB;AAC9B,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,OAAO,CAAA;AAAA,EACjD;AACJ","file":"chunk-S65V52WZ.mjs","sourcesContent":["import { createWalletClient, custom, WalletClient } from 'viem';\nimport { mainnet, base, baseSepolia } from 'viem/chains';\nimport { WalletState, ConnectedWallet, EIP1193Provider, EIP712TypedData } from '../types';\nimport { EventBus } from '../core/event-bus';\nimport { WalletError } from '../core/errors';\n\nexport class WalletModule {\n private _state: WalletState = {\n isConnected: false,\n address: null,\n chainId: null,\n provider: null,\n };\n private client: WalletClient | null = null;\n private chains = [mainnet, base, baseSepolia];\n\n constructor(private eventBus: EventBus) { }\n\n get state(): WalletState {\n return { ...this._state };\n }\n\n async connect(provider: EIP1193Provider): Promise<ConnectedWallet> {\n try {\n this.setupListeners(provider);\n\n const addresses = (await provider.request({ method: 'eth_requestAccounts' })) as string[];\n if (!addresses || addresses.length === 0) {\n throw new WalletError('No accounts found');\n }\n\n const chainIdHex = (await provider.request({ method: 'eth_chainId' })) as string;\n const chainId = parseInt(chainIdHex, 16);\n\n this.client = createWalletClient({\n chain: this.getChain(chainId),\n transport: custom(provider),\n });\n\n const address = addresses[0];\n\n this.updateState({\n isConnected: true,\n address,\n chainId,\n provider,\n });\n\n this.eventBus.emit('wallet:connected', this._state);\n\n return {\n address,\n chainId,\n provider,\n };\n } catch (error: any) {\n if (error.code === 4001) {\n throw new WalletError('User rejected connection');\n }\n throw new WalletError(`Connection failed: ${error.message}`, error);\n }\n }\n\n async disconnect(): Promise<void> {\n // Remove listeners if needed (not easily possible with just EIP1193Provider standard without storing internal listener refs, but we can clear state)\n // Actually standard providers like Metamask don't really 'disconnect' via API, but we act as if we did.\n if (this._state.provider && this._state.provider.removeListener) {\n // We should ideally remove listeners we added.\n // For simplicity in this scope, we just resetting state.\n }\n\n this.updateState({\n isConnected: false,\n address: null,\n chainId: null,\n provider: null\n });\n this.client = null;\n this.eventBus.emit('wallet:disconnected', undefined);\n }\n\n getAddress(): string | null {\n return this._state.address;\n }\n\n getChainId(): number | null {\n return this._state.chainId;\n }\n\n isConnected(): boolean {\n return this._state.isConnected;\n }\n\n async signMessage(message: string): Promise<string> {\n if (!this.client || !this._state.address) {\n throw new WalletError('Wallet not connected');\n }\n try {\n return await this.client.signMessage({\n account: this._state.address as `0x${string}`,\n message,\n });\n } catch (error: any) {\n if (error.code === 4001) throw new WalletError('User rejected signing');\n throw new WalletError(`Sign message failed: ${error.message}`, error);\n }\n }\n\n async signTypedData(typedData: EIP712TypedData): Promise<string> {\n if (!this.client || !this._state.address) {\n throw new WalletError('Wallet not connected');\n }\n try {\n // viem expects exact structure\n return await this.client.signTypedData({\n account: this._state.address as `0x${string}`,\n domain: typedData.domain as any,\n types: typedData.types as any,\n primaryType: typedData.primaryType,\n message: typedData.message,\n });\n } catch (error: any) {\n if (error.code === 4001) throw new WalletError('User rejected signing');\n throw new WalletError(`Sign typed data failed: ${error.message}`, error);\n }\n }\n\n async switchChain(chainId: number): Promise<void> {\n if (!this._state.provider) throw new WalletError('Provider not available');\n try {\n await this._state.provider.request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${chainId.toString(16)}` }],\n });\n } catch (error: any) {\n throw new WalletError(`Switch chain failed: ${error.message}`, error);\n }\n }\n\n onStateChange(callback: (state: WalletState) => void): () => void {\n const unsub1 = this.eventBus.on('wallet:connected', () => callback(this._state));\n // subscribe to other events if needed, or just general updates\n // The requirement says \"onStateChange(callback): Unsubscribe\".\n // We can emit a generic 'wallet:stateChanged' internal event\n return unsub1;\n }\n\n private updateState(newState: WalletState) {\n this._state = newState;\n // We could emit a generic event here too used by onStateChange\n }\n\n private setupListeners(provider: EIP1193Provider) {\n if (!provider.on) return;\n\n provider.on('accountsChanged', (accounts: string[]) => {\n if (accounts.length === 0) {\n this.disconnect();\n } else {\n this.updateState({ ...this._state, address: accounts[0] });\n this.eventBus.emit('wallet:accountsChanged', accounts);\n }\n });\n\n provider.on('chainChanged', (chainId: string) => {\n const id = parseInt(chainId, 16);\n this.updateState({ ...this._state, chainId: id });\n // Update client chain if possible or recreate?\n // For now just update state\n this.eventBus.emit('wallet:chainChanged', id);\n });\n\n provider.on('disconnect', () => {\n this.disconnect();\n });\n }\n\n private getChain(chainId: number) {\n return this.chains.find(c => c.id === chainId);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/payment/index.ts"],"names":[],"mappings":"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","file":"chunk-VORGSH76.mjs","sourcesContent":["import { HttpClient } from '../core/http-client';\nimport { WalletModule } from '../wallet';\nimport {\n PaymentRequirements,\n PaymentAuthorization,\n SignedAuthorization,\n VerifyResponse,\n SettleResponse,\n SupportedSchemesResponse,\n EIP712TypedData\n} from '../types';\nimport { PaymentError } from '../core/errors';\n\nexport class PaymentModule {\n constructor(\n private http: HttpClient,\n private wallet: WalletModule\n ) { }\n\n async pay(request: { requirements: PaymentRequirements; from?: string }): Promise<SettleResponse> {\n const from = request.from || request.requirements.from || this.wallet.getAddress();\n if (!from) throw new PaymentError('No sender address provided');\n\n // Create requirements with `from` set for EIP-1271 Smart Account signature verification\n const requirementsWithFrom: PaymentRequirements = {\n ...request.requirements,\n from, // Critical: backend needs to know which Smart Account is the payer\n };\n\n const auth = this.buildAuthorization(requirementsWithFrom, from);\n const signed = await this.signAuthorization(auth, requirementsWithFrom);\n\n const verification = await this.verify(signed, requirementsWithFrom);\n if (!verification.isValid) {\n throw new PaymentError(`Payment verification failed: ${verification.invalidReason}`);\n }\n\n return this.settle(signed, requirementsWithFrom);\n }\n\n buildAuthorization(requirements: PaymentRequirements, from: string): PaymentAuthorization {\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n const nonce = '0x' + Array.from(array).map(b => b.toString(16).padStart(2, '0')).join('');\n\n const now = Math.floor(Date.now() / 1000);\n\n return {\n from,\n to: requirements.payTo,\n value: requirements.maxAmountRequired,\n validAfter: now - 60, // 60s buffer\n validBefore: now + requirements.maxTimeoutSeconds,\n nonce\n };\n }\n\n async signAuthorization(authorization: PaymentAuthorization, requirements: PaymentRequirements): Promise<SignedAuthorization> {\n let chainId: number;\n const network = requirements.network;\n if (network.startsWith('eip155:')) {\n chainId = parseInt(network.split(':')[1], 10);\n } else {\n chainId = parseInt(network, 10);\n }\n\n if (isNaN(chainId)) throw new PaymentError('Invalid chain ID');\n\n // EIP-712 requires uint256 values as BigInt for proper encoding\n const typedData: EIP712TypedData = {\n domain: {\n name: requirements.extra?.name || \"x402 Payment Token\",\n version: requirements.extra?.version || \"1\",\n chainId,\n verifyingContract: requirements.asset\n },\n types: {\n TransferWithAuthorization: [\n { name: \"from\", type: \"address\" },\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n { name: \"validAfter\", type: \"uint256\" },\n { name: \"validBefore\", type: \"uint256\" },\n { name: \"nonce\", type: \"bytes32\" }\n ]\n },\n primaryType: \"TransferWithAuthorization\",\n message: {\n from: authorization.from,\n to: authorization.to,\n // CRITICAL: viem requires BigInt for uint256 types\n value: BigInt(authorization.value),\n validAfter: BigInt(authorization.validAfter),\n validBefore: BigInt(authorization.validBefore),\n nonce: authorization.nonce\n }\n };\n\n const signature = await this.wallet.signTypedData(typedData);\n return { ...authorization, signature };\n }\n\n encodePaymentHeader(signed: SignedAuthorization, requirements: PaymentRequirements): string {\n const authorization = {\n from: signed.from,\n to: signed.to,\n value: signed.value,\n nonce: signed.nonce,\n validAfter: signed.validAfter.toString(),\n validBefore: signed.validBefore.toString(),\n };\n\n const accepted = {\n scheme: requirements.scheme,\n network: requirements.network,\n amount: requirements.maxAmountRequired,\n asset: requirements.asset,\n payTo: requirements.payTo,\n maxTimeoutSeconds: requirements.maxTimeoutSeconds,\n };\n\n const paymentPayload = {\n x402Version: 1,\n accepted,\n payload: {\n authorization,\n signature: signed.signature,\n },\n };\n\n const jsonStr = JSON.stringify(paymentPayload);\n const b64Str = btoa(jsonStr);\n return `x402 ${b64Str}`;\n }\n\n async verify(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<VerifyResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n return this.http.post<VerifyResponse>('/x402/verify', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n }\n\n async settle(signed: SignedAuthorization, requirements: PaymentRequirements): Promise<SettleResponse> {\n const header = this.encodePaymentHeader(signed, requirements);\n return this.http.post<SettleResponse>('/x402/settle', {\n x402Version: 1,\n paymentHeader: header,\n paymentRequirements: requirements\n }, { skipAuth: true });\n }\n\n /**\n * Get supported payment schemes from the facilitator.\n * This endpoint does not require authentication.\n */\n async getSupportedSchemes(): Promise<SupportedSchemesResponse> {\n return this.http.get<SupportedSchemesResponse>('/x402/supported', { skipAuth: true });\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/account/index.ts"],"names":[],"mappings":";;;AAGO,IAAM,gBAAN,MAAoB;AAAA,EACvB,YAAoB,IAAA,EAAkB;AAAlB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAAA,EAAoB;AAAA,EAExC,MAAM,IAAI,EAAA,EAA8B;AACpC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,KAAK,GAAA,CAAsB,CAAA,UAAA,EAAa,EAAE,CAAA,CAAE,CAAA;AACxE,IAAA,OAAO,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,YAAY,OAAA,EAAmC;AAMjD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,EAAK;AACjC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,cAAc,WAAA,EAAY,KAAM,OAAA,CAAQ,WAAA,EAAa,CAAA;AAC1F,IAAA,IAAI,CAAC,OAAA,EAAS;AACV,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAClD;AACA,IAAA,OAAO,OAAA;AAAA,EACX;AAAA,EAEA,MAAM,IAAA,GAA2B;AAC7B,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,IAAyB,WAAW,CAAA;AACrE,IAAA,OAAO,QAAA,CAAS,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA;AAAA,EAChD;AAAA,EAEA,MAAM,OAAO,MAAA,EAA6D;AACtE,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAU,WAAA,EAAa;AAAA,MACpD,eAAe,MAAA,CAAO,YAAA;AAAA,MACtB,MAAM,MAAA,CAAO;AAAA,KAChB,CAAA;AAED,IAAA,OAAO;AAAA,MACH,OAAA,EAAS,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA;AAAA,MACzC,QAAQ,QAAA,CAAS;AAAA,KACrB;AAAA,EACJ;AAAA,EAEA,MAAM,eAAe,MAAA,EAAiE;AAClF,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,IAAA,CAAK,KAAiC,mBAAA,EAAqB;AAAA,MACnF,eAAe,MAAA,CAAO,YAAA;AAAA,MACtB,MAAM,MAAA,CAAO;AAAA,KAChB,CAAA;AACD,IAAA,OAAO,QAAA,CAAS,cAAA;AAAA,EACpB;AAAA,EAEQ,WAAW,IAAA,EAAoB;AAEnC,IAAA,OAAO;AAAA,MACH,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,cAAc,IAAA,CAAK,aAAA;AAAA,MACnB,eAAe,IAAA,CAAK,cAAA;AAAA,MACpB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,QAAA,EAAU,KAAK,SAAA,IAAa,CAAA;AAAA,MAC5B,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,WAAW,IAAA,CAAK,UAAA;AAAA,MAChB,WAAW,IAAA,CAAK;AAAA,KACpB;AAAA,EACJ;AACJ","file":"chunk-XKQI2VMJ.js","sourcesContent":["import { HttpClient } from '../core/http-client';\nimport { Account, CreateAccountParams, CreateAccountResponse } from '../types';\n\nexport class AccountModule {\n constructor(private http: HttpClient) { }\n\n async get(id: string): Promise<Account> {\n const response = await this.http.get<{ account: any }>(`/accounts/${id}`);\n return this.mapAccount(response.account);\n }\n\n async getByWallet(address: string): Promise<Account> {\n // Assuming API supports query param or specific endpoint. \n // The task list says \"GET /accounts -> { accounts: [...] }\". \n // It doesn't explicitly have a \"get by wallet\" endpoint, but usually list filters.\n // Or maybe we filter the list.\n // \"GET /accounts\" implies listing current user's accounts usually?\n const response = await this.list();\n const account = response.find(a => a.walletAddress.toLowerCase() === address.toLowerCase());\n if (!account) {\n throw new Error('Account not found for wallet');\n }\n return account;\n }\n\n async list(): Promise<Account[]> {\n const response = await this.http.get<{ accounts: any[] }>('/accounts');\n return response.accounts.map(this.mapAccount);\n }\n\n async create(params: CreateAccountParams): Promise<CreateAccountResponse> {\n const response = await this.http.post<any>('/accounts', {\n owner_address: params.ownerAddress,\n salt: params.salt,\n });\n\n return {\n account: this.mapAccount(response.account),\n txHash: response.tx_hash,\n };\n }\n\n async predictAddress(params: { ownerAddress: string; salt: string }): Promise<string> {\n const response = await this.http.post<{ wallet_address: string }>('/accounts/predict', {\n owner_address: params.ownerAddress,\n salt: params.salt,\n });\n return response.wallet_address;\n }\n\n private mapAccount(data: any): Account {\n // Map snake_case to camelCase\n return {\n id: data.id,\n ownerAddress: data.owner_address,\n walletAddress: data.wallet_address,\n status: data.status,\n kycLevel: data.kyc_level ?? 0,\n userId: data.user_id,\n createdAt: data.created_at,\n updatedAt: data.updated_at,\n };\n }\n}\n"]}