@gatewayfm/ups-sdk 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/account/index.d.mts +18 -0
  2. package/dist/account/index.d.ts +18 -0
  3. package/dist/account/index.js +12 -0
  4. package/dist/account/index.js.map +1 -0
  5. package/dist/account/index.mjs +3 -0
  6. package/dist/account/index.mjs.map +1 -0
  7. package/dist/chunk-2S2KS5ZI.js +150 -0
  8. package/dist/chunk-2S2KS5ZI.js.map +1 -0
  9. package/dist/chunk-BH5YEAE6.mjs +47 -0
  10. package/dist/chunk-BH5YEAE6.mjs.map +1 -0
  11. package/dist/chunk-BUSFZFJS.mjs +55 -0
  12. package/dist/chunk-BUSFZFJS.mjs.map +1 -0
  13. package/dist/chunk-G525R6AV.js +54 -0
  14. package/dist/chunk-G525R6AV.js.map +1 -0
  15. package/dist/chunk-PMX24TXY.js +138 -0
  16. package/dist/chunk-PMX24TXY.js.map +1 -0
  17. package/dist/chunk-S65V52WZ.mjs +148 -0
  18. package/dist/chunk-S65V52WZ.mjs.map +1 -0
  19. package/dist/chunk-VORGSH76.mjs +136 -0
  20. package/dist/chunk-VORGSH76.mjs.map +1 -0
  21. package/dist/chunk-XKQI2VMJ.js +57 -0
  22. package/dist/chunk-XKQI2VMJ.js.map +1 -0
  23. package/dist/http-client-D9JtkvUx.d.mts +22 -0
  24. package/dist/http-client-D9JtkvUx.d.ts +22 -0
  25. package/dist/index-1p5DSytk.d.mts +35 -0
  26. package/dist/index-Csrh5-dl.d.mts +160 -0
  27. package/dist/index-Csrh5-dl.d.ts +160 -0
  28. package/dist/index-D_ytPgEV.d.ts +35 -0
  29. package/dist/index.d.mts +130 -0
  30. package/dist/index.d.ts +130 -0
  31. package/dist/index.js +485 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/index.mjs +445 -0
  34. package/dist/index.mjs.map +1 -0
  35. package/dist/payment/index.d.mts +25 -0
  36. package/dist/payment/index.d.ts +25 -0
  37. package/dist/payment/index.js +13 -0
  38. package/dist/payment/index.js.map +1 -0
  39. package/dist/payment/index.mjs +4 -0
  40. package/dist/payment/index.mjs.map +1 -0
  41. package/dist/wallet/index.d.mts +2 -0
  42. package/dist/wallet/index.d.ts +2 -0
  43. package/dist/wallet/index.js +13 -0
  44. package/dist/wallet/index.js.map +1 -0
  45. package/dist/wallet/index.mjs +4 -0
  46. package/dist/wallet/index.mjs.map +1 -0
  47. package/package.json +56 -0
@@ -0,0 +1,18 @@
1
+ import { H as HttpClient } from '../http-client-D9JtkvUx.mjs';
2
+ import { f as Account, h as CreateAccountParams, i as CreateAccountResponse } from '../index-Csrh5-dl.mjs';
3
+
4
+ declare class AccountModule {
5
+ private http;
6
+ constructor(http: HttpClient);
7
+ get(id: string): Promise<Account>;
8
+ getByWallet(address: string): Promise<Account>;
9
+ list(): Promise<Account[]>;
10
+ create(params: CreateAccountParams): Promise<CreateAccountResponse>;
11
+ predictAddress(params: {
12
+ ownerAddress: string;
13
+ salt: string;
14
+ }): Promise<string>;
15
+ private mapAccount;
16
+ }
17
+
18
+ export { AccountModule };
@@ -0,0 +1,18 @@
1
+ import { H as HttpClient } from '../http-client-D9JtkvUx.js';
2
+ import { f as Account, h as CreateAccountParams, i as CreateAccountResponse } from '../index-Csrh5-dl.js';
3
+
4
+ declare class AccountModule {
5
+ private http;
6
+ constructor(http: HttpClient);
7
+ get(id: string): Promise<Account>;
8
+ getByWallet(address: string): Promise<Account>;
9
+ list(): Promise<Account[]>;
10
+ create(params: CreateAccountParams): Promise<CreateAccountResponse>;
11
+ predictAddress(params: {
12
+ ownerAddress: string;
13
+ salt: string;
14
+ }): Promise<string>;
15
+ private mapAccount;
16
+ }
17
+
18
+ export { AccountModule };
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ var chunkXKQI2VMJ_js = require('../chunk-XKQI2VMJ.js');
4
+
5
+
6
+
7
+ Object.defineProperty(exports, "AccountModule", {
8
+ enumerable: true,
9
+ get: function () { return chunkXKQI2VMJ_js.AccountModule; }
10
+ });
11
+ //# sourceMappingURL=index.js.map
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.js"}
@@ -0,0 +1,3 @@
1
+ export { AccountModule } from '../chunk-BUSFZFJS.mjs';
2
+ //# sourceMappingURL=index.mjs.map
3
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.mjs"}
@@ -0,0 +1,150 @@
1
+ 'use strict';
2
+
3
+ var chunkG525R6AV_js = require('./chunk-G525R6AV.js');
4
+ var viem = require('viem');
5
+ var chains = require('viem/chains');
6
+
7
+ var WalletModule = class {
8
+ constructor(eventBus) {
9
+ this.eventBus = eventBus;
10
+ }
11
+ _state = {
12
+ isConnected: false,
13
+ address: null,
14
+ chainId: null,
15
+ provider: null
16
+ };
17
+ client = null;
18
+ chains = [chains.mainnet, chains.base, chains.baseSepolia];
19
+ get state() {
20
+ return { ...this._state };
21
+ }
22
+ async connect(provider) {
23
+ try {
24
+ this.setupListeners(provider);
25
+ const addresses = await provider.request({ method: "eth_requestAccounts" });
26
+ if (!addresses || addresses.length === 0) {
27
+ throw new chunkG525R6AV_js.WalletError("No accounts found");
28
+ }
29
+ const chainIdHex = await provider.request({ method: "eth_chainId" });
30
+ const chainId = parseInt(chainIdHex, 16);
31
+ this.client = viem.createWalletClient({
32
+ chain: this.getChain(chainId),
33
+ transport: viem.custom(provider)
34
+ });
35
+ const address = addresses[0];
36
+ this.updateState({
37
+ isConnected: true,
38
+ address,
39
+ chainId,
40
+ provider
41
+ });
42
+ this.eventBus.emit("wallet:connected", this._state);
43
+ return {
44
+ address,
45
+ chainId,
46
+ provider
47
+ };
48
+ } catch (error) {
49
+ if (error.code === 4001) {
50
+ throw new chunkG525R6AV_js.WalletError("User rejected connection");
51
+ }
52
+ throw new chunkG525R6AV_js.WalletError(`Connection failed: ${error.message}`, error);
53
+ }
54
+ }
55
+ async disconnect() {
56
+ if (this._state.provider && this._state.provider.removeListener) ;
57
+ this.updateState({
58
+ isConnected: false,
59
+ address: null,
60
+ chainId: null,
61
+ provider: null
62
+ });
63
+ this.client = null;
64
+ this.eventBus.emit("wallet:disconnected", void 0);
65
+ }
66
+ getAddress() {
67
+ return this._state.address;
68
+ }
69
+ getChainId() {
70
+ return this._state.chainId;
71
+ }
72
+ isConnected() {
73
+ return this._state.isConnected;
74
+ }
75
+ async signMessage(message) {
76
+ if (!this.client || !this._state.address) {
77
+ throw new chunkG525R6AV_js.WalletError("Wallet not connected");
78
+ }
79
+ try {
80
+ return await this.client.signMessage({
81
+ account: this._state.address,
82
+ message
83
+ });
84
+ } catch (error) {
85
+ if (error.code === 4001) throw new chunkG525R6AV_js.WalletError("User rejected signing");
86
+ throw new chunkG525R6AV_js.WalletError(`Sign message failed: ${error.message}`, error);
87
+ }
88
+ }
89
+ async signTypedData(typedData) {
90
+ if (!this.client || !this._state.address) {
91
+ throw new chunkG525R6AV_js.WalletError("Wallet not connected");
92
+ }
93
+ try {
94
+ return await this.client.signTypedData({
95
+ account: this._state.address,
96
+ domain: typedData.domain,
97
+ types: typedData.types,
98
+ primaryType: typedData.primaryType,
99
+ message: typedData.message
100
+ });
101
+ } catch (error) {
102
+ if (error.code === 4001) throw new chunkG525R6AV_js.WalletError("User rejected signing");
103
+ throw new chunkG525R6AV_js.WalletError(`Sign typed data failed: ${error.message}`, error);
104
+ }
105
+ }
106
+ async switchChain(chainId) {
107
+ if (!this._state.provider) throw new chunkG525R6AV_js.WalletError("Provider not available");
108
+ try {
109
+ await this._state.provider.request({
110
+ method: "wallet_switchEthereumChain",
111
+ params: [{ chainId: `0x${chainId.toString(16)}` }]
112
+ });
113
+ } catch (error) {
114
+ throw new chunkG525R6AV_js.WalletError(`Switch chain failed: ${error.message}`, error);
115
+ }
116
+ }
117
+ onStateChange(callback) {
118
+ const unsub1 = this.eventBus.on("wallet:connected", () => callback(this._state));
119
+ return unsub1;
120
+ }
121
+ updateState(newState) {
122
+ this._state = newState;
123
+ }
124
+ setupListeners(provider) {
125
+ if (!provider.on) return;
126
+ provider.on("accountsChanged", (accounts) => {
127
+ if (accounts.length === 0) {
128
+ this.disconnect();
129
+ } else {
130
+ this.updateState({ ...this._state, address: accounts[0] });
131
+ this.eventBus.emit("wallet:accountsChanged", accounts);
132
+ }
133
+ });
134
+ provider.on("chainChanged", (chainId) => {
135
+ const id = parseInt(chainId, 16);
136
+ this.updateState({ ...this._state, chainId: id });
137
+ this.eventBus.emit("wallet:chainChanged", id);
138
+ });
139
+ provider.on("disconnect", () => {
140
+ this.disconnect();
141
+ });
142
+ }
143
+ getChain(chainId) {
144
+ return this.chains.find((c) => c.id === chainId);
145
+ }
146
+ };
147
+
148
+ exports.WalletModule = WalletModule;
149
+ //# sourceMappingURL=chunk-2S2KS5ZI.js.map
150
+ //# sourceMappingURL=chunk-2S2KS5ZI.js.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,47 @@
1
+ // src/core/errors.ts
2
+ var UPSError = class extends Error {
3
+ code;
4
+ details;
5
+ constructor(message, code, details) {
6
+ super(message);
7
+ this.name = "UPSError";
8
+ this.code = code;
9
+ this.details = details;
10
+ }
11
+ };
12
+ var NetworkError = class extends UPSError {
13
+ status;
14
+ constructor(message, details, status) {
15
+ super(message, "NETWORK_ERROR", details);
16
+ this.name = "NetworkError";
17
+ this.status = status;
18
+ }
19
+ };
20
+ var AuthError = class extends UPSError {
21
+ constructor(message, details) {
22
+ super(message, "AUTH_ERROR", details);
23
+ this.name = "AuthError";
24
+ }
25
+ };
26
+ var WalletError = class extends UPSError {
27
+ constructor(message, details) {
28
+ super(message, "WALLET_ERROR", details);
29
+ this.name = "WalletError";
30
+ }
31
+ };
32
+ var PaymentError = class extends UPSError {
33
+ constructor(message, details) {
34
+ super(message, "PAYMENT_ERROR", details);
35
+ this.name = "PaymentError";
36
+ }
37
+ };
38
+ var RateLimitError = class extends UPSError {
39
+ constructor(message, details) {
40
+ super(message, "RATE_LIMIT_ERROR", details);
41
+ this.name = "RateLimitError";
42
+ }
43
+ };
44
+
45
+ export { AuthError, NetworkError, PaymentError, RateLimitError, UPSError, WalletError };
46
+ //# sourceMappingURL=chunk-BH5YEAE6.mjs.map
47
+ //# sourceMappingURL=chunk-BH5YEAE6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts"],"names":[],"mappings":";AAAO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAChC,IAAA;AAAA,EACA,OAAA;AAAA,EAEA,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,OAAA,EAAmB;AAC1D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACnB;AACJ;AAEO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EAChC,MAAA;AAAA,EAEP,WAAA,CAAY,OAAA,EAAiB,OAAA,EAAmB,MAAA,EAAiB;AAC7D,IAAA,KAAA,CAAM,OAAA,EAAS,iBAAiB,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAClB;AACJ;AAEO,IAAM,SAAA,GAAN,cAAwB,QAAA,CAAS;AAAA,EACpC,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,cAAc,OAAO,CAAA;AACpC,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA,EAChB;AACJ;AAEO,IAAM,WAAA,GAAN,cAA0B,QAAA,CAAS;AAAA,EACtC,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,gBAAgB,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EAChB;AACJ;AAEO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EACvC,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,iBAAiB,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EAChB;AACJ;AAEO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EACzC,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,oBAAoB,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EAChB;AACJ","file":"chunk-BH5YEAE6.mjs","sourcesContent":["export class UPSError extends Error {\n code: string;\n details?: unknown;\n\n constructor(message: string, code: string, details?: unknown) {\n super(message);\n this.name = 'UPSError';\n this.code = code;\n this.details = details;\n }\n}\n\nexport class NetworkError extends UPSError {\n public status?: number;\n\n constructor(message: string, details?: unknown, status?: number) {\n super(message, 'NETWORK_ERROR', details);\n this.name = 'NetworkError';\n this.status = status;\n }\n}\n\nexport class AuthError extends UPSError {\n constructor(message: string, details?: unknown) {\n super(message, 'AUTH_ERROR', details);\n this.name = 'AuthError';\n }\n}\n\nexport class WalletError extends UPSError {\n constructor(message: string, details?: unknown) {\n super(message, 'WALLET_ERROR', details);\n this.name = 'WalletError';\n }\n}\n\nexport class PaymentError extends UPSError {\n constructor(message: string, details?: unknown) {\n super(message, 'PAYMENT_ERROR', details);\n this.name = 'PaymentError';\n }\n}\n\nexport class RateLimitError extends UPSError {\n constructor(message: string, details?: unknown) {\n super(message, 'RATE_LIMIT_ERROR', details);\n this.name = 'RateLimitError';\n }\n}\n"]}
@@ -0,0 +1,55 @@
1
+ // src/account/index.ts
2
+ var AccountModule = class {
3
+ constructor(http) {
4
+ this.http = http;
5
+ }
6
+ async get(id) {
7
+ const response = await this.http.get(`/accounts/${id}`);
8
+ return this.mapAccount(response.account);
9
+ }
10
+ async getByWallet(address) {
11
+ const response = await this.list();
12
+ const account = response.find((a) => a.walletAddress.toLowerCase() === address.toLowerCase());
13
+ if (!account) {
14
+ throw new Error("Account not found for wallet");
15
+ }
16
+ return account;
17
+ }
18
+ async list() {
19
+ const response = await this.http.get("/accounts");
20
+ return response.accounts.map(this.mapAccount);
21
+ }
22
+ async create(params) {
23
+ const response = await this.http.post("/accounts", {
24
+ owner_address: params.ownerAddress,
25
+ salt: params.salt
26
+ });
27
+ return {
28
+ account: this.mapAccount(response.account),
29
+ txHash: response.tx_hash
30
+ };
31
+ }
32
+ async predictAddress(params) {
33
+ const response = await this.http.post("/accounts/predict", {
34
+ owner_address: params.ownerAddress,
35
+ salt: params.salt
36
+ });
37
+ return response.wallet_address;
38
+ }
39
+ mapAccount(data) {
40
+ return {
41
+ id: data.id,
42
+ ownerAddress: data.owner_address,
43
+ walletAddress: data.wallet_address,
44
+ status: data.status,
45
+ kycLevel: data.kyc_level ?? 0,
46
+ userId: data.user_id,
47
+ createdAt: data.created_at,
48
+ updatedAt: data.updated_at
49
+ };
50
+ }
51
+ };
52
+
53
+ export { AccountModule };
54
+ //# sourceMappingURL=chunk-BUSFZFJS.mjs.map
55
+ //# sourceMappingURL=chunk-BUSFZFJS.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ // src/core/errors.ts
4
+ var UPSError = class extends Error {
5
+ code;
6
+ details;
7
+ constructor(message, code, details) {
8
+ super(message);
9
+ this.name = "UPSError";
10
+ this.code = code;
11
+ this.details = details;
12
+ }
13
+ };
14
+ var NetworkError = class extends UPSError {
15
+ status;
16
+ constructor(message, details, status) {
17
+ super(message, "NETWORK_ERROR", details);
18
+ this.name = "NetworkError";
19
+ this.status = status;
20
+ }
21
+ };
22
+ var AuthError = class extends UPSError {
23
+ constructor(message, details) {
24
+ super(message, "AUTH_ERROR", details);
25
+ this.name = "AuthError";
26
+ }
27
+ };
28
+ var WalletError = class extends UPSError {
29
+ constructor(message, details) {
30
+ super(message, "WALLET_ERROR", details);
31
+ this.name = "WalletError";
32
+ }
33
+ };
34
+ var PaymentError = class extends UPSError {
35
+ constructor(message, details) {
36
+ super(message, "PAYMENT_ERROR", details);
37
+ this.name = "PaymentError";
38
+ }
39
+ };
40
+ var RateLimitError = class extends UPSError {
41
+ constructor(message, details) {
42
+ super(message, "RATE_LIMIT_ERROR", details);
43
+ this.name = "RateLimitError";
44
+ }
45
+ };
46
+
47
+ exports.AuthError = AuthError;
48
+ exports.NetworkError = NetworkError;
49
+ exports.PaymentError = PaymentError;
50
+ exports.RateLimitError = RateLimitError;
51
+ exports.UPSError = UPSError;
52
+ exports.WalletError = WalletError;
53
+ //# sourceMappingURL=chunk-G525R6AV.js.map
54
+ //# sourceMappingURL=chunk-G525R6AV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/errors.ts"],"names":[],"mappings":";;;AAAO,IAAM,QAAA,GAAN,cAAuB,KAAA,CAAM;AAAA,EAChC,IAAA;AAAA,EACA,OAAA;AAAA,EAEA,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,OAAA,EAAmB;AAC1D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAAA,EACnB;AACJ;AAEO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EAChC,MAAA;AAAA,EAEP,WAAA,CAAY,OAAA,EAAiB,OAAA,EAAmB,MAAA,EAAiB;AAC7D,IAAA,KAAA,CAAM,OAAA,EAAS,iBAAiB,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAClB;AACJ;AAEO,IAAM,SAAA,GAAN,cAAwB,QAAA,CAAS;AAAA,EACpC,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,cAAc,OAAO,CAAA;AACpC,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA,EAChB;AACJ;AAEO,IAAM,WAAA,GAAN,cAA0B,QAAA,CAAS;AAAA,EACtC,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,gBAAgB,OAAO,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AAAA,EAChB;AACJ;AAEO,IAAM,YAAA,GAAN,cAA2B,QAAA,CAAS;AAAA,EACvC,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,iBAAiB,OAAO,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,cAAA;AAAA,EAChB;AACJ;AAEO,IAAM,cAAA,GAAN,cAA6B,QAAA,CAAS;AAAA,EACzC,WAAA,CAAY,SAAiB,OAAA,EAAmB;AAC5C,IAAA,KAAA,CAAM,OAAA,EAAS,oBAAoB,OAAO,CAAA;AAC1C,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EAChB;AACJ","file":"chunk-G525R6AV.js","sourcesContent":["export class UPSError extends Error {\n code: string;\n details?: unknown;\n\n constructor(message: string, code: string, details?: unknown) {\n super(message);\n this.name = 'UPSError';\n this.code = code;\n this.details = details;\n }\n}\n\nexport class NetworkError extends UPSError {\n public status?: number;\n\n constructor(message: string, details?: unknown, status?: number) {\n super(message, 'NETWORK_ERROR', details);\n this.name = 'NetworkError';\n this.status = status;\n }\n}\n\nexport class AuthError extends UPSError {\n constructor(message: string, details?: unknown) {\n super(message, 'AUTH_ERROR', details);\n this.name = 'AuthError';\n }\n}\n\nexport class WalletError extends UPSError {\n constructor(message: string, details?: unknown) {\n super(message, 'WALLET_ERROR', details);\n this.name = 'WalletError';\n }\n}\n\nexport class PaymentError extends UPSError {\n constructor(message: string, details?: unknown) {\n super(message, 'PAYMENT_ERROR', details);\n this.name = 'PaymentError';\n }\n}\n\nexport class RateLimitError extends UPSError {\n constructor(message: string, details?: unknown) {\n super(message, 'RATE_LIMIT_ERROR', details);\n this.name = 'RateLimitError';\n }\n}\n"]}
@@ -0,0 +1,138 @@
1
+ 'use strict';
2
+
3
+ var chunkG525R6AV_js = require('./chunk-G525R6AV.js');
4
+
5
+ // src/payment/index.ts
6
+ var PaymentModule = class {
7
+ constructor(http, wallet) {
8
+ this.http = http;
9
+ this.wallet = wallet;
10
+ }
11
+ async pay(request) {
12
+ const from = request.from || request.requirements.from || this.wallet.getAddress();
13
+ if (!from) throw new chunkG525R6AV_js.PaymentError("No sender address provided");
14
+ const requirementsWithFrom = {
15
+ ...request.requirements,
16
+ from
17
+ // Critical: backend needs to know which Smart Account is the payer
18
+ };
19
+ const auth = this.buildAuthorization(requirementsWithFrom, from);
20
+ const signed = await this.signAuthorization(auth, requirementsWithFrom);
21
+ const verification = await this.verify(signed, requirementsWithFrom);
22
+ if (!verification.isValid) {
23
+ throw new chunkG525R6AV_js.PaymentError(`Payment verification failed: ${verification.invalidReason}`);
24
+ }
25
+ return this.settle(signed, requirementsWithFrom);
26
+ }
27
+ buildAuthorization(requirements, from) {
28
+ const array = new Uint8Array(32);
29
+ crypto.getRandomValues(array);
30
+ const nonce = "0x" + Array.from(array).map((b) => b.toString(16).padStart(2, "0")).join("");
31
+ const now = Math.floor(Date.now() / 1e3);
32
+ return {
33
+ from,
34
+ to: requirements.payTo,
35
+ value: requirements.maxAmountRequired,
36
+ validAfter: now - 60,
37
+ // 60s buffer
38
+ validBefore: now + requirements.maxTimeoutSeconds,
39
+ nonce
40
+ };
41
+ }
42
+ async signAuthorization(authorization, requirements) {
43
+ let chainId;
44
+ const network = requirements.network;
45
+ if (network.startsWith("eip155:")) {
46
+ chainId = parseInt(network.split(":")[1], 10);
47
+ } else {
48
+ chainId = parseInt(network, 10);
49
+ }
50
+ if (isNaN(chainId)) throw new chunkG525R6AV_js.PaymentError("Invalid chain ID");
51
+ const typedData = {
52
+ domain: {
53
+ name: requirements.extra?.name || "x402 Payment Token",
54
+ version: requirements.extra?.version || "1",
55
+ chainId,
56
+ verifyingContract: requirements.asset
57
+ },
58
+ types: {
59
+ TransferWithAuthorization: [
60
+ { name: "from", type: "address" },
61
+ { name: "to", type: "address" },
62
+ { name: "value", type: "uint256" },
63
+ { name: "validAfter", type: "uint256" },
64
+ { name: "validBefore", type: "uint256" },
65
+ { name: "nonce", type: "bytes32" }
66
+ ]
67
+ },
68
+ primaryType: "TransferWithAuthorization",
69
+ message: {
70
+ from: authorization.from,
71
+ to: authorization.to,
72
+ // CRITICAL: viem requires BigInt for uint256 types
73
+ value: BigInt(authorization.value),
74
+ validAfter: BigInt(authorization.validAfter),
75
+ validBefore: BigInt(authorization.validBefore),
76
+ nonce: authorization.nonce
77
+ }
78
+ };
79
+ const signature = await this.wallet.signTypedData(typedData);
80
+ return { ...authorization, signature };
81
+ }
82
+ encodePaymentHeader(signed, requirements) {
83
+ const authorization = {
84
+ from: signed.from,
85
+ to: signed.to,
86
+ value: signed.value,
87
+ nonce: signed.nonce,
88
+ validAfter: signed.validAfter.toString(),
89
+ validBefore: signed.validBefore.toString()
90
+ };
91
+ const accepted = {
92
+ scheme: requirements.scheme,
93
+ network: requirements.network,
94
+ amount: requirements.maxAmountRequired,
95
+ asset: requirements.asset,
96
+ payTo: requirements.payTo,
97
+ maxTimeoutSeconds: requirements.maxTimeoutSeconds
98
+ };
99
+ const paymentPayload = {
100
+ x402Version: 1,
101
+ accepted,
102
+ payload: {
103
+ authorization,
104
+ signature: signed.signature
105
+ }
106
+ };
107
+ const jsonStr = JSON.stringify(paymentPayload);
108
+ const b64Str = btoa(jsonStr);
109
+ return `x402 ${b64Str}`;
110
+ }
111
+ async verify(signed, requirements) {
112
+ const header = this.encodePaymentHeader(signed, requirements);
113
+ return this.http.post("/x402/verify", {
114
+ x402Version: 1,
115
+ paymentHeader: header,
116
+ paymentRequirements: requirements
117
+ }, { skipAuth: true });
118
+ }
119
+ async settle(signed, requirements) {
120
+ const header = this.encodePaymentHeader(signed, requirements);
121
+ return this.http.post("/x402/settle", {
122
+ x402Version: 1,
123
+ paymentHeader: header,
124
+ paymentRequirements: requirements
125
+ }, { skipAuth: true });
126
+ }
127
+ /**
128
+ * Get supported payment schemes from the facilitator.
129
+ * This endpoint does not require authentication.
130
+ */
131
+ async getSupportedSchemes() {
132
+ return this.http.get("/x402/supported", { skipAuth: true });
133
+ }
134
+ };
135
+
136
+ exports.PaymentModule = PaymentModule;
137
+ //# sourceMappingURL=chunk-PMX24TXY.js.map
138
+ //# sourceMappingURL=chunk-PMX24TXY.js.map
@@ -0,0 +1 @@
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"]}