@chipi-stack/shared 11.21.0 → 12.0.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.
@@ -1,6 +1,21 @@
1
+ import { WalletType } from '@chipi-stack/types';
2
+
1
3
  /**
2
4
  * Constants used across Chipi SDK packages
3
5
  */
6
+
7
+ /**
8
+ * API Versioning
9
+ * - VERSION: Major version for path-based versioning (/v1, /v2, etc.)
10
+ * - VERSION_DATE: Detailed version for tracking breaking changes (YYYY-MM-DD format)
11
+ *
12
+ * Update VERSION_DATE when making API changes.
13
+ * Update VERSION when making major breaking changes (typically 1-2 times per year).
14
+ */
15
+ declare const API_VERSIONING: {
16
+ readonly VERSION: "1";
17
+ readonly VERSION_DATE: "2025-12-30";
18
+ };
4
19
  declare const STARKNET_NETWORKS: {
5
20
  readonly MAINNET: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7";
6
21
  readonly SEPOLIA: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7";
@@ -39,7 +54,7 @@ declare const ERRORS: {
39
54
  readonly SKU_UNAVAILABLE: "SKU_UNAVAILABLE";
40
55
  };
41
56
  declare const SKU_CONTRACTS: {
42
- readonly RECHARGER_WITH_STRK_MAINNET: "0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e";
57
+ readonly RECHARGER_WITH_STRK_MAINNET: "0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7";
43
58
  readonly CHIPI_BILL_SERVICE: "0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b";
44
59
  };
45
60
  declare const SERVICE_TYPES: {
@@ -60,5 +75,42 @@ declare const CHAIN_TOKEN_TYPES: {
60
75
  readonly WBTC: "WBTC";
61
76
  readonly OTHER: "OTHER";
62
77
  };
78
+ declare const WALLET_CLASS_HASHES: Record<WalletType, string>;
79
+ declare const WALLET_RPC_ENDPOINTS: Record<WalletType, string>;
80
+ declare const PAYMASTER_CONFIG: {
81
+ readonly URL: "https://paymaster.chipipay.com";
82
+ };
83
+ declare const SESSION_DEFAULTS: {
84
+ /** Default session duration: 6 hours in seconds */
85
+ readonly DURATION_SECONDS: 21600;
86
+ /** Default max calls per session */
87
+ readonly MAX_CALLS: 1000;
88
+ };
89
+ declare const SESSION_ERRORS: {
90
+ /** Session keys only work with CHIPI wallets */
91
+ readonly INVALID_WALLET_TYPE_FOR_SESSION: "INVALID_WALLET_TYPE_FOR_SESSION";
92
+ /** Session has expired (validUntil < now) */
93
+ readonly SESSION_EXPIRED: "SESSION_EXPIRED";
94
+ /** Session key not registered on contract */
95
+ readonly SESSION_NOT_REGISTERED: "SESSION_NOT_REGISTERED";
96
+ /** Session key has been revoked */
97
+ readonly SESSION_REVOKED: "SESSION_REVOKED";
98
+ /** Session has exceeded max calls */
99
+ readonly SESSION_MAX_CALLS_EXCEEDED: "SESSION_MAX_CALLS_EXCEEDED";
100
+ /** Entrypoint not allowed for this session */
101
+ readonly SESSION_ENTRYPOINT_NOT_ALLOWED: "SESSION_ENTRYPOINT_NOT_ALLOWED";
102
+ /** Failed to decrypt session private key */
103
+ readonly SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED";
104
+ /** Failed to create session key */
105
+ readonly SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED";
106
+ };
107
+ declare const SESSION_ENTRYPOINTS: {
108
+ /** Add or update a session key (owner only) */
109
+ readonly ADD_OR_UPDATE: "add_or_update_session_key";
110
+ /** Revoke a session key (owner only) */
111
+ readonly REVOKE: "revoke_session_key";
112
+ /** Query session data (public read) */
113
+ readonly GET_DATA: "get_session_data";
114
+ };
63
115
 
64
- export { API_ENDPOINTS, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, SERVICE_TYPES, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS };
116
+ export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS };
@@ -1,6 +1,21 @@
1
+ import { WalletType } from '@chipi-stack/types';
2
+
1
3
  /**
2
4
  * Constants used across Chipi SDK packages
3
5
  */
6
+
7
+ /**
8
+ * API Versioning
9
+ * - VERSION: Major version for path-based versioning (/v1, /v2, etc.)
10
+ * - VERSION_DATE: Detailed version for tracking breaking changes (YYYY-MM-DD format)
11
+ *
12
+ * Update VERSION_DATE when making API changes.
13
+ * Update VERSION when making major breaking changes (typically 1-2 times per year).
14
+ */
15
+ declare const API_VERSIONING: {
16
+ readonly VERSION: "1";
17
+ readonly VERSION_DATE: "2025-12-30";
18
+ };
4
19
  declare const STARKNET_NETWORKS: {
5
20
  readonly MAINNET: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7";
6
21
  readonly SEPOLIA: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7";
@@ -39,7 +54,7 @@ declare const ERRORS: {
39
54
  readonly SKU_UNAVAILABLE: "SKU_UNAVAILABLE";
40
55
  };
41
56
  declare const SKU_CONTRACTS: {
42
- readonly RECHARGER_WITH_STRK_MAINNET: "0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e";
57
+ readonly RECHARGER_WITH_STRK_MAINNET: "0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7";
43
58
  readonly CHIPI_BILL_SERVICE: "0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b";
44
59
  };
45
60
  declare const SERVICE_TYPES: {
@@ -60,5 +75,42 @@ declare const CHAIN_TOKEN_TYPES: {
60
75
  readonly WBTC: "WBTC";
61
76
  readonly OTHER: "OTHER";
62
77
  };
78
+ declare const WALLET_CLASS_HASHES: Record<WalletType, string>;
79
+ declare const WALLET_RPC_ENDPOINTS: Record<WalletType, string>;
80
+ declare const PAYMASTER_CONFIG: {
81
+ readonly URL: "https://paymaster.chipipay.com";
82
+ };
83
+ declare const SESSION_DEFAULTS: {
84
+ /** Default session duration: 6 hours in seconds */
85
+ readonly DURATION_SECONDS: 21600;
86
+ /** Default max calls per session */
87
+ readonly MAX_CALLS: 1000;
88
+ };
89
+ declare const SESSION_ERRORS: {
90
+ /** Session keys only work with CHIPI wallets */
91
+ readonly INVALID_WALLET_TYPE_FOR_SESSION: "INVALID_WALLET_TYPE_FOR_SESSION";
92
+ /** Session has expired (validUntil < now) */
93
+ readonly SESSION_EXPIRED: "SESSION_EXPIRED";
94
+ /** Session key not registered on contract */
95
+ readonly SESSION_NOT_REGISTERED: "SESSION_NOT_REGISTERED";
96
+ /** Session key has been revoked */
97
+ readonly SESSION_REVOKED: "SESSION_REVOKED";
98
+ /** Session has exceeded max calls */
99
+ readonly SESSION_MAX_CALLS_EXCEEDED: "SESSION_MAX_CALLS_EXCEEDED";
100
+ /** Entrypoint not allowed for this session */
101
+ readonly SESSION_ENTRYPOINT_NOT_ALLOWED: "SESSION_ENTRYPOINT_NOT_ALLOWED";
102
+ /** Failed to decrypt session private key */
103
+ readonly SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED";
104
+ /** Failed to create session key */
105
+ readonly SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED";
106
+ };
107
+ declare const SESSION_ENTRYPOINTS: {
108
+ /** Add or update a session key (owner only) */
109
+ readonly ADD_OR_UPDATE: "add_or_update_session_key";
110
+ /** Revoke a session key (owner only) */
111
+ readonly REVOKE: "revoke_session_key";
112
+ /** Query session data (public read) */
113
+ readonly GET_DATA: "get_session_data";
114
+ };
63
115
 
64
- export { API_ENDPOINTS, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, SERVICE_TYPES, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS };
116
+ export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS };
@@ -1,6 +1,12 @@
1
1
  'use strict';
2
2
 
3
3
  // src/constants/index.ts
4
+ var API_VERSIONING = {
5
+ VERSION: "1",
6
+ // Major version - used in URL path
7
+ VERSION_DATE: "2025-12-30"
8
+ // Detailed version - sent as query param for tracking
9
+ };
4
10
  var STARKNET_NETWORKS = {
5
11
  MAINNET: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
6
12
  SEPOLIA: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7"
@@ -39,7 +45,8 @@ var ERRORS = {
39
45
  SKU_UNAVAILABLE: "SKU_UNAVAILABLE"
40
46
  };
41
47
  var SKU_CONTRACTS = {
42
- RECHARGER_WITH_STRK_MAINNET: "0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e",
48
+ RECHARGER_WITH_STRK_MAINNET: "0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7",
49
+ //changed contract address used to be 0x0f3
43
50
  CHIPI_BILL_SERVICE: "0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b"
44
51
  };
45
52
  var SERVICE_TYPES = {
@@ -60,17 +67,67 @@ var CHAIN_TOKEN_TYPES = {
60
67
  WBTC: "WBTC",
61
68
  OTHER: "OTHER"
62
69
  };
70
+ var WALLET_CLASS_HASHES = {
71
+ CHIPI: "0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83",
72
+ READY: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
73
+ };
74
+ var WALLET_RPC_ENDPOINTS = {
75
+ CHIPI: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
76
+ READY: "https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7"
77
+ };
78
+ var PAYMASTER_CONFIG = {
79
+ URL: "https://paymaster.chipipay.com"
80
+ };
81
+ var SESSION_DEFAULTS = {
82
+ /** Default session duration: 6 hours in seconds */
83
+ DURATION_SECONDS: 21600,
84
+ /** Default max calls per session */
85
+ MAX_CALLS: 1e3
86
+ };
87
+ var SESSION_ERRORS = {
88
+ /** Session keys only work with CHIPI wallets */
89
+ INVALID_WALLET_TYPE_FOR_SESSION: "INVALID_WALLET_TYPE_FOR_SESSION",
90
+ /** Session has expired (validUntil < now) */
91
+ SESSION_EXPIRED: "SESSION_EXPIRED",
92
+ /** Session key not registered on contract */
93
+ SESSION_NOT_REGISTERED: "SESSION_NOT_REGISTERED",
94
+ /** Session key has been revoked */
95
+ SESSION_REVOKED: "SESSION_REVOKED",
96
+ /** Session has exceeded max calls */
97
+ SESSION_MAX_CALLS_EXCEEDED: "SESSION_MAX_CALLS_EXCEEDED",
98
+ /** Entrypoint not allowed for this session */
99
+ SESSION_ENTRYPOINT_NOT_ALLOWED: "SESSION_ENTRYPOINT_NOT_ALLOWED",
100
+ /** Failed to decrypt session private key */
101
+ SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED",
102
+ /** Failed to create session key */
103
+ SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED"
104
+ };
105
+ var SESSION_ENTRYPOINTS = {
106
+ /** Add or update a session key (owner only) */
107
+ ADD_OR_UPDATE: "add_or_update_session_key",
108
+ /** Revoke a session key (owner only) */
109
+ REVOKE: "revoke_session_key",
110
+ /** Query session data (public read) */
111
+ GET_DATA: "get_session_data"
112
+ };
63
113
 
64
114
  exports.API_ENDPOINTS = API_ENDPOINTS;
115
+ exports.API_VERSIONING = API_VERSIONING;
65
116
  exports.CARRIER_IDS = CARRIER_IDS;
66
117
  exports.CHAIN_TOKEN_TYPES = CHAIN_TOKEN_TYPES;
67
118
  exports.CHAIN_TYPES = CHAIN_TYPES;
68
119
  exports.CONTRACT_ADDRESSES = CONTRACT_ADDRESSES;
69
120
  exports.DEFAULT_PAGINATION = DEFAULT_PAGINATION;
70
121
  exports.ERRORS = ERRORS;
122
+ exports.PAYMASTER_CONFIG = PAYMASTER_CONFIG;
71
123
  exports.SERVICE_TYPES = SERVICE_TYPES;
124
+ exports.SESSION_DEFAULTS = SESSION_DEFAULTS;
125
+ exports.SESSION_ENTRYPOINTS = SESSION_ENTRYPOINTS;
126
+ exports.SESSION_ERRORS = SESSION_ERRORS;
72
127
  exports.SKU_CONTRACTS = SKU_CONTRACTS;
73
128
  exports.STARKNET_NETWORKS = STARKNET_NETWORKS;
74
129
  exports.TOKEN_DECIMALS = TOKEN_DECIMALS;
130
+ exports.WALLET_CLASS_HASHES = WALLET_CLASS_HASHES;
131
+ exports.WALLET_RPC_ENDPOINTS = WALLET_RPC_ENDPOINTS;
75
132
  //# sourceMappingURL=index.js.map
76
133
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/constants/index.ts"],"names":[],"mappings":";;;AAIO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,sDAAA;AAAA,EACT,OAAA,EAAS;AACX;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,YAAA,EACE,oEAAA;AAAA,EACF,iBAAA,EACE;AACJ;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,EAAA;AAAA,EACL,IAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAK;AACP;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,gBAAA,EAAkB,mBAAA;AAAA,EAClB,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO;AACT;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,SAAA,EAAW;AACb;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB;AACnB;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,2BAAA,EACE,mEAAA;AAAA,EACF,kBAAA,EACE;AACJ;AAGO,IAAM,aAAA,GAAgB;AAAA,EAC3B,WAAA,EAAa;AACf;AAGO,IAAM,WAAA,GAAc;AAAA,EACzB,SAAA,EAAW;AACb;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,QAAA,EAAU;AACZ;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT","file":"index.js","sourcesContent":["/**\n * Constants used across Chipi SDK packages\n */\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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 \"0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e\",\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\",\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n"]}
1
+ {"version":3,"sources":["../../src/constants/index.ts"],"names":[],"mappings":";;;AAcO,IAAM,cAAA,GAAiB;AAAA,EAC5B,OAAA,EAAS,GAAA;AAAA;AAAA,EACT,YAAA,EAAc;AAAA;AAChB;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,sDAAA;AAAA,EACT,OAAA,EAAS;AACX;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,YAAA,EACE,oEAAA;AAAA,EACF,iBAAA,EACE;AACJ;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,EAAA;AAAA,EACL,IAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAK;AACP;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,gBAAA,EAAkB,mBAAA;AAAA,EAClB,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO;AACT;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,SAAA,EAAW;AACb;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB;AACnB;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,2BAAA,EACE,oEAAA;AAAA;AAAA,EACF,kBAAA,EACE;AACJ;AAGO,IAAM,aAAA,GAAgB;AAAA,EAC3B,WAAA,EAAa;AACf;AAGO,IAAM,WAAA,GAAc;AAAA,EACzB,SAAA,EAAW;AACb;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,QAAA,EAAU;AACZ;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT;AAEO,IAAM,mBAAA,GAAkD;AAAA,EAC7D,KAAA,EAAO,mEAAA;AAAA,EACP,KAAA,EAAO;AACT;AAGO,IAAM,oBAAA,GAAmD;AAAA,EAC9D,KAAA,EAAO,sDAAA;AAAA,EACP,KAAA,EAAO;AACT;AAGO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,GAAA,EAAK;AACP;AAGO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,gBAAA,EAAkB,KAAA;AAAA;AAAA,EAElB,SAAA,EAAW;AACb;AAGO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,+BAAA,EAAiC,iCAAA;AAAA;AAAA,EAEjC,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAEjB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAExB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAEjB,0BAAA,EAA4B,4BAAA;AAAA;AAAA,EAE5B,8BAAA,EAAgC,gCAAA;AAAA;AAAA,EAEhC,yBAAA,EAA2B,2BAAA;AAAA;AAAA,EAE3B,uBAAA,EAAyB;AAC3B;AAGO,IAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,aAAA,EAAe,2BAAA;AAAA;AAAA,EAEf,MAAA,EAAQ,oBAAA;AAAA;AAAA,EAER,QAAA,EAAU;AACZ","file":"index.js","sourcesContent":["/**\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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\",\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: \"0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\",\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"]}
@@ -1,4 +1,10 @@
1
1
  // src/constants/index.ts
2
+ var API_VERSIONING = {
3
+ VERSION: "1",
4
+ // Major version - used in URL path
5
+ VERSION_DATE: "2025-12-30"
6
+ // Detailed version - sent as query param for tracking
7
+ };
2
8
  var STARKNET_NETWORKS = {
3
9
  MAINNET: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
4
10
  SEPOLIA: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7"
@@ -37,7 +43,8 @@ var ERRORS = {
37
43
  SKU_UNAVAILABLE: "SKU_UNAVAILABLE"
38
44
  };
39
45
  var SKU_CONTRACTS = {
40
- RECHARGER_WITH_STRK_MAINNET: "0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e",
46
+ RECHARGER_WITH_STRK_MAINNET: "0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7",
47
+ //changed contract address used to be 0x0f3
41
48
  CHIPI_BILL_SERVICE: "0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b"
42
49
  };
43
50
  var SERVICE_TYPES = {
@@ -58,7 +65,50 @@ var CHAIN_TOKEN_TYPES = {
58
65
  WBTC: "WBTC",
59
66
  OTHER: "OTHER"
60
67
  };
68
+ var WALLET_CLASS_HASHES = {
69
+ CHIPI: "0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83",
70
+ READY: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
71
+ };
72
+ var WALLET_RPC_ENDPOINTS = {
73
+ CHIPI: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
74
+ READY: "https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7"
75
+ };
76
+ var PAYMASTER_CONFIG = {
77
+ URL: "https://paymaster.chipipay.com"
78
+ };
79
+ var SESSION_DEFAULTS = {
80
+ /** Default session duration: 6 hours in seconds */
81
+ DURATION_SECONDS: 21600,
82
+ /** Default max calls per session */
83
+ MAX_CALLS: 1e3
84
+ };
85
+ var SESSION_ERRORS = {
86
+ /** Session keys only work with CHIPI wallets */
87
+ INVALID_WALLET_TYPE_FOR_SESSION: "INVALID_WALLET_TYPE_FOR_SESSION",
88
+ /** Session has expired (validUntil < now) */
89
+ SESSION_EXPIRED: "SESSION_EXPIRED",
90
+ /** Session key not registered on contract */
91
+ SESSION_NOT_REGISTERED: "SESSION_NOT_REGISTERED",
92
+ /** Session key has been revoked */
93
+ SESSION_REVOKED: "SESSION_REVOKED",
94
+ /** Session has exceeded max calls */
95
+ SESSION_MAX_CALLS_EXCEEDED: "SESSION_MAX_CALLS_EXCEEDED",
96
+ /** Entrypoint not allowed for this session */
97
+ SESSION_ENTRYPOINT_NOT_ALLOWED: "SESSION_ENTRYPOINT_NOT_ALLOWED",
98
+ /** Failed to decrypt session private key */
99
+ SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED",
100
+ /** Failed to create session key */
101
+ SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED"
102
+ };
103
+ var SESSION_ENTRYPOINTS = {
104
+ /** Add or update a session key (owner only) */
105
+ ADD_OR_UPDATE: "add_or_update_session_key",
106
+ /** Revoke a session key (owner only) */
107
+ REVOKE: "revoke_session_key",
108
+ /** Query session data (public read) */
109
+ GET_DATA: "get_session_data"
110
+ };
61
111
 
62
- export { API_ENDPOINTS, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, SERVICE_TYPES, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS };
112
+ export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS };
63
113
  //# sourceMappingURL=index.mjs.map
64
114
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/constants/index.ts"],"names":[],"mappings":";AAIO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,sDAAA;AAAA,EACT,OAAA,EAAS;AACX;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,YAAA,EACE,oEAAA;AAAA,EACF,iBAAA,EACE;AACJ;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,EAAA;AAAA,EACL,IAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAK;AACP;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,gBAAA,EAAkB,mBAAA;AAAA,EAClB,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO;AACT;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,SAAA,EAAW;AACb;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB;AACnB;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,2BAAA,EACE,mEAAA;AAAA,EACF,kBAAA,EACE;AACJ;AAGO,IAAM,aAAA,GAAgB;AAAA,EAC3B,WAAA,EAAa;AACf;AAGO,IAAM,WAAA,GAAc;AAAA,EACzB,SAAA,EAAW;AACb;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,QAAA,EAAU;AACZ;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT","file":"index.mjs","sourcesContent":["/**\n * Constants used across Chipi SDK packages\n */\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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 \"0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e\",\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\",\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n"]}
1
+ {"version":3,"sources":["../../src/constants/index.ts"],"names":[],"mappings":";AAcO,IAAM,cAAA,GAAiB;AAAA,EAC5B,OAAA,EAAS,GAAA;AAAA;AAAA,EACT,YAAA,EAAc;AAAA;AAChB;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,sDAAA;AAAA,EACT,OAAA,EAAS;AACX;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,YAAA,EACE,oEAAA;AAAA,EACF,iBAAA,EACE;AACJ;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,EAAA;AAAA,EACL,IAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAK;AACP;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,gBAAA,EAAkB,mBAAA;AAAA,EAClB,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO;AACT;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,SAAA,EAAW;AACb;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB;AACnB;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,2BAAA,EACE,oEAAA;AAAA;AAAA,EACF,kBAAA,EACE;AACJ;AAGO,IAAM,aAAA,GAAgB;AAAA,EAC3B,WAAA,EAAa;AACf;AAGO,IAAM,WAAA,GAAc;AAAA,EACzB,SAAA,EAAW;AACb;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,QAAA,EAAU;AACZ;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT;AAEO,IAAM,mBAAA,GAAkD;AAAA,EAC7D,KAAA,EAAO,mEAAA;AAAA,EACP,KAAA,EAAO;AACT;AAGO,IAAM,oBAAA,GAAmD;AAAA,EAC9D,KAAA,EAAO,sDAAA;AAAA,EACP,KAAA,EAAO;AACT;AAGO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,GAAA,EAAK;AACP;AAGO,IAAM,gBAAA,GAAmB;AAAA;AAAA,EAE9B,gBAAA,EAAkB,KAAA;AAAA;AAAA,EAElB,SAAA,EAAW;AACb;AAGO,IAAM,cAAA,GAAiB;AAAA;AAAA,EAE5B,+BAAA,EAAiC,iCAAA;AAAA;AAAA,EAEjC,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAEjB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAExB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAEjB,0BAAA,EAA4B,4BAAA;AAAA;AAAA,EAE5B,8BAAA,EAAgC,gCAAA;AAAA;AAAA,EAEhC,yBAAA,EAA2B,2BAAA;AAAA;AAAA,EAE3B,uBAAA,EAAyB;AAC3B;AAGO,IAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,aAAA,EAAe,2BAAA;AAAA;AAAA,EAEf,MAAA,EAAQ,oBAAA;AAAA;AAAA,EAER,QAAA,EAAU;AACZ","file":"index.mjs","sourcesContent":["/**\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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\",\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: \"0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\",\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"]}
package/dist/index.d.mts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { createPaginatedResponse, deepMerge, formatAmount, getUsdAmount, isValidAddress, isValidApiKey, parseAmount, retry, sanitizeUrl, sleep, validatePagination } from './utils/index.mjs';
2
- export { API_ENDPOINTS, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, SERVICE_TYPES, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS } from './constants/index.mjs';
2
+ export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS } from './constants/index.mjs';
3
3
  import { ErrorWithCode } from '@chipi-stack/types';
4
4
  import { z } from 'zod';
5
5
 
@@ -20,6 +20,9 @@ declare class ChipiWalletError extends ChipiError {
20
20
  declare class ChipiTransactionError extends ChipiError {
21
21
  constructor(message: string, code?: string);
22
22
  }
23
+ declare class ChipiSessionError extends ChipiError {
24
+ constructor(message: string, code?: string);
25
+ }
23
26
  declare class ChipiSkuError extends ChipiError {
24
27
  constructor(message: string, code?: string);
25
28
  }
@@ -70,4 +73,4 @@ type ErrorResponse = z.infer<typeof ErrorResponseSchema>;
70
73
  declare function validateApiResponse<T>(response: unknown, dataSchema: z.ZodType<T>): void;
71
74
  declare function validateErrorResponse(response: unknown): ErrorResponse;
72
75
 
73
- export { type ApiResponse, ApiResponseSchema, ChipiApiError, ChipiAuthError, ChipiError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, type ErrorResponse, ErrorResponseSchema, SuccessResponseSchema, camelToSnake, capitalizeFirst, formatAddress, formatCurrency, formatDate, formatNumber, formatTransactionHash, handleApiError, isChipiError, snakeToCamel, validateApiResponse, validateErrorResponse };
76
+ export { type ApiResponse, ApiResponseSchema, ChipiApiError, ChipiAuthError, ChipiError, ChipiSessionError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, type ErrorResponse, ErrorResponseSchema, SuccessResponseSchema, camelToSnake, capitalizeFirst, formatAddress, formatCurrency, formatDate, formatNumber, formatTransactionHash, handleApiError, isChipiError, snakeToCamel, validateApiResponse, validateErrorResponse };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { createPaginatedResponse, deepMerge, formatAmount, getUsdAmount, isValidAddress, isValidApiKey, parseAmount, retry, sanitizeUrl, sleep, validatePagination } from './utils/index.js';
2
- export { API_ENDPOINTS, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, SERVICE_TYPES, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS } from './constants/index.js';
2
+ export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, DEFAULT_PAGINATION, ERRORS, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS } from './constants/index.js';
3
3
  import { ErrorWithCode } from '@chipi-stack/types';
4
4
  import { z } from 'zod';
5
5
 
@@ -20,6 +20,9 @@ declare class ChipiWalletError extends ChipiError {
20
20
  declare class ChipiTransactionError extends ChipiError {
21
21
  constructor(message: string, code?: string);
22
22
  }
23
+ declare class ChipiSessionError extends ChipiError {
24
+ constructor(message: string, code?: string);
25
+ }
23
26
  declare class ChipiSkuError extends ChipiError {
24
27
  constructor(message: string, code?: string);
25
28
  }
@@ -70,4 +73,4 @@ type ErrorResponse = z.infer<typeof ErrorResponseSchema>;
70
73
  declare function validateApiResponse<T>(response: unknown, dataSchema: z.ZodType<T>): void;
71
74
  declare function validateErrorResponse(response: unknown): ErrorResponse;
72
75
 
73
- export { type ApiResponse, ApiResponseSchema, ChipiApiError, ChipiAuthError, ChipiError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, type ErrorResponse, ErrorResponseSchema, SuccessResponseSchema, camelToSnake, capitalizeFirst, formatAddress, formatCurrency, formatDate, formatNumber, formatTransactionHash, handleApiError, isChipiError, snakeToCamel, validateApiResponse, validateErrorResponse };
76
+ export { type ApiResponse, ApiResponseSchema, ChipiApiError, ChipiAuthError, ChipiError, ChipiSessionError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, type ErrorResponse, ErrorResponseSchema, SuccessResponseSchema, camelToSnake, capitalizeFirst, formatAddress, formatCurrency, formatDate, formatNumber, formatTransactionHash, handleApiError, isChipiError, snakeToCamel, validateApiResponse, validateErrorResponse };
package/dist/index.js CHANGED
@@ -3,6 +3,12 @@
3
3
  var zod = require('zod');
4
4
 
5
5
  // src/constants/index.ts
6
+ var API_VERSIONING = {
7
+ VERSION: "1",
8
+ // Major version - used in URL path
9
+ VERSION_DATE: "2025-12-30"
10
+ // Detailed version - sent as query param for tracking
11
+ };
6
12
  var STARKNET_NETWORKS = {
7
13
  MAINNET: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
8
14
  SEPOLIA: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7"
@@ -41,7 +47,8 @@ var ERRORS = {
41
47
  SKU_UNAVAILABLE: "SKU_UNAVAILABLE"
42
48
  };
43
49
  var SKU_CONTRACTS = {
44
- RECHARGER_WITH_STRK_MAINNET: "0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e",
50
+ RECHARGER_WITH_STRK_MAINNET: "0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7",
51
+ //changed contract address used to be 0x0f3
45
52
  CHIPI_BILL_SERVICE: "0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b"
46
53
  };
47
54
  var SERVICE_TYPES = {
@@ -62,6 +69,49 @@ var CHAIN_TOKEN_TYPES = {
62
69
  WBTC: "WBTC",
63
70
  OTHER: "OTHER"
64
71
  };
72
+ var WALLET_CLASS_HASHES = {
73
+ CHIPI: "0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83",
74
+ READY: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
75
+ };
76
+ var WALLET_RPC_ENDPOINTS = {
77
+ CHIPI: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
78
+ READY: "https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7"
79
+ };
80
+ var PAYMASTER_CONFIG = {
81
+ URL: "https://paymaster.chipipay.com"
82
+ };
83
+ var SESSION_DEFAULTS = {
84
+ /** Default session duration: 6 hours in seconds */
85
+ DURATION_SECONDS: 21600,
86
+ /** Default max calls per session */
87
+ MAX_CALLS: 1e3
88
+ };
89
+ var SESSION_ERRORS = {
90
+ /** Session keys only work with CHIPI wallets */
91
+ INVALID_WALLET_TYPE_FOR_SESSION: "INVALID_WALLET_TYPE_FOR_SESSION",
92
+ /** Session has expired (validUntil < now) */
93
+ SESSION_EXPIRED: "SESSION_EXPIRED",
94
+ /** Session key not registered on contract */
95
+ SESSION_NOT_REGISTERED: "SESSION_NOT_REGISTERED",
96
+ /** Session key has been revoked */
97
+ SESSION_REVOKED: "SESSION_REVOKED",
98
+ /** Session has exceeded max calls */
99
+ SESSION_MAX_CALLS_EXCEEDED: "SESSION_MAX_CALLS_EXCEEDED",
100
+ /** Entrypoint not allowed for this session */
101
+ SESSION_ENTRYPOINT_NOT_ALLOWED: "SESSION_ENTRYPOINT_NOT_ALLOWED",
102
+ /** Failed to decrypt session private key */
103
+ SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED",
104
+ /** Failed to create session key */
105
+ SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED"
106
+ };
107
+ var SESSION_ENTRYPOINTS = {
108
+ /** Add or update a session key (owner only) */
109
+ ADD_OR_UPDATE: "add_or_update_session_key",
110
+ /** Revoke a session key (owner only) */
111
+ REVOKE: "revoke_session_key",
112
+ /** Query session data (public read) */
113
+ GET_DATA: "get_session_data"
114
+ };
65
115
 
66
116
  // src/utils/index.ts
67
117
  function isValidAddress(address) {
@@ -206,6 +256,12 @@ var ChipiTransactionError = class extends ChipiError {
206
256
  this.name = "ChipiTransactionError";
207
257
  }
208
258
  };
259
+ var ChipiSessionError = class extends ChipiError {
260
+ constructor(message, code = "SESSION_ERROR") {
261
+ super(message, code);
262
+ this.name = "ChipiSessionError";
263
+ }
264
+ };
209
265
  var ChipiSkuError = class extends ChipiError {
210
266
  constructor(message, code = "SKU_ERROR") {
211
267
  super(message, code);
@@ -314,6 +370,7 @@ function validateErrorResponse(response) {
314
370
  }
315
371
 
316
372
  exports.API_ENDPOINTS = API_ENDPOINTS;
373
+ exports.API_VERSIONING = API_VERSIONING;
317
374
  exports.ApiResponseSchema = ApiResponseSchema;
318
375
  exports.CARRIER_IDS = CARRIER_IDS;
319
376
  exports.CHAIN_TOKEN_TYPES = CHAIN_TOKEN_TYPES;
@@ -322,6 +379,7 @@ exports.CONTRACT_ADDRESSES = CONTRACT_ADDRESSES;
322
379
  exports.ChipiApiError = ChipiApiError;
323
380
  exports.ChipiAuthError = ChipiAuthError;
324
381
  exports.ChipiError = ChipiError;
382
+ exports.ChipiSessionError = ChipiSessionError;
325
383
  exports.ChipiSkuError = ChipiSkuError;
326
384
  exports.ChipiTransactionError = ChipiTransactionError;
327
385
  exports.ChipiValidationError = ChipiValidationError;
@@ -329,11 +387,17 @@ exports.ChipiWalletError = ChipiWalletError;
329
387
  exports.DEFAULT_PAGINATION = DEFAULT_PAGINATION;
330
388
  exports.ERRORS = ERRORS;
331
389
  exports.ErrorResponseSchema = ErrorResponseSchema;
390
+ exports.PAYMASTER_CONFIG = PAYMASTER_CONFIG;
332
391
  exports.SERVICE_TYPES = SERVICE_TYPES;
392
+ exports.SESSION_DEFAULTS = SESSION_DEFAULTS;
393
+ exports.SESSION_ENTRYPOINTS = SESSION_ENTRYPOINTS;
394
+ exports.SESSION_ERRORS = SESSION_ERRORS;
333
395
  exports.SKU_CONTRACTS = SKU_CONTRACTS;
334
396
  exports.STARKNET_NETWORKS = STARKNET_NETWORKS;
335
397
  exports.SuccessResponseSchema = SuccessResponseSchema;
336
398
  exports.TOKEN_DECIMALS = TOKEN_DECIMALS;
399
+ exports.WALLET_CLASS_HASHES = WALLET_CLASS_HASHES;
400
+ exports.WALLET_RPC_ENDPOINTS = WALLET_RPC_ENDPOINTS;
337
401
  exports.camelToSnake = camelToSnake;
338
402
  exports.capitalizeFirst = capitalizeFirst;
339
403
  exports.createPaginatedResponse = createPaginatedResponse;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/index.ts","../src/utils/index.ts","../src/errors.ts","../src/formatters.ts","../src/validation.ts"],"names":["amountBN","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Constants used across Chipi SDK packages\n */\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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 \"0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e\",\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\",\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n","import type { PaginationQuery, PaginatedResponse } 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\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\nexport async function getUsdAmount(\n mxnAmount: number,\n bearerToken: string,\n client: { get: <T>(params: { endpoint: string; params?: Record<string, any>; bearerToken?: string }) => Promise<T> }\n): Promise<number> {\n try {\n const response = await client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/get-usd-amount`,\n bearerToken,\n params: { mxnAmount: Number(mxnAmount) },\n });\n\n if (response === null || response === undefined) {\n throw new Error('Exchange API returned null or undefined response');\n }\n\n // Runtime type guard - fail fast on bad payloads\n if (typeof response === 'number' && !isNaN(response)) {\n return response;\n }\n\n // Handle object shape like { usdAmount: number }\n if (typeof response === 'object' && 'usdAmount' in response) {\n const amount = (response as any).usdAmount;\n if (typeof amount === 'number' && !isNaN(amount)) {\n return amount;\n }\n }\n\n throw new Error(\n `Exchange API returned unexpected type: ${typeof response}. Expected number or { usdAmount: number }`\n );\n } catch (error) {\n console.error(\"Error getting USD amount:\", error);\n throw error instanceof Error \n ? error \n : new Error(\"Failed to get USD amount\");\n }\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 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/constants/index.ts","../src/utils/index.ts","../src/errors.ts","../src/formatters.ts","../src/validation.ts"],"names":["amountBN","z"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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\",\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: \"0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\",\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 { PaginationQuery, PaginatedResponse } 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\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\nexport async function getUsdAmount(\n mxnAmount: number,\n bearerToken: string,\n client: { get: <T>(params: { endpoint: string; params?: Record<string, any>; bearerToken?: string }) => Promise<T> }\n): Promise<number> {\n try {\n const response = await client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/get-usd-amount`,\n bearerToken,\n params: { mxnAmount: Number(mxnAmount) },\n });\n\n if (response === null || response === undefined) {\n throw new Error('Exchange API returned null or undefined response');\n }\n\n // Runtime type guard - fail fast on bad payloads\n if (typeof response === 'number' && !isNaN(response)) {\n return response;\n }\n\n // Handle object shape like { usdAmount: number }\n if (typeof response === 'object' && 'usdAmount' in response) {\n const amount = (response as any).usdAmount;\n if (typeof amount === 'number' && !isNaN(amount)) {\n return amount;\n }\n }\n\n throw new Error(\n `Exchange API returned unexpected type: ${typeof response}. Expected number or { usdAmount: number }`\n );\n } catch (error) {\n console.error(\"Error getting USD amount:\", error);\n throw error instanceof Error \n ? error \n : new Error(\"Failed to get USD amount\");\n }\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"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,12 @@
1
1
  import { z } from 'zod';
2
2
 
3
3
  // src/constants/index.ts
4
+ var API_VERSIONING = {
5
+ VERSION: "1",
6
+ // Major version - used in URL path
7
+ VERSION_DATE: "2025-12-30"
8
+ // Detailed version - sent as query param for tracking
9
+ };
4
10
  var STARKNET_NETWORKS = {
5
11
  MAINNET: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
6
12
  SEPOLIA: "https://starknet-sepolia.public.blastapi.io/rpc/v0_7"
@@ -39,7 +45,8 @@ var ERRORS = {
39
45
  SKU_UNAVAILABLE: "SKU_UNAVAILABLE"
40
46
  };
41
47
  var SKU_CONTRACTS = {
42
- RECHARGER_WITH_STRK_MAINNET: "0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e",
48
+ RECHARGER_WITH_STRK_MAINNET: "0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7",
49
+ //changed contract address used to be 0x0f3
43
50
  CHIPI_BILL_SERVICE: "0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b"
44
51
  };
45
52
  var SERVICE_TYPES = {
@@ -60,6 +67,49 @@ var CHAIN_TOKEN_TYPES = {
60
67
  WBTC: "WBTC",
61
68
  OTHER: "OTHER"
62
69
  };
70
+ var WALLET_CLASS_HASHES = {
71
+ CHIPI: "0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83",
72
+ READY: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
73
+ };
74
+ var WALLET_RPC_ENDPOINTS = {
75
+ CHIPI: "https://starknet-mainnet.public.blastapi.io/rpc/v0_7",
76
+ READY: "https://cloud.argent-api.com/v1/starknet/mainnet/rpc/v0.7"
77
+ };
78
+ var PAYMASTER_CONFIG = {
79
+ URL: "https://paymaster.chipipay.com"
80
+ };
81
+ var SESSION_DEFAULTS = {
82
+ /** Default session duration: 6 hours in seconds */
83
+ DURATION_SECONDS: 21600,
84
+ /** Default max calls per session */
85
+ MAX_CALLS: 1e3
86
+ };
87
+ var SESSION_ERRORS = {
88
+ /** Session keys only work with CHIPI wallets */
89
+ INVALID_WALLET_TYPE_FOR_SESSION: "INVALID_WALLET_TYPE_FOR_SESSION",
90
+ /** Session has expired (validUntil < now) */
91
+ SESSION_EXPIRED: "SESSION_EXPIRED",
92
+ /** Session key not registered on contract */
93
+ SESSION_NOT_REGISTERED: "SESSION_NOT_REGISTERED",
94
+ /** Session key has been revoked */
95
+ SESSION_REVOKED: "SESSION_REVOKED",
96
+ /** Session has exceeded max calls */
97
+ SESSION_MAX_CALLS_EXCEEDED: "SESSION_MAX_CALLS_EXCEEDED",
98
+ /** Entrypoint not allowed for this session */
99
+ SESSION_ENTRYPOINT_NOT_ALLOWED: "SESSION_ENTRYPOINT_NOT_ALLOWED",
100
+ /** Failed to decrypt session private key */
101
+ SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED",
102
+ /** Failed to create session key */
103
+ SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED"
104
+ };
105
+ var SESSION_ENTRYPOINTS = {
106
+ /** Add or update a session key (owner only) */
107
+ ADD_OR_UPDATE: "add_or_update_session_key",
108
+ /** Revoke a session key (owner only) */
109
+ REVOKE: "revoke_session_key",
110
+ /** Query session data (public read) */
111
+ GET_DATA: "get_session_data"
112
+ };
63
113
 
64
114
  // src/utils/index.ts
65
115
  function isValidAddress(address) {
@@ -204,6 +254,12 @@ var ChipiTransactionError = class extends ChipiError {
204
254
  this.name = "ChipiTransactionError";
205
255
  }
206
256
  };
257
+ var ChipiSessionError = class extends ChipiError {
258
+ constructor(message, code = "SESSION_ERROR") {
259
+ super(message, code);
260
+ this.name = "ChipiSessionError";
261
+ }
262
+ };
207
263
  var ChipiSkuError = class extends ChipiError {
208
264
  constructor(message, code = "SKU_ERROR") {
209
265
  super(message, code);
@@ -311,6 +367,6 @@ function validateErrorResponse(response) {
311
367
  };
312
368
  }
313
369
 
314
- export { API_ENDPOINTS, ApiResponseSchema, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ChipiApiError, ChipiAuthError, ChipiError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, DEFAULT_PAGINATION, ERRORS, ErrorResponseSchema, SERVICE_TYPES, SKU_CONTRACTS, STARKNET_NETWORKS, SuccessResponseSchema, TOKEN_DECIMALS, camelToSnake, capitalizeFirst, createPaginatedResponse, deepMerge, formatAddress, formatAmount, formatCurrency, formatDate, formatNumber, formatTransactionHash, getUsdAmount, handleApiError, isChipiError, isValidAddress, isValidApiKey, parseAmount, retry, sanitizeUrl, sleep, snakeToCamel, validateApiResponse, validateErrorResponse, validatePagination };
370
+ export { API_ENDPOINTS, API_VERSIONING, ApiResponseSchema, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ChipiApiError, ChipiAuthError, ChipiError, ChipiSessionError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, DEFAULT_PAGINATION, 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, getUsdAmount, handleApiError, isChipiError, isValidAddress, isValidApiKey, parseAmount, retry, sanitizeUrl, sleep, snakeToCamel, validateApiResponse, validateErrorResponse, validatePagination };
315
371
  //# sourceMappingURL=index.mjs.map
316
372
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants/index.ts","../src/utils/index.ts","../src/errors.ts","../src/formatters.ts","../src/validation.ts"],"names":["amountBN"],"mappings":";;;AAIO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,OAAA,EAAS,sDAAA;AAAA,EACT,OAAA,EAAS;AACX;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,YAAA,EACE,oEAAA;AAAA,EACF,iBAAA,EACE;AACJ;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,CAAA;AAAA,EACN,GAAA,EAAK,EAAA;AAAA,EACL,IAAA,EAAM,EAAA;AAAA,EACN,GAAA,EAAK;AACP;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA,EAAe,gBAAA;AAAA,EACf,YAAA,EAAc,eAAA;AAAA,EACd,IAAA,EAAM,OAAA;AAAA,EACN,gBAAA,EAAkB,mBAAA;AAAA,EAClB,SAAA,EAAW,YAAA;AAAA,EACX,KAAA,EAAO;AACT;AAEO,IAAM,kBAAA,GAAqB;AAAA,EAChC,IAAA,EAAM,CAAA;AAAA,EACN,KAAA,EAAO,EAAA;AAAA,EACP,SAAA,EAAW;AACb;AAEO,IAAM,MAAA,GAAS;AAAA,EACpB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB;AACnB;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,2BAAA,EACE,mEAAA;AAAA,EACF,kBAAA,EACE;AACJ;AAGO,IAAM,aAAA,GAAgB;AAAA,EAC3B,WAAA,EAAa;AACf;AAGO,IAAM,WAAA,GAAc;AAAA,EACzB,SAAA,EAAW;AACb;AAEO,IAAM,WAAA,GAAc;AAAA,EACzB,QAAA,EAAU;AACZ;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT;;;ACvEO,SAAS,eAAe,OAAA,EAA0B;AAEvD,EAAA,OAAO,uBAAA,CAAwB,KAAK,OAAO,CAAA;AAC7C;AAEO,SAAS,cAAc,MAAA,EAAyB;AAErD,EAAA,OAAO,kCAAA,CAAmC,KAAK,MAAM,CAAA;AACvD;AAEO,SAAS,YAAA,CAAa,MAAA,EAAiB,QAAA,GAAmB,EAAA,EAAY;AAG3E,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,EAAG;AACzB,IAAA,MAAMA,SAAAA,GAAW,OAAO,MAAM,CAAA,GAAI,OAAO,EAAE,CAAA,IAAK,OAAO,QAAQ,CAAA;AAC/D,IAAA,OAAOA,UAAS,QAAA,EAAS;AAAA,EAC3B;AAGA,EAAA,MAAM,CAAC,WAAA,EAAa,WAAA,GAAc,EAAE,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACxD,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAA,CAAO,QAAA,EAAU,GAAG,CAAA,CAAE,KAAA,CAAM,GAAG,QAAQ,CAAA;AACzE,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,WAAA,GAAc,aAAa,CAAA;AAEnD,EAAA,OAAO,SAAS,QAAA,EAAS;AAC3B;AAEO,SAAS,WAAA,CAAY,MAAA,EAAgB,QAAA,GAAmB,EAAA,EAAY;AACzE,EAAA,MAAM,QAAA,GAAW,OAAO,MAAM,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,EAAE,CAAA,IAAK,OAAO,QAAQ,CAAA;AAC7C,EAAA,OAAO,MAAA,CAAO,QAAQ,CAAA,GAAI,MAAA,CAAO,OAAO,CAAA;AAC1C;AAEO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACvD;AAEO,SAAS,KAAA,CACd,EAAA,EACA,OAAA,GAII,EAAC,EACO;AACZ,EAAA,MAAM,EAAE,WAAA,GAAc,CAAA,EAAG,QAAQ,GAAA,EAAM,OAAA,GAAU,MAAK,GAAI,OAAA;AAE1D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,MAAM,QAAQ,YAAY;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,EAAA,EAAG;AACxB,QAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,MAChB,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,EAAA;AAEA,QAAA,IAAI,WAAW,WAAA,EAAa;AAC1B,UAAA,MAAA,CAAO,KAAK,CAAA;AACZ,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,QAAA,GAAW,UAAU,KAAA,GAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,GAAI,KAAA;AAC9D,QAAA,UAAA,CAAW,OAAO,QAAQ,CAAA;AAAA,MAC5B;AAAA,IACF,CAAA;AAEA,IAAA,KAAA,EAAM;AAAA,EACR,CAAC,CAAA;AACH;AAEO,SAAS,uBAAA,CACd,IAAA,EACA,KAAA,EACA,KAAA,EACsB;AACtB,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,EAAA;AAC7B,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,IAAA,CAAK,KAAA,GAAQ,KAAK,CAAA;AAE1C,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,mBAAmB,KAAA,EAGjC;AACA,EAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,KAAA,CAAM,QAAQ,CAAC,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,IAAI,CAAA,EAAG,KAAA,CAAM,KAAA,IAAS,EAAE,CAAC,CAAA;AAE1D,EAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AACvB;AAEO,SAAS,YAAY,GAAA,EAAqB;AAC/C,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,GAAG,CAAA;AAC1B,IAAA,OAAO,OAAO,QAAA,EAAS;AAAA,EACzB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,aAAA,EAAgB,GAAG,CAAA,CAAE,CAAA;AAAA,EACvC;AACF;AAEO,SAAS,SAAA,CACd,QACA,MAAA,EACG;AACH,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAE3B,EAAA,KAAA,MAAW,OAAO,MAAA,EAAQ;AACxB,IAAA,IAAI,MAAA,CAAO,GAAG,CAAA,KAAM,MAAA,EAAW;AAC7B,MAAA,MAAM,WAAA,GAAc,OAAO,GAAG,CAAA;AAC9B,MAAA,IACE,OAAO,WAAA,KAAgB,QAAA,IACvB,WAAA,KAAgB,IAAA,IAChB,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,IAC1B,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,IACvB,MAAA,CAAO,GAAG,CAAA,KAAM,IAAA,IAChB,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,EAC1B;AACA,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,CAAU,MAAA,CAAO,GAAG,GAAG,WAAW,CAAA;AAAA,MAClD,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGA,eAAsB,YAAA,CACpB,SAAA,EACA,WAAA,EACA,MAAA,EACiB;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,GAAA,CAAY;AAAA,MACxC,QAAA,EAAU,CAAA,EAAG,aAAA,CAAc,SAAS,CAAA,eAAA,CAAA;AAAA,MACpC,WAAA;AAAA,MACA,MAAA,EAAQ,EAAE,SAAA,EAAW,MAAA,CAAO,SAAS,CAAA;AAAE,KACxC,CAAA;AAED,IAAA,IAAI,QAAA,KAAa,IAAA,IAAQ,QAAA,KAAa,KAAA,CAAA,EAAW;AAC/C,MAAA,MAAM,IAAI,MAAM,kDAAkD,CAAA;AAAA,IACpE;AAGA,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,CAAC,KAAA,CAAM,QAAQ,CAAA,EAAG;AACpD,MAAA,OAAO,QAAA;AAAA,IACT;AAGA,IAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,WAAA,IAAe,QAAA,EAAU;AAC3D,MAAA,MAAM,SAAU,QAAA,CAAiB,SAAA;AACjC,MAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,CAAC,KAAA,CAAM,MAAM,CAAA,EAAG;AAChD,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,uCAAA,EAA0C,OAAO,QAAQ,CAAA,0CAAA;AAAA,KAC3D;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,6BAA6B,KAAK,CAAA;AAChD,IAAA,MAAM,KAAA,YAAiB,KAAA,GACnB,KAAA,GACA,IAAI,MAAM,0BAA0B,CAAA;AAAA,EAC1C;AACF;;;AC9KO,IAAM,UAAA,GAAN,MAAM,WAAA,SAAmB,KAAA,CAA+B;AAAA,EAI7D,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,MAAA,EAAiB;AAC1D,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAGd,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,WAAU,CAAA;AAAA,IAC1C;AAAA,EACF;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,UAAA,CAAW;AAAA,EAC5C,WAAA,CAAY,OAAA,EAAiB,IAAA,EAAc,MAAA,EAAgB;AACzD,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,MAAM,CAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,eAAA;AAAA,EACd;AACF;AAEO,IAAM,gBAAA,GAAN,cAA+B,UAAA,CAAW;AAAA,EAC/C,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAe,cAAA,EAAgB;AAC1D,IAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AAAA,EACd;AACF;AAEO,IAAM,qBAAA,GAAN,cAAoC,UAAA,CAAW;AAAA,EACpD,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAe,mBAAA,EAAqB;AAC/D,IAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AACnB,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AAAA,EACd;AACF;AAEO,IAAM,aAAA,GAAN,cAA4B,UAAA,CAAW;AAAA,EAC5C,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAe,WAAA,EAAa;AACvD,IAAA,KAAA,CAAM,SAAS,IAAI,CAAA;AAAA,EACrB;AACF;AAEO,IAAM,oBAAA,GAAN,cAAmC,UAAA,CAAW;AAAA,EACnD,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAe,kBAAA,EAAoB;AAC9D,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,GAAG,CAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;AAEO,IAAM,cAAA,GAAN,cAA6B,UAAA,CAAW;AAAA,EAC7C,WAAA,CAAY,OAAA,EAAiB,IAAA,GAAe,YAAA,EAAc;AACxD,IAAA,KAAA,CAAM,OAAA,EAAS,MAAM,GAAG,CAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AAAA,EACd;AACF;AAEO,SAAS,aAAa,KAAA,EAAiC;AAC5D,EAAA,OAAO,KAAA,YAAiB,UAAA;AAC1B;AAEO,SAAS,eAAe,KAAA,EAAwB;AACrD,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,EAAG;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,EAAO,UAAU,MAAA,EAAQ;AAC3B,IAAA,MAAM,MAAA,GAAS,MAAM,QAAA,CAAS,MAAA;AAC9B,IAAA,MAAM,UAAU,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,OAAA,IAAW,MAAM,OAAA,IAAW,oBAAA;AACjE,IAAA,MAAM,OAAO,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,IAAA,IAAQ,QAAQ,MAAM,CAAA,CAAA;AAExD,IAAA,OAAO,IAAI,aAAA,CAAc,OAAA,EAAS,IAAA,EAAM,MAAM,CAAA;AAAA,EAChD;AAEA,EAAA,OAAO,IAAI,UAAA;AAAA,IACT,OAAO,OAAA,IAAW,2BAAA;AAAA,IAClB;AAAA,GACF;AACF;;;ACjFO,SAAS,cAAA,CACd,MAAA,EACA,QAAA,GAAmB,KAAA,EACnB,SAAiB,OAAA,EACT;AACR,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,IACnC,KAAA,EAAO,UAAA;AAAA,IACP;AAAA,GACD,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA;AAClB;AAEO,SAAS,YAAA,CACd,KAAA,EACA,OAAA,GAII,EAAC,EACG;AACR,EAAA,MAAM,EAAE,QAAA,GAAW,CAAA,EAAG,SAAS,OAAA,EAAS,OAAA,GAAU,OAAM,GAAI,OAAA;AAE5D,EAAA,OAAO,IAAI,IAAA,CAAK,YAAA,CAAa,MAAA,EAAQ;AAAA,IACnC,qBAAA,EAAuB,QAAA;AAAA,IACvB,qBAAA,EAAuB,QAAA;AAAA,IACvB,QAAA,EAAU,UAAU,SAAA,GAAY;AAAA,GACjC,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA;AACjB;AAEO,SAAS,UAAA,CACd,IAAA,EACA,OAAA,GAII,EAAC,EACG;AACR,EAAA,MAAM,EAAE,MAAA,GAAS,OAAA,EAAS,SAAA,GAAY,QAAA,EAAU,WAAU,GAAI,OAAA;AAC9D,EAAA,MAAM,UAAU,OAAO,IAAA,KAAS,WAAW,IAAI,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAE5D,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ;AAAA,IACrC,SAAA;AAAA,IACA;AAAA,GACD,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA;AACnB;AAEO,SAAS,aAAA,CAAc,OAAA,EAAiB,MAAA,GAAiB,CAAA,EAAW;AACzE,EAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,MAAA,GAAS,CAAA,EAAG;AAChC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,MAAM,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,CAAC,MAAM,CAAC,CAAA,CAAA;AAChE;AAEO,SAAS,sBAAsB,IAAA,EAAsB;AAC1D,EAAA,OAAO,aAAA,CAAc,MAAM,CAAC,CAAA;AAC9B;AAIO,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,OAAO,GAAA,CAAI,QAAQ,QAAA,EAAU,CAAA,MAAA,KAAU,IAAI,MAAA,CAAO,WAAA,EAAa,CAAA,CAAE,CAAA;AACnE;AAEO,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,OAAO,GAAA,CAAI,QAAQ,WAAA,EAAa,CAAC,GAAG,MAAA,KAAW,MAAA,CAAO,aAAa,CAAA;AACrE;AAEO,SAAS,gBAAgB,GAAA,EAAqB;AACnD,EAAA,OAAO,GAAA,CAAI,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,GAAA,CAAI,MAAM,CAAC,CAAA;AAClD;ACtEO,IAAM,iBAAA,GAAoB,EAAE,MAAA,CAAO;AAAA,EACxC,IAAA,EAAM,EAAE,OAAA,EAAQ;AAAA,EAChB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC7B,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACnB,CAAC;AAGM,IAAM,mBAAA,GAAsB,EAAE,MAAA,CAAO;AAAA,EAC1C,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,EAClB,IAAA,EAAM,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,EAC1B,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AACrB,CAAC;AAGM,IAAM,qBAAA,GAAwB,CAAyB,UAAA,KAC5D,CAAA,CAAE,MAAA,CAAO;AAAA,EACP,IAAA,EAAM;AACR,CAAC;AAUI,SAAS,mBAAA,CACd,UACA,UAAA,EACM;AAEN,EAAA,MAAM,MAAA,GAAS,qBAAA,CAAsB,UAAU,CAAA,CAAE,UAAU,QAAQ,CAAA;AACnE,EAAA,IAAI,CAAC,OAAO,IAAA,EAAM;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAAA,EACxE;AACF;AAEO,SAAS,sBAAsB,QAAA,EAAkC;AACtE,EAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,SAAA,CAAU,QAAQ,CAAA;AACrD,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,OAAO,MAAA,CAAO,IAAA;AAAA,EAChB;AAGA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,wBAAA;AAAA,IACT,IAAA,EAAM;AAAA,GACR;AACF","file":"index.mjs","sourcesContent":["/**\n * Constants used across Chipi SDK packages\n */\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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 \"0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e\",\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\",\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n","import type { PaginationQuery, PaginatedResponse } 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\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\nexport async function getUsdAmount(\n mxnAmount: number,\n bearerToken: string,\n client: { get: <T>(params: { endpoint: string; params?: Record<string, any>; bearerToken?: string }) => Promise<T> }\n): Promise<number> {\n try {\n const response = await client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/get-usd-amount`,\n bearerToken,\n params: { mxnAmount: Number(mxnAmount) },\n });\n\n if (response === null || response === undefined) {\n throw new Error('Exchange API returned null or undefined response');\n }\n\n // Runtime type guard - fail fast on bad payloads\n if (typeof response === 'number' && !isNaN(response)) {\n return response;\n }\n\n // Handle object shape like { usdAmount: number }\n if (typeof response === 'object' && 'usdAmount' in response) {\n const amount = (response as any).usdAmount;\n if (typeof amount === 'number' && !isNaN(amount)) {\n return amount;\n }\n }\n\n throw new Error(\n `Exchange API returned unexpected type: ${typeof response}. Expected number or { usdAmount: number }`\n );\n } catch (error) {\n console.error(\"Error getting USD amount:\", error);\n throw error instanceof Error \n ? error \n : new Error(\"Failed to get USD amount\");\n }\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 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/constants/index.ts","../src/utils/index.ts","../src/errors.ts","../src/formatters.ts","../src/validation.ts"],"names":["amountBN"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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\",\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: \"0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\",\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 { PaginationQuery, PaginatedResponse } 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\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\nexport async function getUsdAmount(\n mxnAmount: number,\n bearerToken: string,\n client: { get: <T>(params: { endpoint: string; params?: Record<string, any>; bearerToken?: string }) => Promise<T> }\n): Promise<number> {\n try {\n const response = await client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/get-usd-amount`,\n bearerToken,\n params: { mxnAmount: Number(mxnAmount) },\n });\n\n if (response === null || response === undefined) {\n throw new Error('Exchange API returned null or undefined response');\n }\n\n // Runtime type guard - fail fast on bad payloads\n if (typeof response === 'number' && !isNaN(response)) {\n return response;\n }\n\n // Handle object shape like { usdAmount: number }\n if (typeof response === 'object' && 'usdAmount' in response) {\n const amount = (response as any).usdAmount;\n if (typeof amount === 'number' && !isNaN(amount)) {\n return amount;\n }\n }\n\n throw new Error(\n `Exchange API returned unexpected type: ${typeof response}. Expected number or { usdAmount: number }`\n );\n } catch (error) {\n console.error(\"Error getting USD amount:\", error);\n throw error instanceof Error \n ? error \n : new Error(\"Failed to get USD amount\");\n }\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 +1 @@
1
- {"version":3,"sources":["../../src/constants/index.ts","../../src/utils/index.ts"],"names":["amountBN"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Constants used across Chipi SDK packages\n */\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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 \"0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e\",\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\",\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n","import type { PaginationQuery, PaginatedResponse } 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\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\nexport async function getUsdAmount(\n mxnAmount: number,\n bearerToken: string,\n client: { get: <T>(params: { endpoint: string; params?: Record<string, any>; bearerToken?: string }) => Promise<T> }\n): Promise<number> {\n try {\n const response = await client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/get-usd-amount`,\n bearerToken,\n params: { mxnAmount: Number(mxnAmount) },\n });\n\n if (response === null || response === undefined) {\n throw new Error('Exchange API returned null or undefined response');\n }\n\n // Runtime type guard - fail fast on bad payloads\n if (typeof response === 'number' && !isNaN(response)) {\n return response;\n }\n\n // Handle object shape like { usdAmount: number }\n if (typeof response === 'object' && 'usdAmount' in response) {\n const amount = (response as any).usdAmount;\n if (typeof amount === 'number' && !isNaN(amount)) {\n return amount;\n }\n }\n\n throw new Error(\n `Exchange API returned unexpected type: ${typeof response}. Expected number or { usdAmount: number }`\n );\n } catch (error) {\n console.error(\"Error getting USD amount:\", error);\n throw error instanceof Error \n ? error \n : new Error(\"Failed to get USD amount\");\n }\n}"]}
1
+ {"version":3,"sources":["../../src/constants/index.ts","../../src/utils/index.ts"],"names":["amountBN"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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\",\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: \"0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\",\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 { PaginationQuery, PaginatedResponse } 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\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\nexport async function getUsdAmount(\n mxnAmount: number,\n bearerToken: string,\n client: { get: <T>(params: { endpoint: string; params?: Record<string, any>; bearerToken?: string }) => Promise<T> }\n): Promise<number> {\n try {\n const response = await client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/get-usd-amount`,\n bearerToken,\n params: { mxnAmount: Number(mxnAmount) },\n });\n\n if (response === null || response === undefined) {\n throw new Error('Exchange API returned null or undefined response');\n }\n\n // Runtime type guard - fail fast on bad payloads\n if (typeof response === 'number' && !isNaN(response)) {\n return response;\n }\n\n // Handle object shape like { usdAmount: number }\n if (typeof response === 'object' && 'usdAmount' in response) {\n const amount = (response as any).usdAmount;\n if (typeof amount === 'number' && !isNaN(amount)) {\n return amount;\n }\n }\n\n throw new Error(\n `Exchange API returned unexpected type: ${typeof response}. Expected number or { usdAmount: number }`\n );\n } catch (error) {\n console.error(\"Error getting USD amount:\", error);\n throw error instanceof Error \n ? error \n : new Error(\"Failed to get USD amount\");\n }\n}"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/constants/index.ts","../../src/utils/index.ts"],"names":["amountBN"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Constants used across Chipi SDK packages\n */\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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 \"0x0f3b9f89c1da1113ea497c9073f9257c9d1fe5d871ce9a6785491fc5e47539e\",\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\",\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n","import type { PaginationQuery, PaginatedResponse } 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\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\nexport async function getUsdAmount(\n mxnAmount: number,\n bearerToken: string,\n client: { get: <T>(params: { endpoint: string; params?: Record<string, any>; bearerToken?: string }) => Promise<T> }\n): Promise<number> {\n try {\n const response = await client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/get-usd-amount`,\n bearerToken,\n params: { mxnAmount: Number(mxnAmount) },\n });\n\n if (response === null || response === undefined) {\n throw new Error('Exchange API returned null or undefined response');\n }\n\n // Runtime type guard - fail fast on bad payloads\n if (typeof response === 'number' && !isNaN(response)) {\n return response;\n }\n\n // Handle object shape like { usdAmount: number }\n if (typeof response === 'object' && 'usdAmount' in response) {\n const amount = (response as any).usdAmount;\n if (typeof amount === 'number' && !isNaN(amount)) {\n return amount;\n }\n }\n\n throw new Error(\n `Exchange API returned unexpected type: ${typeof response}. Expected number or { usdAmount: number }`\n );\n } catch (error) {\n console.error(\"Error getting USD amount:\", error);\n throw error instanceof Error \n ? error \n : new Error(\"Failed to get USD amount\");\n }\n}"]}
1
+ {"version":3,"sources":["../../src/constants/index.ts","../../src/utils/index.ts"],"names":["amountBN"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\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 \"0x053c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8\",\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_TRANSACTIONS: \"/sku-transactions\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const DEFAULT_PAGINATION = {\n PAGE: 1,\n LIMIT: 10,\n MAX_LIMIT: 100,\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\",\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: \"0x2de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\",\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 { PaginationQuery, PaginatedResponse } 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\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\nexport async function getUsdAmount(\n mxnAmount: number,\n bearerToken: string,\n client: { get: <T>(params: { endpoint: string; params?: Record<string, any>; bearerToken?: string }) => Promise<T> }\n): Promise<number> {\n try {\n const response = await client.get<number>({\n endpoint: `${API_ENDPOINTS.EXCHANGES}/get-usd-amount`,\n bearerToken,\n params: { mxnAmount: Number(mxnAmount) },\n });\n\n if (response === null || response === undefined) {\n throw new Error('Exchange API returned null or undefined response');\n }\n\n // Runtime type guard - fail fast on bad payloads\n if (typeof response === 'number' && !isNaN(response)) {\n return response;\n }\n\n // Handle object shape like { usdAmount: number }\n if (typeof response === 'object' && 'usdAmount' in response) {\n const amount = (response as any).usdAmount;\n if (typeof amount === 'number' && !isNaN(amount)) {\n return amount;\n }\n }\n\n throw new Error(\n `Exchange API returned unexpected type: ${typeof response}. Expected number or { usdAmount: number }`\n );\n } catch (error) {\n console.error(\"Error getting USD amount:\", error);\n throw error instanceof Error \n ? error \n : new Error(\"Failed to get USD amount\");\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chipi-stack/shared",
3
- "version": "11.21.0",
3
+ "version": "12.0.0",
4
4
  "description": "Shared utilities and helpers for Chipi SDK packages",
5
5
  "repository": {
6
6
  "type": "git",
@@ -51,7 +51,7 @@
51
51
  "dependencies": {
52
52
  "starknet": ">=6.23.1",
53
53
  "zod": "^4.0.17",
54
- "@chipi-stack/types": "^11.21.0"
54
+ "@chipi-stack/types": "^12.0.0"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@types/node": "^22.15.15",