@kheopskit/core 1.0.1 → 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 +75 -15
@@ -0,0 +1,578 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+ var _chunkSIUWQBT4js = require('./chunk-SIUWQBT4.js');
11
+
12
+ // src/utils/isEthereumAddress.ts
13
+ var _sha3 = require('@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 = _sha3.keccak_256.call(void 0, 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 = _nullishCoalesce(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
+ var _blake2b = require('@noble/hashes/blake2b');
38
+ var _base = require('@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 = _base.base58.decode(address);
45
+ } catch (e) {
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.blake2b.call(void 0, 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
+
62
+ var isSolanaAddress = (address) => {
63
+ if (!address) return false;
64
+ try {
65
+ return _base.base58.decode(address).length === 32;
66
+ } catch (e2) {
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
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+ var _rxjs = require('rxjs');
97
+ var loadAppKit = async () => {
98
+ try {
99
+ const { createAppKit } = await Promise.resolve().then(() => _interopRequireWildcard(require("@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
+ _chunkSIUWQBT4js.clearCachedObservablesByPrefix.call(void 0,
121
+ `accounts:${_chunkSIUWQBT4js.getWalletId.call(void 0, platform, "walletconnect")}:`
122
+ );
123
+ };
124
+ var getAppKitWallets$ = (config) => {
125
+ if (!config.walletConnect) return _rxjs.of.call(void 0, {});
126
+ if (typeof window === "undefined") return _rxjs.of.call(void 0, {});
127
+ const walletConnect = config.walletConnect;
128
+ let cachedAppKit = getCachedAppKit();
129
+ if (!cachedAppKit) {
130
+ cachedAppKit = _rxjs.from.call(void 0, loadAppKit()).pipe(
131
+ _rxjs.switchMap.call(void 0, (createAppKit) => {
132
+ if (!createAppKit) return _rxjs.of.call(void 0, {});
133
+ return new (0, _rxjs.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 (0, _rxjs.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
+ _rxjs.map.call(void 0, (s) => s.isPolkadotConnected),
171
+ _rxjs.distinctUntilChanged.call(void 0, ),
172
+ _rxjs.tap.call(void 0, clearAccountsCacheOnDisconnect("polkadot")),
173
+ _rxjs.map.call(void 0, (isConnected) => {
174
+ const walletInfo = appKit.getWalletInfo();
175
+ const walletId = _chunkSIUWQBT4js.getWalletId.call(void 0, "polkadot", "walletconnect");
176
+ return {
177
+ id: walletId,
178
+ platform: "polkadot",
179
+ type: "appKit",
180
+ appKit: appKitInstance,
181
+ name: _nullishCoalesce(_optionalChain([walletInfo, 'optionalAccess', _ => _.name]), () => ( "WalletConnect")),
182
+ icon: _nullishCoalesce(_optionalChain([walletInfo, 'optionalAccess', _2 => _2.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
+ ) : _rxjs.of.call(void 0, void 0);
193
+ const ethereumWallet$ = appKit.chainNamespaces.includes("eip155") ? status$.pipe(
194
+ _rxjs.map.call(void 0, (s) => s.isEthereumConnected),
195
+ _rxjs.distinctUntilChanged.call(void 0, ),
196
+ _rxjs.tap.call(void 0, clearAccountsCacheOnDisconnect("ethereum")),
197
+ _rxjs.map.call(void 0, (isConnected) => {
198
+ const walletInfo = appKit.getWalletInfo();
199
+ const walletId = _chunkSIUWQBT4js.getWalletId.call(void 0, "ethereum", "walletconnect");
200
+ return {
201
+ id: walletId,
202
+ platform: "ethereum",
203
+ type: "appKit",
204
+ appKit: appKitInstance,
205
+ name: _nullishCoalesce(_optionalChain([walletInfo, 'optionalAccess', _3 => _3.name]), () => ( "WalletConnect")),
206
+ icon: _nullishCoalesce(_optionalChain([walletInfo, 'optionalAccess', _4 => _4.icon]), () => ( WALLET_CONNECT_ICON)),
207
+ connect: () => appKit.open(),
208
+ disconnect: async () => {
209
+ await appKit.disconnect();
210
+ },
211
+ isConnected
212
+ };
213
+ })
214
+ ) : _rxjs.of.call(void 0, void 0);
215
+ const solanaWallet$ = appKit.chainNamespaces.includes("solana") ? status$.pipe(
216
+ _rxjs.map.call(void 0, (s) => s.isSolanaConnected),
217
+ _rxjs.distinctUntilChanged.call(void 0, ),
218
+ _rxjs.tap.call(void 0, clearAccountsCacheOnDisconnect("solana")),
219
+ _rxjs.map.call(void 0, (isConnected) => {
220
+ const walletInfo = appKit.getWalletInfo();
221
+ const walletId = _chunkSIUWQBT4js.getWalletId.call(void 0, "solana", "walletconnect");
222
+ return {
223
+ id: walletId,
224
+ platform: "solana",
225
+ type: "appKit",
226
+ appKit: appKitInstance,
227
+ name: _nullishCoalesce(_optionalChain([walletInfo, 'optionalAccess', _5 => _5.name]), () => ( "WalletConnect")),
228
+ icon: _nullishCoalesce(_optionalChain([walletInfo, 'optionalAccess', _6 => _6.icon]), () => ( WALLET_CONNECT_ICON)),
229
+ connect: () => appKit.open(),
230
+ disconnect: async () => {
231
+ await appKit.disconnect();
232
+ },
233
+ isConnected
234
+ };
235
+ })
236
+ ) : _rxjs.of.call(void 0, void 0);
237
+ const sub = _rxjs.combineLatest.call(void 0, {
238
+ polkadot: polkadotWallet$,
239
+ ethereum: ethereumWallet$,
240
+ solana: solanaWallet$
241
+ }).subscribe(subscriber);
242
+ return () => {
243
+ sub.unsubscribe();
244
+ unsubProviders();
245
+ };
246
+ });
247
+ }),
248
+ _rxjs.shareReplay.call(void 0, { 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: _optionalChain([options, 'optionalAccess', _7 => _7.cause]) });
259
+ _chunkSIUWQBT4js.__publicField.call(void 0, this, "code");
260
+ /** The wallet id this error relates to, when applicable. */
261
+ _chunkSIUWQBT4js.__publicField.call(void 0, this, "walletId");
262
+ this.name = "KheopskitError";
263
+ this.code = code;
264
+ this.walletId = _optionalChain([options, 'optionalAccess', _8 => _8.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 = _nullishCoalesce(_optionalChain([config, 'optionalAccess', _9 => _9.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
+ var _lodashes = require('lodash-es');
296
+
297
+ // src/utils/createStore.ts
298
+
299
+ var createStore = (key, defaultValue, storage = _chunkSIUWQBT4js.safeLocalStorage) => {
300
+ const subject = new (0, _rxjs.BehaviorSubject)(
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
+ _optionalChain([unsubscribeStorage, 'optionalCall', _10 => _10()]);
323
+ subject.complete();
324
+ }
325
+ };
326
+ };
327
+ var parseData = (str, defaultValue) => {
328
+ try {
329
+ if (str) return JSON.parse(str);
330
+ } catch (e3) {
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 _chunkSIUWQBT4js.isValidWalletId.call(void 0, w.id) && _chunkSIUWQBT4js.isWalletPlatform.call(void 0, 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 && _chunkSIUWQBT4js.isWalletPlatform.call(void 0, a.platform) && typeof a.address === "string" && !!a.address && _chunkSIUWQBT4js.isValidWalletId.call(void 0, 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) : _chunkSIUWQBT4js.safeLocalStorage;
386
+ const store2 = createStore(storageKey, DEFAULT_SETTINGS, storage);
387
+ const addEnabledWalletId = (walletId) => {
388
+ _chunkSIUWQBT4js.parseWalletId.call(void 0, walletId);
389
+ store2.mutate((prev) => ({
390
+ ...prev,
391
+ autoReconnect: _lodashes.uniq.call(void 0, (_nullishCoalesce(prev.autoReconnect, () => ( []))).concat(walletId))
392
+ }));
393
+ };
394
+ const removeEnabledWalletId = (walletId) => {
395
+ store2.mutate((prev) => ({
396
+ ...prev,
397
+ autoReconnect: _lodashes.uniq.call(void 0,
398
+ (_nullishCoalesce(prev.autoReconnect, () => ( []))).filter((id) => id !== walletId)
399
+ )
400
+ }));
401
+ };
402
+ const getCachedState = () => {
403
+ const data = store2.get();
404
+ const cachedWallets = Array.isArray(_optionalChain([data, 'optionalAccess', _11 => _11.cachedWallets])) ? data.cachedWallets : [];
405
+ const cachedAccounts = Array.isArray(_optionalChain([data, 'optionalAccess', _12 => _12.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 = _optionalChain([data, 'access', _13 => _13.cachedWallets, 'optionalAccess', _14 => _14.map, 'call', _15 => _15(
450
+ (wallet) => [
451
+ wallet.id,
452
+ wallet.name,
453
+ wallet.isConnected ? 1 : 0,
454
+ wallet.type === "appKit" ? 1 : 0
455
+ ]
456
+ )]);
457
+ const accounts = _optionalChain([data, 'access', _16 => _16.cachedAccounts, 'optionalAccess', _17 => _17.map, 'call', _18 => _18(
458
+ (account) => [
459
+ account.walletId,
460
+ account.address,
461
+ _nullishCoalesce(account.name, () => ( null)),
462
+ _nullishCoalesce(account.chainId, () => ( null)),
463
+ toCompactPolkadotAccountType(account.polkadotAccountType)
464
+ ]
465
+ )]);
466
+ return {
467
+ v: 1,
468
+ r: data.autoReconnect,
469
+ w: _optionalChain([wallets, 'optionalAccess', _19 => _19.length]) ? wallets : void 0,
470
+ a: _optionalChain([accounts, 'optionalAccess', _20 => _20.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 (!_chunkSIUWQBT4js.isValidWalletId.call(void 0, id)) continue;
480
+ const { platform } = _chunkSIUWQBT4js.parseWalletId.call(void 0, 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 (!_chunkSIUWQBT4js.isValidWalletId.call(void 0, walletId) || typeof address !== "string" || !address)
495
+ continue;
496
+ const { platform } = _chunkSIUWQBT4js.parseWalletId.call(void 0, walletId);
497
+ accounts.push({
498
+ id: getWalletAccountId(walletId, address),
499
+ platform,
500
+ address,
501
+ name: _nullishCoalesce(name, () => ( void 0)),
502
+ chainId: _nullishCoalesce(chainId, () => ( void 0)),
503
+ polkadotAccountType: platform === "polkadot" ? fromCompactPolkadotAccountType(polkadotAccountType) : void 0,
504
+ walletId,
505
+ walletName: _nullishCoalesce(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 (e4) {
520
+ return fallback;
521
+ }
522
+ };
523
+ var encodeStore = (data) => JSON.stringify(toCompactStore(data));
524
+ var createCompactCookieStorage = (initialCookies) => {
525
+ const base = _chunkSIUWQBT4js.cookieStorage.call(void 0, 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 (e5) {
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 = _optionalChain([base, 'access', _21 => _21.subscribe, 'optionalCall', _22 => _22(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
+ _optionalChain([unsubscribe, 'optionalCall', _23 => _23()]);
558
+ };
559
+ }
560
+ };
561
+ };
562
+
563
+
564
+
565
+
566
+
567
+
568
+
569
+
570
+
571
+
572
+
573
+
574
+
575
+
576
+
577
+ exports.isEthereumAddress = isEthereumAddress; exports.isSs58Address = isSs58Address; exports.isSolanaAddress = isSolanaAddress; exports.isValidAddress = isValidAddress; exports.getWalletAccountId = getWalletAccountId; exports.resetAppKitCache = resetAppKitCache; exports.getAppKitWallets$ = getAppKitWallets$; exports.KheopskitError = KheopskitError; exports.DEFAULT_STORAGE_KEY = DEFAULT_STORAGE_KEY; exports.resolveConfig = resolveConfig; exports.createKheopskitStore = createKheopskitStore; exports.getDefaultStore = getDefaultStore; exports.store = store;
578
+ //# sourceMappingURL=chunk-NU46D4MZ.js.map