@chipi-stack/shared 13.13.0 → 14.1.0

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/index.js CHANGED
@@ -95,9 +95,12 @@ var API_VERSIONING = {
95
95
  VERSION_DATE: "2025-12-30"
96
96
  // Detailed version - sent as query param for tracking
97
97
  };
98
+ var DEFAULT_MAINNET_RPC = "https://starknet-mainnet.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2";
99
+ var DEFAULT_SEPOLIA_RPC = "https://starknet-sepolia.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2";
98
100
  var STARKNET_NETWORKS = {
99
- MAINNET: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
100
- SEPOLIA: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7"
101
+ MAINNET: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,
102
+ MAINNET_FALLBACK: "https://rpc.starknet.lava.build",
103
+ SEPOLIA: process.env.STARKNET_RPC_URL_SEPOLIA ?? DEFAULT_SEPOLIA_RPC
101
104
  };
102
105
  var CONTRACT_ADDRESSES = {
103
106
  USDC_MAINNET: "0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb",
@@ -153,13 +156,39 @@ var CHAIN_TOKEN_TYPES = {
153
156
  OTHER: "OTHER"
154
157
  };
155
158
  var WALLET_CLASS_HASHES = {
156
- CHIPI: "0x53f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a",
157
- // CHIPI: "0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83", // Old class Hash
159
+ CHIPI: "0x053f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a",
160
+ // v29 — must match backend until coordinated v33 upgrade
158
161
  READY: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
159
162
  };
163
+ var LEGACY_CHIPI_CLASS_HASHES = [
164
+ "0x0484bbd2404b3c7264bea271f7267d6d4004821ac7787a9eed7f472e79ef40d1",
165
+ // v33 — wallets created during brief v33 window
166
+ "0x035a2251aca25daba18a5d8950deffa8372a7d84774554e75283cb85552eebc9",
167
+ // v32 — audit 3
168
+ "0x0254f6dd0427319ec614c29e4e3929500d1ba95d0da87ff81d67051ce572667",
169
+ // v31
170
+ "0x072b77b033a874fa1b8f7ff52e18be8fb5ce01a00c59cd184ae15f5b29bc0e57",
171
+ // v30
172
+ "0x02de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83"
173
+ // v28
174
+ ];
175
+ function getWalletTypeFromClassHash(classHash) {
176
+ const normalized = classHash.toLowerCase().replace(/^0x0+/, "0x");
177
+ const normalize = (h) => h.toLowerCase().replace(/^0x0+/, "0x");
178
+ if (normalize(WALLET_CLASS_HASHES.READY) === normalized) {
179
+ return "READY";
180
+ }
181
+ if (normalize(WALLET_CLASS_HASHES.CHIPI) === normalized) {
182
+ return "CHIPI";
183
+ }
184
+ if (LEGACY_CHIPI_CLASS_HASHES.some((h) => normalize(h) === normalized)) {
185
+ return "CHIPI";
186
+ }
187
+ return null;
188
+ }
160
189
  var WALLET_RPC_ENDPOINTS = {
161
- CHIPI: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
162
- READY: "https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7"
190
+ CHIPI: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,
191
+ READY: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC
163
192
  };
164
193
  var PAYMASTER_CONFIG = {
165
194
  URL: "https://paymaster.chipipay.com"
@@ -186,7 +215,9 @@ var SESSION_ERRORS = {
186
215
  /** Failed to decrypt session private key */
187
216
  SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED",
188
217
  /** Failed to create session key */
189
- SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED"
218
+ SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED",
219
+ /** Backend returned an invalid response shape */
220
+ SESSION_INVALID_RESPONSE: "SESSION_INVALID_RESPONSE"
190
221
  };
191
222
  var SESSION_ENTRYPOINTS = {
192
223
  /** Add or update a session key (owner only) */
@@ -236,6 +267,7 @@ var ChipiSessionError = class extends ChipiError {
236
267
  var ChipiSkuError = class extends ChipiError {
237
268
  constructor(message, code = "SKU_ERROR") {
238
269
  super(message, code);
270
+ this.name = "ChipiSkuError";
239
271
  }
240
272
  };
241
273
  var ChipiValidationError = class extends ChipiError {
@@ -250,23 +282,53 @@ var ChipiAuthError = class extends ChipiError {
250
282
  this.name = "ChipiAuthError";
251
283
  }
252
284
  };
285
+ var WalletNotCompatibleError = class extends ChipiWalletError {
286
+ constructor(message) {
287
+ super(message, "WALLET_NOT_COMPATIBLE");
288
+ this.name = "WalletNotCompatibleError";
289
+ }
290
+ };
291
+ var WalletClassHashNotFoundError = class extends ChipiWalletError {
292
+ constructor(walletType) {
293
+ super(
294
+ `No class hash registered for wallet type '${walletType}'. Register it via customWalletTypes in SDK config.`,
295
+ "WALLET_CLASS_HASH_NOT_FOUND"
296
+ );
297
+ this.name = "WalletClassHashNotFoundError";
298
+ }
299
+ };
300
+ var PaymasterIncompatibleError = class extends ChipiError {
301
+ constructor(classHash) {
302
+ super(
303
+ `Wallet class hash ${classHash} is not compatible with Chipi paymaster. Account must implement SNIP-9 (outside_execution_v2).`,
304
+ "PAYMASTER_INCOMPATIBLE",
305
+ 400
306
+ );
307
+ this.name = "PaymasterIncompatibleError";
308
+ }
309
+ };
253
310
  function isChipiError(error) {
254
311
  return error instanceof ChipiError;
255
312
  }
313
+ function hasHttpStatus(error) {
314
+ return typeof error === "object" && error !== null && "status" in error && typeof error.status === "number";
315
+ }
256
316
  function handleApiError(error) {
257
317
  if (isChipiError(error)) {
258
318
  return error;
259
319
  }
260
- if (error?.response?.status) {
320
+ if (typeof error?.response?.status === "number") {
261
321
  const status = error.response.status;
262
322
  const message = error.response.data?.message || error.message || "API request failed";
263
323
  const code = error.response.data?.code || `HTTP_${status}`;
264
324
  return new ChipiApiError(message, code, status);
265
325
  }
266
- return new ChipiError(
267
- error?.message || "An unknown error occurred",
268
- "UNKNOWN_ERROR"
269
- );
326
+ if (error?.status && typeof error.status === "number") {
327
+ const message = error?.message || "API request failed";
328
+ const code = error?.code || `HTTP_${error.status}`;
329
+ return new ChipiApiError(message, code, error.status);
330
+ }
331
+ return new ChipiError(error?.message || "An unknown error occurred", "UNKNOWN_ERROR");
270
332
  }
271
333
 
272
334
  // src/formatters.ts
@@ -320,18 +382,18 @@ var ErrorResponseSchema = zod.z.object({
320
382
  code: zod.z.string().optional(),
321
383
  status: zod.z.number().optional()
322
384
  });
323
- var SuccessResponseSchema = (dataSchema) => zod.z.object({
385
+ var SuccessResponseSchema = (dataSchema) => ApiResponseSchema.extend({
324
386
  data: dataSchema
325
387
  });
326
388
  function validateApiResponse(response, dataSchema) {
327
389
  const result = SuccessResponseSchema(dataSchema).safeParse(response);
328
- if (!result.data) {
390
+ if (!result.success) {
329
391
  throw new Error(`Invalid API response format: ${result.error.message}`);
330
392
  }
331
393
  }
332
394
  function validateErrorResponse(response) {
333
395
  const result = ErrorResponseSchema.safeParse(response);
334
- if (result.data) {
396
+ if (result.success) {
335
397
  return result.data;
336
398
  }
337
399
  return {
@@ -357,7 +419,9 @@ exports.ChipiValidationError = ChipiValidationError;
357
419
  exports.ChipiWalletError = ChipiWalletError;
358
420
  exports.ERRORS = ERRORS;
359
421
  exports.ErrorResponseSchema = ErrorResponseSchema;
422
+ exports.LEGACY_CHIPI_CLASS_HASHES = LEGACY_CHIPI_CLASS_HASHES;
360
423
  exports.PAYMASTER_CONFIG = PAYMASTER_CONFIG;
424
+ exports.PaymasterIncompatibleError = PaymasterIncompatibleError;
361
425
  exports.SERVICE_TYPES = SERVICE_TYPES;
362
426
  exports.SESSION_DEFAULTS = SESSION_DEFAULTS;
363
427
  exports.SESSION_ENTRYPOINTS = SESSION_ENTRYPOINTS;
@@ -368,6 +432,8 @@ exports.SuccessResponseSchema = SuccessResponseSchema;
368
432
  exports.TOKEN_DECIMALS = TOKEN_DECIMALS;
369
433
  exports.WALLET_CLASS_HASHES = WALLET_CLASS_HASHES;
370
434
  exports.WALLET_RPC_ENDPOINTS = WALLET_RPC_ENDPOINTS;
435
+ exports.WalletClassHashNotFoundError = WalletClassHashNotFoundError;
436
+ exports.WalletNotCompatibleError = WalletNotCompatibleError;
371
437
  exports.camelToSnake = camelToSnake;
372
438
  exports.capitalizeFirst = capitalizeFirst;
373
439
  exports.createPaginatedResponse = createPaginatedResponse;
@@ -378,7 +444,9 @@ exports.formatCurrency = formatCurrency;
378
444
  exports.formatDate = formatDate;
379
445
  exports.formatNumber = formatNumber;
380
446
  exports.formatTransactionHash = formatTransactionHash;
447
+ exports.getWalletTypeFromClassHash = getWalletTypeFromClassHash;
381
448
  exports.handleApiError = handleApiError;
449
+ exports.hasHttpStatus = hasHttpStatus;
382
450
  exports.isChipiError = isChipiError;
383
451
  exports.isValidAddress = isValidAddress;
384
452
  exports.isValidApiKey = isValidApiKey;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/index.ts","../src/constants/index.ts","../src/errors.ts","../src/formatters.ts","../src/validation.ts"],"names":["amountBN","z"],"mappings":"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","file":"index.js","sourcesContent":["import type {\n PaginationQuery,\n PaginatedResponse,\n Currency,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"../constants\";\n\n/**\n * Utility functions used across Chipi SDK packages\n */\n\nexport function isValidAddress(address: string): boolean {\n // Validate Starknet address format\n return /^0x[0-9a-fA-F]{1,64}$/.test(address);\n}\n\nexport function isValidApiKey(apiKey: string): boolean {\n // Validate API key format (pk_dev_ or pk_prod_)\n return /^pk_(dev|prod)_[a-zA-Z0-9]{32,}$/.test(apiKey);\n}\n\nexport function formatAmount(amount: string, decimals: number = 18): string {\n // If it's an integer, multiply by 10^decimals\n if (!amount.includes(\".\")) {\n const amountBN = BigInt(amount) * BigInt(10) ** BigInt(decimals);\n return amountBN.toString();\n }\n\n // If it has decimals, handle properly\n const [integerPart, decimalPart = \"\"] = amount.split(\".\");\n const paddedDecimal = decimalPart.padEnd(decimals, \"0\").slice(0, decimals);\n const amountBN = BigInt(integerPart + paddedDecimal);\n\n return amountBN.toString();\n}\n\nexport function parseAmount(amount: string, decimals: number = 18): number {\n const amountBN = BigInt(amount);\n const divisor = BigInt(10) ** BigInt(decimals);\n return Number(amountBN) / Number(divisor);\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: boolean;\n } = {},\n): Promise<T> {\n const { maxAttempts = 3, delay = 1000, backoff = true } = options;\n\n return new Promise((resolve, reject) => {\n let attempt = 0;\n\n const tryFn = async () => {\n try {\n const result = await fn();\n resolve(result);\n } catch (error) {\n attempt++;\n\n if (attempt >= maxAttempts) {\n reject(error);\n return;\n }\n\n const waitTime = backoff ? delay * Math.pow(2, attempt - 1) : delay;\n setTimeout(tryFn, waitTime);\n }\n };\n\n tryFn();\n });\n}\n\nexport function createPaginatedResponse<T>(\n data: T[],\n query: PaginationQuery,\n total: number,\n): PaginatedResponse<T> {\n const page = query.page || 1;\n const limit = query.limit || 10;\n const totalPages = Math.ceil(total / limit);\n\n return {\n data,\n total,\n page,\n limit,\n totalPages,\n };\n}\n\nexport function validatePagination(query: PaginationQuery): {\n page: number;\n limit: number;\n} {\n const page = Math.max(1, query.page || 1);\n const limit = Math.min(100, Math.max(1, query.limit || 10));\n\n return { page, limit };\n}\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.toString();\n } catch (error) {\n throw new Error(`Invalid URL: ${url}`);\n }\n}\n\nexport function deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>,\n): T {\n const result = { ...target };\n\n for (const key in source) {\n if (source[key] !== undefined) {\n const sourceValue = source[key];\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof result[key] === \"object\" &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n result[key] = deepMerge(result[key], sourceValue);\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n","/**\n * Constants used across Chipi SDK packages\n */\n\nimport { WalletType } from \"@chipi-stack/types\";\n\n/**\n * API Versioning\n * - VERSION: Major version for path-based versioning (/v1, /v2, etc.)\n * - VERSION_DATE: Detailed version for tracking breaking changes (YYYY-MM-DD format)\n *\n * Update VERSION_DATE when making API changes.\n * Update VERSION when making major breaking changes (typically 1-2 times per year).\n */\nexport const API_VERSIONING = {\n VERSION: \"1\", // Major version - used in URL path\n VERSION_DATE: \"2025-12-30\", // Detailed version - sent as query param for tracking\n} as const;\n\nexport const STARKNET_NETWORKS = {\n MAINNET: \"https://starknet-mainnet.public.blastapi.io/rpc/v0_7\",\n SEPOLIA: \"https://starknet-sepolia.public.blastapi.io/rpc/v0_7\",\n} as const;\n\nexport const CONTRACT_ADDRESSES = {\n USDC_MAINNET:\n \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\", // Changed to Native USDC (was bridged USDC.e)\n VESU_USDC_MAINNET:\n \"0x017f19582c61479f2fe0b6606300e975c0a8f439102f43eeecc1d0e9b3d84350\",\n} as const;\n\nexport const TOKEN_DECIMALS = {\n USDC: 6,\n USDT: 6,\n ETH: 18,\n STRK: 18,\n DAI: 18,\n} as const;\n\nexport const API_ENDPOINTS = {\n CHIPI_WALLETS: \"/chipi-wallets\",\n TRANSACTIONS: \"/transactions\",\n SKUS: \"/skus\",\n SKU_PURCHASES: \"/sku-purchases\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const ERRORS = {\n INVALID_API_KEY: \"INVALID_API_KEY\",\n WALLET_NOT_FOUND: \"WALLET_NOT_FOUND\",\n INSUFFICIENT_BALANCE: \"INSUFFICIENT_BALANCE\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INVALID_SIGNATURE: \"INVALID_SIGNATURE\",\n SKU_NOT_FOUND: \"SKU_NOT_FOUND\",\n SKU_UNAVAILABLE: \"SKU_UNAVAILABLE\",\n} as const;\n\nexport const SKU_CONTRACTS = {\n RECHARGER_WITH_STRK_MAINNET:\n \"0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7\", //changed contract address used to be 0x0f3\n CHIPI_BILL_SERVICE:\n \"0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b\",\n} as const;\n\n// Service types\nexport const SERVICE_TYPES = {\n BUY_SERVICE: \"BUY_SERVICE\",\n} as const;\n\n// Carrier IDs\nexport const CARRIER_IDS = {\n CHIPI_PAY: \"chipi_pay\",\n} as const;\n\nexport const CHAIN_TYPES = {\n STARKNET: \"STARKNET\",\n} as const;\n\nexport const CHAIN_TOKEN_TYPES = {\n USDC: \"USDC\", // Changed to Native USDC (was bridged USDC.e)\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n\nexport const WALLET_CLASS_HASHES: Record<WalletType, string> = {\n CHIPI: \"0x53f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a\",\n // CHIPI: \"0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\", // Old class Hash\n READY: \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\",\n};\n\n// RPC endpoints per wallet type\nexport const WALLET_RPC_ENDPOINTS: Record<WalletType, string> = {\n CHIPI: \"https://starknet-mainnet.public.blastapi.io/rpc/v0_7\",\n READY: \"https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7\",\n};\n\n// Paymaster configuration\nexport const PAYMASTER_CONFIG = {\n URL: \"https://paymaster.chipipay.com\",\n} as const;\n\n// Session key configuration (CHIPI wallets only - SNIP-9 compatible)\nexport const SESSION_DEFAULTS = {\n /** Default session duration: 6 hours in seconds */\n DURATION_SECONDS: 21600,\n /** Default max calls per session */\n MAX_CALLS: 1000,\n} as const;\n\n// Session-specific error codes\nexport const SESSION_ERRORS = {\n /** Session keys only work with CHIPI wallets */\n INVALID_WALLET_TYPE_FOR_SESSION: \"INVALID_WALLET_TYPE_FOR_SESSION\",\n /** Session has expired (validUntil < now) */\n SESSION_EXPIRED: \"SESSION_EXPIRED\",\n /** Session key not registered on contract */\n SESSION_NOT_REGISTERED: \"SESSION_NOT_REGISTERED\",\n /** Session key has been revoked */\n SESSION_REVOKED: \"SESSION_REVOKED\",\n /** Session has exceeded max calls */\n SESSION_MAX_CALLS_EXCEEDED: \"SESSION_MAX_CALLS_EXCEEDED\",\n /** Entrypoint not allowed for this session */\n SESSION_ENTRYPOINT_NOT_ALLOWED: \"SESSION_ENTRYPOINT_NOT_ALLOWED\",\n /** Failed to decrypt session private key */\n SESSION_DECRYPTION_FAILED: \"SESSION_DECRYPTION_FAILED\",\n /** Failed to create session key */\n SESSION_CREATION_FAILED: \"SESSION_CREATION_FAILED\",\n} as const;\n\n// Session contract entrypoint names\nexport const SESSION_ENTRYPOINTS = {\n /** Add or update a session key (owner only) */\n ADD_OR_UPDATE: \"add_or_update_session_key\",\n /** Revoke a session key (owner only) */\n REVOKE: \"revoke_session_key\",\n /** Query session data (public read) */\n GET_DATA: \"get_session_data\",\n} as const;\n","import type { ErrorWithCode } from '@chipi-stack/types';\n\n/**\n * Error classes and utilities for Chipi SDK\n */\n\nexport class ChipiError extends Error implements ErrorWithCode {\n public readonly code: string;\n public readonly status?: number;\n\n constructor(message: string, code: string, status?: number) {\n super(message);\n this.name = 'ChipiError';\n this.code = code;\n this.status = status;\n \n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ChipiError);\n }\n }\n}\n\nexport class ChipiApiError extends ChipiError {\n constructor(message: string, code: string, status: number) {\n super(message, code, status);\n this.name = 'ChipiApiError';\n }\n}\n\nexport class ChipiWalletError extends ChipiError {\n constructor(message: string, code: string = 'WALLET_ERROR') {\n super(message, code);\n this.name = 'ChipiWalletError';\n }\n}\n\nexport class ChipiTransactionError extends ChipiError {\n constructor(message: string, code: string = 'TRANSACTION_ERROR') {\n super(message, code);\n this.name = 'ChipiTransactionError';\n }\n}\n\nexport class ChipiSessionError extends ChipiError {\n constructor(message: string, code: string = 'SESSION_ERROR') {\n super(message, code);\n this.name = 'ChipiSessionError';\n }\n}\n\nexport class ChipiSkuError extends ChipiError {\n constructor(message: string, code: string = 'SKU_ERROR') {\n super(message, code);\n }\n}\n\nexport class ChipiValidationError extends ChipiError {\n constructor(message: string, code: string = 'VALIDATION_ERROR') {\n super(message, code, 400);\n this.name = 'ChipiValidationError';\n }\n}\n\nexport class ChipiAuthError extends ChipiError {\n constructor(message: string, code: string = 'AUTH_ERROR') {\n super(message, code, 401);\n this.name = 'ChipiAuthError';\n }\n}\n\nexport function isChipiError(error: any): error is ChipiError {\n return error instanceof ChipiError;\n}\n\nexport function handleApiError(error: any): ChipiError {\n if (isChipiError(error)) {\n return error;\n }\n\n if (error?.response?.status) {\n const status = error.response.status;\n const message = error.response.data?.message || error.message || 'API request failed';\n const code = error.response.data?.code || `HTTP_${status}`;\n \n return new ChipiApiError(message, code, status);\n }\n\n return new ChipiError(\n error?.message || 'An unknown error occurred',\n 'UNKNOWN_ERROR'\n );\n}\n","/**\n * Data formatters and transformers for Chipi SDK\n */\n\nexport function formatCurrency(\n amount: number,\n currency: string = 'USD',\n locale: string = 'en-US'\n): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(amount);\n}\n\nexport function formatNumber(\n value: number,\n options: {\n decimals?: number;\n locale?: string;\n compact?: boolean;\n } = {}\n): string {\n const { decimals = 2, locale = 'en-US', compact = false } = options;\n \n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n notation: compact ? 'compact' : 'standard',\n }).format(value);\n}\n\nexport function formatDate(\n date: Date | string,\n options: {\n locale?: string;\n dateStyle?: 'full' | 'long' | 'medium' | 'short';\n timeStyle?: 'full' | 'long' | 'medium' | 'short';\n } = {}\n): string {\n const { locale = 'en-US', dateStyle = 'medium', timeStyle } = options;\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n \n return new Intl.DateTimeFormat(locale, {\n dateStyle,\n timeStyle,\n }).format(dateObj);\n}\n\nexport function formatAddress(address: string, length: number = 8): string {\n if (address.length <= length * 2) {\n return address;\n }\n \n return `${address.slice(0, length)}...${address.slice(-length)}`;\n}\n\nexport function formatTransactionHash(hash: string): string {\n return formatAddress(hash, 6);\n}\n\n\n\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nexport function capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import { z } from \"zod\";\n\n// Base API response schema\nexport const ApiResponseSchema = z.object({\n data: z.unknown(),\n message: z.string().optional(),\n code: z.string().optional(),\n});\n\n// Error response schema\nexport const ErrorResponseSchema = z.object({\n message: z.string(),\n code: z.string().optional(),\n status: z.number().optional(),\n});\n\n// Generic success response schema\nexport const SuccessResponseSchema = <T extends z.ZodTypeAny>(dataSchema: T) =>\n z.object({\n data: dataSchema,\n });\n\n// Type helpers\nexport type ApiResponse<T> = z.infer<\n ReturnType<typeof SuccessResponseSchema<z.ZodType<T>>>\n>;\nexport type ErrorResponse = z.infer<typeof ErrorResponseSchema>;\n\n// Validation functions\n// This is not very good nor useful without passing a data schema\nexport function validateApiResponse<T>(\n response: unknown,\n dataSchema: z.ZodType<T>\n): void {\n // Validate with specific data schema\n const result = SuccessResponseSchema(dataSchema).safeParse(response);\n if (!result.data) {\n throw new Error(`Invalid API response format: ${result.error.message}`);\n }\n}\n\nexport function validateErrorResponse(response: unknown): ErrorResponse {\n const result = ErrorResponseSchema.safeParse(response);\n if (result.data) {\n return result.data;\n }\n\n // Fallback for malformed error responses\n return {\n message: \"Unknown error occurred\",\n code: \"UNKNOWN_ERROR\",\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/index.ts","../src/constants/index.ts","../src/errors.ts","../src/formatters.ts","../src/validation.ts"],"names":["amountBN","z"],"mappings":"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","file":"index.js","sourcesContent":["import type { PaginationQuery, PaginatedResponse, Currency } from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"../constants\";\n\n/**\n * Utility functions used across Chipi SDK packages\n */\n\nexport function isValidAddress(address: string): boolean {\n // Validate Starknet address format\n return /^0x[0-9a-fA-F]{1,64}$/.test(address);\n}\n\nexport function isValidApiKey(apiKey: string): boolean {\n // Validate API key format (pk_dev_ or pk_prod_)\n return /^pk_(dev|prod)_[a-zA-Z0-9]{32,}$/.test(apiKey);\n}\n\nexport function formatAmount(amount: string, decimals: number = 18): string {\n // If it's an integer, multiply by 10^decimals\n if (!amount.includes(\".\")) {\n const amountBN = BigInt(amount) * BigInt(10) ** BigInt(decimals);\n return amountBN.toString();\n }\n\n // If it has decimals, handle properly\n const [integerPart, decimalPart = \"\"] = amount.split(\".\");\n const paddedDecimal = decimalPart.padEnd(decimals, \"0\").slice(0, decimals);\n const amountBN = BigInt(integerPart + paddedDecimal);\n\n return amountBN.toString();\n}\n\nexport function parseAmount(amount: string, decimals: number = 18): number {\n const amountBN = BigInt(amount);\n const divisor = BigInt(10) ** BigInt(decimals);\n return Number(amountBN) / Number(divisor);\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: boolean;\n } = {}\n): Promise<T> {\n const { maxAttempts = 3, delay = 1000, backoff = true } = options;\n\n return new Promise((resolve, reject) => {\n let attempt = 0;\n\n const tryFn = async () => {\n try {\n const result = await fn();\n resolve(result);\n } catch (error) {\n attempt++;\n\n if (attempt >= maxAttempts) {\n reject(error);\n return;\n }\n\n const waitTime = backoff ? delay * Math.pow(2, attempt - 1) : delay;\n setTimeout(tryFn, waitTime);\n }\n };\n\n tryFn();\n });\n}\n\nexport function createPaginatedResponse<T>(\n data: T[],\n query: PaginationQuery,\n total: number\n): PaginatedResponse<T> {\n const page = query.page || 1;\n const limit = query.limit || 10;\n const totalPages = Math.ceil(total / limit);\n\n return {\n data,\n total,\n page,\n limit,\n totalPages,\n };\n}\n\nexport function validatePagination(query: PaginationQuery): {\n page: number;\n limit: number;\n} {\n const page = Math.max(1, query.page || 1);\n const limit = Math.min(100, Math.max(1, query.limit || 10));\n\n return { page, limit };\n}\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.toString();\n } catch (error) {\n throw new Error(`Invalid URL: ${url}`);\n }\n}\n\nexport function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (source[key] !== undefined) {\n const sourceValue = source[key];\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof result[key] === \"object\" &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n result[key] = deepMerge(result[key], sourceValue);\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n","/**\n * Constants used across Chipi SDK packages\n */\n\nimport type { WalletType } from \"@chipi-stack/types\";\n\n/**\n * API Versioning\n * - VERSION: Major version for path-based versioning (/v1, /v2, etc.)\n * - VERSION_DATE: Detailed version for tracking breaking changes (YYYY-MM-DD format)\n *\n * Update VERSION_DATE when making API changes.\n * Update VERSION when making major breaking changes (typically 1-2 times per year).\n */\nexport const API_VERSIONING = {\n VERSION: \"1\", // Major version - used in URL path\n VERSION_DATE: \"2025-12-30\", // Detailed version - sent as query param for tracking\n} as const;\n\n// Default RPC URLs — override via STARKNET_RPC_URL / STARKNET_RPC_URL_SEPOLIA env vars.\nconst DEFAULT_MAINNET_RPC =\n \"https://starknet-mainnet.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2\";\nconst DEFAULT_SEPOLIA_RPC =\n \"https://starknet-sepolia.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2\";\n\nexport const STARKNET_NETWORKS = {\n MAINNET: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n MAINNET_FALLBACK: \"https://rpc.starknet.lava.build\",\n SEPOLIA: process.env.STARKNET_RPC_URL_SEPOLIA ?? DEFAULT_SEPOLIA_RPC,\n} as const;\n\nexport const CONTRACT_ADDRESSES = {\n USDC_MAINNET: \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\", // Changed to Native USDC (was bridged USDC.e)\n VESU_USDC_MAINNET: \"0x017f19582c61479f2fe0b6606300e975c0a8f439102f43eeecc1d0e9b3d84350\",\n} as const;\n\nexport const TOKEN_DECIMALS = {\n USDC: 6,\n USDT: 6,\n ETH: 18,\n STRK: 18,\n DAI: 18,\n} as const;\n\nexport const API_ENDPOINTS = {\n CHIPI_WALLETS: \"/chipi-wallets\",\n TRANSACTIONS: \"/transactions\",\n SKUS: \"/skus\",\n SKU_PURCHASES: \"/sku-purchases\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const ERRORS = {\n INVALID_API_KEY: \"INVALID_API_KEY\",\n WALLET_NOT_FOUND: \"WALLET_NOT_FOUND\",\n INSUFFICIENT_BALANCE: \"INSUFFICIENT_BALANCE\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INVALID_SIGNATURE: \"INVALID_SIGNATURE\",\n SKU_NOT_FOUND: \"SKU_NOT_FOUND\",\n SKU_UNAVAILABLE: \"SKU_UNAVAILABLE\",\n} as const;\n\nexport const SKU_CONTRACTS = {\n RECHARGER_WITH_STRK_MAINNET: \"0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7\", //changed contract address used to be 0x0f3\n CHIPI_BILL_SERVICE: \"0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b\",\n} as const;\n\n// Service types\nexport const SERVICE_TYPES = {\n BUY_SERVICE: \"BUY_SERVICE\",\n} as const;\n\n// Carrier IDs\nexport const CARRIER_IDS = {\n CHIPI_PAY: \"chipi_pay\",\n} as const;\n\nexport const CHAIN_TYPES = {\n STARKNET: \"STARKNET\",\n} as const;\n\nexport const CHAIN_TOKEN_TYPES = {\n USDC: \"USDC\", // Changed to Native USDC (was bridged USDC.e)\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n\nexport const WALLET_CLASS_HASHES: Record<string, string> = {\n CHIPI: \"0x053f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a\", // v29 — must match backend until coordinated v33 upgrade\n READY: \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\",\n};\n\n/**\n * Previous CHIPI wallet class hashes that are still deployed on-chain.\n * Used by getWalletTypeFromClassHash() to identify legacy wallets.\n * Ordered newest → oldest.\n */\nexport const LEGACY_CHIPI_CLASS_HASHES: string[] = [\n \"0x0484bbd2404b3c7264bea271f7267d6d4004821ac7787a9eed7f472e79ef40d1\", // v33 — wallets created during brief v33 window\n \"0x035a2251aca25daba18a5d8950deffa8372a7d84774554e75283cb85552eebc9\", // v32 — audit 3\n \"0x0254f6dd0427319ec614c29e4e3929500d1ba95d0da87ff81d67051ce572667\", // v31\n \"0x072b77b033a874fa1b8f7ff52e18be8fb5ce01a00c59cd184ae15f5b29bc0e57\", // v30\n \"0x02de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\", // v28\n];\n\n/**\n * Determine wallet type from an on-chain class hash.\n * - If it matches the READY hash → READY\n * - If it matches the current CHIPI hash → CHIPI\n * - If it matches a legacy CHIPI hash → CHIPI\n * - Otherwise → null (unknown class hash, caller should handle accordingly)\n */\nexport function getWalletTypeFromClassHash(classHash: string): WalletType | null {\n const normalized = classHash.toLowerCase().replace(/^0x0+/, \"0x\");\n const normalize = (h: string) => h.toLowerCase().replace(/^0x0+/, \"0x\");\n\n if (normalize(WALLET_CLASS_HASHES.READY) === normalized) {\n return \"READY\";\n }\n // Current or legacy CHIPI hashes\n if (normalize(WALLET_CLASS_HASHES.CHIPI) === normalized) {\n return \"CHIPI\";\n }\n if (LEGACY_CHIPI_CLASS_HASHES.some((h) => normalize(h) === normalized)) {\n return \"CHIPI\";\n }\n // Unknown class hash — return null so callers can handle explicitly\n return null;\n}\n\n// RPC endpoints per wallet type — any standard Starknet RPC works for all wallet types.\n// Override via STARKNET_RPC_URL env var; falls back to the default Infura endpoint.\nexport const WALLET_RPC_ENDPOINTS: Record<string, string> = {\n CHIPI: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n READY: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n};\n\n// Paymaster configuration\nexport const PAYMASTER_CONFIG = {\n URL: \"https://paymaster.chipipay.com\",\n} as const;\n\n// Session key configuration (CHIPI wallets only - SNIP-9 compatible)\nexport const SESSION_DEFAULTS = {\n /** Default session duration: 6 hours in seconds */\n DURATION_SECONDS: 21600,\n /** Default max calls per session */\n MAX_CALLS: 1000,\n} as const;\n\n// Session-specific error codes\nexport const SESSION_ERRORS = {\n /** Session keys only work with CHIPI wallets */\n INVALID_WALLET_TYPE_FOR_SESSION: \"INVALID_WALLET_TYPE_FOR_SESSION\",\n /** Session has expired (validUntil < now) */\n SESSION_EXPIRED: \"SESSION_EXPIRED\",\n /** Session key not registered on contract */\n SESSION_NOT_REGISTERED: \"SESSION_NOT_REGISTERED\",\n /** Session key has been revoked */\n SESSION_REVOKED: \"SESSION_REVOKED\",\n /** Session has exceeded max calls */\n SESSION_MAX_CALLS_EXCEEDED: \"SESSION_MAX_CALLS_EXCEEDED\",\n /** Entrypoint not allowed for this session */\n SESSION_ENTRYPOINT_NOT_ALLOWED: \"SESSION_ENTRYPOINT_NOT_ALLOWED\",\n /** Failed to decrypt session private key */\n SESSION_DECRYPTION_FAILED: \"SESSION_DECRYPTION_FAILED\",\n /** Failed to create session key */\n SESSION_CREATION_FAILED: \"SESSION_CREATION_FAILED\",\n /** Backend returned an invalid response shape */\n SESSION_INVALID_RESPONSE: \"SESSION_INVALID_RESPONSE\",\n} as const;\n\n// Session contract entrypoint names\nexport const SESSION_ENTRYPOINTS = {\n /** Add or update a session key (owner only) */\n ADD_OR_UPDATE: \"add_or_update_session_key\",\n /** Revoke a session key (owner only) */\n REVOKE: \"revoke_session_key\",\n /** Query session data (public read) */\n GET_DATA: \"get_session_data\",\n} as const;\n","import type { ErrorWithCode } from \"@chipi-stack/types\";\n\n/**\n * Error classes and utilities for Chipi SDK\n */\n\nexport class ChipiError extends Error implements ErrorWithCode {\n public readonly code: string;\n public readonly status?: number;\n\n constructor(message: string, code: string, status?: number) {\n super(message);\n this.name = \"ChipiError\";\n this.code = code;\n this.status = status;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ChipiError);\n }\n }\n}\n\nexport class ChipiApiError extends ChipiError {\n constructor(message: string, code: string, status: number) {\n super(message, code, status);\n this.name = \"ChipiApiError\";\n }\n}\n\nexport class ChipiWalletError extends ChipiError {\n constructor(message: string, code: string = \"WALLET_ERROR\") {\n super(message, code);\n this.name = \"ChipiWalletError\";\n }\n}\n\nexport class ChipiTransactionError extends ChipiError {\n constructor(message: string, code: string = \"TRANSACTION_ERROR\") {\n super(message, code);\n this.name = \"ChipiTransactionError\";\n }\n}\n\nexport class ChipiSessionError extends ChipiError {\n constructor(message: string, code: string = \"SESSION_ERROR\") {\n super(message, code);\n this.name = \"ChipiSessionError\";\n }\n}\n\nexport class ChipiSkuError extends ChipiError {\n constructor(message: string, code: string = \"SKU_ERROR\") {\n super(message, code);\n this.name = \"ChipiSkuError\";\n }\n}\n\nexport class ChipiValidationError extends ChipiError {\n constructor(message: string, code: string = \"VALIDATION_ERROR\") {\n super(message, code, 400);\n this.name = \"ChipiValidationError\";\n }\n}\n\nexport class ChipiAuthError extends ChipiError {\n constructor(message: string, code: string = \"AUTH_ERROR\") {\n super(message, code, 401);\n this.name = \"ChipiAuthError\";\n }\n}\n\nexport class WalletNotCompatibleError extends ChipiWalletError {\n constructor(message: string) {\n super(message, \"WALLET_NOT_COMPATIBLE\");\n this.name = \"WalletNotCompatibleError\";\n }\n}\n\nexport class WalletClassHashNotFoundError extends ChipiWalletError {\n constructor(walletType: string) {\n super(\n `No class hash registered for wallet type '${walletType}'. Register it via customWalletTypes in SDK config.`,\n \"WALLET_CLASS_HASH_NOT_FOUND\"\n );\n this.name = \"WalletClassHashNotFoundError\";\n }\n}\n\nexport class PaymasterIncompatibleError extends ChipiError {\n constructor(classHash: string) {\n super(\n `Wallet class hash ${classHash} is not compatible with Chipi paymaster. Account must implement SNIP-9 (outside_execution_v2).`,\n \"PAYMASTER_INCOMPATIBLE\",\n 400\n );\n this.name = \"PaymasterIncompatibleError\";\n }\n}\n\nexport function isChipiError(error: unknown): error is ChipiError {\n return error instanceof ChipiError;\n}\n\n/**\n * Type guard to check if an error has an HTTP status property.\n * Useful for retry logic where you need to distinguish API errors\n * (which have status codes) from network errors (which don't).\n */\nexport function hasHttpStatus(error: unknown): error is { status: number } {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"status\" in error &&\n typeof (error as { status: unknown }).status === \"number\"\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleApiError(error: any): ChipiError {\n if (isChipiError(error)) {\n return error;\n }\n\n if (typeof error?.response?.status === \"number\") {\n const status = error.response.status;\n const message = error.response.data?.message || error.message || \"API request failed\";\n const code = error.response.data?.code || `HTTP_${status}`;\n\n return new ChipiApiError(message, code, status);\n }\n\n // Handle errors with direct status property (non-Axios)\n if (error?.status && typeof error.status === \"number\") {\n const message = error?.message || \"API request failed\";\n const code = error?.code || `HTTP_${error.status}`;\n return new ChipiApiError(message, code, error.status);\n }\n\n return new ChipiError(error?.message || \"An unknown error occurred\", \"UNKNOWN_ERROR\");\n}\n","/**\n * Data formatters and transformers for Chipi SDK\n */\n\nexport function formatCurrency(\n amount: number,\n currency: string = \"USD\",\n locale: string = \"en-US\"\n): string {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n }).format(amount);\n}\n\nexport function formatNumber(\n value: number,\n options: {\n decimals?: number;\n locale?: string;\n compact?: boolean;\n } = {}\n): string {\n const { decimals = 2, locale = \"en-US\", compact = false } = options;\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n notation: compact ? \"compact\" : \"standard\",\n }).format(value);\n}\n\nexport function formatDate(\n date: Date | string,\n options: {\n locale?: string;\n dateStyle?: \"full\" | \"long\" | \"medium\" | \"short\";\n timeStyle?: \"full\" | \"long\" | \"medium\" | \"short\";\n } = {}\n): string {\n const { locale = \"en-US\", dateStyle = \"medium\", timeStyle } = options;\n const dateObj = typeof date === \"string\" ? new Date(date) : date;\n\n return new Intl.DateTimeFormat(locale, {\n dateStyle,\n timeStyle,\n }).format(dateObj);\n}\n\nexport function formatAddress(address: string, length: number = 8): string {\n if (address.length <= length * 2) {\n return address;\n }\n\n return `${address.slice(0, length)}...${address.slice(-length)}`;\n}\n\nexport function formatTransactionHash(hash: string): string {\n return formatAddress(hash, 6);\n}\n\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nexport function capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import { z } from \"zod\";\n\n// Base API response schema\nexport const ApiResponseSchema = z.object({\n data: z.unknown(),\n message: z.string().optional(),\n code: z.string().optional(),\n});\n\n// Error response schema\nexport const ErrorResponseSchema = z.object({\n message: z.string(),\n code: z.string().optional(),\n status: z.number().optional(),\n});\n\n// Generic success response schema\nexport const SuccessResponseSchema = <T extends z.ZodTypeAny>(dataSchema: T) =>\n ApiResponseSchema.extend({\n data: dataSchema,\n });\n\n// Type helpers\nexport type ApiResponse<T> = {\n data: T;\n message?: string;\n code?: string;\n};\nexport type ErrorResponse = z.infer<typeof ErrorResponseSchema>;\n\n// Validation functions\n// This is not very good nor useful without passing a data schema\nexport function validateApiResponse<T>(response: unknown, dataSchema: z.ZodType<T>): void {\n // Validate with specific data schema\n const result = SuccessResponseSchema(dataSchema).safeParse(response);\n if (!result.success) {\n throw new Error(`Invalid API response format: ${result.error.message}`);\n }\n}\n\nexport function validateErrorResponse(response: unknown): ErrorResponse {\n const result = ErrorResponseSchema.safeParse(response);\n if (result.success) {\n return result.data;\n }\n\n // Fallback for malformed error responses\n return {\n message: \"Unknown error occurred\",\n code: \"UNKNOWN_ERROR\",\n };\n}\n"]}
package/dist/index.mjs CHANGED
@@ -93,9 +93,12 @@ var API_VERSIONING = {
93
93
  VERSION_DATE: "2025-12-30"
94
94
  // Detailed version - sent as query param for tracking
95
95
  };
96
+ var DEFAULT_MAINNET_RPC = "https://starknet-mainnet.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2";
97
+ var DEFAULT_SEPOLIA_RPC = "https://starknet-sepolia.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2";
96
98
  var STARKNET_NETWORKS = {
97
- MAINNET: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
98
- SEPOLIA: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7"
99
+ MAINNET: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,
100
+ MAINNET_FALLBACK: "https://rpc.starknet.lava.build",
101
+ SEPOLIA: process.env.STARKNET_RPC_URL_SEPOLIA ?? DEFAULT_SEPOLIA_RPC
99
102
  };
100
103
  var CONTRACT_ADDRESSES = {
101
104
  USDC_MAINNET: "0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb",
@@ -151,13 +154,39 @@ var CHAIN_TOKEN_TYPES = {
151
154
  OTHER: "OTHER"
152
155
  };
153
156
  var WALLET_CLASS_HASHES = {
154
- CHIPI: "0x53f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a",
155
- // CHIPI: "0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83", // Old class Hash
157
+ CHIPI: "0x053f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a",
158
+ // v29 — must match backend until coordinated v33 upgrade
156
159
  READY: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
157
160
  };
161
+ var LEGACY_CHIPI_CLASS_HASHES = [
162
+ "0x0484bbd2404b3c7264bea271f7267d6d4004821ac7787a9eed7f472e79ef40d1",
163
+ // v33 — wallets created during brief v33 window
164
+ "0x035a2251aca25daba18a5d8950deffa8372a7d84774554e75283cb85552eebc9",
165
+ // v32 — audit 3
166
+ "0x0254f6dd0427319ec614c29e4e3929500d1ba95d0da87ff81d67051ce572667",
167
+ // v31
168
+ "0x072b77b033a874fa1b8f7ff52e18be8fb5ce01a00c59cd184ae15f5b29bc0e57",
169
+ // v30
170
+ "0x02de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83"
171
+ // v28
172
+ ];
173
+ function getWalletTypeFromClassHash(classHash) {
174
+ const normalized = classHash.toLowerCase().replace(/^0x0+/, "0x");
175
+ const normalize = (h) => h.toLowerCase().replace(/^0x0+/, "0x");
176
+ if (normalize(WALLET_CLASS_HASHES.READY) === normalized) {
177
+ return "READY";
178
+ }
179
+ if (normalize(WALLET_CLASS_HASHES.CHIPI) === normalized) {
180
+ return "CHIPI";
181
+ }
182
+ if (LEGACY_CHIPI_CLASS_HASHES.some((h) => normalize(h) === normalized)) {
183
+ return "CHIPI";
184
+ }
185
+ return null;
186
+ }
158
187
  var WALLET_RPC_ENDPOINTS = {
159
- CHIPI: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
160
- READY: "https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7"
188
+ CHIPI: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,
189
+ READY: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC
161
190
  };
162
191
  var PAYMASTER_CONFIG = {
163
192
  URL: "https://paymaster.chipipay.com"
@@ -184,7 +213,9 @@ var SESSION_ERRORS = {
184
213
  /** Failed to decrypt session private key */
185
214
  SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED",
186
215
  /** Failed to create session key */
187
- SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED"
216
+ SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED",
217
+ /** Backend returned an invalid response shape */
218
+ SESSION_INVALID_RESPONSE: "SESSION_INVALID_RESPONSE"
188
219
  };
189
220
  var SESSION_ENTRYPOINTS = {
190
221
  /** Add or update a session key (owner only) */
@@ -234,6 +265,7 @@ var ChipiSessionError = class extends ChipiError {
234
265
  var ChipiSkuError = class extends ChipiError {
235
266
  constructor(message, code = "SKU_ERROR") {
236
267
  super(message, code);
268
+ this.name = "ChipiSkuError";
237
269
  }
238
270
  };
239
271
  var ChipiValidationError = class extends ChipiError {
@@ -248,23 +280,53 @@ var ChipiAuthError = class extends ChipiError {
248
280
  this.name = "ChipiAuthError";
249
281
  }
250
282
  };
283
+ var WalletNotCompatibleError = class extends ChipiWalletError {
284
+ constructor(message) {
285
+ super(message, "WALLET_NOT_COMPATIBLE");
286
+ this.name = "WalletNotCompatibleError";
287
+ }
288
+ };
289
+ var WalletClassHashNotFoundError = class extends ChipiWalletError {
290
+ constructor(walletType) {
291
+ super(
292
+ `No class hash registered for wallet type '${walletType}'. Register it via customWalletTypes in SDK config.`,
293
+ "WALLET_CLASS_HASH_NOT_FOUND"
294
+ );
295
+ this.name = "WalletClassHashNotFoundError";
296
+ }
297
+ };
298
+ var PaymasterIncompatibleError = class extends ChipiError {
299
+ constructor(classHash) {
300
+ super(
301
+ `Wallet class hash ${classHash} is not compatible with Chipi paymaster. Account must implement SNIP-9 (outside_execution_v2).`,
302
+ "PAYMASTER_INCOMPATIBLE",
303
+ 400
304
+ );
305
+ this.name = "PaymasterIncompatibleError";
306
+ }
307
+ };
251
308
  function isChipiError(error) {
252
309
  return error instanceof ChipiError;
253
310
  }
311
+ function hasHttpStatus(error) {
312
+ return typeof error === "object" && error !== null && "status" in error && typeof error.status === "number";
313
+ }
254
314
  function handleApiError(error) {
255
315
  if (isChipiError(error)) {
256
316
  return error;
257
317
  }
258
- if (error?.response?.status) {
318
+ if (typeof error?.response?.status === "number") {
259
319
  const status = error.response.status;
260
320
  const message = error.response.data?.message || error.message || "API request failed";
261
321
  const code = error.response.data?.code || `HTTP_${status}`;
262
322
  return new ChipiApiError(message, code, status);
263
323
  }
264
- return new ChipiError(
265
- error?.message || "An unknown error occurred",
266
- "UNKNOWN_ERROR"
267
- );
324
+ if (error?.status && typeof error.status === "number") {
325
+ const message = error?.message || "API request failed";
326
+ const code = error?.code || `HTTP_${error.status}`;
327
+ return new ChipiApiError(message, code, error.status);
328
+ }
329
+ return new ChipiError(error?.message || "An unknown error occurred", "UNKNOWN_ERROR");
268
330
  }
269
331
 
270
332
  // src/formatters.ts
@@ -318,18 +380,18 @@ var ErrorResponseSchema = z.object({
318
380
  code: z.string().optional(),
319
381
  status: z.number().optional()
320
382
  });
321
- var SuccessResponseSchema = (dataSchema) => z.object({
383
+ var SuccessResponseSchema = (dataSchema) => ApiResponseSchema.extend({
322
384
  data: dataSchema
323
385
  });
324
386
  function validateApiResponse(response, dataSchema) {
325
387
  const result = SuccessResponseSchema(dataSchema).safeParse(response);
326
- if (!result.data) {
388
+ if (!result.success) {
327
389
  throw new Error(`Invalid API response format: ${result.error.message}`);
328
390
  }
329
391
  }
330
392
  function validateErrorResponse(response) {
331
393
  const result = ErrorResponseSchema.safeParse(response);
332
- if (result.data) {
394
+ if (result.success) {
333
395
  return result.data;
334
396
  }
335
397
  return {
@@ -338,6 +400,6 @@ function validateErrorResponse(response) {
338
400
  };
339
401
  }
340
402
 
341
- export { API_ENDPOINTS, API_VERSIONING, ApiResponseSchema, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ChipiApiError, ChipiAuthError, ChipiError, ChipiSessionError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, ERRORS, ErrorResponseSchema, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, SuccessResponseSchema, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS, camelToSnake, capitalizeFirst, createPaginatedResponse, deepMerge, formatAddress, formatAmount, formatCurrency, formatDate, formatNumber, formatTransactionHash, handleApiError, isChipiError, isValidAddress, isValidApiKey, parseAmount, retry, sanitizeUrl, sleep, snakeToCamel, validateApiResponse, validateErrorResponse, validatePagination };
403
+ export { API_ENDPOINTS, API_VERSIONING, ApiResponseSchema, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ChipiApiError, ChipiAuthError, ChipiError, ChipiSessionError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, ERRORS, ErrorResponseSchema, LEGACY_CHIPI_CLASS_HASHES, PAYMASTER_CONFIG, PaymasterIncompatibleError, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, SuccessResponseSchema, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS, WalletClassHashNotFoundError, WalletNotCompatibleError, camelToSnake, capitalizeFirst, createPaginatedResponse, deepMerge, formatAddress, formatAmount, formatCurrency, formatDate, formatNumber, formatTransactionHash, getWalletTypeFromClassHash, handleApiError, hasHttpStatus, isChipiError, isValidAddress, isValidApiKey, parseAmount, retry, sanitizeUrl, sleep, snakeToCamel, validateApiResponse, validateErrorResponse, validatePagination };
342
404
  //# sourceMappingURL=index.mjs.map
343
405
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/index.ts","../src/constants/index.ts","../src/errors.ts","../src/formatters.ts","../src/validation.ts"],"names":["amountBN"],"mappings":"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","file":"index.mjs","sourcesContent":["import type {\n PaginationQuery,\n PaginatedResponse,\n Currency,\n} from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"../constants\";\n\n/**\n * Utility functions used across Chipi SDK packages\n */\n\nexport function isValidAddress(address: string): boolean {\n // Validate Starknet address format\n return /^0x[0-9a-fA-F]{1,64}$/.test(address);\n}\n\nexport function isValidApiKey(apiKey: string): boolean {\n // Validate API key format (pk_dev_ or pk_prod_)\n return /^pk_(dev|prod)_[a-zA-Z0-9]{32,}$/.test(apiKey);\n}\n\nexport function formatAmount(amount: string, decimals: number = 18): string {\n // If it's an integer, multiply by 10^decimals\n if (!amount.includes(\".\")) {\n const amountBN = BigInt(amount) * BigInt(10) ** BigInt(decimals);\n return amountBN.toString();\n }\n\n // If it has decimals, handle properly\n const [integerPart, decimalPart = \"\"] = amount.split(\".\");\n const paddedDecimal = decimalPart.padEnd(decimals, \"0\").slice(0, decimals);\n const amountBN = BigInt(integerPart + paddedDecimal);\n\n return amountBN.toString();\n}\n\nexport function parseAmount(amount: string, decimals: number = 18): number {\n const amountBN = BigInt(amount);\n const divisor = BigInt(10) ** BigInt(decimals);\n return Number(amountBN) / Number(divisor);\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: boolean;\n } = {},\n): Promise<T> {\n const { maxAttempts = 3, delay = 1000, backoff = true } = options;\n\n return new Promise((resolve, reject) => {\n let attempt = 0;\n\n const tryFn = async () => {\n try {\n const result = await fn();\n resolve(result);\n } catch (error) {\n attempt++;\n\n if (attempt >= maxAttempts) {\n reject(error);\n return;\n }\n\n const waitTime = backoff ? delay * Math.pow(2, attempt - 1) : delay;\n setTimeout(tryFn, waitTime);\n }\n };\n\n tryFn();\n });\n}\n\nexport function createPaginatedResponse<T>(\n data: T[],\n query: PaginationQuery,\n total: number,\n): PaginatedResponse<T> {\n const page = query.page || 1;\n const limit = query.limit || 10;\n const totalPages = Math.ceil(total / limit);\n\n return {\n data,\n total,\n page,\n limit,\n totalPages,\n };\n}\n\nexport function validatePagination(query: PaginationQuery): {\n page: number;\n limit: number;\n} {\n const page = Math.max(1, query.page || 1);\n const limit = Math.min(100, Math.max(1, query.limit || 10));\n\n return { page, limit };\n}\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.toString();\n } catch (error) {\n throw new Error(`Invalid URL: ${url}`);\n }\n}\n\nexport function deepMerge<T extends Record<string, any>>(\n target: T,\n source: Partial<T>,\n): T {\n const result = { ...target };\n\n for (const key in source) {\n if (source[key] !== undefined) {\n const sourceValue = source[key];\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof result[key] === \"object\" &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n result[key] = deepMerge(result[key], sourceValue);\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n","/**\n * Constants used across Chipi SDK packages\n */\n\nimport { WalletType } from \"@chipi-stack/types\";\n\n/**\n * API Versioning\n * - VERSION: Major version for path-based versioning (/v1, /v2, etc.)\n * - VERSION_DATE: Detailed version for tracking breaking changes (YYYY-MM-DD format)\n *\n * Update VERSION_DATE when making API changes.\n * Update VERSION when making major breaking changes (typically 1-2 times per year).\n */\nexport const API_VERSIONING = {\n VERSION: \"1\", // Major version - used in URL path\n VERSION_DATE: \"2025-12-30\", // Detailed version - sent as query param for tracking\n} as const;\n\nexport const STARKNET_NETWORKS = {\n MAINNET: \"https://starknet-mainnet.public.blastapi.io/rpc/v0_7\",\n SEPOLIA: \"https://starknet-sepolia.public.blastapi.io/rpc/v0_7\",\n} as const;\n\nexport const CONTRACT_ADDRESSES = {\n USDC_MAINNET:\n \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\", // Changed to Native USDC (was bridged USDC.e)\n VESU_USDC_MAINNET:\n \"0x017f19582c61479f2fe0b6606300e975c0a8f439102f43eeecc1d0e9b3d84350\",\n} as const;\n\nexport const TOKEN_DECIMALS = {\n USDC: 6,\n USDT: 6,\n ETH: 18,\n STRK: 18,\n DAI: 18,\n} as const;\n\nexport const API_ENDPOINTS = {\n CHIPI_WALLETS: \"/chipi-wallets\",\n TRANSACTIONS: \"/transactions\",\n SKUS: \"/skus\",\n SKU_PURCHASES: \"/sku-purchases\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const ERRORS = {\n INVALID_API_KEY: \"INVALID_API_KEY\",\n WALLET_NOT_FOUND: \"WALLET_NOT_FOUND\",\n INSUFFICIENT_BALANCE: \"INSUFFICIENT_BALANCE\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INVALID_SIGNATURE: \"INVALID_SIGNATURE\",\n SKU_NOT_FOUND: \"SKU_NOT_FOUND\",\n SKU_UNAVAILABLE: \"SKU_UNAVAILABLE\",\n} as const;\n\nexport const SKU_CONTRACTS = {\n RECHARGER_WITH_STRK_MAINNET:\n \"0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7\", //changed contract address used to be 0x0f3\n CHIPI_BILL_SERVICE:\n \"0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b\",\n} as const;\n\n// Service types\nexport const SERVICE_TYPES = {\n BUY_SERVICE: \"BUY_SERVICE\",\n} as const;\n\n// Carrier IDs\nexport const CARRIER_IDS = {\n CHIPI_PAY: \"chipi_pay\",\n} as const;\n\nexport const CHAIN_TYPES = {\n STARKNET: \"STARKNET\",\n} as const;\n\nexport const CHAIN_TOKEN_TYPES = {\n USDC: \"USDC\", // Changed to Native USDC (was bridged USDC.e)\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n\nexport const WALLET_CLASS_HASHES: Record<WalletType, string> = {\n CHIPI: \"0x53f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a\",\n // CHIPI: \"0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\", // Old class Hash\n READY: \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\",\n};\n\n// RPC endpoints per wallet type\nexport const WALLET_RPC_ENDPOINTS: Record<WalletType, string> = {\n CHIPI: \"https://starknet-mainnet.public.blastapi.io/rpc/v0_7\",\n READY: \"https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7\",\n};\n\n// Paymaster configuration\nexport const PAYMASTER_CONFIG = {\n URL: \"https://paymaster.chipipay.com\",\n} as const;\n\n// Session key configuration (CHIPI wallets only - SNIP-9 compatible)\nexport const SESSION_DEFAULTS = {\n /** Default session duration: 6 hours in seconds */\n DURATION_SECONDS: 21600,\n /** Default max calls per session */\n MAX_CALLS: 1000,\n} as const;\n\n// Session-specific error codes\nexport const SESSION_ERRORS = {\n /** Session keys only work with CHIPI wallets */\n INVALID_WALLET_TYPE_FOR_SESSION: \"INVALID_WALLET_TYPE_FOR_SESSION\",\n /** Session has expired (validUntil < now) */\n SESSION_EXPIRED: \"SESSION_EXPIRED\",\n /** Session key not registered on contract */\n SESSION_NOT_REGISTERED: \"SESSION_NOT_REGISTERED\",\n /** Session key has been revoked */\n SESSION_REVOKED: \"SESSION_REVOKED\",\n /** Session has exceeded max calls */\n SESSION_MAX_CALLS_EXCEEDED: \"SESSION_MAX_CALLS_EXCEEDED\",\n /** Entrypoint not allowed for this session */\n SESSION_ENTRYPOINT_NOT_ALLOWED: \"SESSION_ENTRYPOINT_NOT_ALLOWED\",\n /** Failed to decrypt session private key */\n SESSION_DECRYPTION_FAILED: \"SESSION_DECRYPTION_FAILED\",\n /** Failed to create session key */\n SESSION_CREATION_FAILED: \"SESSION_CREATION_FAILED\",\n} as const;\n\n// Session contract entrypoint names\nexport const SESSION_ENTRYPOINTS = {\n /** Add or update a session key (owner only) */\n ADD_OR_UPDATE: \"add_or_update_session_key\",\n /** Revoke a session key (owner only) */\n REVOKE: \"revoke_session_key\",\n /** Query session data (public read) */\n GET_DATA: \"get_session_data\",\n} as const;\n","import type { ErrorWithCode } from '@chipi-stack/types';\n\n/**\n * Error classes and utilities for Chipi SDK\n */\n\nexport class ChipiError extends Error implements ErrorWithCode {\n public readonly code: string;\n public readonly status?: number;\n\n constructor(message: string, code: string, status?: number) {\n super(message);\n this.name = 'ChipiError';\n this.code = code;\n this.status = status;\n \n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ChipiError);\n }\n }\n}\n\nexport class ChipiApiError extends ChipiError {\n constructor(message: string, code: string, status: number) {\n super(message, code, status);\n this.name = 'ChipiApiError';\n }\n}\n\nexport class ChipiWalletError extends ChipiError {\n constructor(message: string, code: string = 'WALLET_ERROR') {\n super(message, code);\n this.name = 'ChipiWalletError';\n }\n}\n\nexport class ChipiTransactionError extends ChipiError {\n constructor(message: string, code: string = 'TRANSACTION_ERROR') {\n super(message, code);\n this.name = 'ChipiTransactionError';\n }\n}\n\nexport class ChipiSessionError extends ChipiError {\n constructor(message: string, code: string = 'SESSION_ERROR') {\n super(message, code);\n this.name = 'ChipiSessionError';\n }\n}\n\nexport class ChipiSkuError extends ChipiError {\n constructor(message: string, code: string = 'SKU_ERROR') {\n super(message, code);\n }\n}\n\nexport class ChipiValidationError extends ChipiError {\n constructor(message: string, code: string = 'VALIDATION_ERROR') {\n super(message, code, 400);\n this.name = 'ChipiValidationError';\n }\n}\n\nexport class ChipiAuthError extends ChipiError {\n constructor(message: string, code: string = 'AUTH_ERROR') {\n super(message, code, 401);\n this.name = 'ChipiAuthError';\n }\n}\n\nexport function isChipiError(error: any): error is ChipiError {\n return error instanceof ChipiError;\n}\n\nexport function handleApiError(error: any): ChipiError {\n if (isChipiError(error)) {\n return error;\n }\n\n if (error?.response?.status) {\n const status = error.response.status;\n const message = error.response.data?.message || error.message || 'API request failed';\n const code = error.response.data?.code || `HTTP_${status}`;\n \n return new ChipiApiError(message, code, status);\n }\n\n return new ChipiError(\n error?.message || 'An unknown error occurred',\n 'UNKNOWN_ERROR'\n );\n}\n","/**\n * Data formatters and transformers for Chipi SDK\n */\n\nexport function formatCurrency(\n amount: number,\n currency: string = 'USD',\n locale: string = 'en-US'\n): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(amount);\n}\n\nexport function formatNumber(\n value: number,\n options: {\n decimals?: number;\n locale?: string;\n compact?: boolean;\n } = {}\n): string {\n const { decimals = 2, locale = 'en-US', compact = false } = options;\n \n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n notation: compact ? 'compact' : 'standard',\n }).format(value);\n}\n\nexport function formatDate(\n date: Date | string,\n options: {\n locale?: string;\n dateStyle?: 'full' | 'long' | 'medium' | 'short';\n timeStyle?: 'full' | 'long' | 'medium' | 'short';\n } = {}\n): string {\n const { locale = 'en-US', dateStyle = 'medium', timeStyle } = options;\n const dateObj = typeof date === 'string' ? new Date(date) : date;\n \n return new Intl.DateTimeFormat(locale, {\n dateStyle,\n timeStyle,\n }).format(dateObj);\n}\n\nexport function formatAddress(address: string, length: number = 8): string {\n if (address.length <= length * 2) {\n return address;\n }\n \n return `${address.slice(0, length)}...${address.slice(-length)}`;\n}\n\nexport function formatTransactionHash(hash: string): string {\n return formatAddress(hash, 6);\n}\n\n\n\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);\n}\n\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nexport function capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import { z } from \"zod\";\n\n// Base API response schema\nexport const ApiResponseSchema = z.object({\n data: z.unknown(),\n message: z.string().optional(),\n code: z.string().optional(),\n});\n\n// Error response schema\nexport const ErrorResponseSchema = z.object({\n message: z.string(),\n code: z.string().optional(),\n status: z.number().optional(),\n});\n\n// Generic success response schema\nexport const SuccessResponseSchema = <T extends z.ZodTypeAny>(dataSchema: T) =>\n z.object({\n data: dataSchema,\n });\n\n// Type helpers\nexport type ApiResponse<T> = z.infer<\n ReturnType<typeof SuccessResponseSchema<z.ZodType<T>>>\n>;\nexport type ErrorResponse = z.infer<typeof ErrorResponseSchema>;\n\n// Validation functions\n// This is not very good nor useful without passing a data schema\nexport function validateApiResponse<T>(\n response: unknown,\n dataSchema: z.ZodType<T>\n): void {\n // Validate with specific data schema\n const result = SuccessResponseSchema(dataSchema).safeParse(response);\n if (!result.data) {\n throw new Error(`Invalid API response format: ${result.error.message}`);\n }\n}\n\nexport function validateErrorResponse(response: unknown): ErrorResponse {\n const result = ErrorResponseSchema.safeParse(response);\n if (result.data) {\n return result.data;\n }\n\n // Fallback for malformed error responses\n return {\n message: \"Unknown error occurred\",\n code: \"UNKNOWN_ERROR\",\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/index.ts","../src/constants/index.ts","../src/errors.ts","../src/formatters.ts","../src/validation.ts"],"names":["amountBN"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { PaginationQuery, PaginatedResponse, Currency } from \"@chipi-stack/types\";\nimport { API_ENDPOINTS } from \"../constants\";\n\n/**\n * Utility functions used across Chipi SDK packages\n */\n\nexport function isValidAddress(address: string): boolean {\n // Validate Starknet address format\n return /^0x[0-9a-fA-F]{1,64}$/.test(address);\n}\n\nexport function isValidApiKey(apiKey: string): boolean {\n // Validate API key format (pk_dev_ or pk_prod_)\n return /^pk_(dev|prod)_[a-zA-Z0-9]{32,}$/.test(apiKey);\n}\n\nexport function formatAmount(amount: string, decimals: number = 18): string {\n // If it's an integer, multiply by 10^decimals\n if (!amount.includes(\".\")) {\n const amountBN = BigInt(amount) * BigInt(10) ** BigInt(decimals);\n return amountBN.toString();\n }\n\n // If it has decimals, handle properly\n const [integerPart, decimalPart = \"\"] = amount.split(\".\");\n const paddedDecimal = decimalPart.padEnd(decimals, \"0\").slice(0, decimals);\n const amountBN = BigInt(integerPart + paddedDecimal);\n\n return amountBN.toString();\n}\n\nexport function parseAmount(amount: string, decimals: number = 18): number {\n const amountBN = BigInt(amount);\n const divisor = BigInt(10) ** BigInt(decimals);\n return Number(amountBN) / Number(divisor);\n}\n\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n delay?: number;\n backoff?: boolean;\n } = {}\n): Promise<T> {\n const { maxAttempts = 3, delay = 1000, backoff = true } = options;\n\n return new Promise((resolve, reject) => {\n let attempt = 0;\n\n const tryFn = async () => {\n try {\n const result = await fn();\n resolve(result);\n } catch (error) {\n attempt++;\n\n if (attempt >= maxAttempts) {\n reject(error);\n return;\n }\n\n const waitTime = backoff ? delay * Math.pow(2, attempt - 1) : delay;\n setTimeout(tryFn, waitTime);\n }\n };\n\n tryFn();\n });\n}\n\nexport function createPaginatedResponse<T>(\n data: T[],\n query: PaginationQuery,\n total: number\n): PaginatedResponse<T> {\n const page = query.page || 1;\n const limit = query.limit || 10;\n const totalPages = Math.ceil(total / limit);\n\n return {\n data,\n total,\n page,\n limit,\n totalPages,\n };\n}\n\nexport function validatePagination(query: PaginationQuery): {\n page: number;\n limit: number;\n} {\n const page = Math.max(1, query.page || 1);\n const limit = Math.min(100, Math.max(1, query.limit || 10));\n\n return { page, limit };\n}\n\nexport function sanitizeUrl(url: string): string {\n try {\n const parsed = new URL(url);\n return parsed.toString();\n } catch (error) {\n throw new Error(`Invalid URL: ${url}`);\n }\n}\n\nexport function deepMerge<T extends Record<string, any>>(target: T, source: Partial<T>): T {\n const result = { ...target };\n\n for (const key in source) {\n if (source[key] !== undefined) {\n const sourceValue = source[key];\n if (\n typeof sourceValue === \"object\" &&\n sourceValue !== null &&\n !Array.isArray(sourceValue) &&\n typeof result[key] === \"object\" &&\n result[key] !== null &&\n !Array.isArray(result[key])\n ) {\n result[key] = deepMerge(result[key], sourceValue);\n } else {\n result[key] = sourceValue as T[Extract<keyof T, string>];\n }\n }\n }\n\n return result;\n}\n","/**\n * Constants used across Chipi SDK packages\n */\n\nimport type { WalletType } from \"@chipi-stack/types\";\n\n/**\n * API Versioning\n * - VERSION: Major version for path-based versioning (/v1, /v2, etc.)\n * - VERSION_DATE: Detailed version for tracking breaking changes (YYYY-MM-DD format)\n *\n * Update VERSION_DATE when making API changes.\n * Update VERSION when making major breaking changes (typically 1-2 times per year).\n */\nexport const API_VERSIONING = {\n VERSION: \"1\", // Major version - used in URL path\n VERSION_DATE: \"2025-12-30\", // Detailed version - sent as query param for tracking\n} as const;\n\n// Default RPC URLs — override via STARKNET_RPC_URL / STARKNET_RPC_URL_SEPOLIA env vars.\nconst DEFAULT_MAINNET_RPC =\n \"https://starknet-mainnet.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2\";\nconst DEFAULT_SEPOLIA_RPC =\n \"https://starknet-sepolia.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2\";\n\nexport const STARKNET_NETWORKS = {\n MAINNET: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n MAINNET_FALLBACK: \"https://rpc.starknet.lava.build\",\n SEPOLIA: process.env.STARKNET_RPC_URL_SEPOLIA ?? DEFAULT_SEPOLIA_RPC,\n} as const;\n\nexport const CONTRACT_ADDRESSES = {\n USDC_MAINNET: \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\", // Changed to Native USDC (was bridged USDC.e)\n VESU_USDC_MAINNET: \"0x017f19582c61479f2fe0b6606300e975c0a8f439102f43eeecc1d0e9b3d84350\",\n} as const;\n\nexport const TOKEN_DECIMALS = {\n USDC: 6,\n USDT: 6,\n ETH: 18,\n STRK: 18,\n DAI: 18,\n} as const;\n\nexport const API_ENDPOINTS = {\n CHIPI_WALLETS: \"/chipi-wallets\",\n TRANSACTIONS: \"/transactions\",\n SKUS: \"/skus\",\n SKU_PURCHASES: \"/sku-purchases\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const ERRORS = {\n INVALID_API_KEY: \"INVALID_API_KEY\",\n WALLET_NOT_FOUND: \"WALLET_NOT_FOUND\",\n INSUFFICIENT_BALANCE: \"INSUFFICIENT_BALANCE\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INVALID_SIGNATURE: \"INVALID_SIGNATURE\",\n SKU_NOT_FOUND: \"SKU_NOT_FOUND\",\n SKU_UNAVAILABLE: \"SKU_UNAVAILABLE\",\n} as const;\n\nexport const SKU_CONTRACTS = {\n RECHARGER_WITH_STRK_MAINNET: \"0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7\", //changed contract address used to be 0x0f3\n CHIPI_BILL_SERVICE: \"0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b\",\n} as const;\n\n// Service types\nexport const SERVICE_TYPES = {\n BUY_SERVICE: \"BUY_SERVICE\",\n} as const;\n\n// Carrier IDs\nexport const CARRIER_IDS = {\n CHIPI_PAY: \"chipi_pay\",\n} as const;\n\nexport const CHAIN_TYPES = {\n STARKNET: \"STARKNET\",\n} as const;\n\nexport const CHAIN_TOKEN_TYPES = {\n USDC: \"USDC\", // Changed to Native USDC (was bridged USDC.e)\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n\nexport const WALLET_CLASS_HASHES: Record<string, string> = {\n CHIPI: \"0x053f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a\", // v29 — must match backend until coordinated v33 upgrade\n READY: \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\",\n};\n\n/**\n * Previous CHIPI wallet class hashes that are still deployed on-chain.\n * Used by getWalletTypeFromClassHash() to identify legacy wallets.\n * Ordered newest → oldest.\n */\nexport const LEGACY_CHIPI_CLASS_HASHES: string[] = [\n \"0x0484bbd2404b3c7264bea271f7267d6d4004821ac7787a9eed7f472e79ef40d1\", // v33 — wallets created during brief v33 window\n \"0x035a2251aca25daba18a5d8950deffa8372a7d84774554e75283cb85552eebc9\", // v32 — audit 3\n \"0x0254f6dd0427319ec614c29e4e3929500d1ba95d0da87ff81d67051ce572667\", // v31\n \"0x072b77b033a874fa1b8f7ff52e18be8fb5ce01a00c59cd184ae15f5b29bc0e57\", // v30\n \"0x02de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\", // v28\n];\n\n/**\n * Determine wallet type from an on-chain class hash.\n * - If it matches the READY hash → READY\n * - If it matches the current CHIPI hash → CHIPI\n * - If it matches a legacy CHIPI hash → CHIPI\n * - Otherwise → null (unknown class hash, caller should handle accordingly)\n */\nexport function getWalletTypeFromClassHash(classHash: string): WalletType | null {\n const normalized = classHash.toLowerCase().replace(/^0x0+/, \"0x\");\n const normalize = (h: string) => h.toLowerCase().replace(/^0x0+/, \"0x\");\n\n if (normalize(WALLET_CLASS_HASHES.READY) === normalized) {\n return \"READY\";\n }\n // Current or legacy CHIPI hashes\n if (normalize(WALLET_CLASS_HASHES.CHIPI) === normalized) {\n return \"CHIPI\";\n }\n if (LEGACY_CHIPI_CLASS_HASHES.some((h) => normalize(h) === normalized)) {\n return \"CHIPI\";\n }\n // Unknown class hash — return null so callers can handle explicitly\n return null;\n}\n\n// RPC endpoints per wallet type — any standard Starknet RPC works for all wallet types.\n// Override via STARKNET_RPC_URL env var; falls back to the default Infura endpoint.\nexport const WALLET_RPC_ENDPOINTS: Record<string, string> = {\n CHIPI: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n READY: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n};\n\n// Paymaster configuration\nexport const PAYMASTER_CONFIG = {\n URL: \"https://paymaster.chipipay.com\",\n} as const;\n\n// Session key configuration (CHIPI wallets only - SNIP-9 compatible)\nexport const SESSION_DEFAULTS = {\n /** Default session duration: 6 hours in seconds */\n DURATION_SECONDS: 21600,\n /** Default max calls per session */\n MAX_CALLS: 1000,\n} as const;\n\n// Session-specific error codes\nexport const SESSION_ERRORS = {\n /** Session keys only work with CHIPI wallets */\n INVALID_WALLET_TYPE_FOR_SESSION: \"INVALID_WALLET_TYPE_FOR_SESSION\",\n /** Session has expired (validUntil < now) */\n SESSION_EXPIRED: \"SESSION_EXPIRED\",\n /** Session key not registered on contract */\n SESSION_NOT_REGISTERED: \"SESSION_NOT_REGISTERED\",\n /** Session key has been revoked */\n SESSION_REVOKED: \"SESSION_REVOKED\",\n /** Session has exceeded max calls */\n SESSION_MAX_CALLS_EXCEEDED: \"SESSION_MAX_CALLS_EXCEEDED\",\n /** Entrypoint not allowed for this session */\n SESSION_ENTRYPOINT_NOT_ALLOWED: \"SESSION_ENTRYPOINT_NOT_ALLOWED\",\n /** Failed to decrypt session private key */\n SESSION_DECRYPTION_FAILED: \"SESSION_DECRYPTION_FAILED\",\n /** Failed to create session key */\n SESSION_CREATION_FAILED: \"SESSION_CREATION_FAILED\",\n /** Backend returned an invalid response shape */\n SESSION_INVALID_RESPONSE: \"SESSION_INVALID_RESPONSE\",\n} as const;\n\n// Session contract entrypoint names\nexport const SESSION_ENTRYPOINTS = {\n /** Add or update a session key (owner only) */\n ADD_OR_UPDATE: \"add_or_update_session_key\",\n /** Revoke a session key (owner only) */\n REVOKE: \"revoke_session_key\",\n /** Query session data (public read) */\n GET_DATA: \"get_session_data\",\n} as const;\n","import type { ErrorWithCode } from \"@chipi-stack/types\";\n\n/**\n * Error classes and utilities for Chipi SDK\n */\n\nexport class ChipiError extends Error implements ErrorWithCode {\n public readonly code: string;\n public readonly status?: number;\n\n constructor(message: string, code: string, status?: number) {\n super(message);\n this.name = \"ChipiError\";\n this.code = code;\n this.status = status;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, ChipiError);\n }\n }\n}\n\nexport class ChipiApiError extends ChipiError {\n constructor(message: string, code: string, status: number) {\n super(message, code, status);\n this.name = \"ChipiApiError\";\n }\n}\n\nexport class ChipiWalletError extends ChipiError {\n constructor(message: string, code: string = \"WALLET_ERROR\") {\n super(message, code);\n this.name = \"ChipiWalletError\";\n }\n}\n\nexport class ChipiTransactionError extends ChipiError {\n constructor(message: string, code: string = \"TRANSACTION_ERROR\") {\n super(message, code);\n this.name = \"ChipiTransactionError\";\n }\n}\n\nexport class ChipiSessionError extends ChipiError {\n constructor(message: string, code: string = \"SESSION_ERROR\") {\n super(message, code);\n this.name = \"ChipiSessionError\";\n }\n}\n\nexport class ChipiSkuError extends ChipiError {\n constructor(message: string, code: string = \"SKU_ERROR\") {\n super(message, code);\n this.name = \"ChipiSkuError\";\n }\n}\n\nexport class ChipiValidationError extends ChipiError {\n constructor(message: string, code: string = \"VALIDATION_ERROR\") {\n super(message, code, 400);\n this.name = \"ChipiValidationError\";\n }\n}\n\nexport class ChipiAuthError extends ChipiError {\n constructor(message: string, code: string = \"AUTH_ERROR\") {\n super(message, code, 401);\n this.name = \"ChipiAuthError\";\n }\n}\n\nexport class WalletNotCompatibleError extends ChipiWalletError {\n constructor(message: string) {\n super(message, \"WALLET_NOT_COMPATIBLE\");\n this.name = \"WalletNotCompatibleError\";\n }\n}\n\nexport class WalletClassHashNotFoundError extends ChipiWalletError {\n constructor(walletType: string) {\n super(\n `No class hash registered for wallet type '${walletType}'. Register it via customWalletTypes in SDK config.`,\n \"WALLET_CLASS_HASH_NOT_FOUND\"\n );\n this.name = \"WalletClassHashNotFoundError\";\n }\n}\n\nexport class PaymasterIncompatibleError extends ChipiError {\n constructor(classHash: string) {\n super(\n `Wallet class hash ${classHash} is not compatible with Chipi paymaster. Account must implement SNIP-9 (outside_execution_v2).`,\n \"PAYMASTER_INCOMPATIBLE\",\n 400\n );\n this.name = \"PaymasterIncompatibleError\";\n }\n}\n\nexport function isChipiError(error: unknown): error is ChipiError {\n return error instanceof ChipiError;\n}\n\n/**\n * Type guard to check if an error has an HTTP status property.\n * Useful for retry logic where you need to distinguish API errors\n * (which have status codes) from network errors (which don't).\n */\nexport function hasHttpStatus(error: unknown): error is { status: number } {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"status\" in error &&\n typeof (error as { status: unknown }).status === \"number\"\n );\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function handleApiError(error: any): ChipiError {\n if (isChipiError(error)) {\n return error;\n }\n\n if (typeof error?.response?.status === \"number\") {\n const status = error.response.status;\n const message = error.response.data?.message || error.message || \"API request failed\";\n const code = error.response.data?.code || `HTTP_${status}`;\n\n return new ChipiApiError(message, code, status);\n }\n\n // Handle errors with direct status property (non-Axios)\n if (error?.status && typeof error.status === \"number\") {\n const message = error?.message || \"API request failed\";\n const code = error?.code || `HTTP_${error.status}`;\n return new ChipiApiError(message, code, error.status);\n }\n\n return new ChipiError(error?.message || \"An unknown error occurred\", \"UNKNOWN_ERROR\");\n}\n","/**\n * Data formatters and transformers for Chipi SDK\n */\n\nexport function formatCurrency(\n amount: number,\n currency: string = \"USD\",\n locale: string = \"en-US\"\n): string {\n return new Intl.NumberFormat(locale, {\n style: \"currency\",\n currency,\n }).format(amount);\n}\n\nexport function formatNumber(\n value: number,\n options: {\n decimals?: number;\n locale?: string;\n compact?: boolean;\n } = {}\n): string {\n const { decimals = 2, locale = \"en-US\", compact = false } = options;\n\n return new Intl.NumberFormat(locale, {\n minimumFractionDigits: decimals,\n maximumFractionDigits: decimals,\n notation: compact ? \"compact\" : \"standard\",\n }).format(value);\n}\n\nexport function formatDate(\n date: Date | string,\n options: {\n locale?: string;\n dateStyle?: \"full\" | \"long\" | \"medium\" | \"short\";\n timeStyle?: \"full\" | \"long\" | \"medium\" | \"short\";\n } = {}\n): string {\n const { locale = \"en-US\", dateStyle = \"medium\", timeStyle } = options;\n const dateObj = typeof date === \"string\" ? new Date(date) : date;\n\n return new Intl.DateTimeFormat(locale, {\n dateStyle,\n timeStyle,\n }).format(dateObj);\n}\n\nexport function formatAddress(address: string, length: number = 8): string {\n if (address.length <= length * 2) {\n return address;\n }\n\n return `${address.slice(0, length)}...${address.slice(-length)}`;\n}\n\nexport function formatTransactionHash(hash: string): string {\n return formatAddress(hash, 6);\n}\n\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);\n}\n\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());\n}\n\nexport function capitalizeFirst(str: string): string {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n","import { z } from \"zod\";\n\n// Base API response schema\nexport const ApiResponseSchema = z.object({\n data: z.unknown(),\n message: z.string().optional(),\n code: z.string().optional(),\n});\n\n// Error response schema\nexport const ErrorResponseSchema = z.object({\n message: z.string(),\n code: z.string().optional(),\n status: z.number().optional(),\n});\n\n// Generic success response schema\nexport const SuccessResponseSchema = <T extends z.ZodTypeAny>(dataSchema: T) =>\n ApiResponseSchema.extend({\n data: dataSchema,\n });\n\n// Type helpers\nexport type ApiResponse<T> = {\n data: T;\n message?: string;\n code?: string;\n};\nexport type ErrorResponse = z.infer<typeof ErrorResponseSchema>;\n\n// Validation functions\n// This is not very good nor useful without passing a data schema\nexport function validateApiResponse<T>(response: unknown, dataSchema: z.ZodType<T>): void {\n // Validate with specific data schema\n const result = SuccessResponseSchema(dataSchema).safeParse(response);\n if (!result.success) {\n throw new Error(`Invalid API response format: ${result.error.message}`);\n }\n}\n\nexport function validateErrorResponse(response: unknown): ErrorResponse {\n const result = ErrorResponseSchema.safeParse(response);\n if (result.success) {\n return result.data;\n }\n\n // Fallback for malformed error responses\n return {\n message: \"Unknown error occurred\",\n code: \"UNKNOWN_ERROR\",\n };\n}\n"]}