@chipi-stack/shared 13.13.0 → 14.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +19 -1
- package/dist/constants/index.d.mts +22 -5
- package/dist/constants/index.d.ts +22 -5
- package/dist/constants/index.js +40 -7
- package/dist/constants/index.js.map +1 -1
- package/dist/constants/index.mjs +39 -8
- package/dist/constants/index.mjs.map +1 -1
- package/dist/index.d.mts +29 -6
- package/dist/index.d.ts +29 -6
- package/dist/index.js +83 -15
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +78 -16
- package/dist/index.mjs.map +1 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +2 -2
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024-2026 Chipi Pay
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,21 @@
|
|
|
1
1
|
# @chipi-stack/shared
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Shared constants, utilities, error classes, and validators for the Chipi SDK ecosystem.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @chipi-stack/shared
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Key Exports
|
|
12
|
+
|
|
13
|
+
- **Constants** (`constants/`): WALLET_CLASS_HASHES, LEGACY_CHIPI_CLASS_HASHES, CONTRACT_ADDRESSES, STARKNET_NETWORKS, API_ENDPOINTS, TOKEN_DECIMALS, SKU_CONTRACTS, CHAIN_TOKEN_TYPES, WALLET_RPC_ENDPOINTS, PAYMASTER_CONFIG, SESSION_DEFAULTS, SESSION_ERRORS, SESSION_ENTRYPOINTS, getWalletTypeFromClassHash
|
|
14
|
+
- **Errors** (`errors.ts`): ChipiError, ChipiApiError, ChipiWalletError, ChipiTransactionError, ChipiSessionError, ChipiSkuError, ChipiValidationError, ChipiAuthError, isChipiError, hasHttpStatus, handleApiError
|
|
15
|
+
- **Formatters** (`formatters.ts`): formatCurrency, formatNumber, formatDate, formatAddress, formatTransactionHash, camelToSnake, snakeToCamel, capitalizeFirst
|
|
16
|
+
- **Utils** (`utils/`): isValidAddress, isValidApiKey, formatAmount, parseAmount, sleep, retry, createPaginatedResponse, validatePagination, sanitizeUrl, deepMerge
|
|
17
|
+
- **Validation** (`validation.ts`): ApiResponseSchema, ErrorResponseSchema, SuccessResponseSchema, validateApiResponse, validateErrorResponse
|
|
18
|
+
|
|
19
|
+
## License
|
|
20
|
+
|
|
21
|
+
MIT
|
|
@@ -17,8 +17,9 @@ declare const API_VERSIONING: {
|
|
|
17
17
|
readonly VERSION_DATE: "2025-12-30";
|
|
18
18
|
};
|
|
19
19
|
declare const STARKNET_NETWORKS: {
|
|
20
|
-
readonly MAINNET:
|
|
21
|
-
readonly
|
|
20
|
+
readonly MAINNET: string;
|
|
21
|
+
readonly MAINNET_FALLBACK: "https://rpc.starknet.lava.build";
|
|
22
|
+
readonly SEPOLIA: string;
|
|
22
23
|
};
|
|
23
24
|
declare const CONTRACT_ADDRESSES: {
|
|
24
25
|
readonly USDC_MAINNET: "0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb";
|
|
@@ -70,8 +71,22 @@ declare const CHAIN_TOKEN_TYPES: {
|
|
|
70
71
|
readonly WBTC: "WBTC";
|
|
71
72
|
readonly OTHER: "OTHER";
|
|
72
73
|
};
|
|
73
|
-
declare const WALLET_CLASS_HASHES: Record<
|
|
74
|
-
|
|
74
|
+
declare const WALLET_CLASS_HASHES: Record<string, string>;
|
|
75
|
+
/**
|
|
76
|
+
* Previous CHIPI wallet class hashes that are still deployed on-chain.
|
|
77
|
+
* Used by getWalletTypeFromClassHash() to identify legacy wallets.
|
|
78
|
+
* Ordered newest → oldest.
|
|
79
|
+
*/
|
|
80
|
+
declare const LEGACY_CHIPI_CLASS_HASHES: string[];
|
|
81
|
+
/**
|
|
82
|
+
* Determine wallet type from an on-chain class hash.
|
|
83
|
+
* - If it matches the READY hash → READY
|
|
84
|
+
* - If it matches the current CHIPI hash → CHIPI
|
|
85
|
+
* - If it matches a legacy CHIPI hash → CHIPI
|
|
86
|
+
* - Otherwise → null (unknown class hash, caller should handle accordingly)
|
|
87
|
+
*/
|
|
88
|
+
declare function getWalletTypeFromClassHash(classHash: string): WalletType | null;
|
|
89
|
+
declare const WALLET_RPC_ENDPOINTS: Record<string, string>;
|
|
75
90
|
declare const PAYMASTER_CONFIG: {
|
|
76
91
|
readonly URL: "https://paymaster.chipipay.com";
|
|
77
92
|
};
|
|
@@ -98,6 +113,8 @@ declare const SESSION_ERRORS: {
|
|
|
98
113
|
readonly SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED";
|
|
99
114
|
/** Failed to create session key */
|
|
100
115
|
readonly SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED";
|
|
116
|
+
/** Backend returned an invalid response shape */
|
|
117
|
+
readonly SESSION_INVALID_RESPONSE: "SESSION_INVALID_RESPONSE";
|
|
101
118
|
};
|
|
102
119
|
declare const SESSION_ENTRYPOINTS: {
|
|
103
120
|
/** Add or update a session key (owner only) */
|
|
@@ -108,4 +125,4 @@ declare const SESSION_ENTRYPOINTS: {
|
|
|
108
125
|
readonly GET_DATA: "get_session_data";
|
|
109
126
|
};
|
|
110
127
|
|
|
111
|
-
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ERRORS, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS };
|
|
128
|
+
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ERRORS, LEGACY_CHIPI_CLASS_HASHES, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS, getWalletTypeFromClassHash };
|
|
@@ -17,8 +17,9 @@ declare const API_VERSIONING: {
|
|
|
17
17
|
readonly VERSION_DATE: "2025-12-30";
|
|
18
18
|
};
|
|
19
19
|
declare const STARKNET_NETWORKS: {
|
|
20
|
-
readonly MAINNET:
|
|
21
|
-
readonly
|
|
20
|
+
readonly MAINNET: string;
|
|
21
|
+
readonly MAINNET_FALLBACK: "https://rpc.starknet.lava.build";
|
|
22
|
+
readonly SEPOLIA: string;
|
|
22
23
|
};
|
|
23
24
|
declare const CONTRACT_ADDRESSES: {
|
|
24
25
|
readonly USDC_MAINNET: "0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb";
|
|
@@ -70,8 +71,22 @@ declare const CHAIN_TOKEN_TYPES: {
|
|
|
70
71
|
readonly WBTC: "WBTC";
|
|
71
72
|
readonly OTHER: "OTHER";
|
|
72
73
|
};
|
|
73
|
-
declare const WALLET_CLASS_HASHES: Record<
|
|
74
|
-
|
|
74
|
+
declare const WALLET_CLASS_HASHES: Record<string, string>;
|
|
75
|
+
/**
|
|
76
|
+
* Previous CHIPI wallet class hashes that are still deployed on-chain.
|
|
77
|
+
* Used by getWalletTypeFromClassHash() to identify legacy wallets.
|
|
78
|
+
* Ordered newest → oldest.
|
|
79
|
+
*/
|
|
80
|
+
declare const LEGACY_CHIPI_CLASS_HASHES: string[];
|
|
81
|
+
/**
|
|
82
|
+
* Determine wallet type from an on-chain class hash.
|
|
83
|
+
* - If it matches the READY hash → READY
|
|
84
|
+
* - If it matches the current CHIPI hash → CHIPI
|
|
85
|
+
* - If it matches a legacy CHIPI hash → CHIPI
|
|
86
|
+
* - Otherwise → null (unknown class hash, caller should handle accordingly)
|
|
87
|
+
*/
|
|
88
|
+
declare function getWalletTypeFromClassHash(classHash: string): WalletType | null;
|
|
89
|
+
declare const WALLET_RPC_ENDPOINTS: Record<string, string>;
|
|
75
90
|
declare const PAYMASTER_CONFIG: {
|
|
76
91
|
readonly URL: "https://paymaster.chipipay.com";
|
|
77
92
|
};
|
|
@@ -98,6 +113,8 @@ declare const SESSION_ERRORS: {
|
|
|
98
113
|
readonly SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED";
|
|
99
114
|
/** Failed to create session key */
|
|
100
115
|
readonly SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED";
|
|
116
|
+
/** Backend returned an invalid response shape */
|
|
117
|
+
readonly SESSION_INVALID_RESPONSE: "SESSION_INVALID_RESPONSE";
|
|
101
118
|
};
|
|
102
119
|
declare const SESSION_ENTRYPOINTS: {
|
|
103
120
|
/** Add or update a session key (owner only) */
|
|
@@ -108,4 +125,4 @@ declare const SESSION_ENTRYPOINTS: {
|
|
|
108
125
|
readonly GET_DATA: "get_session_data";
|
|
109
126
|
};
|
|
110
127
|
|
|
111
|
-
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ERRORS, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS };
|
|
128
|
+
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ERRORS, LEGACY_CHIPI_CLASS_HASHES, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS, getWalletTypeFromClassHash };
|
package/dist/constants/index.js
CHANGED
|
@@ -7,9 +7,12 @@ var API_VERSIONING = {
|
|
|
7
7
|
VERSION_DATE: "2025-12-30"
|
|
8
8
|
// Detailed version - sent as query param for tracking
|
|
9
9
|
};
|
|
10
|
+
var DEFAULT_MAINNET_RPC = "https://starknet-mainnet.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2";
|
|
11
|
+
var DEFAULT_SEPOLIA_RPC = "https://starknet-sepolia.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2";
|
|
10
12
|
var STARKNET_NETWORKS = {
|
|
11
|
-
MAINNET:
|
|
12
|
-
|
|
13
|
+
MAINNET: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,
|
|
14
|
+
MAINNET_FALLBACK: "https://rpc.starknet.lava.build",
|
|
15
|
+
SEPOLIA: process.env.STARKNET_RPC_URL_SEPOLIA ?? DEFAULT_SEPOLIA_RPC
|
|
13
16
|
};
|
|
14
17
|
var CONTRACT_ADDRESSES = {
|
|
15
18
|
USDC_MAINNET: "0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb",
|
|
@@ -65,13 +68,39 @@ var CHAIN_TOKEN_TYPES = {
|
|
|
65
68
|
OTHER: "OTHER"
|
|
66
69
|
};
|
|
67
70
|
var WALLET_CLASS_HASHES = {
|
|
68
|
-
CHIPI: "
|
|
69
|
-
//
|
|
71
|
+
CHIPI: "0x053f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a",
|
|
72
|
+
// v29 — must match backend until coordinated v33 upgrade
|
|
70
73
|
READY: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
|
|
71
74
|
};
|
|
75
|
+
var LEGACY_CHIPI_CLASS_HASHES = [
|
|
76
|
+
"0x0484bbd2404b3c7264bea271f7267d6d4004821ac7787a9eed7f472e79ef40d1",
|
|
77
|
+
// v33 — wallets created during brief v33 window
|
|
78
|
+
"0x035a2251aca25daba18a5d8950deffa8372a7d84774554e75283cb85552eebc9",
|
|
79
|
+
// v32 — audit 3
|
|
80
|
+
"0x0254f6dd0427319ec614c29e4e3929500d1ba95d0da87ff81d67051ce572667",
|
|
81
|
+
// v31
|
|
82
|
+
"0x072b77b033a874fa1b8f7ff52e18be8fb5ce01a00c59cd184ae15f5b29bc0e57",
|
|
83
|
+
// v30
|
|
84
|
+
"0x02de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83"
|
|
85
|
+
// v28
|
|
86
|
+
];
|
|
87
|
+
function getWalletTypeFromClassHash(classHash) {
|
|
88
|
+
const normalized = classHash.toLowerCase().replace(/^0x0+/, "0x");
|
|
89
|
+
const normalize = (h) => h.toLowerCase().replace(/^0x0+/, "0x");
|
|
90
|
+
if (normalize(WALLET_CLASS_HASHES.READY) === normalized) {
|
|
91
|
+
return "READY";
|
|
92
|
+
}
|
|
93
|
+
if (normalize(WALLET_CLASS_HASHES.CHIPI) === normalized) {
|
|
94
|
+
return "CHIPI";
|
|
95
|
+
}
|
|
96
|
+
if (LEGACY_CHIPI_CLASS_HASHES.some((h) => normalize(h) === normalized)) {
|
|
97
|
+
return "CHIPI";
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
72
101
|
var WALLET_RPC_ENDPOINTS = {
|
|
73
|
-
CHIPI:
|
|
74
|
-
READY:
|
|
102
|
+
CHIPI: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,
|
|
103
|
+
READY: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC
|
|
75
104
|
};
|
|
76
105
|
var PAYMASTER_CONFIG = {
|
|
77
106
|
URL: "https://paymaster.chipipay.com"
|
|
@@ -98,7 +127,9 @@ var SESSION_ERRORS = {
|
|
|
98
127
|
/** Failed to decrypt session private key */
|
|
99
128
|
SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED",
|
|
100
129
|
/** Failed to create session key */
|
|
101
|
-
SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED"
|
|
130
|
+
SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED",
|
|
131
|
+
/** Backend returned an invalid response shape */
|
|
132
|
+
SESSION_INVALID_RESPONSE: "SESSION_INVALID_RESPONSE"
|
|
102
133
|
};
|
|
103
134
|
var SESSION_ENTRYPOINTS = {
|
|
104
135
|
/** Add or update a session key (owner only) */
|
|
@@ -116,6 +147,7 @@ exports.CHAIN_TOKEN_TYPES = CHAIN_TOKEN_TYPES;
|
|
|
116
147
|
exports.CHAIN_TYPES = CHAIN_TYPES;
|
|
117
148
|
exports.CONTRACT_ADDRESSES = CONTRACT_ADDRESSES;
|
|
118
149
|
exports.ERRORS = ERRORS;
|
|
150
|
+
exports.LEGACY_CHIPI_CLASS_HASHES = LEGACY_CHIPI_CLASS_HASHES;
|
|
119
151
|
exports.PAYMASTER_CONFIG = PAYMASTER_CONFIG;
|
|
120
152
|
exports.SERVICE_TYPES = SERVICE_TYPES;
|
|
121
153
|
exports.SESSION_DEFAULTS = SESSION_DEFAULTS;
|
|
@@ -126,5 +158,6 @@ exports.STARKNET_NETWORKS = STARKNET_NETWORKS;
|
|
|
126
158
|
exports.TOKEN_DECIMALS = TOKEN_DECIMALS;
|
|
127
159
|
exports.WALLET_CLASS_HASHES = WALLET_CLASS_HASHES;
|
|
128
160
|
exports.WALLET_RPC_ENDPOINTS = WALLET_RPC_ENDPOINTS;
|
|
161
|
+
exports.getWalletTypeFromClassHash = getWalletTypeFromClassHash;
|
|
129
162
|
//# sourceMappingURL=index.js.map
|
|
130
163
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"sources":["../../src/constants/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Constants used across Chipi SDK packages\n */\n\nimport type { WalletType } from \"@chipi-stack/types\";\n\n/**\n * API Versioning\n * - VERSION: Major version for path-based versioning (/v1, /v2, etc.)\n * - VERSION_DATE: Detailed version for tracking breaking changes (YYYY-MM-DD format)\n *\n * Update VERSION_DATE when making API changes.\n * Update VERSION when making major breaking changes (typically 1-2 times per year).\n */\nexport const API_VERSIONING = {\n VERSION: \"1\", // Major version - used in URL path\n VERSION_DATE: \"2025-12-30\", // Detailed version - sent as query param for tracking\n} as const;\n\n// Default RPC URLs — override via STARKNET_RPC_URL / STARKNET_RPC_URL_SEPOLIA env vars.\nconst DEFAULT_MAINNET_RPC =\n \"https://starknet-mainnet.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2\";\nconst DEFAULT_SEPOLIA_RPC =\n \"https://starknet-sepolia.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2\";\n\nexport const STARKNET_NETWORKS = {\n MAINNET: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n MAINNET_FALLBACK: \"https://rpc.starknet.lava.build\",\n SEPOLIA: process.env.STARKNET_RPC_URL_SEPOLIA ?? DEFAULT_SEPOLIA_RPC,\n} as const;\n\nexport const CONTRACT_ADDRESSES = {\n USDC_MAINNET: \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\", // Changed to Native USDC (was bridged USDC.e)\n VESU_USDC_MAINNET: \"0x017f19582c61479f2fe0b6606300e975c0a8f439102f43eeecc1d0e9b3d84350\",\n} as const;\n\nexport const TOKEN_DECIMALS = {\n USDC: 6,\n USDT: 6,\n ETH: 18,\n STRK: 18,\n DAI: 18,\n} as const;\n\nexport const API_ENDPOINTS = {\n CHIPI_WALLETS: \"/chipi-wallets\",\n TRANSACTIONS: \"/transactions\",\n SKUS: \"/skus\",\n SKU_PURCHASES: \"/sku-purchases\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const ERRORS = {\n INVALID_API_KEY: \"INVALID_API_KEY\",\n WALLET_NOT_FOUND: \"WALLET_NOT_FOUND\",\n INSUFFICIENT_BALANCE: \"INSUFFICIENT_BALANCE\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INVALID_SIGNATURE: \"INVALID_SIGNATURE\",\n SKU_NOT_FOUND: \"SKU_NOT_FOUND\",\n SKU_UNAVAILABLE: \"SKU_UNAVAILABLE\",\n} as const;\n\nexport const SKU_CONTRACTS = {\n RECHARGER_WITH_STRK_MAINNET: \"0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7\", //changed contract address used to be 0x0f3\n CHIPI_BILL_SERVICE: \"0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b\",\n} as const;\n\n// Service types\nexport const SERVICE_TYPES = {\n BUY_SERVICE: \"BUY_SERVICE\",\n} as const;\n\n// Carrier IDs\nexport const CARRIER_IDS = {\n CHIPI_PAY: \"chipi_pay\",\n} as const;\n\nexport const CHAIN_TYPES = {\n STARKNET: \"STARKNET\",\n} as const;\n\nexport const CHAIN_TOKEN_TYPES = {\n USDC: \"USDC\", // Changed to Native USDC (was bridged USDC.e)\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n\nexport const WALLET_CLASS_HASHES: Record<string, string> = {\n CHIPI: \"0x053f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a\", // v29 — must match backend until coordinated v33 upgrade\n READY: \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\",\n};\n\n/**\n * Previous CHIPI wallet class hashes that are still deployed on-chain.\n * Used by getWalletTypeFromClassHash() to identify legacy wallets.\n * Ordered newest → oldest.\n */\nexport const LEGACY_CHIPI_CLASS_HASHES: string[] = [\n \"0x0484bbd2404b3c7264bea271f7267d6d4004821ac7787a9eed7f472e79ef40d1\", // v33 — wallets created during brief v33 window\n \"0x035a2251aca25daba18a5d8950deffa8372a7d84774554e75283cb85552eebc9\", // v32 — audit 3\n \"0x0254f6dd0427319ec614c29e4e3929500d1ba95d0da87ff81d67051ce572667\", // v31\n \"0x072b77b033a874fa1b8f7ff52e18be8fb5ce01a00c59cd184ae15f5b29bc0e57\", // v30\n \"0x02de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\", // v28\n];\n\n/**\n * Determine wallet type from an on-chain class hash.\n * - If it matches the READY hash → READY\n * - If it matches the current CHIPI hash → CHIPI\n * - If it matches a legacy CHIPI hash → CHIPI\n * - Otherwise → null (unknown class hash, caller should handle accordingly)\n */\nexport function getWalletTypeFromClassHash(classHash: string): WalletType | null {\n const normalized = classHash.toLowerCase().replace(/^0x0+/, \"0x\");\n const normalize = (h: string) => h.toLowerCase().replace(/^0x0+/, \"0x\");\n\n if (normalize(WALLET_CLASS_HASHES.READY) === normalized) {\n return \"READY\";\n }\n // Current or legacy CHIPI hashes\n if (normalize(WALLET_CLASS_HASHES.CHIPI) === normalized) {\n return \"CHIPI\";\n }\n if (LEGACY_CHIPI_CLASS_HASHES.some((h) => normalize(h) === normalized)) {\n return \"CHIPI\";\n }\n // Unknown class hash — return null so callers can handle explicitly\n return null;\n}\n\n// RPC endpoints per wallet type — any standard Starknet RPC works for all wallet types.\n// Override via STARKNET_RPC_URL env var; falls back to the default Infura endpoint.\nexport const WALLET_RPC_ENDPOINTS: Record<string, string> = {\n CHIPI: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n READY: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n};\n\n// Paymaster configuration\nexport const PAYMASTER_CONFIG = {\n URL: \"https://paymaster.chipipay.com\",\n} as const;\n\n// Session key configuration (CHIPI wallets only - SNIP-9 compatible)\nexport const SESSION_DEFAULTS = {\n /** Default session duration: 6 hours in seconds */\n DURATION_SECONDS: 21600,\n /** Default max calls per session */\n MAX_CALLS: 1000,\n} as const;\n\n// Session-specific error codes\nexport const SESSION_ERRORS = {\n /** Session keys only work with CHIPI wallets */\n INVALID_WALLET_TYPE_FOR_SESSION: \"INVALID_WALLET_TYPE_FOR_SESSION\",\n /** Session has expired (validUntil < now) */\n SESSION_EXPIRED: \"SESSION_EXPIRED\",\n /** Session key not registered on contract */\n SESSION_NOT_REGISTERED: \"SESSION_NOT_REGISTERED\",\n /** Session key has been revoked */\n SESSION_REVOKED: \"SESSION_REVOKED\",\n /** Session has exceeded max calls */\n SESSION_MAX_CALLS_EXCEEDED: \"SESSION_MAX_CALLS_EXCEEDED\",\n /** Entrypoint not allowed for this session */\n SESSION_ENTRYPOINT_NOT_ALLOWED: \"SESSION_ENTRYPOINT_NOT_ALLOWED\",\n /** Failed to decrypt session private key */\n SESSION_DECRYPTION_FAILED: \"SESSION_DECRYPTION_FAILED\",\n /** Failed to create session key */\n SESSION_CREATION_FAILED: \"SESSION_CREATION_FAILED\",\n /** Backend returned an invalid response shape */\n SESSION_INVALID_RESPONSE: \"SESSION_INVALID_RESPONSE\",\n} as const;\n\n// Session contract entrypoint names\nexport const SESSION_ENTRYPOINTS = {\n /** Add or update a session key (owner only) */\n ADD_OR_UPDATE: \"add_or_update_session_key\",\n /** Revoke a session key (owner only) */\n REVOKE: \"revoke_session_key\",\n /** Query session data (public read) */\n GET_DATA: \"get_session_data\",\n} as const;\n"]}
|
package/dist/constants/index.mjs
CHANGED
|
@@ -5,9 +5,12 @@ var API_VERSIONING = {
|
|
|
5
5
|
VERSION_DATE: "2025-12-30"
|
|
6
6
|
// Detailed version - sent as query param for tracking
|
|
7
7
|
};
|
|
8
|
+
var DEFAULT_MAINNET_RPC = "https://starknet-mainnet.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2";
|
|
9
|
+
var DEFAULT_SEPOLIA_RPC = "https://starknet-sepolia.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2";
|
|
8
10
|
var STARKNET_NETWORKS = {
|
|
9
|
-
MAINNET:
|
|
10
|
-
|
|
11
|
+
MAINNET: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,
|
|
12
|
+
MAINNET_FALLBACK: "https://rpc.starknet.lava.build",
|
|
13
|
+
SEPOLIA: process.env.STARKNET_RPC_URL_SEPOLIA ?? DEFAULT_SEPOLIA_RPC
|
|
11
14
|
};
|
|
12
15
|
var CONTRACT_ADDRESSES = {
|
|
13
16
|
USDC_MAINNET: "0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb",
|
|
@@ -63,13 +66,39 @@ var CHAIN_TOKEN_TYPES = {
|
|
|
63
66
|
OTHER: "OTHER"
|
|
64
67
|
};
|
|
65
68
|
var WALLET_CLASS_HASHES = {
|
|
66
|
-
CHIPI: "
|
|
67
|
-
//
|
|
69
|
+
CHIPI: "0x053f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a",
|
|
70
|
+
// v29 — must match backend until coordinated v33 upgrade
|
|
68
71
|
READY: "0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f"
|
|
69
72
|
};
|
|
73
|
+
var LEGACY_CHIPI_CLASS_HASHES = [
|
|
74
|
+
"0x0484bbd2404b3c7264bea271f7267d6d4004821ac7787a9eed7f472e79ef40d1",
|
|
75
|
+
// v33 — wallets created during brief v33 window
|
|
76
|
+
"0x035a2251aca25daba18a5d8950deffa8372a7d84774554e75283cb85552eebc9",
|
|
77
|
+
// v32 — audit 3
|
|
78
|
+
"0x0254f6dd0427319ec614c29e4e3929500d1ba95d0da87ff81d67051ce572667",
|
|
79
|
+
// v31
|
|
80
|
+
"0x072b77b033a874fa1b8f7ff52e18be8fb5ce01a00c59cd184ae15f5b29bc0e57",
|
|
81
|
+
// v30
|
|
82
|
+
"0x02de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83"
|
|
83
|
+
// v28
|
|
84
|
+
];
|
|
85
|
+
function getWalletTypeFromClassHash(classHash) {
|
|
86
|
+
const normalized = classHash.toLowerCase().replace(/^0x0+/, "0x");
|
|
87
|
+
const normalize = (h) => h.toLowerCase().replace(/^0x0+/, "0x");
|
|
88
|
+
if (normalize(WALLET_CLASS_HASHES.READY) === normalized) {
|
|
89
|
+
return "READY";
|
|
90
|
+
}
|
|
91
|
+
if (normalize(WALLET_CLASS_HASHES.CHIPI) === normalized) {
|
|
92
|
+
return "CHIPI";
|
|
93
|
+
}
|
|
94
|
+
if (LEGACY_CHIPI_CLASS_HASHES.some((h) => normalize(h) === normalized)) {
|
|
95
|
+
return "CHIPI";
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
70
99
|
var WALLET_RPC_ENDPOINTS = {
|
|
71
|
-
CHIPI:
|
|
72
|
-
READY:
|
|
100
|
+
CHIPI: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,
|
|
101
|
+
READY: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC
|
|
73
102
|
};
|
|
74
103
|
var PAYMASTER_CONFIG = {
|
|
75
104
|
URL: "https://paymaster.chipipay.com"
|
|
@@ -96,7 +125,9 @@ var SESSION_ERRORS = {
|
|
|
96
125
|
/** Failed to decrypt session private key */
|
|
97
126
|
SESSION_DECRYPTION_FAILED: "SESSION_DECRYPTION_FAILED",
|
|
98
127
|
/** Failed to create session key */
|
|
99
|
-
SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED"
|
|
128
|
+
SESSION_CREATION_FAILED: "SESSION_CREATION_FAILED",
|
|
129
|
+
/** Backend returned an invalid response shape */
|
|
130
|
+
SESSION_INVALID_RESPONSE: "SESSION_INVALID_RESPONSE"
|
|
100
131
|
};
|
|
101
132
|
var SESSION_ENTRYPOINTS = {
|
|
102
133
|
/** Add or update a session key (owner only) */
|
|
@@ -107,6 +138,6 @@ var SESSION_ENTRYPOINTS = {
|
|
|
107
138
|
GET_DATA: "get_session_data"
|
|
108
139
|
};
|
|
109
140
|
|
|
110
|
-
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ERRORS, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS };
|
|
141
|
+
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ERRORS, LEGACY_CHIPI_CLASS_HASHES, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS, getWalletTypeFromClassHash };
|
|
111
142
|
//# sourceMappingURL=index.mjs.map
|
|
112
143
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
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;
|
|
1
|
+
{"version":3,"sources":["../../src/constants/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Constants used across Chipi SDK packages\n */\n\nimport type { WalletType } from \"@chipi-stack/types\";\n\n/**\n * API Versioning\n * - VERSION: Major version for path-based versioning (/v1, /v2, etc.)\n * - VERSION_DATE: Detailed version for tracking breaking changes (YYYY-MM-DD format)\n *\n * Update VERSION_DATE when making API changes.\n * Update VERSION when making major breaking changes (typically 1-2 times per year).\n */\nexport const API_VERSIONING = {\n VERSION: \"1\", // Major version - used in URL path\n VERSION_DATE: \"2025-12-30\", // Detailed version - sent as query param for tracking\n} as const;\n\n// Default RPC URLs — override via STARKNET_RPC_URL / STARKNET_RPC_URL_SEPOLIA env vars.\nconst DEFAULT_MAINNET_RPC =\n \"https://starknet-mainnet.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2\";\nconst DEFAULT_SEPOLIA_RPC =\n \"https://starknet-sepolia.infura.io/v3/4a4a1fdd7d704509aa99154fb29886e2\";\n\nexport const STARKNET_NETWORKS = {\n MAINNET: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n MAINNET_FALLBACK: \"https://rpc.starknet.lava.build\",\n SEPOLIA: process.env.STARKNET_RPC_URL_SEPOLIA ?? DEFAULT_SEPOLIA_RPC,\n} as const;\n\nexport const CONTRACT_ADDRESSES = {\n USDC_MAINNET: \"0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb\", // Changed to Native USDC (was bridged USDC.e)\n VESU_USDC_MAINNET: \"0x017f19582c61479f2fe0b6606300e975c0a8f439102f43eeecc1d0e9b3d84350\",\n} as const;\n\nexport const TOKEN_DECIMALS = {\n USDC: 6,\n USDT: 6,\n ETH: 18,\n STRK: 18,\n DAI: 18,\n} as const;\n\nexport const API_ENDPOINTS = {\n CHIPI_WALLETS: \"/chipi-wallets\",\n TRANSACTIONS: \"/transactions\",\n SKUS: \"/skus\",\n SKU_PURCHASES: \"/sku-purchases\",\n EXCHANGES: \"/exchanges\",\n USERS: \"/users\",\n} as const;\n\nexport const ERRORS = {\n INVALID_API_KEY: \"INVALID_API_KEY\",\n WALLET_NOT_FOUND: \"WALLET_NOT_FOUND\",\n INSUFFICIENT_BALANCE: \"INSUFFICIENT_BALANCE\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INVALID_SIGNATURE: \"INVALID_SIGNATURE\",\n SKU_NOT_FOUND: \"SKU_NOT_FOUND\",\n SKU_UNAVAILABLE: \"SKU_UNAVAILABLE\",\n} as const;\n\nexport const SKU_CONTRACTS = {\n RECHARGER_WITH_STRK_MAINNET: \"0x02d65bb726d2c29e3c97669cf297c5145eac19284fb6f935c05c0bfc68dae2b7\", //changed contract address used to be 0x0f3\n CHIPI_BILL_SERVICE: \"0x4e8150110d580069de26adec9b179023289d55859ea07487aaade5458d7aa8b\",\n} as const;\n\n// Service types\nexport const SERVICE_TYPES = {\n BUY_SERVICE: \"BUY_SERVICE\",\n} as const;\n\n// Carrier IDs\nexport const CARRIER_IDS = {\n CHIPI_PAY: \"chipi_pay\",\n} as const;\n\nexport const CHAIN_TYPES = {\n STARKNET: \"STARKNET\",\n} as const;\n\nexport const CHAIN_TOKEN_TYPES = {\n USDC: \"USDC\", // Changed to Native USDC (was bridged USDC.e)\n USDT: \"USDT\",\n ETH: \"ETH\",\n STRK: \"STRK\",\n DAI: \"DAI\",\n WBTC: \"WBTC\",\n OTHER: \"OTHER\",\n} as const;\n\nexport const WALLET_CLASS_HASHES: Record<string, string> = {\n CHIPI: \"0x053f4f8791ed5bed0fddaa553d180c664e32cfaf8316bb232ae77bb08f459f2a\", // v29 — must match backend until coordinated v33 upgrade\n READY: \"0x036078334509b514626504edc9fb252328d1a240e4e948bef8d0c08dff45927f\",\n};\n\n/**\n * Previous CHIPI wallet class hashes that are still deployed on-chain.\n * Used by getWalletTypeFromClassHash() to identify legacy wallets.\n * Ordered newest → oldest.\n */\nexport const LEGACY_CHIPI_CLASS_HASHES: string[] = [\n \"0x0484bbd2404b3c7264bea271f7267d6d4004821ac7787a9eed7f472e79ef40d1\", // v33 — wallets created during brief v33 window\n \"0x035a2251aca25daba18a5d8950deffa8372a7d84774554e75283cb85552eebc9\", // v32 — audit 3\n \"0x0254f6dd0427319ec614c29e4e3929500d1ba95d0da87ff81d67051ce572667\", // v31\n \"0x072b77b033a874fa1b8f7ff52e18be8fb5ce01a00c59cd184ae15f5b29bc0e57\", // v30\n \"0x02de1565226d5215a38b68c4d9a4913989b54edff64c68c45e453c417b44cd83\", // v28\n];\n\n/**\n * Determine wallet type from an on-chain class hash.\n * - If it matches the READY hash → READY\n * - If it matches the current CHIPI hash → CHIPI\n * - If it matches a legacy CHIPI hash → CHIPI\n * - Otherwise → null (unknown class hash, caller should handle accordingly)\n */\nexport function getWalletTypeFromClassHash(classHash: string): WalletType | null {\n const normalized = classHash.toLowerCase().replace(/^0x0+/, \"0x\");\n const normalize = (h: string) => h.toLowerCase().replace(/^0x0+/, \"0x\");\n\n if (normalize(WALLET_CLASS_HASHES.READY) === normalized) {\n return \"READY\";\n }\n // Current or legacy CHIPI hashes\n if (normalize(WALLET_CLASS_HASHES.CHIPI) === normalized) {\n return \"CHIPI\";\n }\n if (LEGACY_CHIPI_CLASS_HASHES.some((h) => normalize(h) === normalized)) {\n return \"CHIPI\";\n }\n // Unknown class hash — return null so callers can handle explicitly\n return null;\n}\n\n// RPC endpoints per wallet type — any standard Starknet RPC works for all wallet types.\n// Override via STARKNET_RPC_URL env var; falls back to the default Infura endpoint.\nexport const WALLET_RPC_ENDPOINTS: Record<string, string> = {\n CHIPI: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n READY: process.env.STARKNET_RPC_URL ?? DEFAULT_MAINNET_RPC,\n};\n\n// Paymaster configuration\nexport const PAYMASTER_CONFIG = {\n URL: \"https://paymaster.chipipay.com\",\n} as const;\n\n// Session key configuration (CHIPI wallets only - SNIP-9 compatible)\nexport const SESSION_DEFAULTS = {\n /** Default session duration: 6 hours in seconds */\n DURATION_SECONDS: 21600,\n /** Default max calls per session */\n MAX_CALLS: 1000,\n} as const;\n\n// Session-specific error codes\nexport const SESSION_ERRORS = {\n /** Session keys only work with CHIPI wallets */\n INVALID_WALLET_TYPE_FOR_SESSION: \"INVALID_WALLET_TYPE_FOR_SESSION\",\n /** Session has expired (validUntil < now) */\n SESSION_EXPIRED: \"SESSION_EXPIRED\",\n /** Session key not registered on contract */\n SESSION_NOT_REGISTERED: \"SESSION_NOT_REGISTERED\",\n /** Session key has been revoked */\n SESSION_REVOKED: \"SESSION_REVOKED\",\n /** Session has exceeded max calls */\n SESSION_MAX_CALLS_EXCEEDED: \"SESSION_MAX_CALLS_EXCEEDED\",\n /** Entrypoint not allowed for this session */\n SESSION_ENTRYPOINT_NOT_ALLOWED: \"SESSION_ENTRYPOINT_NOT_ALLOWED\",\n /** Failed to decrypt session private key */\n SESSION_DECRYPTION_FAILED: \"SESSION_DECRYPTION_FAILED\",\n /** Failed to create session key */\n SESSION_CREATION_FAILED: \"SESSION_CREATION_FAILED\",\n /** Backend returned an invalid response shape */\n SESSION_INVALID_RESPONSE: \"SESSION_INVALID_RESPONSE\",\n} as const;\n\n// Session contract entrypoint names\nexport const SESSION_ENTRYPOINTS = {\n /** Add or update a session key (owner only) */\n ADD_OR_UPDATE: \"add_or_update_session_key\",\n /** Revoke a session key (owner only) */\n REVOKE: \"revoke_session_key\",\n /** Query session data (public read) */\n GET_DATA: \"get_session_data\",\n} as const;\n"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createPaginatedResponse, deepMerge, formatAmount, isValidAddress, isValidApiKey, parseAmount, retry, sanitizeUrl, sleep, validatePagination } from './utils/index.mjs';
|
|
2
|
-
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, 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';
|
|
2
|
+
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ERRORS, LEGACY_CHIPI_CLASS_HASHES, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS, getWalletTypeFromClassHash } from './constants/index.mjs';
|
|
3
3
|
import { ErrorWithCode } from '@chipi-stack/types';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
|
|
@@ -32,7 +32,24 @@ declare class ChipiValidationError extends ChipiError {
|
|
|
32
32
|
declare class ChipiAuthError extends ChipiError {
|
|
33
33
|
constructor(message: string, code?: string);
|
|
34
34
|
}
|
|
35
|
-
declare
|
|
35
|
+
declare class WalletNotCompatibleError extends ChipiWalletError {
|
|
36
|
+
constructor(message: string);
|
|
37
|
+
}
|
|
38
|
+
declare class WalletClassHashNotFoundError extends ChipiWalletError {
|
|
39
|
+
constructor(walletType: string);
|
|
40
|
+
}
|
|
41
|
+
declare class PaymasterIncompatibleError extends ChipiError {
|
|
42
|
+
constructor(classHash: string);
|
|
43
|
+
}
|
|
44
|
+
declare function isChipiError(error: unknown): error is ChipiError;
|
|
45
|
+
/**
|
|
46
|
+
* Type guard to check if an error has an HTTP status property.
|
|
47
|
+
* Useful for retry logic where you need to distinguish API errors
|
|
48
|
+
* (which have status codes) from network errors (which don't).
|
|
49
|
+
*/
|
|
50
|
+
declare function hasHttpStatus(error: unknown): error is {
|
|
51
|
+
status: number;
|
|
52
|
+
};
|
|
36
53
|
declare function handleApiError(error: any): ChipiError;
|
|
37
54
|
|
|
38
55
|
/**
|
|
@@ -46,8 +63,8 @@ declare function formatNumber(value: number, options?: {
|
|
|
46
63
|
}): string;
|
|
47
64
|
declare function formatDate(date: Date | string, options?: {
|
|
48
65
|
locale?: string;
|
|
49
|
-
dateStyle?:
|
|
50
|
-
timeStyle?:
|
|
66
|
+
dateStyle?: "full" | "long" | "medium" | "short";
|
|
67
|
+
timeStyle?: "full" | "long" | "medium" | "short";
|
|
51
68
|
}): string;
|
|
52
69
|
declare function formatAddress(address: string, length?: number): string;
|
|
53
70
|
declare function formatTransactionHash(hash: string): string;
|
|
@@ -66,11 +83,17 @@ declare const ErrorResponseSchema: z.ZodObject<{
|
|
|
66
83
|
status: z.ZodOptional<z.ZodNumber>;
|
|
67
84
|
}, z.core.$strip>;
|
|
68
85
|
declare const SuccessResponseSchema: <T extends z.ZodTypeAny>(dataSchema: T) => z.ZodObject<{
|
|
86
|
+
message: z.ZodOptional<z.ZodString>;
|
|
87
|
+
code: z.ZodOptional<z.ZodString>;
|
|
69
88
|
data: T;
|
|
70
89
|
}, z.core.$strip>;
|
|
71
|
-
type ApiResponse<T> =
|
|
90
|
+
type ApiResponse<T> = {
|
|
91
|
+
data: T;
|
|
92
|
+
message?: string;
|
|
93
|
+
code?: string;
|
|
94
|
+
};
|
|
72
95
|
type ErrorResponse = z.infer<typeof ErrorResponseSchema>;
|
|
73
96
|
declare function validateApiResponse<T>(response: unknown, dataSchema: z.ZodType<T>): void;
|
|
74
97
|
declare function validateErrorResponse(response: unknown): ErrorResponse;
|
|
75
98
|
|
|
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 };
|
|
99
|
+
export { type ApiResponse, ApiResponseSchema, ChipiApiError, ChipiAuthError, ChipiError, ChipiSessionError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, type ErrorResponse, ErrorResponseSchema, PaymasterIncompatibleError, SuccessResponseSchema, WalletClassHashNotFoundError, WalletNotCompatibleError, camelToSnake, capitalizeFirst, formatAddress, formatCurrency, formatDate, formatNumber, formatTransactionHash, handleApiError, hasHttpStatus, isChipiError, snakeToCamel, validateApiResponse, validateErrorResponse };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { createPaginatedResponse, deepMerge, formatAmount, isValidAddress, isValidApiKey, parseAmount, retry, sanitizeUrl, sleep, validatePagination } from './utils/index.js';
|
|
2
|
-
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, 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';
|
|
2
|
+
export { API_ENDPOINTS, API_VERSIONING, CARRIER_IDS, CHAIN_TOKEN_TYPES, CHAIN_TYPES, CONTRACT_ADDRESSES, ERRORS, LEGACY_CHIPI_CLASS_HASHES, PAYMASTER_CONFIG, SERVICE_TYPES, SESSION_DEFAULTS, SESSION_ENTRYPOINTS, SESSION_ERRORS, SKU_CONTRACTS, STARKNET_NETWORKS, TOKEN_DECIMALS, WALLET_CLASS_HASHES, WALLET_RPC_ENDPOINTS, getWalletTypeFromClassHash } from './constants/index.js';
|
|
3
3
|
import { ErrorWithCode } from '@chipi-stack/types';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
|
|
@@ -32,7 +32,24 @@ declare class ChipiValidationError extends ChipiError {
|
|
|
32
32
|
declare class ChipiAuthError extends ChipiError {
|
|
33
33
|
constructor(message: string, code?: string);
|
|
34
34
|
}
|
|
35
|
-
declare
|
|
35
|
+
declare class WalletNotCompatibleError extends ChipiWalletError {
|
|
36
|
+
constructor(message: string);
|
|
37
|
+
}
|
|
38
|
+
declare class WalletClassHashNotFoundError extends ChipiWalletError {
|
|
39
|
+
constructor(walletType: string);
|
|
40
|
+
}
|
|
41
|
+
declare class PaymasterIncompatibleError extends ChipiError {
|
|
42
|
+
constructor(classHash: string);
|
|
43
|
+
}
|
|
44
|
+
declare function isChipiError(error: unknown): error is ChipiError;
|
|
45
|
+
/**
|
|
46
|
+
* Type guard to check if an error has an HTTP status property.
|
|
47
|
+
* Useful for retry logic where you need to distinguish API errors
|
|
48
|
+
* (which have status codes) from network errors (which don't).
|
|
49
|
+
*/
|
|
50
|
+
declare function hasHttpStatus(error: unknown): error is {
|
|
51
|
+
status: number;
|
|
52
|
+
};
|
|
36
53
|
declare function handleApiError(error: any): ChipiError;
|
|
37
54
|
|
|
38
55
|
/**
|
|
@@ -46,8 +63,8 @@ declare function formatNumber(value: number, options?: {
|
|
|
46
63
|
}): string;
|
|
47
64
|
declare function formatDate(date: Date | string, options?: {
|
|
48
65
|
locale?: string;
|
|
49
|
-
dateStyle?:
|
|
50
|
-
timeStyle?:
|
|
66
|
+
dateStyle?: "full" | "long" | "medium" | "short";
|
|
67
|
+
timeStyle?: "full" | "long" | "medium" | "short";
|
|
51
68
|
}): string;
|
|
52
69
|
declare function formatAddress(address: string, length?: number): string;
|
|
53
70
|
declare function formatTransactionHash(hash: string): string;
|
|
@@ -66,11 +83,17 @@ declare const ErrorResponseSchema: z.ZodObject<{
|
|
|
66
83
|
status: z.ZodOptional<z.ZodNumber>;
|
|
67
84
|
}, z.core.$strip>;
|
|
68
85
|
declare const SuccessResponseSchema: <T extends z.ZodTypeAny>(dataSchema: T) => z.ZodObject<{
|
|
86
|
+
message: z.ZodOptional<z.ZodString>;
|
|
87
|
+
code: z.ZodOptional<z.ZodString>;
|
|
69
88
|
data: T;
|
|
70
89
|
}, z.core.$strip>;
|
|
71
|
-
type ApiResponse<T> =
|
|
90
|
+
type ApiResponse<T> = {
|
|
91
|
+
data: T;
|
|
92
|
+
message?: string;
|
|
93
|
+
code?: string;
|
|
94
|
+
};
|
|
72
95
|
type ErrorResponse = z.infer<typeof ErrorResponseSchema>;
|
|
73
96
|
declare function validateApiResponse<T>(response: unknown, dataSchema: z.ZodType<T>): void;
|
|
74
97
|
declare function validateErrorResponse(response: unknown): ErrorResponse;
|
|
75
98
|
|
|
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 };
|
|
99
|
+
export { type ApiResponse, ApiResponseSchema, ChipiApiError, ChipiAuthError, ChipiError, ChipiSessionError, ChipiSkuError, ChipiTransactionError, ChipiValidationError, ChipiWalletError, type ErrorResponse, ErrorResponseSchema, PaymasterIncompatibleError, SuccessResponseSchema, WalletClassHashNotFoundError, WalletNotCompatibleError, camelToSnake, capitalizeFirst, formatAddress, formatCurrency, formatDate, formatNumber, formatTransactionHash, handleApiError, hasHttpStatus, isChipiError, snakeToCamel, validateApiResponse, validateErrorResponse };
|