facinet 2.2.2 → 2.4.1

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/sdk.mjs CHANGED
@@ -2,27 +2,92 @@
2
2
  import axios from "axios";
3
3
  import { Wallet, JsonRpcProvider } from "ethers";
4
4
  var CHAINS = {
5
- avalanche: {
6
- name: "Avalanche Fuji",
5
+ "avalanche-fuji": {
6
+ name: "avalanche-fuji",
7
+ displayName: "Avalanche Fuji",
7
8
  chainId: 43113,
8
9
  rpcUrl: "https://api.avax-test.network/ext/bc/C/rpc",
9
10
  usdcAddress: "0x5425890298aed601595a70AB815c96711a31Bc65",
11
+ usdcDecimals: 6,
10
12
  gasToken: "AVAX",
11
- blockExplorer: "https://testnet.snowtrace.io"
13
+ blockExplorer: "https://testnet.snowtrace.io",
14
+ erc3009DomainName: "USD Coin",
15
+ erc3009DomainVersion: "2"
16
+ },
17
+ "ethereum-sepolia": {
18
+ name: "ethereum-sepolia",
19
+ displayName: "Ethereum Sepolia",
20
+ chainId: 11155111,
21
+ rpcUrl: "https://ethereum-sepolia-rpc.publicnode.com",
22
+ usdcAddress: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
23
+ usdcDecimals: 6,
24
+ gasToken: "ETH",
25
+ blockExplorer: "https://sepolia.etherscan.io",
26
+ erc3009DomainName: "USDC",
27
+ erc3009DomainVersion: "2"
28
+ },
29
+ "base-sepolia": {
30
+ name: "base-sepolia",
31
+ displayName: "Base Sepolia",
32
+ chainId: 84532,
33
+ rpcUrl: "https://sepolia.base.org",
34
+ usdcAddress: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
35
+ usdcDecimals: 6,
36
+ gasToken: "ETH",
37
+ blockExplorer: "https://sepolia.basescan.org",
38
+ erc3009DomainName: "USDC",
39
+ erc3009DomainVersion: "2"
40
+ },
41
+ "polygon-amoy": {
42
+ name: "polygon-amoy",
43
+ displayName: "Polygon Amoy",
44
+ chainId: 80002,
45
+ rpcUrl: "https://rpc-amoy.polygon.technology",
46
+ usdcAddress: "0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582",
47
+ usdcDecimals: 6,
48
+ gasToken: "MATIC",
49
+ blockExplorer: "https://amoy.polygonscan.com",
50
+ erc3009DomainName: "USDC",
51
+ erc3009DomainVersion: "2"
12
52
  }
13
53
  };
54
+ var NETWORK_ALIASES = {
55
+ "avalanche": "avalanche-fuji",
56
+ "ethereum": "ethereum-sepolia",
57
+ "polygon": "polygon-amoy",
58
+ "base": "base-sepolia"
59
+ };
60
+ var NETWORK_API_URLS = {
61
+ "avalanche-fuji": "https://x402-avalanche-chi.vercel.app",
62
+ "ethereum-sepolia": "https://x402-ethereum-chi.vercel.app",
63
+ "base-sepolia": "https://x402-base-chi.vercel.app",
64
+ "polygon-amoy": "https://x402-polygon-chi.vercel.app"
65
+ };
66
+ function resolveNetwork(network) {
67
+ return NETWORK_ALIASES[network] || network;
68
+ }
69
+ function getApiUrlForNetwork(network, customApiUrl) {
70
+ if (customApiUrl) {
71
+ return customApiUrl.replace(/\/$/, "");
72
+ }
73
+ const resolvedNetwork = resolveNetwork(network);
74
+ return NETWORK_API_URLS[resolvedNetwork] || NETWORK_API_URLS["avalanche-fuji"];
75
+ }
14
76
  var Facinet = class _Facinet {
15
77
  constructor(config = {}) {
16
- const apiUrl = (config.apiUrl || "https://x402-avalanche-chi.vercel.app").replace(/\/$/, "");
78
+ const resolvedNetwork = resolveNetwork(config.network || "avalanche-fuji");
79
+ const apiUrl = getApiUrlForNetwork(resolvedNetwork, config.apiUrl);
17
80
  this.config = {
18
81
  apiUrl,
19
82
  privateKey: config.privateKey || "",
20
- network: config.network || "avalanche",
83
+ network: resolvedNetwork,
21
84
  rpcUrl: config.rpcUrl || ""
22
85
  };
23
- this.chain = CHAINS[this.config.network];
86
+ this.chain = CHAINS[resolvedNetwork];
24
87
  if (!this.chain) {
25
- throw new Error(`Unsupported network: ${this.config.network}`);
88
+ throw new Error(
89
+ `Unsupported network: ${config.network}. Supported networks: ${Object.keys(CHAINS).join(", ")}`
90
+ );
26
91
  }
27
92
  if (this.config.privateKey) {
28
93
  const provider = new JsonRpcProvider(
@@ -31,12 +96,30 @@ var Facinet = class _Facinet {
31
96
  this.wallet = new Wallet(this.config.privateKey, provider);
32
97
  }
33
98
  }
99
+ /**
100
+ * Get the current chain configuration
101
+ */
102
+ getChain() {
103
+ return { ...this.chain };
104
+ }
105
+ /**
106
+ * Get all supported chains
107
+ */
108
+ static getSupportedChains() {
109
+ return Object.values(CHAINS);
110
+ }
111
+ /**
112
+ * Get supported network names
113
+ */
114
+ static getSupportedNetworks() {
115
+ return Object.keys(CHAINS);
116
+ }
34
117
  /**
35
118
  * Make a payment via x402 facilitator network
36
119
  *
37
120
  * @example
38
121
  * ```typescript
39
- * const facinet = new Facinet();
122
+ * const facinet = new Facinet({ network: 'base-sepolia' });
40
123
  * const result = await facinet.pay({
41
124
  * amount: '1',
42
125
  * recipient: '0xMerchantAddress',
@@ -78,8 +161,8 @@ var Facinet = class _Facinet {
78
161
  () => Math.floor(Math.random() * 16).toString(16)
79
162
  ).join("");
80
163
  const domain = {
81
- name: "USD Coin",
82
- version: "2",
164
+ name: this.chain.erc3009DomainName,
165
+ version: this.chain.erc3009DomainVersion,
83
166
  chainId: this.chain.chainId,
84
167
  verifyingContract: this.chain.usdcAddress
85
168
  };
@@ -95,9 +178,7 @@ var Facinet = class _Facinet {
95
178
  };
96
179
  const value = {
97
180
  from: payerAddress,
98
- // Checksummed
99
181
  to: recipientAddress,
100
- // Checksummed - Payment goes to merchant's address!
101
182
  value: amount,
102
183
  validAfter,
103
184
  validBefore,
@@ -116,8 +197,6 @@ var Facinet = class _Facinet {
116
197
  validBefore: validBefore.toString(),
117
198
  nonce
118
199
  };
119
- const hash = TypedDataEncoder.hash(domain, types, messageForSigning);
120
- console.log("\u{1F510} Signing hash:", hash);
121
200
  const typedDataPayload = JSON.stringify({
122
201
  types: {
123
202
  EIP712Domain: [
@@ -136,28 +215,14 @@ var Facinet = class _Facinet {
136
215
  method: "eth_signTypedData_v4",
137
216
  params: [payerAddress, typedDataPayload]
138
217
  });
139
- console.log("\u{1F510} Signature:", signature, "Length:", signature.length);
140
218
  } else {
141
219
  throw new Error("No signing method available");
142
220
  }
143
- console.log("\u{1F4DD} Final authorization:", {
144
- from: payerAddress,
145
- // Checksummed
146
- to: recipientAddress,
147
- // Checksummed
148
- value: amount.toString(),
149
- validAfter: validAfter.toString(),
150
- validBefore: validBefore.toString(),
151
- nonce,
152
- signature: signature?.slice(0, 20) + "..."
153
- });
154
221
  const paymentPayload = {
155
222
  signature,
156
223
  authorization: {
157
224
  from: payerAddress,
158
- // Checksummed
159
225
  to: recipientAddress,
160
- // Checksummed
161
226
  value: amount.toString(),
162
227
  validAfter: validAfter.toString(),
163
228
  validBefore: validBefore.toString(),
@@ -173,21 +238,21 @@ var Facinet = class _Facinet {
173
238
  }
174
239
  );
175
240
  if (!response.data.success) {
176
- throw new Error(response.data.error || response.data.message || "Payment failed");
241
+ throw new Error(
242
+ response.data.error || response.data.message || "Payment failed"
243
+ );
177
244
  }
178
245
  return {
179
246
  success: true,
180
247
  txHash: response.data.txHash,
181
248
  facilitator: {
182
249
  id: facilitator.id,
183
- name: facilitator.name,
250
+ name: facilitator.name || `Facilitator ${facilitator.id.slice(0, 8)}`,
184
251
  wallet: facilitator.facilitatorWallet
185
252
  },
186
253
  payment: {
187
254
  from: payerAddress,
188
- // Checksummed
189
255
  to: recipientAddress,
190
- // Checksummed
191
256
  amount: params.amount,
192
257
  network: this.config.network
193
258
  }
@@ -201,45 +266,75 @@ var Facinet = class _Facinet {
201
266
  }
202
267
  }
203
268
  /**
204
- * Get all active facilitators
269
+ * Get all active facilitators for the current network
205
270
  */
206
271
  async getFacilitators() {
207
- const response = await axios.get(
208
- `${this.config.apiUrl}/api/facilitator/list`
209
- );
210
- if (response.data.success) {
211
- return response.data.facilitators.filter(
212
- (f) => f.status === "active"
272
+ try {
273
+ const response = await axios.get(
274
+ `${this.config.apiUrl}/api/facilitator/list`,
275
+ {
276
+ timeout: 1e4,
277
+ headers: {
278
+ "User-Agent": "Facinet-SDK/2.3.0"
279
+ }
280
+ }
281
+ );
282
+ if (response.data.success && Array.isArray(response.data.facilitators)) {
283
+ return response.data.facilitators.filter((f) => {
284
+ if (f.status !== "active") {
285
+ return false;
286
+ }
287
+ if (f.network) {
288
+ return f.network === this.config.network;
289
+ }
290
+ if (f.chainId !== void 0) {
291
+ return f.chainId === this.chain.chainId;
292
+ }
293
+ return true;
294
+ });
295
+ }
296
+ return [];
297
+ } catch (error) {
298
+ throw new Error(
299
+ `Failed to fetch facilitators for ${this.chain.displayName} (${this.config.network}): ${error.message || "Unknown error"}`
213
300
  );
214
301
  }
215
- return [];
216
302
  }
217
303
  /**
218
- * Select a random active facilitator
304
+ * Select a random active facilitator for the current network
219
305
  */
220
306
  async selectRandomFacilitator() {
221
307
  const facilitators = await this.getFacilitators();
222
308
  if (facilitators.length === 0) {
223
- throw new Error("No active facilitators available");
309
+ throw new Error(
310
+ `No active facilitators available for ${this.chain.displayName} (${this.config.network}, Chain ID: ${this.chain.chainId}). Please check that facilitators are registered for this network. API URL: ${this.config.apiUrl}`
311
+ );
224
312
  }
225
313
  const randomIndex = Math.floor(Math.random() * facilitators.length);
226
- return facilitators[randomIndex];
314
+ const selectedFacilitator = facilitators[randomIndex];
315
+ if (!selectedFacilitator.name) {
316
+ selectedFacilitator.name = `Facilitator ${selectedFacilitator.id.slice(0, 8)}`;
317
+ }
318
+ return selectedFacilitator;
227
319
  }
228
320
  /**
229
321
  * Quick payment helper (static method)
230
322
  *
231
323
  * @example
232
324
  * ```typescript
325
+ * // Pay on Base Sepolia
233
326
  * await Facinet.quickPay({
234
327
  * amount: '1',
235
328
  * recipient: '0xMerchantAddress',
236
- * privateKey: process.env.PRIVATE_KEY
329
+ * privateKey: process.env.PRIVATE_KEY,
330
+ * network: 'base-sepolia'
237
331
  * });
238
332
  * ```
239
333
  */
240
334
  static async quickPay(params) {
241
335
  const facinet = new _Facinet({
242
- privateKey: params.privateKey
336
+ privateKey: params.privateKey,
337
+ network: params.network
243
338
  });
244
339
  return facinet.pay({
245
340
  amount: params.amount,
package/dist/sdk.mjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/sdk/Facinet.ts"],
4
- "sourcesContent": ["/**\n * Facinet SDK - Main Class\n *\n * JavaScript/TypeScript SDK for integrating x402 payments\n */\n\nimport axios from 'axios';\nimport { Wallet, JsonRpcProvider } from 'ethers';\nimport type {\n FacinetConfig,\n PaymentParams,\n PaymentResult,\n Facilitator,\n ChainConfig,\n} from './types';\n\nconst CHAINS: Record<string, ChainConfig> = {\n avalanche: {\n name: 'Avalanche Fuji',\n chainId: 43113,\n rpcUrl: 'https://api.avax-test.network/ext/bc/C/rpc',\n usdcAddress: '0x5425890298aed601595a70AB815c96711a31Bc65',\n gasToken: 'AVAX',\n blockExplorer: 'https://testnet.snowtrace.io',\n },\n};\n\nexport class Facinet {\n private config: Required<FacinetConfig>;\n private chain: ChainConfig;\n private wallet?: Wallet;\n\n constructor(config: FacinetConfig = {}) {\n // Normalize API URL - remove trailing slash\n const apiUrl = (config.apiUrl || 'https://x402-avalanche-chi.vercel.app').replace(/\\/$/, '');\n\n this.config = {\n apiUrl: apiUrl,\n privateKey: config.privateKey || '',\n network: config.network || 'avalanche',\n rpcUrl: config.rpcUrl || '',\n };\n\n this.chain = CHAINS[this.config.network];\n if (!this.chain) {\n throw new Error(`Unsupported network: ${this.config.network}`);\n }\n\n // Initialize wallet if private key provided (Node.js)\n if (this.config.privateKey) {\n const provider = new JsonRpcProvider(\n this.config.rpcUrl || this.chain.rpcUrl\n );\n this.wallet = new Wallet(this.config.privateKey, provider);\n }\n }\n\n /**\n * Make a payment via x402 facilitator network\n *\n * @example\n * ```typescript\n * const facinet = new Facinet();\n * const result = await facinet.pay({\n * amount: '1',\n * recipient: '0xMerchantAddress',\n * payerAddress: '0xCustomerAddress'\n * });\n * console.log('Payment successful!', result.txHash);\n * ```\n */\n async pay(params: PaymentParams): Promise<PaymentResult> {\n // Validate parameters\n if (!params.amount || parseFloat(params.amount) <= 0) {\n throw new Error('Invalid amount');\n }\n\n if (!params.recipient.match(/^0x[a-fA-F0-9]{40}$/)) {\n throw new Error('Invalid recipient address');\n }\n\n // Get payer address\n let payerAddress: string = params.payerAddress || '';\n if (!payerAddress) {\n if (this.wallet) {\n payerAddress = this.wallet.address;\n } else if (typeof window !== 'undefined' && (window as any).ethereum) {\n // Browser - get from MetaMask\n const accounts = await (window as any).ethereum.request({\n method: 'eth_requestAccounts',\n });\n payerAddress = accounts[0];\n } else {\n throw new Error(\n 'No payer address provided and no wallet available. Provide payerAddress or privateKey in config.'\n );\n }\n }\n\n // CRITICAL: Use lowercase addresses for EIP-712 signing (per spec)\n payerAddress = payerAddress.toLowerCase();\n const recipientAddress = params.recipient.toLowerCase();\n\n // Select random facilitator\n const facilitator = await this.selectRandomFacilitator();\n\n // Create ERC-3009 authorization\n const amount = BigInt(parseFloat(params.amount) * 1_000_000); // 6 decimals\n const validAfter = Math.floor(Date.now() / 1000) - 60;\n const validBefore = validAfter + 3600; // 1 hour\n const nonce =\n '0x' +\n Array.from({ length: 64 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join('');\n\n // EIP-712 Domain\n const domain = {\n name: 'USD Coin',\n version: '2',\n chainId: this.chain.chainId,\n verifyingContract: this.chain.usdcAddress,\n };\n\n const 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\n const value = {\n from: payerAddress, // Checksummed\n to: recipientAddress, // Checksummed - Payment goes to merchant's address!\n value: amount,\n validAfter: validAfter,\n validBefore: validBefore,\n nonce: nonce,\n };\n\n // Sign authorization\n let signature: string;\n\n if (this.wallet) {\n // Node.js - sign with wallet (ethers handles BigInt)\n signature = await this.wallet.signTypedData(domain, types, value);\n } else if (typeof window !== 'undefined' && (window as any).ethereum) {\n // Browser - Use ethers to format the typed data EXACTLY like CLI\n const { TypedDataEncoder } = await import('ethers');\n\n // Convert BigInt to string for JSON serialization, but keep structure identical to Node.js\n const messageForSigning = {\n from: payerAddress,\n to: recipientAddress,\n value: amount.toString(),\n validAfter: validAfter.toString(),\n validBefore: validBefore.toString(),\n nonce: nonce,\n };\n\n // Use ethers TypedDataEncoder to get the exact hash\n const hash = TypedDataEncoder.hash(domain, types, messageForSigning);\n\n console.log('\uD83D\uDD10 Signing hash:', hash);\n\n // Create the exact same structure that ethers uses, with EIP712Domain explicitly defined\n const typedDataPayload = JSON.stringify({\n types: {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n TransferWithAuthorization: types.TransferWithAuthorization,\n },\n domain: domain,\n primaryType: 'TransferWithAuthorization',\n message: messageForSigning,\n });\n\n signature = await (window as any).ethereum.request({\n method: 'eth_signTypedData_v4',\n params: [payerAddress, typedDataPayload],\n });\n\n console.log('\uD83D\uDD10 Signature:', signature, 'Length:', signature.length);\n } else {\n throw new Error('No signing method available');\n }\n\n console.log('\uD83D\uDCDD Final authorization:', {\n from: payerAddress, // Checksummed\n to: recipientAddress, // Checksummed\n value: amount.toString(),\n validAfter: validAfter.toString(),\n validBefore: validBefore.toString(),\n nonce: nonce,\n signature: signature?.slice(0, 20) + '...',\n });\n\n // Submit to facilitator\n const paymentPayload = {\n signature,\n authorization: {\n from: payerAddress, // Checksummed\n to: recipientAddress, // Checksummed\n value: amount.toString(),\n validAfter: validAfter.toString(),\n validBefore: validBefore.toString(),\n nonce: nonce,\n },\n };\n\n try {\n const response = await axios.post(\n `${this.config.apiUrl}/api/x402/settle-custom`,\n {\n facilitatorId: facilitator.id,\n paymentPayload: paymentPayload,\n }\n );\n\n if (!response.data.success) {\n throw new Error(response.data.error || response.data.message || 'Payment failed');\n }\n\n return {\n success: true,\n txHash: response.data.txHash,\n facilitator: {\n id: facilitator.id,\n name: facilitator.name,\n wallet: facilitator.facilitatorWallet,\n },\n payment: {\n from: payerAddress, // Checksummed\n to: recipientAddress, // Checksummed\n amount: params.amount,\n network: this.config.network,\n },\n };\n } catch (error: any) {\n // Enhanced error handling with backend error details\n if (error.response?.data) {\n const backendError = error.response.data.message || error.response.data.error;\n throw new Error(`Payment failed: ${backendError}`);\n }\n throw error;\n }\n }\n\n /**\n * Get all active facilitators\n */\n async getFacilitators(): Promise<Facilitator[]> {\n const response = await axios.get(\n `${this.config.apiUrl}/api/facilitator/list`\n );\n\n if (response.data.success) {\n return response.data.facilitators.filter(\n (f: Facilitator) => f.status === 'active'\n );\n }\n\n return [];\n }\n\n /**\n * Select a random active facilitator\n */\n async selectRandomFacilitator(): Promise<Facilitator> {\n const facilitators = await this.getFacilitators();\n\n if (facilitators.length === 0) {\n throw new Error('No active facilitators available');\n }\n\n const randomIndex = Math.floor(Math.random() * facilitators.length);\n return facilitators[randomIndex];\n }\n\n /**\n * Quick payment helper (static method)\n *\n * @example\n * ```typescript\n * await Facinet.quickPay({\n * amount: '1',\n * recipient: '0xMerchantAddress',\n * privateKey: process.env.PRIVATE_KEY\n * });\n * ```\n */\n static async quickPay(\n params: PaymentParams & { privateKey?: string }\n ): Promise<PaymentResult> {\n const facinet = new Facinet({\n privateKey: params.privateKey,\n });\n\n return facinet.pay({\n amount: params.amount,\n recipient: params.recipient,\n payerAddress: params.payerAddress,\n });\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * Facinet SDK - Main Class\n *\n * JavaScript/TypeScript SDK for integrating x402 payments\n * Supports multichain: Avalanche Fuji, Ethereum Sepolia, Base Sepolia, Polygon Amoy\n */\n\nimport axios from 'axios';\nimport { Wallet, JsonRpcProvider } from 'ethers';\nimport type { FacinetConfig, PaymentParams, PaymentResult, Facilitator, ChainConfig } from './types';\n\n// All 4 supported chains\nconst CHAINS: Record<string, ChainConfig> = {\n 'avalanche-fuji': {\n name: 'avalanche-fuji',\n displayName: 'Avalanche Fuji',\n chainId: 43113,\n rpcUrl: 'https://api.avax-test.network/ext/bc/C/rpc',\n usdcAddress: '0x5425890298aed601595a70AB815c96711a31Bc65',\n usdcDecimals: 6,\n gasToken: 'AVAX',\n blockExplorer: 'https://testnet.snowtrace.io',\n erc3009DomainName: 'USD Coin',\n erc3009DomainVersion: '2',\n },\n 'ethereum-sepolia': {\n name: 'ethereum-sepolia',\n displayName: 'Ethereum Sepolia',\n chainId: 11155111,\n rpcUrl: 'https://ethereum-sepolia-rpc.publicnode.com',\n usdcAddress: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n usdcDecimals: 6,\n gasToken: 'ETH',\n blockExplorer: 'https://sepolia.etherscan.io',\n erc3009DomainName: 'USDC',\n erc3009DomainVersion: '2',\n },\n 'base-sepolia': {\n name: 'base-sepolia',\n displayName: 'Base Sepolia',\n chainId: 84532,\n rpcUrl: 'https://sepolia.base.org',\n usdcAddress: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n usdcDecimals: 6,\n gasToken: 'ETH',\n blockExplorer: 'https://sepolia.basescan.org',\n erc3009DomainName: 'USDC',\n erc3009DomainVersion: '2',\n },\n 'polygon-amoy': {\n name: 'polygon-amoy',\n displayName: 'Polygon Amoy',\n chainId: 80002,\n rpcUrl: 'https://rpc-amoy.polygon.technology',\n usdcAddress: '0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582',\n usdcDecimals: 6,\n gasToken: 'MATIC',\n blockExplorer: 'https://amoy.polygonscan.com',\n erc3009DomainName: 'USDC',\n erc3009DomainVersion: '2',\n },\n};\n\n// Legacy aliases for backwards compatibility\nconst NETWORK_ALIASES: Record<string, string> = {\n 'avalanche': 'avalanche-fuji',\n 'ethereum': 'ethereum-sepolia',\n 'polygon': 'polygon-amoy',\n 'base': 'base-sepolia',\n};\n\n// Network-specific API URLs\nconst NETWORK_API_URLS: Record<string, string> = {\n 'avalanche-fuji': 'https://x402-avalanche-chi.vercel.app',\n 'ethereum-sepolia': 'https://x402-ethereum-chi.vercel.app',\n 'base-sepolia': 'https://x402-base-chi.vercel.app',\n 'polygon-amoy': 'https://x402-polygon-chi.vercel.app',\n};\n\n/**\n * Resolve network name (handles legacy aliases)\n */\nfunction resolveNetwork(network: string): string {\n return NETWORK_ALIASES[network] || network;\n}\n\n/**\n * Get API URL for a network\n */\nfunction getApiUrlForNetwork(network: string, customApiUrl?: string): string {\n if (customApiUrl) {\n return customApiUrl.replace(/\\/$/, '');\n }\n const resolvedNetwork = resolveNetwork(network);\n return NETWORK_API_URLS[resolvedNetwork] || NETWORK_API_URLS['avalanche-fuji'];\n}\n\nexport class Facinet {\n private config: Required<Pick<FacinetConfig, 'apiUrl' | 'privateKey' | 'network' | 'rpcUrl'>>;\n private chain: ChainConfig;\n private wallet?: InstanceType<typeof Wallet>;\n\n constructor(config: FacinetConfig = {}) {\n const resolvedNetwork = resolveNetwork(config.network || 'avalanche-fuji');\n const apiUrl = getApiUrlForNetwork(resolvedNetwork, config.apiUrl);\n\n this.config = {\n apiUrl,\n privateKey: config.privateKey || '',\n network: resolvedNetwork as any,\n rpcUrl: config.rpcUrl || '',\n };\n\n this.chain = CHAINS[resolvedNetwork];\n if (!this.chain) {\n throw new Error(\n `Unsupported network: ${config.network}. Supported networks: ${Object.keys(CHAINS).join(', ')}`\n );\n }\n\n if (this.config.privateKey) {\n const provider = new JsonRpcProvider(\n this.config.rpcUrl || this.chain.rpcUrl\n );\n this.wallet = new Wallet(this.config.privateKey, provider);\n }\n }\n\n /**\n * Get the current chain configuration\n */\n getChain(): ChainConfig {\n return { ...this.chain };\n }\n\n /**\n * Get all supported chains\n */\n static getSupportedChains(): ChainConfig[] {\n return Object.values(CHAINS);\n }\n\n /**\n * Get supported network names\n */\n static getSupportedNetworks(): string[] {\n return Object.keys(CHAINS);\n }\n\n /**\n * Make a payment via x402 facilitator network\n *\n * @example\n * ```typescript\n * const facinet = new Facinet({ network: 'base-sepolia' });\n * const result = await facinet.pay({\n * amount: '1',\n * recipient: '0xMerchantAddress',\n * payerAddress: '0xCustomerAddress'\n * });\n * console.log('Payment successful!', result.txHash);\n * ```\n */\n async pay(params: PaymentParams): Promise<PaymentResult> {\n if (!params.amount || parseFloat(params.amount) <= 0) {\n throw new Error('Invalid amount');\n }\n\n if (!params.recipient.match(/^0x[a-fA-F0-9]{40}$/)) {\n throw new Error('Invalid recipient address');\n }\n\n // Resolve payer address\n let payerAddress = params.payerAddress || '';\n if (!payerAddress) {\n if (this.wallet) {\n payerAddress = this.wallet.address as `0x${string}`;\n } else if (typeof window !== 'undefined' && (window as any).ethereum) {\n const accounts = await (window as any).ethereum.request({\n method: 'eth_requestAccounts',\n });\n payerAddress = accounts[0];\n } else {\n throw new Error(\n 'No payer address provided and no wallet available. Provide payerAddress or privateKey in config.'\n );\n }\n }\n\n payerAddress = payerAddress.toLowerCase() as `0x${string}`;\n const recipientAddress = params.recipient.toLowerCase();\n\n // Select random facilitator\n const facilitator = await this.selectRandomFacilitator();\n\n // Create ERC-3009 authorization\n const amount = BigInt(parseFloat(params.amount) * 1e6); // 6 decimals for USDC\n const validAfter = Math.floor(Date.now() / 1000) - 60;\n const validBefore = validAfter + 3600; // 1 hour validity\n const nonce =\n '0x' +\n Array.from({ length: 64 }, () =>\n Math.floor(Math.random() * 16).toString(16)\n ).join('');\n\n // EIP-712 Domain - uses chain-specific domain name\n const domain = {\n name: this.chain.erc3009DomainName,\n version: this.chain.erc3009DomainVersion,\n chainId: this.chain.chainId,\n verifyingContract: this.chain.usdcAddress,\n };\n\n const 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\n const value = {\n from: payerAddress,\n to: recipientAddress,\n value: amount,\n validAfter,\n validBefore,\n nonce,\n };\n\n // Sign the authorization\n let signature: string;\n\n if (this.wallet) {\n signature = await this.wallet.signTypedData(domain, types, value);\n } else if (typeof window !== 'undefined' && (window as any).ethereum) {\n const { TypedDataEncoder } = await import('ethers');\n\n const messageForSigning = {\n from: payerAddress,\n to: recipientAddress,\n value: amount.toString(),\n validAfter: validAfter.toString(),\n validBefore: validBefore.toString(),\n nonce,\n };\n\n const typedDataPayload = JSON.stringify({\n types: {\n EIP712Domain: [\n { name: 'name', type: 'string' },\n { name: 'version', type: 'string' },\n { name: 'chainId', type: 'uint256' },\n { name: 'verifyingContract', type: 'address' },\n ],\n TransferWithAuthorization: types.TransferWithAuthorization,\n },\n domain,\n primaryType: 'TransferWithAuthorization',\n message: messageForSigning,\n });\n\n signature = await (window as any).ethereum.request({\n method: 'eth_signTypedData_v4',\n params: [payerAddress, typedDataPayload],\n });\n } else {\n throw new Error('No signing method available');\n }\n\n // Build payment payload\n const paymentPayload = {\n signature,\n authorization: {\n from: payerAddress,\n to: recipientAddress,\n value: amount.toString(),\n validAfter: validAfter.toString(),\n validBefore: validBefore.toString(),\n nonce,\n },\n };\n\n // Submit to facilitator\n try {\n const response = await axios.post(\n `${this.config.apiUrl}/api/x402/settle-custom`,\n {\n facilitatorId: facilitator.id,\n paymentPayload,\n }\n );\n\n if (!response.data.success) {\n throw new Error(\n response.data.error || response.data.message || 'Payment failed'\n );\n }\n\n return {\n success: true,\n txHash: response.data.txHash,\n facilitator: {\n id: facilitator.id,\n name: facilitator.name || `Facilitator ${facilitator.id.slice(0, 8)}`,\n wallet: facilitator.facilitatorWallet,\n },\n payment: {\n from: payerAddress,\n to: recipientAddress,\n amount: params.amount,\n network: this.config.network,\n },\n };\n } catch (error: any) {\n if (error.response?.data) {\n const backendError =\n error.response.data.message || error.response.data.error;\n throw new Error(`Payment failed: ${backendError}`);\n }\n throw error;\n }\n }\n\n /**\n * Get all active facilitators for the current network\n */\n async getFacilitators(): Promise<Facilitator[]> {\n try {\n const response = await axios.get(\n `${this.config.apiUrl}/api/facilitator/list`,\n {\n timeout: 10000,\n headers: {\n 'User-Agent': 'Facinet-SDK/2.3.0',\n },\n }\n );\n\n if (response.data.success && Array.isArray(response.data.facilitators)) {\n // Filter by status and network/chainId\n return response.data.facilitators.filter((f: Facilitator) => {\n // Must be active\n if (f.status !== 'active') {\n return false;\n }\n \n // If facilitator has network or chainId, match it with current chain\n if (f.network) {\n return f.network === this.config.network;\n }\n \n if (f.chainId !== undefined) {\n return f.chainId === this.chain.chainId;\n }\n \n // If no network/chainId specified, include it (backwards compatibility)\n return true;\n });\n }\n\n return [];\n } catch (error: any) {\n throw new Error(\n `Failed to fetch facilitators for ${this.chain.displayName} (${this.config.network}): ${error.message || 'Unknown error'}`\n );\n }\n }\n\n /**\n * Select a random active facilitator for the current network\n */\n async selectRandomFacilitator(): Promise<Facilitator> {\n const facilitators = await this.getFacilitators();\n\n if (facilitators.length === 0) {\n throw new Error(\n `No active facilitators available for ${this.chain.displayName} (${this.config.network}, Chain ID: ${this.chain.chainId}). ` +\n `Please check that facilitators are registered for this network. API URL: ${this.config.apiUrl}`\n );\n }\n\n const randomIndex = Math.floor(Math.random() * facilitators.length);\n const selectedFacilitator = facilitators[randomIndex];\n \n // Ensure facilitator has a name\n if (!selectedFacilitator.name) {\n selectedFacilitator.name = `Facilitator ${selectedFacilitator.id.slice(0, 8)}`;\n }\n \n return selectedFacilitator;\n }\n\n /**\n * Quick payment helper (static method)\n *\n * @example\n * ```typescript\n * // Pay on Base Sepolia\n * await Facinet.quickPay({\n * amount: '1',\n * recipient: '0xMerchantAddress',\n * privateKey: process.env.PRIVATE_KEY,\n * network: 'base-sepolia'\n * });\n * ```\n */\n static async quickPay(\n params: PaymentParams & { privateKey?: string; network?: FacinetConfig['network'] }\n ): Promise<PaymentResult> {\n const facinet = new Facinet({\n privateKey: params.privateKey,\n network: params.network,\n });\n\n return facinet.pay({\n amount: params.amount,\n recipient: params.recipient,\n payerAddress: params.payerAddress,\n });\n }\n}\n"],
5
+ "mappings": ";AAOA,OAAO,WAAW;AAClB,SAAS,QAAQ,uBAAuB;AAIxC,IAAM,SAAsC;AAAA,EAC1C,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,EACxB;AAAA,EACA,oBAAoB;AAAA,IAClB,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,EACxB;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,EACxB;AAAA,EACA,gBAAgB;AAAA,IACd,MAAM;AAAA,IACN,aAAa;AAAA,IACb,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,sBAAsB;AAAA,EACxB;AACF;AAGA,IAAM,kBAA0C;AAAA,EAC9C,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AACV;AAGA,IAAM,mBAA2C;AAAA,EAC/C,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,gBAAgB;AAClB;AAKA,SAAS,eAAe,SAAyB;AAC/C,SAAO,gBAAgB,OAAO,KAAK;AACrC;AAKA,SAAS,oBAAoB,SAAiB,cAA+B;AAC3E,MAAI,cAAc;AAChB,WAAO,aAAa,QAAQ,OAAO,EAAE;AAAA,EACvC;AACA,QAAM,kBAAkB,eAAe,OAAO;AAC9C,SAAO,iBAAiB,eAAe,KAAK,iBAAiB,gBAAgB;AAC/E;AAEO,IAAM,UAAN,MAAM,SAAQ;AAAA,EAKnB,YAAY,SAAwB,CAAC,GAAG;AACtC,UAAM,kBAAkB,eAAe,OAAO,WAAW,gBAAgB;AACzE,UAAM,SAAS,oBAAoB,iBAAiB,OAAO,MAAM;AAEjE,SAAK,SAAS;AAAA,MACZ;AAAA,MACA,YAAY,OAAO,cAAc;AAAA,MACjC,SAAS;AAAA,MACT,QAAQ,OAAO,UAAU;AAAA,IAC3B;AAEA,SAAK,QAAQ,OAAO,eAAe;AACnC,QAAI,CAAC,KAAK,OAAO;AACf,YAAM,IAAI;AAAA,QACR,wBAAwB,OAAO,OAAO,yBAAyB,OAAO,KAAK,MAAM,EAAE,KAAK,IAAI,CAAC;AAAA,MAC/F;AAAA,IACF;AAEA,QAAI,KAAK,OAAO,YAAY;AAC1B,YAAM,WAAW,IAAI;AAAA,QACnB,KAAK,OAAO,UAAU,KAAK,MAAM;AAAA,MACnC;AACA,WAAK,SAAS,IAAI,OAAO,KAAK,OAAO,YAAY,QAAQ;AAAA,IAC3D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,WAAwB;AACtB,WAAO,EAAE,GAAG,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,qBAAoC;AACzC,WAAO,OAAO,OAAO,MAAM;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO,uBAAiC;AACtC,WAAO,OAAO,KAAK,MAAM;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAM,IAAI,QAA+C;AACvD,QAAI,CAAC,OAAO,UAAU,WAAW,OAAO,MAAM,KAAK,GAAG;AACpD,YAAM,IAAI,MAAM,gBAAgB;AAAA,IAClC;AAEA,QAAI,CAAC,OAAO,UAAU,MAAM,qBAAqB,GAAG;AAClD,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AAGA,QAAI,eAAe,OAAO,gBAAgB;AAC1C,QAAI,CAAC,cAAc;AACjB,UAAI,KAAK,QAAQ;AACf,uBAAe,KAAK,OAAO;AAAA,MAC7B,WAAW,OAAO,WAAW,eAAgB,OAAe,UAAU;AACpE,cAAM,WAAW,MAAO,OAAe,SAAS,QAAQ;AAAA,UACtD,QAAQ;AAAA,QACV,CAAC;AACD,uBAAe,SAAS,CAAC;AAAA,MAC3B,OAAO;AACL,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,mBAAe,aAAa,YAAY;AACxC,UAAM,mBAAmB,OAAO,UAAU,YAAY;AAGtD,UAAM,cAAc,MAAM,KAAK,wBAAwB;AAGvD,UAAM,SAAS,OAAO,WAAW,OAAO,MAAM,IAAI,GAAG;AACrD,UAAM,aAAa,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI;AACnD,UAAM,cAAc,aAAa;AACjC,UAAM,QACJ,OACA,MAAM;AAAA,MAAK,EAAE,QAAQ,GAAG;AAAA,MAAG,MACzB,KAAK,MAAM,KAAK,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE;AAAA,IAC5C,EAAE,KAAK,EAAE;AAGX,UAAM,SAAS;AAAA,MACb,MAAM,KAAK,MAAM;AAAA,MACjB,SAAS,KAAK,MAAM;AAAA,MACpB,SAAS,KAAK,MAAM;AAAA,MACpB,mBAAmB,KAAK,MAAM;AAAA,IAChC;AAEA,UAAM,QAAQ;AAAA,MACZ,2BAA2B;AAAA,QACzB,EAAE,MAAM,QAAQ,MAAM,UAAU;AAAA,QAChC,EAAE,MAAM,MAAM,MAAM,UAAU;AAAA,QAC9B,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,QACjC,EAAE,MAAM,cAAc,MAAM,UAAU;AAAA,QACtC,EAAE,MAAM,eAAe,MAAM,UAAU;AAAA,QACvC,EAAE,MAAM,SAAS,MAAM,UAAU;AAAA,MACnC;AAAA,IACF;AAEA,UAAM,QAAQ;AAAA,MACZ,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,QAAI;AAEJ,QAAI,KAAK,QAAQ;AACf,kBAAY,MAAM,KAAK,OAAO,cAAc,QAAQ,OAAO,KAAK;AAAA,IAClE,WAAW,OAAO,WAAW,eAAgB,OAAe,UAAU;AACpE,YAAM,EAAE,iBAAiB,IAAI,MAAM,OAAO,QAAQ;AAElD,YAAM,oBAAoB;AAAA,QACxB,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO,OAAO,SAAS;AAAA,QACvB,YAAY,WAAW,SAAS;AAAA,QAChC,aAAa,YAAY,SAAS;AAAA,QAClC;AAAA,MACF;AAEA,YAAM,mBAAmB,KAAK,UAAU;AAAA,QACtC,OAAO;AAAA,UACL,cAAc;AAAA,YACZ,EAAE,MAAM,QAAQ,MAAM,SAAS;AAAA,YAC/B,EAAE,MAAM,WAAW,MAAM,SAAS;AAAA,YAClC,EAAE,MAAM,WAAW,MAAM,UAAU;AAAA,YACnC,EAAE,MAAM,qBAAqB,MAAM,UAAU;AAAA,UAC/C;AAAA,UACA,2BAA2B,MAAM;AAAA,QACnC;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb,SAAS;AAAA,MACX,CAAC;AAED,kBAAY,MAAO,OAAe,SAAS,QAAQ;AAAA,QACjD,QAAQ;AAAA,QACR,QAAQ,CAAC,cAAc,gBAAgB;AAAA,MACzC,CAAC;AAAA,IACH,OAAO;AACL,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAGA,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,eAAe;AAAA,QACb,MAAM;AAAA,QACN,IAAI;AAAA,QACJ,OAAO,OAAO,SAAS;AAAA,QACvB,YAAY,WAAW,SAAS;AAAA,QAChC,aAAa,YAAY,SAAS;AAAA,QAClC;AAAA,MACF;AAAA,IACF;AAGA,QAAI;AACF,YAAM,WAAW,MAAM,MAAM;AAAA,QAC3B,GAAG,KAAK,OAAO,MAAM;AAAA,QACrB;AAAA,UACE,eAAe,YAAY;AAAA,UAC3B;AAAA,QACF;AAAA,MACF;AAEA,UAAI,CAAC,SAAS,KAAK,SAAS;AAC1B,cAAM,IAAI;AAAA,UACR,SAAS,KAAK,SAAS,SAAS,KAAK,WAAW;AAAA,QAClD;AAAA,MACF;AAEA,aAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ,SAAS,KAAK;AAAA,QACtB,aAAa;AAAA,UACX,IAAI,YAAY;AAAA,UAChB,MAAM,YAAY,QAAQ,eAAe,YAAY,GAAG,MAAM,GAAG,CAAC,CAAC;AAAA,UACnE,QAAQ,YAAY;AAAA,QACtB;AAAA,QACA,SAAS;AAAA,UACP,MAAM;AAAA,UACN,IAAI;AAAA,UACJ,QAAQ,OAAO;AAAA,UACf,SAAS,KAAK,OAAO;AAAA,QACvB;AAAA,MACF;AAAA,IACF,SAAS,OAAY;AACnB,UAAI,MAAM,UAAU,MAAM;AACxB,cAAM,eACJ,MAAM,SAAS,KAAK,WAAW,MAAM,SAAS,KAAK;AACrD,cAAM,IAAI,MAAM,mBAAmB,YAAY,EAAE;AAAA,MACnD;AACA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,kBAA0C;AAC9C,QAAI;AACF,YAAM,WAAW,MAAM,MAAM;AAAA,QAC3B,GAAG,KAAK,OAAO,MAAM;AAAA,QACrB;AAAA,UACE,SAAS;AAAA,UACT,SAAS;AAAA,YACP,cAAc;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAEA,UAAI,SAAS,KAAK,WAAW,MAAM,QAAQ,SAAS,KAAK,YAAY,GAAG;AAEtE,eAAO,SAAS,KAAK,aAAa,OAAO,CAAC,MAAmB;AAE3D,cAAI,EAAE,WAAW,UAAU;AACzB,mBAAO;AAAA,UACT;AAGA,cAAI,EAAE,SAAS;AACb,mBAAO,EAAE,YAAY,KAAK,OAAO;AAAA,UACnC;AAEA,cAAI,EAAE,YAAY,QAAW;AAC3B,mBAAO,EAAE,YAAY,KAAK,MAAM;AAAA,UAClC;AAGA,iBAAO;AAAA,QACT,CAAC;AAAA,MACH;AAEA,aAAO,CAAC;AAAA,IACV,SAAS,OAAY;AACnB,YAAM,IAAI;AAAA,QACR,oCAAoC,KAAK,MAAM,WAAW,KAAK,KAAK,OAAO,OAAO,MAAM,MAAM,WAAW,eAAe;AAAA,MAC1H;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,0BAAgD;AACpD,UAAM,eAAe,MAAM,KAAK,gBAAgB;AAEhD,QAAI,aAAa,WAAW,GAAG;AAC7B,YAAM,IAAI;AAAA,QACR,wCAAwC,KAAK,MAAM,WAAW,KAAK,KAAK,OAAO,OAAO,eAAe,KAAK,MAAM,OAAO,+EAC3C,KAAK,OAAO,MAAM;AAAA,MAChG;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,MAAM,KAAK,OAAO,IAAI,aAAa,MAAM;AAClE,UAAM,sBAAsB,aAAa,WAAW;AAGpD,QAAI,CAAC,oBAAoB,MAAM;AAC7B,0BAAoB,OAAO,eAAe,oBAAoB,GAAG,MAAM,GAAG,CAAC,CAAC;AAAA,IAC9E;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,aAAa,SACX,QACwB;AACxB,UAAM,UAAU,IAAI,SAAQ;AAAA,MAC1B,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,IAClB,CAAC;AAED,WAAO,QAAQ,IAAI;AAAA,MACjB,QAAQ,OAAO;AAAA,MACf,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,IACvB,CAAC;AAAA,EACH;AACF;",
6
6
  "names": []
7
7
  }
@@ -3,21 +3,18 @@
3
3
  *
4
4
  * Interact with x402 backend APIs
5
5
  */
6
- interface FacilitatorCreatePayload {
7
- name: string;
8
- facilitatorWallet: string;
9
- facilitatorPrivateKey: string;
10
- paymentRecipient: string;
11
- createdBy: string;
12
- }
13
6
  /**
14
7
  * Get all active facilitators
8
+ * @param apiUrl - API URL for the facilitator network
9
+ * @param chainId - Optional chain ID to filter facilitators by network
15
10
  */
16
- export declare function listFacilitators(apiUrl: string): Promise<any[]>;
11
+ export declare function listFacilitators(apiUrl: string, chainId?: number): Promise<any>;
17
12
  /**
18
13
  * Select a random active facilitator
14
+ * @param apiUrl - API URL for the facilitator network
15
+ * @param chainId - Optional chain ID to filter facilitators by network
19
16
  */
20
- export declare function selectRandomFacilitator(apiUrl: string): Promise<any>;
17
+ export declare function selectRandomFacilitator(apiUrl: string, chainId?: number): Promise<any>;
21
18
  /**
22
19
  * Get facilitator by ID
23
20
  */
@@ -29,14 +26,22 @@ export declare function getFacilitatorStatus(apiUrl: string, id: string): Promis
29
26
  /**
30
27
  * Get facilitator balance
31
28
  */
32
- export declare function getFacilitatorBalance(apiUrl: string, id: string): Promise<any>;
29
+ export declare function getFacilitatorBalance(apiUrl: string, id: string): Promise<{
30
+ name: any;
31
+ wallet: any;
32
+ balance: any;
33
+ status: any;
34
+ }>;
33
35
  /**
34
36
  * Create a new facilitator
35
37
  */
36
- export declare function createFacilitator(apiUrl: string, payload: FacilitatorCreatePayload): Promise<any>;
38
+ export declare function createFacilitator(apiUrl: string, payload: any): Promise<void>;
37
39
  /**
38
40
  * Submit payment to facilitator
39
41
  */
40
- export declare function submitPayment(apiUrl: string, facilitatorId: string, paymentPayload: any): Promise<any>;
41
- export {};
42
+ export declare function submitPayment(apiUrl: string, facilitatorId: string, paymentPayload: any): Promise<{
43
+ txHash: any;
44
+ facilitatorWallet: any;
45
+ facilitatorName: any;
46
+ }>;
42
47
  //# sourceMappingURL=api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,UAAU,wBAAwB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;IAC9B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CA4BrE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAS1E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAgBjF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAEnF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAmBpF;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,GAAG,CAAC,CA6Bd;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,GAAG,GAClB,OAAO,CAAC,GAAG,CAAC,CAmBd"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;GAIG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,gBA+BtE;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,gBAmB7E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,gBAclE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,gBAEpE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;;;;;GAkBrE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,iBASnE;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,EACrB,cAAc,EAAE,GAAG;;;;GAmBpB"}
package/dist/utils/api.js CHANGED
@@ -18,44 +18,55 @@ exports.submitPayment = submitPayment;
18
18
  const axios_1 = __importDefault(require("axios"));
19
19
  /**
20
20
  * Get all active facilitators
21
+ * @param apiUrl - API URL for the facilitator network
22
+ * @param chainId - Optional chain ID to filter facilitators by network
21
23
  */
22
- async function listFacilitators(apiUrl) {
24
+ async function listFacilitators(apiUrl, chainId) {
23
25
  try {
24
- console.log(`[DEBUG] Fetching from: ${apiUrl}/api/facilitator/list`);
25
26
  const response = await axios_1.default.get(`${apiUrl}/api/facilitator/list`, {
26
27
  timeout: 10000,
27
28
  headers: {
28
- 'User-Agent': 'Facinet-CLI/1.0.1'
29
- }
29
+ 'User-Agent': 'Facinet-CLI/2.3.0',
30
+ },
30
31
  });
31
- console.log(`[DEBUG] Response status: ${response.status}`);
32
- console.log(`[DEBUG] Response data:`, JSON.stringify(response.data).substring(0, 200));
33
- if (response.data.success) {
34
- // Filter only active facilitators
35
- return response.data.facilitators.filter((f) => f.status === 'active');
32
+ if (response.data.success && Array.isArray(response.data.facilitators)) {
33
+ return response.data.facilitators.filter((f) => {
34
+ // Must be active
35
+ if (f.status !== 'active') {
36
+ return false;
37
+ }
38
+ // If chainId is provided, filter by it
39
+ if (chainId !== undefined && f.chainId !== undefined) {
40
+ return f.chainId === chainId;
41
+ }
42
+ // If facilitator has network property, it should match (handled by SDK)
43
+ return true;
44
+ });
36
45
  }
37
46
  return [];
38
47
  }
39
48
  catch (error) {
40
- console.error(`[DEBUG] Error details:`, {
41
- message: error.message,
42
- code: error.code,
43
- status: error.response?.status,
44
- data: error.response?.data
45
- });
46
- throw new Error(`Failed to fetch facilitators: ${error.message || error.code || 'Unknown error'}`);
49
+ throw new Error(`Failed to fetch facilitators from ${apiUrl}: ${error.message || error.code || 'Unknown error'}`);
47
50
  }
48
51
  }
49
52
  /**
50
53
  * Select a random active facilitator
54
+ * @param apiUrl - API URL for the facilitator network
55
+ * @param chainId - Optional chain ID to filter facilitators by network
51
56
  */
52
- async function selectRandomFacilitator(apiUrl) {
53
- const facilitators = await listFacilitators(apiUrl);
57
+ async function selectRandomFacilitator(apiUrl, chainId) {
58
+ const facilitators = await listFacilitators(apiUrl, chainId);
54
59
  if (facilitators.length === 0) {
55
- throw new Error('No active facilitators available');
60
+ const networkInfo = chainId ? ` (Chain ID: ${chainId})` : '';
61
+ throw new Error(`No active facilitators available${networkInfo}. API URL: ${apiUrl}`);
56
62
  }
57
63
  const randomIndex = Math.floor(Math.random() * facilitators.length);
58
- return facilitators[randomIndex];
64
+ const facilitator = facilitators[randomIndex];
65
+ // Ensure facilitator has a name
66
+ if (!facilitator.name) {
67
+ facilitator.name = `Facilitator ${facilitator.id?.slice(0, 8) || 'Unknown'}`;
68
+ }
69
+ return facilitator;
59
70
  }
60
71
  /**
61
72
  * Get facilitator by ID
@@ -109,26 +120,8 @@ async function getFacilitatorBalance(apiUrl, id) {
109
120
  */
110
121
  async function createFacilitator(apiUrl, payload) {
111
122
  try {
112
- // Note: In real implementation, this would:
113
- // 1. Encrypt private key with user password
114
- // 2. Call payment API to pay registration fee
115
- // 3. Submit facilitator creation request
116
- // For CLI demo, we'll just show what would happen
117
- throw new Error('Facilitator creation requires payment flow. Please use the web interface at ' + apiUrl);
118
- // Actual implementation would be:
119
- /*
120
- const response = await axios.post(`${apiUrl}/api/facilitator/create`, {
121
- name: payload.name,
122
- encryptedPrivateKey: 'encrypted_key',
123
- systemEncryptedKey: 'system_encrypted_key',
124
- facilitatorWallet: payload.facilitatorWallet,
125
- paymentRecipient: payload.paymentRecipient,
126
- createdBy: payload.createdBy,
127
- registrationTxHash: 'tx_hash_from_payment',
128
- });
129
-
130
- return response.data;
131
- */
123
+ throw new Error('Facilitator creation requires payment flow. Please use the web interface at ' +
124
+ apiUrl);
132
125
  }
133
126
  catch (error) {
134
127
  throw new Error(`Failed to create facilitator: ${error.message}`);
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;AASH,4CA+BC;AAOD,0DAmBC;AAKD,gDAcC;AAKD,oDAEC;AAKD,sDAkBC;AAKD,8CASC;AAKD,sCAsBC;AA1JD,kDAA0B;AAE1B;;;;GAIG;AACI,KAAK,UAAU,gBAAgB,CAAC,MAAc,EAAE,OAAgB;IACrE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,MAAM,uBAAuB,EAAE;YACjE,OAAO,EAAE,KAAK;YACd,OAAO,EAAE;gBACP,YAAY,EAAE,mBAAmB;aAClC;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACvE,OAAO,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE;gBAClD,iBAAiB;gBACjB,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC1B,OAAO,KAAK,CAAC;gBACf,CAAC;gBAED,uCAAuC;gBACvC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;oBACrD,OAAO,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;gBAC/B,CAAC;gBAED,wEAAwE;gBACxE,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CACb,qCAAqC,MAAM,KAAK,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,eAAe,EAAE,CACjG,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACI,KAAK,UAAU,uBAAuB,CAAC,MAAc,EAAE,OAAgB;IAC5E,MAAM,YAAY,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE7D,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CACb,mCAAmC,WAAW,cAAc,MAAM,EAAE,CACrE,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpE,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAE9C,gCAAgC;IAChC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACtB,WAAW,CAAC,IAAI,GAAG,eAAe,WAAW,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS,EAAE,CAAC;IAC/E,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,kBAAkB,CAAC,MAAc,EAAE,EAAU;IACjE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,MAAM,uBAAuB,CAAC,CAAC;QACnE,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,WAAW,CAAC;QACrB,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,oBAAoB,CAAC,MAAc,EAAE,EAAU;IACnE,OAAO,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,qBAAqB,CAAC,MAAc,EAAE,EAAU;IACpE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,MAAM,0BAA0B,EAAE;YACrE,aAAa,EAAE,EAAE;SAClB,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO;gBACL,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;gBACxB,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;gBAC5B,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO;gBAC9B,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;aAC7B,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,iBAAiB,CAAC,MAAc,EAAE,OAAY;IAClE,IAAI,CAAC;QACH,MAAM,IAAI,KAAK,CACb,8EAA8E;YAC5E,MAAM,CACT,CAAC;IACJ,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,aAAqB,EACrB,cAAmB;IAEnB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,MAAM,yBAAyB,EAAE;YACpE,aAAa;YACb,cAAc;SACf,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAC1B,OAAO;gBACL,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM;gBAC5B,iBAAiB,EAAE,QAAQ,CAAC,IAAI,CAAC,iBAAiB;gBAClD,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC,eAAe;aAC/C,CAAC;QACJ,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
@@ -3,23 +3,16 @@
3
3
  *
4
4
  * Save and load user configuration
5
5
  */
6
- interface Config {
7
- privateKey?: string;
8
- address?: string;
9
- network?: string;
10
- apiUrl?: string;
11
- }
12
6
  /**
13
7
  * Get configuration
14
8
  */
15
- export declare function getConfig(): Config;
9
+ export declare function getConfig(): Record<string, any>;
16
10
  /**
17
11
  * Save configuration
18
12
  */
19
- export declare function saveConfig(config: Partial<Config>): void;
13
+ export declare function saveConfig(config: Record<string, any>): void;
20
14
  /**
21
15
  * Clear configuration
22
16
  */
23
17
  export declare function clearConfig(): void;
24
- export {};
25
18
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,UAAU,MAAM;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAKD;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAWlC;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAcxD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAQlC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAU/C;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAW5D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,IAAI,CAQlC"}
@@ -36,7 +36,6 @@ function getConfig() {
36
36
  */
37
37
  function saveConfig(config) {
38
38
  try {
39
- // Create config directory if it doesn't exist
40
39
  if (!fs_1.default.existsSync(CONFIG_DIR)) {
41
40
  fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true });
42
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;AAmBH,8BAWC;AAKD,gCAcC;AAKD,kCAQC;AA5DD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AASpB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD;;GAEG;AACH,SAAgB,SAAS;IACvB,IAAI,CAAC;QACH,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,MAAuB;IAChD,IAAI,CAAC;QACH,8CAA8C;QAC9C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,cAAc,GAAG,SAAS,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QAEnD,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,IAAI,CAAC;QACH,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;AAYH,8BAUC;AAKD,gCAWC;AAKD,kCAQC;AAjDD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAEpB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD;;GAEG;AACH,SAAgB,SAAS;IACvB,IAAI,CAAC;QACH,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,IAAI,GAAG,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,UAAU,CAAC,MAA2B;IACpD,IAAI,CAAC;QACH,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,cAAc,GAAG,SAAS,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;QACnD,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iCAAiC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,WAAW;IACzB,IAAI,CAAC;QACH,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,kCAAkC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC"}