@kheopskit/core 1.0.0 → 4.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.
Files changed (57) hide show
  1. package/MIGRATING_TO_V4.md +259 -0
  2. package/README.md +67 -0
  3. package/dist/chunk-4RBYRNY3.mjs +164 -0
  4. package/dist/chunk-4RBYRNY3.mjs.map +1 -0
  5. package/dist/chunk-BWUUHUDK.mjs +24 -0
  6. package/dist/chunk-BWUUHUDK.mjs.map +1 -0
  7. package/dist/chunk-D3EQMFZ2.js +24 -0
  8. package/dist/chunk-D3EQMFZ2.js.map +1 -0
  9. package/dist/chunk-FIAL4HTE.js +1 -0
  10. package/dist/chunk-FIAL4HTE.js.map +1 -0
  11. package/dist/chunk-KWFQDD7E.mjs +578 -0
  12. package/dist/chunk-KWFQDD7E.mjs.map +1 -0
  13. package/dist/chunk-NU46D4MZ.js +578 -0
  14. package/dist/chunk-NU46D4MZ.js.map +1 -0
  15. package/dist/chunk-PNPPI5CH.mjs +201 -0
  16. package/dist/chunk-PNPPI5CH.mjs.map +1 -0
  17. package/dist/chunk-SIUWQBT4.js +201 -0
  18. package/dist/chunk-SIUWQBT4.js.map +1 -0
  19. package/dist/chunk-TMAPQWW2.js +164 -0
  20. package/dist/chunk-TMAPQWW2.js.map +1 -0
  21. package/dist/chunk-YFD3IKK5.mjs +1 -0
  22. package/dist/chunk-YFD3IKK5.mjs.map +1 -0
  23. package/dist/ethereum.d.mts +60 -0
  24. package/dist/ethereum.d.ts +60 -0
  25. package/dist/ethereum.js +332 -0
  26. package/dist/ethereum.js.map +1 -0
  27. package/dist/ethereum.mjs +332 -0
  28. package/dist/ethereum.mjs.map +1 -0
  29. package/dist/getCachedObservable-C4E8dfMp.d.mts +20 -0
  30. package/dist/getCachedObservable-C4E8dfMp.d.ts +20 -0
  31. package/dist/index.d.mts +44 -270
  32. package/dist/index.d.ts +44 -270
  33. package/dist/index.js +160 -1394
  34. package/dist/index.js.map +1 -1
  35. package/dist/index.mjs +119 -1387
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/internal.d.mts +86 -0
  38. package/dist/internal.d.ts +86 -0
  39. package/dist/internal.js +32 -0
  40. package/dist/internal.js.map +1 -0
  41. package/dist/internal.mjs +32 -0
  42. package/dist/internal.mjs.map +1 -0
  43. package/dist/polkadot.d.mts +69 -0
  44. package/dist/polkadot.d.ts +69 -0
  45. package/dist/polkadot.js +314 -0
  46. package/dist/polkadot.js.map +1 -0
  47. package/dist/polkadot.mjs +314 -0
  48. package/dist/polkadot.mjs.map +1 -0
  49. package/dist/solana.d.mts +97 -0
  50. package/dist/solana.d.ts +97 -0
  51. package/dist/solana.js +466 -0
  52. package/dist/solana.js.map +1 -0
  53. package/dist/solana.mjs +466 -0
  54. package/dist/solana.mjs.map +1 -0
  55. package/dist/types-BNzRUNw-.d.mts +319 -0
  56. package/dist/types-BNzRUNw-.d.ts +319 -0
  57. package/package.json +76 -16
@@ -0,0 +1,578 @@
1
+ import {
2
+ __publicField,
3
+ clearCachedObservablesByPrefix,
4
+ cookieStorage,
5
+ getWalletId,
6
+ isValidWalletId,
7
+ isWalletPlatform,
8
+ parseWalletId,
9
+ safeLocalStorage
10
+ } from "./chunk-PNPPI5CH.mjs";
11
+
12
+ // src/utils/isEthereumAddress.ts
13
+ import { keccak_256 } from "@noble/hashes/sha3";
14
+ var HEX_ADDRESS = /^0x[0-9a-fA-F]{40}$/;
15
+ var encoder = new TextEncoder();
16
+ var isChecksumValid = (address) => {
17
+ const hex = address.slice(2);
18
+ const hash = keccak_256(encoder.encode(hex.toLowerCase()));
19
+ for (let i = 0; i < 40; i++) {
20
+ const char = hex.charAt(i);
21
+ const isLetter = char >= "a" && char <= "f" || char >= "A" && char <= "F";
22
+ if (!isLetter) continue;
23
+ const byte = hash[i >> 1] ?? 0;
24
+ const nibble = i % 2 === 0 ? byte >> 4 : byte & 15;
25
+ const isUpper = char <= "F";
26
+ if (isUpper !== nibble >= 8) return false;
27
+ }
28
+ return true;
29
+ };
30
+ var isEthereumAddress = (address) => {
31
+ if (!HEX_ADDRESS.test(address)) return false;
32
+ if (address === address.toLowerCase()) return true;
33
+ return isChecksumValid(address);
34
+ };
35
+
36
+ // src/utils/isSs58Address.ts
37
+ import { blake2b } from "@noble/hashes/blake2b";
38
+ import { base58 } from "@scure/base";
39
+ var SS58PRE = new Uint8Array([83, 83, 53, 56, 80, 82, 69]);
40
+ var isSs58Address = (address) => {
41
+ if (!address) return false;
42
+ let decoded;
43
+ try {
44
+ decoded = base58.decode(address);
45
+ } catch {
46
+ return false;
47
+ }
48
+ const firstByte = decoded[0];
49
+ if (firstByte === void 0 || firstByte & 128) return false;
50
+ const prefixLength = firstByte & 64 ? 2 : 1;
51
+ if (decoded.length !== prefixLength + 32 + 2) return false;
52
+ const body = decoded.subarray(0, decoded.length - 2);
53
+ const preimage = new Uint8Array(SS58PRE.length + body.length);
54
+ preimage.set(SS58PRE);
55
+ preimage.set(body, SS58PRE.length);
56
+ const hash = blake2b(preimage, { dkLen: 64 });
57
+ return decoded[decoded.length - 2] === hash[0] && decoded[decoded.length - 1] === hash[1];
58
+ };
59
+
60
+ // src/utils/isSolanaAddress.ts
61
+ import { base58 as base582 } from "@scure/base";
62
+ var isSolanaAddress = (address) => {
63
+ if (!address) return false;
64
+ try {
65
+ return base582.decode(address).length === 32;
66
+ } catch {
67
+ return false;
68
+ }
69
+ };
70
+
71
+ // src/utils/isValidAddress.ts
72
+ var isValidAddress = (address) => {
73
+ if (address.startsWith("0x")) return isEthereumAddress(address);
74
+ return isSs58Address(address) || isSolanaAddress(address);
75
+ };
76
+
77
+ // src/utils/WalletAccountId.ts
78
+ var getWalletAccountId = (walletId, address) => {
79
+ if (!walletId) throw new Error("Missing walletId");
80
+ if (!isValidAddress(address)) throw new Error("Invalid address");
81
+ return `${walletId}::${address}`;
82
+ };
83
+
84
+ // src/api/appKit.ts
85
+ import {
86
+ BehaviorSubject,
87
+ combineLatest,
88
+ distinctUntilChanged,
89
+ from,
90
+ map,
91
+ Observable,
92
+ of,
93
+ shareReplay,
94
+ switchMap,
95
+ tap
96
+ } from "rxjs";
97
+ var loadAppKit = async () => {
98
+ try {
99
+ const { createAppKit } = await import("@reown/appkit/core");
100
+ return createAppKit;
101
+ } catch (cause) {
102
+ console.error(
103
+ "[kheopskit] WalletConnect is configured but @reown/appkit could not be loaded. Install it with `pnpm add @reown/appkit` (or remove config.walletConnect). WalletConnect wallets are disabled; injected wallets still work.",
104
+ cause
105
+ );
106
+ return null;
107
+ }
108
+ };
109
+ var WALLET_CONNECT_ICON = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+";
110
+ var APPKIT_SYMBOL = /* @__PURE__ */ Symbol.for("kheopskit.cachedAppKit");
111
+ var getCachedAppKit = () => globalThis[APPKIT_SYMBOL];
112
+ var setCachedAppKit = (value) => {
113
+ globalThis[APPKIT_SYMBOL] = value;
114
+ };
115
+ var resetAppKitCache = () => {
116
+ setCachedAppKit(void 0);
117
+ };
118
+ var clearAccountsCacheOnDisconnect = (platform) => (isConnected) => {
119
+ if (!isConnected)
120
+ clearCachedObservablesByPrefix(
121
+ `accounts:${getWalletId(platform, "walletconnect")}:`
122
+ );
123
+ };
124
+ var getAppKitWallets$ = (config) => {
125
+ if (!config.walletConnect) return of({});
126
+ if (typeof window === "undefined") return of({});
127
+ const walletConnect = config.walletConnect;
128
+ let cachedAppKit = getCachedAppKit();
129
+ if (!cachedAppKit) {
130
+ cachedAppKit = from(loadAppKit()).pipe(
131
+ switchMap((createAppKit) => {
132
+ if (!createAppKit) return of({});
133
+ return new Observable((subscriber) => {
134
+ const appKit = createAppKit({
135
+ projectId: walletConnect.projectId,
136
+ metadata: walletConnect.metadata,
137
+ // Loosely typed in WalletConnectConfig to keep @reown/appkit's
138
+ // types out of core; forwarded to AppKit verbatim.
139
+ networks: walletConnect.networks,
140
+ themeMode: walletConnect.themeMode,
141
+ themeVariables: walletConnect.themeVariables,
142
+ universalProviderConfigOverride: {
143
+ methods: {
144
+ polkadot: ["polkadot_signTransaction", "polkadot_signMessage"],
145
+ solana: [
146
+ "solana_signTransaction",
147
+ "solana_signMessage",
148
+ "solana_signAndSendTransaction"
149
+ ]
150
+ }
151
+ },
152
+ allWallets: "HIDE",
153
+ debug: config.debug,
154
+ allowUnsupportedChain: true
155
+ });
156
+ const appKitInstance = appKit;
157
+ const status$ = new BehaviorSubject({
158
+ isPolkadotConnected: false,
159
+ isEthereumConnected: false,
160
+ isSolanaConnected: false
161
+ });
162
+ const unsubProviders = appKit.subscribeProviders((providers) => {
163
+ status$.next({
164
+ isPolkadotConnected: !!providers.polkadot,
165
+ isEthereumConnected: !!providers.eip155,
166
+ isSolanaConnected: !!providers.solana
167
+ });
168
+ });
169
+ const polkadotWallet$ = appKit.chainNamespaces.includes("polkadot") ? status$.pipe(
170
+ map((s) => s.isPolkadotConnected),
171
+ distinctUntilChanged(),
172
+ tap(clearAccountsCacheOnDisconnect("polkadot")),
173
+ map((isConnected) => {
174
+ const walletInfo = appKit.getWalletInfo();
175
+ const walletId = getWalletId("polkadot", "walletconnect");
176
+ return {
177
+ id: walletId,
178
+ platform: "polkadot",
179
+ type: "appKit",
180
+ appKit: appKitInstance,
181
+ name: walletInfo?.name ?? "WalletConnect",
182
+ icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
183
+ connect: async () => {
184
+ if (!isConnected) await appKit.open();
185
+ },
186
+ disconnect: async () => {
187
+ if (isConnected) await appKit.disconnect();
188
+ },
189
+ isConnected
190
+ };
191
+ })
192
+ ) : of(void 0);
193
+ const ethereumWallet$ = appKit.chainNamespaces.includes("eip155") ? status$.pipe(
194
+ map((s) => s.isEthereumConnected),
195
+ distinctUntilChanged(),
196
+ tap(clearAccountsCacheOnDisconnect("ethereum")),
197
+ map((isConnected) => {
198
+ const walletInfo = appKit.getWalletInfo();
199
+ const walletId = getWalletId("ethereum", "walletconnect");
200
+ return {
201
+ id: walletId,
202
+ platform: "ethereum",
203
+ type: "appKit",
204
+ appKit: appKitInstance,
205
+ name: walletInfo?.name ?? "WalletConnect",
206
+ icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
207
+ connect: () => appKit.open(),
208
+ disconnect: async () => {
209
+ await appKit.disconnect();
210
+ },
211
+ isConnected
212
+ };
213
+ })
214
+ ) : of(void 0);
215
+ const solanaWallet$ = appKit.chainNamespaces.includes("solana") ? status$.pipe(
216
+ map((s) => s.isSolanaConnected),
217
+ distinctUntilChanged(),
218
+ tap(clearAccountsCacheOnDisconnect("solana")),
219
+ map((isConnected) => {
220
+ const walletInfo = appKit.getWalletInfo();
221
+ const walletId = getWalletId("solana", "walletconnect");
222
+ return {
223
+ id: walletId,
224
+ platform: "solana",
225
+ type: "appKit",
226
+ appKit: appKitInstance,
227
+ name: walletInfo?.name ?? "WalletConnect",
228
+ icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
229
+ connect: () => appKit.open(),
230
+ disconnect: async () => {
231
+ await appKit.disconnect();
232
+ },
233
+ isConnected
234
+ };
235
+ })
236
+ ) : of(void 0);
237
+ const sub = combineLatest({
238
+ polkadot: polkadotWallet$,
239
+ ethereum: ethereumWallet$,
240
+ solana: solanaWallet$
241
+ }).subscribe(subscriber);
242
+ return () => {
243
+ sub.unsubscribe();
244
+ unsubProviders();
245
+ };
246
+ });
247
+ }),
248
+ shareReplay({ refCount: true, bufferSize: 1 })
249
+ );
250
+ setCachedAppKit(cachedAppKit);
251
+ }
252
+ return cachedAppKit;
253
+ };
254
+
255
+ // src/api/errors.ts
256
+ var KheopskitError = class extends Error {
257
+ constructor(code, message, options) {
258
+ super(`[kheopskit] ${message}`, { cause: options?.cause });
259
+ __publicField(this, "code");
260
+ /** The wallet id this error relates to, when applicable. */
261
+ __publicField(this, "walletId");
262
+ this.name = "KheopskitError";
263
+ this.code = code;
264
+ this.walletId = options?.walletId;
265
+ }
266
+ };
267
+
268
+ // src/api/config.ts
269
+ var DEFAULT_STORAGE_KEY = "kheopskit";
270
+ var DEFAULTS = {
271
+ autoReconnect: true,
272
+ debug: false,
273
+ storageKey: DEFAULT_STORAGE_KEY,
274
+ hydrationGracePeriod: 500
275
+ };
276
+ var resolveConfig = (config) => {
277
+ const platforms = config?.platforms ?? [];
278
+ const invalidPlatforms = platforms.filter(
279
+ (p) => typeof p !== "object" || p === null || typeof p.getWallets$ !== "function"
280
+ );
281
+ if (invalidPlatforms.length > 0) {
282
+ throw new Error(
283
+ `[kheopskit] config.platforms must contain plugin instances created by the per-platform factories (e.g. platforms: [polkadot(), ethereum(), solana()] imported from "@kheopskit/core/<platform>"). Invalid entries: ${JSON.stringify(invalidPlatforms)}. String platform names like "polkadot" were removed in v4 \u2014 see MIGRATING_TO_V4.md.`
284
+ );
285
+ }
286
+ if (platforms.length === 0) {
287
+ console.warn(
288
+ '[kheopskit] No platforms configured; wallets and accounts will be empty. Pass e.g. platforms: [polkadot()] from "@kheopskit/core/polkadot".'
289
+ );
290
+ }
291
+ return Object.assign({}, DEFAULTS, config, { platforms });
292
+ };
293
+
294
+ // src/api/store.ts
295
+ import { uniq } from "lodash-es";
296
+
297
+ // src/utils/createStore.ts
298
+ import { BehaviorSubject as BehaviorSubject2 } from "rxjs";
299
+ var createStore = (key, defaultValue, storage = safeLocalStorage) => {
300
+ const subject = new BehaviorSubject2(
301
+ getStoredData(key, defaultValue, storage)
302
+ );
303
+ let unsubscribeStorage;
304
+ if (typeof window !== "undefined" && storage.subscribe) {
305
+ unsubscribeStorage = storage.subscribe(key, (newValue) => {
306
+ subject.next(parseData(newValue, defaultValue));
307
+ });
308
+ }
309
+ const update = (val) => {
310
+ setStoredData(key, val, storage);
311
+ subject.next(val);
312
+ };
313
+ return {
314
+ observable: subject.asObservable(),
315
+ set: (val) => update(val),
316
+ mutate: (transform) => update(transform(subject.getValue())),
317
+ get: () => structuredClone(subject.getValue()),
318
+ /**
319
+ * Cleanup subscriptions. Call this when the store is no longer needed.
320
+ */
321
+ destroy: () => {
322
+ unsubscribeStorage?.();
323
+ subject.complete();
324
+ }
325
+ };
326
+ };
327
+ var parseData = (str, defaultValue) => {
328
+ try {
329
+ if (str) return JSON.parse(str);
330
+ } catch {
331
+ }
332
+ return defaultValue;
333
+ };
334
+ var getStoredData = (key, defaultValue, storage) => {
335
+ const str = storage.getItem(key);
336
+ return parseData(str, defaultValue);
337
+ };
338
+ var setStoredData = (key, val, storage) => {
339
+ const str = JSON.stringify(val);
340
+ storage.setItem(key, str);
341
+ };
342
+
343
+ // src/api/store.ts
344
+ var DEFAULT_SETTINGS = {};
345
+ var isValidCachedWallet = (value) => {
346
+ if (!value || typeof value !== "object") return false;
347
+ const w = value;
348
+ return isValidWalletId(w.id) && isWalletPlatform(w.platform) && typeof w.name === "string" && (w.type === "injected" || w.type === "appKit") && typeof w.isConnected === "boolean";
349
+ };
350
+ var isValidCachedAccount = (value) => {
351
+ if (!value || typeof value !== "object") return false;
352
+ const a = value;
353
+ return typeof a.id === "string" && !!a.id && isWalletPlatform(a.platform) && typeof a.address === "string" && !!a.address && isValidWalletId(a.walletId) && typeof a.walletName === "string";
354
+ };
355
+ var toCompactPolkadotAccountType = (type) => {
356
+ switch (type) {
357
+ case "sr25519":
358
+ return 0;
359
+ case "ed25519":
360
+ return 1;
361
+ case "ecdsa":
362
+ return 2;
363
+ case "ethereum":
364
+ return 3;
365
+ default:
366
+ return null;
367
+ }
368
+ };
369
+ var fromCompactPolkadotAccountType = (type) => {
370
+ switch (type) {
371
+ case 0:
372
+ return "sr25519";
373
+ case 1:
374
+ return "ed25519";
375
+ case 2:
376
+ return "ecdsa";
377
+ case 3:
378
+ return "ethereum";
379
+ default:
380
+ return void 0;
381
+ }
382
+ };
383
+ var createKheopskitStore = (options = {}) => {
384
+ const { ssrCookies, storageKey = DEFAULT_STORAGE_KEY } = options;
385
+ const storage = ssrCookies !== void 0 ? createCompactCookieStorage(ssrCookies) : safeLocalStorage;
386
+ const store2 = createStore(storageKey, DEFAULT_SETTINGS, storage);
387
+ const addEnabledWalletId = (walletId) => {
388
+ parseWalletId(walletId);
389
+ store2.mutate((prev) => ({
390
+ ...prev,
391
+ autoReconnect: uniq((prev.autoReconnect ?? []).concat(walletId))
392
+ }));
393
+ };
394
+ const removeEnabledWalletId = (walletId) => {
395
+ store2.mutate((prev) => ({
396
+ ...prev,
397
+ autoReconnect: uniq(
398
+ (prev.autoReconnect ?? []).filter((id) => id !== walletId)
399
+ )
400
+ }));
401
+ };
402
+ const getCachedState = () => {
403
+ const data = store2.get();
404
+ const cachedWallets = Array.isArray(data?.cachedWallets) ? data.cachedWallets : [];
405
+ const cachedAccounts = Array.isArray(data?.cachedAccounts) ? data.cachedAccounts : [];
406
+ return {
407
+ wallets: cachedWallets.filter(isValidCachedWallet),
408
+ accounts: cachedAccounts.filter(isValidCachedAccount)
409
+ };
410
+ };
411
+ const setCachedState = (wallets, accounts) => {
412
+ store2.mutate((prev) => ({
413
+ ...prev,
414
+ cachedWallets: wallets,
415
+ cachedAccounts: accounts
416
+ }));
417
+ };
418
+ return {
419
+ observable: store2.observable,
420
+ addEnabledWalletId,
421
+ removeEnabledWalletId,
422
+ getCachedState,
423
+ setCachedState
424
+ };
425
+ };
426
+ var DEFAULT_STORE_SYMBOL = /* @__PURE__ */ Symbol.for("kheopskit.defaultStore");
427
+ var getDefaultStore = () => {
428
+ const g = globalThis;
429
+ if (!g[DEFAULT_STORE_SYMBOL]) {
430
+ g[DEFAULT_STORE_SYMBOL] = createKheopskitStore();
431
+ }
432
+ return g[DEFAULT_STORE_SYMBOL];
433
+ };
434
+ var store = {
435
+ get observable() {
436
+ return getDefaultStore().observable;
437
+ },
438
+ addEnabledWalletId: (walletId) => getDefaultStore().addEnabledWalletId(walletId),
439
+ removeEnabledWalletId: (walletId) => getDefaultStore().removeEnabledWalletId(walletId),
440
+ getCachedState: () => getDefaultStore().getCachedState(),
441
+ setCachedState: (wallets, accounts) => getDefaultStore().setCachedState(wallets, accounts)
442
+ };
443
+ var isCompactStore = (value) => {
444
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
445
+ if ("cachedWallets" in value || "cachedAccounts" in value) return false;
446
+ return "v" in value || "w" in value || "a" in value || "r" in value;
447
+ };
448
+ var toCompactStore = (data) => {
449
+ const wallets = data.cachedWallets?.map(
450
+ (wallet) => [
451
+ wallet.id,
452
+ wallet.name,
453
+ wallet.isConnected ? 1 : 0,
454
+ wallet.type === "appKit" ? 1 : 0
455
+ ]
456
+ );
457
+ const accounts = data.cachedAccounts?.map(
458
+ (account) => [
459
+ account.walletId,
460
+ account.address,
461
+ account.name ?? null,
462
+ account.chainId ?? null,
463
+ toCompactPolkadotAccountType(account.polkadotAccountType)
464
+ ]
465
+ );
466
+ return {
467
+ v: 1,
468
+ r: data.autoReconnect,
469
+ w: wallets?.length ? wallets : void 0,
470
+ a: accounts?.length ? accounts : void 0
471
+ };
472
+ };
473
+ var fromCompactStore = (data) => {
474
+ const walletNameMap = /* @__PURE__ */ new Map();
475
+ const wallets = [];
476
+ for (const item of Array.isArray(data.w) ? data.w : []) {
477
+ if (!Array.isArray(item)) continue;
478
+ const [id, name, isConnected, type] = item;
479
+ if (!isValidWalletId(id)) continue;
480
+ const { platform } = parseWalletId(id);
481
+ walletNameMap.set(id, name);
482
+ wallets.push({
483
+ id,
484
+ platform,
485
+ type: type === 1 ? "appKit" : "injected",
486
+ name,
487
+ isConnected: isConnected === 1
488
+ });
489
+ }
490
+ const accounts = [];
491
+ for (const item of Array.isArray(data.a) ? data.a : []) {
492
+ if (!Array.isArray(item)) continue;
493
+ const [walletId, address, name, chainId, polkadotAccountType] = item;
494
+ if (!isValidWalletId(walletId) || typeof address !== "string" || !address)
495
+ continue;
496
+ const { platform } = parseWalletId(walletId);
497
+ accounts.push({
498
+ id: getWalletAccountId(walletId, address),
499
+ platform,
500
+ address,
501
+ name: name ?? void 0,
502
+ chainId: chainId ?? void 0,
503
+ polkadotAccountType: platform === "polkadot" ? fromCompactPolkadotAccountType(polkadotAccountType) : void 0,
504
+ walletId,
505
+ walletName: walletNameMap.get(walletId) ?? walletId
506
+ });
507
+ }
508
+ return {
509
+ autoReconnect: data.r,
510
+ cachedWallets: wallets,
511
+ cachedAccounts: accounts
512
+ };
513
+ };
514
+ var decodeStore = (raw, fallback) => {
515
+ try {
516
+ const parsed = JSON.parse(raw);
517
+ if (isCompactStore(parsed)) return fromCompactStore(parsed);
518
+ return parsed;
519
+ } catch {
520
+ return fallback;
521
+ }
522
+ };
523
+ var encodeStore = (data) => JSON.stringify(toCompactStore(data));
524
+ var createCompactCookieStorage = (initialCookies) => {
525
+ const base = cookieStorage(initialCookies);
526
+ return {
527
+ getItem: (key) => {
528
+ const raw = base.getItem(key);
529
+ if (!raw) return null;
530
+ const expanded = decodeStore(raw, DEFAULT_SETTINGS);
531
+ if (typeof document !== "undefined") {
532
+ try {
533
+ const parsed = JSON.parse(raw);
534
+ if (!isCompactStore(parsed)) {
535
+ base.setItem(key, encodeStore(expanded));
536
+ }
537
+ } catch {
538
+ }
539
+ }
540
+ return JSON.stringify(expanded);
541
+ },
542
+ setItem: (key, value) => {
543
+ const expanded = decodeStore(value, DEFAULT_SETTINGS);
544
+ base.setItem(key, encodeStore(expanded));
545
+ },
546
+ removeItem: base.removeItem,
547
+ subscribe: (key, callback) => {
548
+ const unsubscribe = base.subscribe?.(key, (value) => {
549
+ if (!value) {
550
+ callback(null);
551
+ return;
552
+ }
553
+ const expanded = decodeStore(value, DEFAULT_SETTINGS);
554
+ callback(JSON.stringify(expanded));
555
+ });
556
+ return () => {
557
+ unsubscribe?.();
558
+ };
559
+ }
560
+ };
561
+ };
562
+
563
+ export {
564
+ isEthereumAddress,
565
+ isSs58Address,
566
+ isSolanaAddress,
567
+ isValidAddress,
568
+ getWalletAccountId,
569
+ resetAppKitCache,
570
+ getAppKitWallets$,
571
+ KheopskitError,
572
+ DEFAULT_STORAGE_KEY,
573
+ resolveConfig,
574
+ createKheopskitStore,
575
+ getDefaultStore,
576
+ store
577
+ };
578
+ //# sourceMappingURL=chunk-KWFQDD7E.mjs.map