@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,148 @@
1
+ import { WalletError } from './chunk-BH5YEAE6.mjs';
2
+ import { createWalletClient, custom } from 'viem';
3
+ import { mainnet, base, baseSepolia } from 'viem/chains';
4
+
5
+ var WalletModule = class {
6
+ constructor(eventBus) {
7
+ this.eventBus = eventBus;
8
+ }
9
+ _state = {
10
+ isConnected: false,
11
+ address: null,
12
+ chainId: null,
13
+ provider: null
14
+ };
15
+ client = null;
16
+ chains = [mainnet, base, baseSepolia];
17
+ get state() {
18
+ return { ...this._state };
19
+ }
20
+ async connect(provider) {
21
+ try {
22
+ this.setupListeners(provider);
23
+ const addresses = await provider.request({ method: "eth_requestAccounts" });
24
+ if (!addresses || addresses.length === 0) {
25
+ throw new WalletError("No accounts found");
26
+ }
27
+ const chainIdHex = await provider.request({ method: "eth_chainId" });
28
+ const chainId = parseInt(chainIdHex, 16);
29
+ this.client = createWalletClient({
30
+ chain: this.getChain(chainId),
31
+ transport: custom(provider)
32
+ });
33
+ const address = addresses[0];
34
+ this.updateState({
35
+ isConnected: true,
36
+ address,
37
+ chainId,
38
+ provider
39
+ });
40
+ this.eventBus.emit("wallet:connected", this._state);
41
+ return {
42
+ address,
43
+ chainId,
44
+ provider
45
+ };
46
+ } catch (error) {
47
+ if (error.code === 4001) {
48
+ throw new WalletError("User rejected connection");
49
+ }
50
+ throw new WalletError(`Connection failed: ${error.message}`, error);
51
+ }
52
+ }
53
+ async disconnect() {
54
+ if (this._state.provider && this._state.provider.removeListener) ;
55
+ this.updateState({
56
+ isConnected: false,
57
+ address: null,
58
+ chainId: null,
59
+ provider: null
60
+ });
61
+ this.client = null;
62
+ this.eventBus.emit("wallet:disconnected", void 0);
63
+ }
64
+ getAddress() {
65
+ return this._state.address;
66
+ }
67
+ getChainId() {
68
+ return this._state.chainId;
69
+ }
70
+ isConnected() {
71
+ return this._state.isConnected;
72
+ }
73
+ async signMessage(message) {
74
+ if (!this.client || !this._state.address) {
75
+ throw new WalletError("Wallet not connected");
76
+ }
77
+ try {
78
+ return await this.client.signMessage({
79
+ account: this._state.address,
80
+ message
81
+ });
82
+ } catch (error) {
83
+ if (error.code === 4001) throw new WalletError("User rejected signing");
84
+ throw new WalletError(`Sign message failed: ${error.message}`, error);
85
+ }
86
+ }
87
+ async signTypedData(typedData) {
88
+ if (!this.client || !this._state.address) {
89
+ throw new WalletError("Wallet not connected");
90
+ }
91
+ try {
92
+ return await this.client.signTypedData({
93
+ account: this._state.address,
94
+ domain: typedData.domain,
95
+ types: typedData.types,
96
+ primaryType: typedData.primaryType,
97
+ message: typedData.message
98
+ });
99
+ } catch (error) {
100
+ if (error.code === 4001) throw new WalletError("User rejected signing");
101
+ throw new WalletError(`Sign typed data failed: ${error.message}`, error);
102
+ }
103
+ }
104
+ async switchChain(chainId) {
105
+ if (!this._state.provider) throw new WalletError("Provider not available");
106
+ try {
107
+ await this._state.provider.request({
108
+ method: "wallet_switchEthereumChain",
109
+ params: [{ chainId: `0x${chainId.toString(16)}` }]
110
+ });
111
+ } catch (error) {
112
+ throw new WalletError(`Switch chain failed: ${error.message}`, error);
113
+ }
114
+ }
115
+ onStateChange(callback) {
116
+ const unsub1 = this.eventBus.on("wallet:connected", () => callback(this._state));
117
+ return unsub1;
118
+ }
119
+ updateState(newState) {
120
+ this._state = newState;
121
+ }
122
+ setupListeners(provider) {
123
+ if (!provider.on) return;
124
+ provider.on("accountsChanged", (accounts) => {
125
+ if (accounts.length === 0) {
126
+ this.disconnect();
127
+ } else {
128
+ this.updateState({ ...this._state, address: accounts[0] });
129
+ this.eventBus.emit("wallet:accountsChanged", accounts);
130
+ }
131
+ });
132
+ provider.on("chainChanged", (chainId) => {
133
+ const id = parseInt(chainId, 16);
134
+ this.updateState({ ...this._state, chainId: id });
135
+ this.eventBus.emit("wallet:chainChanged", id);
136
+ });
137
+ provider.on("disconnect", () => {
138
+ this.disconnect();
139
+ });
140
+ }
141
+ getChain(chainId) {
142
+ return this.chains.find((c) => c.id === chainId);
143
+ }
144
+ };
145
+
146
+ export { WalletModule };
147
+ //# sourceMappingURL=chunk-S65V52WZ.mjs.map
148
+ //# sourceMappingURL=chunk-S65V52WZ.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,136 @@
1
+ import { PaymentError } from './chunk-BH5YEAE6.mjs';
2
+
3
+ // src/payment/index.ts
4
+ var PaymentModule = class {
5
+ constructor(http, wallet) {
6
+ this.http = http;
7
+ this.wallet = wallet;
8
+ }
9
+ async pay(request) {
10
+ const from = request.from || request.requirements.from || this.wallet.getAddress();
11
+ if (!from) throw new PaymentError("No sender address provided");
12
+ const requirementsWithFrom = {
13
+ ...request.requirements,
14
+ from
15
+ // Critical: backend needs to know which Smart Account is the payer
16
+ };
17
+ const auth = this.buildAuthorization(requirementsWithFrom, from);
18
+ const signed = await this.signAuthorization(auth, requirementsWithFrom);
19
+ const verification = await this.verify(signed, requirementsWithFrom);
20
+ if (!verification.isValid) {
21
+ throw new PaymentError(`Payment verification failed: ${verification.invalidReason}`);
22
+ }
23
+ return this.settle(signed, requirementsWithFrom);
24
+ }
25
+ buildAuthorization(requirements, from) {
26
+ const array = new Uint8Array(32);
27
+ crypto.getRandomValues(array);
28
+ const nonce = "0x" + Array.from(array).map((b) => b.toString(16).padStart(2, "0")).join("");
29
+ const now = Math.floor(Date.now() / 1e3);
30
+ return {
31
+ from,
32
+ to: requirements.payTo,
33
+ value: requirements.maxAmountRequired,
34
+ validAfter: now - 60,
35
+ // 60s buffer
36
+ validBefore: now + requirements.maxTimeoutSeconds,
37
+ nonce
38
+ };
39
+ }
40
+ async signAuthorization(authorization, requirements) {
41
+ let chainId;
42
+ const network = requirements.network;
43
+ if (network.startsWith("eip155:")) {
44
+ chainId = parseInt(network.split(":")[1], 10);
45
+ } else {
46
+ chainId = parseInt(network, 10);
47
+ }
48
+ if (isNaN(chainId)) throw new PaymentError("Invalid chain ID");
49
+ const typedData = {
50
+ domain: {
51
+ name: requirements.extra?.name || "x402 Payment Token",
52
+ version: requirements.extra?.version || "1",
53
+ chainId,
54
+ verifyingContract: requirements.asset
55
+ },
56
+ types: {
57
+ TransferWithAuthorization: [
58
+ { name: "from", type: "address" },
59
+ { name: "to", type: "address" },
60
+ { name: "value", type: "uint256" },
61
+ { name: "validAfter", type: "uint256" },
62
+ { name: "validBefore", type: "uint256" },
63
+ { name: "nonce", type: "bytes32" }
64
+ ]
65
+ },
66
+ primaryType: "TransferWithAuthorization",
67
+ message: {
68
+ from: authorization.from,
69
+ to: authorization.to,
70
+ // CRITICAL: viem requires BigInt for uint256 types
71
+ value: BigInt(authorization.value),
72
+ validAfter: BigInt(authorization.validAfter),
73
+ validBefore: BigInt(authorization.validBefore),
74
+ nonce: authorization.nonce
75
+ }
76
+ };
77
+ const signature = await this.wallet.signTypedData(typedData);
78
+ return { ...authorization, signature };
79
+ }
80
+ encodePaymentHeader(signed, requirements) {
81
+ const authorization = {
82
+ from: signed.from,
83
+ to: signed.to,
84
+ value: signed.value,
85
+ nonce: signed.nonce,
86
+ validAfter: signed.validAfter.toString(),
87
+ validBefore: signed.validBefore.toString()
88
+ };
89
+ const accepted = {
90
+ scheme: requirements.scheme,
91
+ network: requirements.network,
92
+ amount: requirements.maxAmountRequired,
93
+ asset: requirements.asset,
94
+ payTo: requirements.payTo,
95
+ maxTimeoutSeconds: requirements.maxTimeoutSeconds
96
+ };
97
+ const paymentPayload = {
98
+ x402Version: 1,
99
+ accepted,
100
+ payload: {
101
+ authorization,
102
+ signature: signed.signature
103
+ }
104
+ };
105
+ const jsonStr = JSON.stringify(paymentPayload);
106
+ const b64Str = btoa(jsonStr);
107
+ return `x402 ${b64Str}`;
108
+ }
109
+ async verify(signed, requirements) {
110
+ const header = this.encodePaymentHeader(signed, requirements);
111
+ return this.http.post("/x402/verify", {
112
+ x402Version: 1,
113
+ paymentHeader: header,
114
+ paymentRequirements: requirements
115
+ }, { skipAuth: true });
116
+ }
117
+ async settle(signed, requirements) {
118
+ const header = this.encodePaymentHeader(signed, requirements);
119
+ return this.http.post("/x402/settle", {
120
+ x402Version: 1,
121
+ paymentHeader: header,
122
+ paymentRequirements: requirements
123
+ }, { skipAuth: true });
124
+ }
125
+ /**
126
+ * Get supported payment schemes from the facilitator.
127
+ * This endpoint does not require authentication.
128
+ */
129
+ async getSupportedSchemes() {
130
+ return this.http.get("/x402/supported", { skipAuth: true });
131
+ }
132
+ };
133
+
134
+ export { PaymentModule };
135
+ //# sourceMappingURL=chunk-VORGSH76.mjs.map
136
+ //# sourceMappingURL=chunk-VORGSH76.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,57 @@
1
+ 'use strict';
2
+
3
+ // src/account/index.ts
4
+ var AccountModule = class {
5
+ constructor(http) {
6
+ this.http = http;
7
+ }
8
+ async get(id) {
9
+ const response = await this.http.get(`/accounts/${id}`);
10
+ return this.mapAccount(response.account);
11
+ }
12
+ async getByWallet(address) {
13
+ const response = await this.list();
14
+ const account = response.find((a) => a.walletAddress.toLowerCase() === address.toLowerCase());
15
+ if (!account) {
16
+ throw new Error("Account not found for wallet");
17
+ }
18
+ return account;
19
+ }
20
+ async list() {
21
+ const response = await this.http.get("/accounts");
22
+ return response.accounts.map(this.mapAccount);
23
+ }
24
+ async create(params) {
25
+ const response = await this.http.post("/accounts", {
26
+ owner_address: params.ownerAddress,
27
+ salt: params.salt
28
+ });
29
+ return {
30
+ account: this.mapAccount(response.account),
31
+ txHash: response.tx_hash
32
+ };
33
+ }
34
+ async predictAddress(params) {
35
+ const response = await this.http.post("/accounts/predict", {
36
+ owner_address: params.ownerAddress,
37
+ salt: params.salt
38
+ });
39
+ return response.wallet_address;
40
+ }
41
+ mapAccount(data) {
42
+ return {
43
+ id: data.id,
44
+ ownerAddress: data.owner_address,
45
+ walletAddress: data.wallet_address,
46
+ status: data.status,
47
+ kycLevel: data.kyc_level ?? 0,
48
+ userId: data.user_id,
49
+ createdAt: data.created_at,
50
+ updatedAt: data.updated_at
51
+ };
52
+ }
53
+ };
54
+
55
+ exports.AccountModule = AccountModule;
56
+ //# sourceMappingURL=chunk-XKQI2VMJ.js.map
57
+ //# sourceMappingURL=chunk-XKQI2VMJ.js.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-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"]}
@@ -0,0 +1,22 @@
1
+ interface HttpClientConfig {
2
+ baseUrl: string;
3
+ timeout?: number;
4
+ retryAttempts?: number;
5
+ getToken?: () => string | null;
6
+ }
7
+ interface RequestOptions extends RequestInit {
8
+ skipAuth?: boolean;
9
+ }
10
+ declare class HttpClient {
11
+ private baseUrl;
12
+ private timeout;
13
+ private retryAttempts;
14
+ private getToken?;
15
+ constructor(config: HttpClientConfig);
16
+ request<T>(path: string, options?: RequestOptions): Promise<T>;
17
+ get<T>(path: string, options?: RequestOptions): Promise<T>;
18
+ post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T>;
19
+ private delay;
20
+ }
21
+
22
+ export { HttpClient as H };
@@ -0,0 +1,22 @@
1
+ interface HttpClientConfig {
2
+ baseUrl: string;
3
+ timeout?: number;
4
+ retryAttempts?: number;
5
+ getToken?: () => string | null;
6
+ }
7
+ interface RequestOptions extends RequestInit {
8
+ skipAuth?: boolean;
9
+ }
10
+ declare class HttpClient {
11
+ private baseUrl;
12
+ private timeout;
13
+ private retryAttempts;
14
+ private getToken?;
15
+ constructor(config: HttpClientConfig);
16
+ request<T>(path: string, options?: RequestOptions): Promise<T>;
17
+ get<T>(path: string, options?: RequestOptions): Promise<T>;
18
+ post<T>(path: string, body?: unknown, options?: RequestOptions): Promise<T>;
19
+ private delay;
20
+ }
21
+
22
+ export { HttpClient as H };
@@ -0,0 +1,35 @@
1
+ import { W as WalletState, d as EIP1193Provider, e as ConnectedWallet, l as EIP712TypedData } from './index-Csrh5-dl.mjs';
2
+
3
+ type Callback<T = any> = (payload: T) => void;
4
+ type Unsubscribe = () => void;
5
+ declare class EventBus {
6
+ private listeners;
7
+ emit<T>(event: string, payload: T): void;
8
+ on<T>(event: string, callback: Callback<T>): Unsubscribe;
9
+ once<T>(event: string, callback: Callback<T>): Unsubscribe;
10
+ off(event: string, callback: Callback): void;
11
+ clear(): void;
12
+ }
13
+
14
+ declare class WalletModule {
15
+ private eventBus;
16
+ private _state;
17
+ private client;
18
+ private chains;
19
+ constructor(eventBus: EventBus);
20
+ get state(): WalletState;
21
+ connect(provider: EIP1193Provider): Promise<ConnectedWallet>;
22
+ disconnect(): Promise<void>;
23
+ getAddress(): string | null;
24
+ getChainId(): number | null;
25
+ isConnected(): boolean;
26
+ signMessage(message: string): Promise<string>;
27
+ signTypedData(typedData: EIP712TypedData): Promise<string>;
28
+ switchChain(chainId: number): Promise<void>;
29
+ onStateChange(callback: (state: WalletState) => void): () => void;
30
+ private updateState;
31
+ private setupListeners;
32
+ private getChain;
33
+ }
34
+
35
+ export { EventBus as E, WalletModule as W };
@@ -0,0 +1,160 @@
1
+ interface UPSConfig {
2
+ baseUrl: string;
3
+ network: string;
4
+ chainId?: number;
5
+ timeout?: number;
6
+ retryAttempts?: number;
7
+ refreshInterval?: number;
8
+ }
9
+ interface AuthState {
10
+ isAuthenticated: boolean;
11
+ token: string | null;
12
+ expiresAt: Date | null;
13
+ address: string | null;
14
+ }
15
+ interface AuthResult {
16
+ token: string;
17
+ expiresAt: string;
18
+ }
19
+ interface User {
20
+ id: string;
21
+ walletAddress: string;
22
+ status: string;
23
+ createdAt: string;
24
+ }
25
+ interface ConnectResult {
26
+ user: User;
27
+ token: string;
28
+ expiresAt: string;
29
+ isNewUser: boolean;
30
+ }
31
+ type EIP1193Provider = {
32
+ request: (args: {
33
+ method: string;
34
+ params?: unknown[];
35
+ }) => Promise<unknown>;
36
+ on?: (event: string, handler: (...args: any[]) => void) => void;
37
+ removeListener?: (event: string, handler: (...args: any[]) => void) => void;
38
+ };
39
+ interface WalletState {
40
+ isConnected: boolean;
41
+ address: string | null;
42
+ chainId: number | null;
43
+ provider: EIP1193Provider | null;
44
+ }
45
+ interface ConnectedWallet {
46
+ address: string;
47
+ chainId: number;
48
+ provider: EIP1193Provider;
49
+ }
50
+ type AccountStatus = 'pending' | 'kyc_in_progress' | 'active' | 'frozen' | 'closed';
51
+ interface Account {
52
+ id: string;
53
+ ownerAddress: string;
54
+ walletAddress: string;
55
+ status: AccountStatus;
56
+ kycLevel: number;
57
+ userId?: string;
58
+ createdAt: string;
59
+ updatedAt?: string;
60
+ }
61
+ interface CreateAccountParams {
62
+ ownerAddress: string;
63
+ salt: string;
64
+ }
65
+ interface CreateAccountResponse {
66
+ account: Account;
67
+ txHash: string;
68
+ }
69
+ interface PaymentRequirements {
70
+ scheme: string;
71
+ network: string;
72
+ maxAmountRequired: string;
73
+ asset: string;
74
+ payTo: string;
75
+ maxTimeoutSeconds: number;
76
+ resource?: string;
77
+ description?: string;
78
+ extra?: PaymentExtra;
79
+ from?: string;
80
+ }
81
+ declare enum PaymentType {
82
+ UNSPECIFIED = "UNSPECIFIED",
83
+ DIRECT = "DIRECT",
84
+ ESCROW = "ESCROW"
85
+ }
86
+ interface PaymentExtra {
87
+ name?: string;
88
+ version?: string;
89
+ payment_type?: PaymentType;
90
+ arbiter?: string;
91
+ release_time?: number;
92
+ payee?: string;
93
+ }
94
+ interface PaymentAuthorization {
95
+ from: string;
96
+ to: string;
97
+ value: string;
98
+ validAfter: number;
99
+ validBefore: number;
100
+ nonce: string;
101
+ }
102
+ interface SignedAuthorization extends PaymentAuthorization {
103
+ signature: string;
104
+ }
105
+ interface VerifyResponse {
106
+ isValid: boolean;
107
+ invalidReason?: string;
108
+ payer?: string;
109
+ }
110
+ interface SettleResponse {
111
+ success: boolean;
112
+ errorReason?: string;
113
+ transaction?: string;
114
+ network?: string;
115
+ payer?: string;
116
+ }
117
+ interface SupportedScheme {
118
+ x402Version: number;
119
+ scheme: string;
120
+ network: string;
121
+ }
122
+ interface SupportedSchemesResponse {
123
+ kinds: SupportedScheme[];
124
+ extensions?: string[];
125
+ signers?: Record<string, string[]>;
126
+ }
127
+ interface EIP712Domain {
128
+ name: string;
129
+ version: string;
130
+ chainId: number;
131
+ verifyingContract: string;
132
+ }
133
+ interface EIP712Type {
134
+ name: string;
135
+ type: string;
136
+ }
137
+ interface EIP712TypedData {
138
+ domain: EIP712Domain;
139
+ types: Record<string, EIP712Type[]>;
140
+ primaryType: string;
141
+ message: Record<string, unknown>;
142
+ }
143
+ interface Escrow {
144
+ escrowId: string;
145
+ payer: string;
146
+ payee: string;
147
+ amount: string;
148
+ arbiter: string;
149
+ releaseTime: number;
150
+ status: EscrowStatus;
151
+ }
152
+ type EscrowStatus = 'ACTIVE' | 'RELEASED' | 'REFUNDED';
153
+ interface EscrowActionResponse {
154
+ success: boolean;
155
+ errorReason?: string;
156
+ transaction?: string;
157
+ network?: string;
158
+ }
159
+
160
+ export { type AuthState as A, type ConnectResult as C, type Escrow as E, type PaymentAuthorization as P, type SettleResponse as S, type User as U, type VerifyResponse as V, type WalletState as W, type AuthResult as a, type EscrowActionResponse as b, type UPSConfig as c, type EIP1193Provider as d, type ConnectedWallet as e, type Account as f, type AccountStatus as g, type CreateAccountParams as h, type CreateAccountResponse as i, type EIP712Domain as j, type EIP712Type as k, type EIP712TypedData as l, type EscrowStatus as m, type PaymentExtra as n, type PaymentRequirements as o, PaymentType as p, type SignedAuthorization as q, type SupportedScheme as r, type SupportedSchemesResponse as s };