@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.
- package/dist/account/index.d.mts +1 -1
- package/dist/account/index.d.ts +1 -1
- package/dist/account/index.js +2 -2
- package/dist/account/index.mjs +1 -1
- package/dist/{chunk-2S2KS5ZI.js → chunk-6S7HWY3Z.js} +17 -11
- package/dist/chunk-6S7HWY3Z.js.map +1 -0
- package/dist/{chunk-PMX24TXY.js → chunk-7M4ZN7F3.js} +50 -4
- package/dist/chunk-7M4ZN7F3.js.map +1 -0
- package/dist/{chunk-BUSFZFJS.mjs → chunk-EONLKSST.mjs} +11 -10
- package/dist/chunk-EONLKSST.mjs.map +1 -0
- package/dist/{chunk-VORGSH76.mjs → chunk-ULP4VMHK.mjs} +50 -5
- package/dist/chunk-ULP4VMHK.mjs.map +1 -0
- package/dist/{chunk-XKQI2VMJ.js → chunk-XFJ6SPQN.js} +11 -10
- package/dist/chunk-XFJ6SPQN.js.map +1 -0
- package/dist/{chunk-S65V52WZ.mjs → chunk-ZVB256ZP.mjs} +17 -11
- package/dist/chunk-ZVB256ZP.mjs.map +1 -0
- package/dist/{index-D_ytPgEV.d.ts → index-0emNrQ4Y.d.ts} +1 -1
- package/dist/{index-Csrh5-dl.d.mts → index-BEjQJc66.d.mts} +35 -4
- package/dist/{index-Csrh5-dl.d.ts → index-BEjQJc66.d.ts} +35 -4
- package/dist/{index-1p5DSytk.d.mts → index-bErQcXnC.d.mts} +1 -1
- package/dist/index.d.mts +35 -4
- package/dist/index.d.ts +35 -4
- package/dist/index.js +77 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +70 -30
- package/dist/index.mjs.map +1 -1
- package/dist/payment/index.d.mts +14 -2
- package/dist/payment/index.d.ts +14 -2
- package/dist/payment/index.js +2 -2
- package/dist/payment/index.mjs +1 -1
- package/dist/wallet/index.d.mts +2 -2
- package/dist/wallet/index.d.ts +2 -2
- package/dist/wallet/index.js +2 -2
- package/dist/wallet/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-2S2KS5ZI.js.map +0 -1
- package/dist/chunk-BUSFZFJS.mjs.map +0 -1
- package/dist/chunk-PMX24TXY.js.map +0 -1
- package/dist/chunk-S65V52WZ.mjs.map +0 -1
- package/dist/chunk-VORGSH76.mjs.map +0 -1
- package/dist/chunk-XKQI2VMJ.js.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,20 +1,12 @@
|
|
|
1
|
-
import { AccountModule } from './chunk-
|
|
2
|
-
export { AccountModule } from './chunk-
|
|
3
|
-
import { PaymentModule } from './chunk-
|
|
4
|
-
export { PaymentModule } from './chunk-
|
|
5
|
-
import { WalletModule } from './chunk-
|
|
6
|
-
export { WalletModule } from './chunk-
|
|
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
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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:
|
|
256
|
-
walletAddress:
|
|
257
|
-
status:
|
|
258
|
-
createdAt:
|
|
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:
|
|
352
|
-
walletAddress:
|
|
353
|
-
status:
|
|
354
|
-
createdAt:
|
|
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
|
|
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,
|
|
483
|
+
export { AuthManager, EscrowModule, EventBus, HttpClient, InvoiceModule, UPSClient, UserModule };
|
|
444
484
|
//# sourceMappingURL=index.mjs.map
|
|
445
485
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -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":"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","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"]}
|
package/dist/payment/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { H as HttpClient } from '../http-client-D9JtkvUx.mjs';
|
|
2
|
-
import { W as WalletModule } from '../index-
|
|
3
|
-
import {
|
|
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;
|
package/dist/payment/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { H as HttpClient } from '../http-client-D9JtkvUx.js';
|
|
2
|
-
import { W as WalletModule } from '../index-
|
|
3
|
-
import {
|
|
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;
|
package/dist/payment/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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
|
|
10
|
+
get: function () { return chunk7M4ZN7F3_js.PaymentModule; }
|
|
11
11
|
});
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/payment/index.mjs
CHANGED
package/dist/wallet/index.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import '../index-
|
|
2
|
-
export { W as WalletModule } from '../index-
|
|
1
|
+
import '../index-BEjQJc66.mjs';
|
|
2
|
+
export { W as WalletModule } from '../index-bErQcXnC.mjs';
|
package/dist/wallet/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import '../index-
|
|
2
|
-
export { W as WalletModule } from '../index-
|
|
1
|
+
import '../index-BEjQJc66.js';
|
|
2
|
+
export { W as WalletModule } from '../index-0emNrQ4Y.js';
|
package/dist/wallet/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
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
|
|
10
|
+
get: function () { return chunk6S7HWY3Z_js.WalletModule; }
|
|
11
11
|
});
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/wallet/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -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":"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","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"]}
|