@usebutr/core 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/chain.ts","../src/storage/persistence.ts","../src/storage/snapshot.ts","../src/types/errors.ts","../src/types/wallet.ts","../src/types/chains-by-platform.ts","../src/types/discoverer.ts","../src/types/signer.ts","../src/wallet-source.ts","../src/store/reducer.ts","../src/storage/browser-storage-driver.ts","../src/storage/cookie-storage-driver.ts","../src/storage/wallet-storage.ts","../src/store/wallet-store.ts","../src/wallet-equal.ts","../src/logger.ts","../src/sanitize-icon.ts","../src/encoding/bytes.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types/chain.ts","../src/storage/persistence.ts","../src/storage/snapshot.ts","../src/types/errors.ts","../src/types/wallet.ts","../src/types/chains-by-platform.ts","../src/types/discoverer.ts","../src/types/signer.ts","../src/wallet-source.ts","../src/store/reducer.ts","../src/storage/browser-storage-driver.ts","../src/storage/cookie-storage-driver.ts","../src/storage/wallet-storage.ts","../src/store/wallet-store.ts","../src/wallet-equal.ts","../src/logger.ts","../src/sanitize-icon.ts","../src/encoding/bytes.ts"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,24 +1,25 @@
1
1
  import { createStore } from "zustand/vanilla";
2
+ import { z } from "zod";
2
3
 
3
4
  //#region src/types/chains-by-platform.ts
4
5
  /**
5
6
  * Build a fully-populated `ChainsByPlatform` from a partial. Platforms
6
7
  * the consumer doesn't specify default to an empty list.
7
8
  *
8
- * Use this in apps that target one or two chain platforms — importing
9
+ * Use this in apps that target one or two chain platforms; importing
9
10
  * only those packages keeps unused chain registries out of the bundle.
10
11
  * Apps that want every chain reach for `CHAINS_BY_PLATFORM` from
11
12
  * `@usebutr/wallets` instead.
12
13
  *
13
14
  * @example
14
- * // EVM-only app — Solana/Sui/Bitcoin tables never enter the bundle
15
+ * // EVM-only app: Solana/Sui/Bitcoin tables never enter the bundle
15
16
  * import { EVM_CHAINS_LIST } from "@usebutr/evm";
16
17
  * import { buildChainsByPlatform } from "@usebutr/core";
17
18
  *
18
19
  * const chains = buildChainsByPlatform({ evm: EVM_CHAINS_LIST });
19
20
  *
20
21
  * @example
21
- * // Multi-chain app — pull from each package the app actually uses
22
+ * // Multi-chain app: pull from each package the app actually uses
22
23
  * import { EVM_CHAINS_LIST } from "@usebutr/evm";
23
24
  * import { SVM_CHAINS_LIST } from "@usebutr/svm";
24
25
  *
@@ -44,7 +45,7 @@ const buildChainsByPlatform = (partial) => ({
44
45
  * - butr's own `Error("Connection timeout")` (from the 90s connect timeout)
45
46
  * - butr's own `Error("Failed to get account")` (from the connect flow)
46
47
  * - EIP-1193 numeric `code` properties (`4001` → UserRejected,
47
- * `-32002` → RequestPending, `4100`/`4900`/`4901` → NotConnected —
48
+ * `-32002` → RequestPending, `4100`/`4900`/`4901` → NotConnected:
48
49
  * unauthorized / disconnected from all-or-one chains)
49
50
  * - common message substrings: "user rejected" / "user denied",
50
51
  * "locked", "chain", etc.
@@ -62,7 +63,7 @@ const mapConnectionError = (raw) => {
62
63
  kind: "NotConnected",
63
64
  message
64
65
  };
65
- const code = raw.code;
66
+ const code = "code" in raw ? raw.code : void 0;
66
67
  if (code === 4001) return {
67
68
  kind: "UserRejected",
68
69
  message
@@ -120,6 +121,18 @@ const CHAIN_PLATFORMS = [
120
121
  "bitcoin",
121
122
  "polkadot"
122
123
  ];
124
+ /**
125
+ * Build butr's `Account` shape from a wallet address and a resolved
126
+ * `ChainBase`. The composite id (`<chain>:<address>`) is what the
127
+ * reducer uses to compare accounts across refreshes, so every adapter
128
+ * must build accounts through this helper (or keep the format
129
+ * byte-identical).
130
+ */
131
+ const buildAccount = (address, chain) => ({
132
+ chain,
133
+ id: `${chain.id}:${address}`,
134
+ walletAddress: address
135
+ });
123
136
 
124
137
  //#endregion
125
138
  //#region src/wallet-source.ts
@@ -166,7 +179,7 @@ const createMemoryStorageDriver = () => {
166
179
  };
167
180
  const createWebStorageDriver = (kind) => {
168
181
  if (!hasWebStorage(kind)) return createMemoryStorageDriver();
169
- const storage = globalThis[kind];
182
+ const storage = kind === "localStorage" ? globalThis.localStorage : globalThis.sessionStorage;
170
183
  return {
171
184
  getItem(key) {
172
185
  try {
@@ -198,41 +211,36 @@ const createBrowserStorageDriver = () => ({
198
211
  });
199
212
 
200
213
  //#endregion
201
- //#region src/storage/wallet-storage.ts
202
- const VALID_CHAIN_PLATFORMS$1 = new Set(CHAIN_PLATFORMS);
203
- const isValidAccount$1 = (value) => {
204
- if (!value || typeof value !== "object") return false;
205
- const account = value;
206
- if (typeof account.walletAddress !== "string" || typeof account.id !== "string") return false;
207
- if (!account.chain || typeof account.chain !== "object") return false;
208
- return true;
209
- };
210
- /**
211
- * Structural validator for a serialized pool entry.
212
- *
213
- * Used in two directions:
214
- * - On read (`getPool`): malformed entries from storage are warned
215
- * and dropped — legacy / cross-tab corruption shouldn't crash the
216
- * consumer.
217
- * - On write (`setPool`): the runtime's reducer state is the source
218
- * of truth, and a malformed write would indicate a programming
219
- * error inside butr. Throw rather than silently corrupt storage.
220
- *
221
- * Same validator either way — keeping the two paths symmetric means
222
- * "what's storable" is a single fact.
223
- */
224
- const isValidPoolEntry$1 = (key, value) => {
225
- if (!value || typeof value !== "object") return false;
226
- const entry = value;
227
- if (typeof entry.connectorId !== "string" || entry.connectorId !== key) return false;
228
- if (typeof entry.chainPlatform !== "string") return false;
229
- if (!VALID_CHAIN_PLATFORMS$1.has(entry.chainPlatform)) return false;
230
- if (typeof entry.name !== "string" || entry.name.length === 0) return false;
231
- if (entry.icon !== void 0 && typeof entry.icon !== "string") return false;
232
- if (!isValidAccount$1(entry.account)) return false;
233
- if (!Array.isArray(entry.accounts) || !entry.accounts.every(isValidAccount$1)) return false;
234
- return true;
214
+ //#region src/storage/validation.ts
215
+ const chainPlatformSchema = z.enum(CHAIN_PLATFORMS);
216
+ const chainSchema = z.looseObject({
217
+ id: z.string(),
218
+ name: z.string(),
219
+ namespace: z.string(),
220
+ reference: z.string()
221
+ });
222
+ const accountSchema = z.looseObject({
223
+ chain: chainSchema,
224
+ id: z.string(),
225
+ walletAddress: z.string()
226
+ });
227
+ const storedPoolEntrySchema = z.looseObject({
228
+ account: accountSchema,
229
+ accounts: z.array(accountSchema),
230
+ chainPlatform: chainPlatformSchema,
231
+ connectorId: z.string(),
232
+ icon: z.string().optional(),
233
+ name: z.string().min(1)
234
+ });
235
+ const recordSchema = z.record(z.string(), z.unknown());
236
+ const parseStoredPoolEntry = (key, value) => {
237
+ const parsed = storedPoolEntrySchema.safeParse(value);
238
+ if (!parsed.success || parsed.data.connectorId !== key) return null;
239
+ return parsed.data;
235
240
  };
241
+
242
+ //#endregion
243
+ //#region src/storage/wallet-storage.ts
236
244
  var WalletStorage = class {
237
245
  poolKey;
238
246
  selectionKey;
@@ -246,7 +254,7 @@ var WalletStorage = class {
246
254
  * this, two simultaneous `setPool` calls both read the pre-write
247
255
  * state, each merge their own entries, and whichever finishes last
248
256
  * overwrites the other's additions. Reads (`getPool`) don't enter
249
- * the queue — they observe whatever's currently in the driver.
257
+ * the queue; they observe whatever's currently in the driver.
250
258
  */
251
259
  poolMutationQueue = Promise.resolve();
252
260
  constructor(config) {
@@ -282,15 +290,19 @@ var WalletStorage = class {
282
290
  async getPool() {
283
291
  try {
284
292
  const stored = await this.persistent.getItem(this.poolKey);
285
- if (!stored) return {};
286
- const parsed = JSON.parse(stored);
287
- if (!parsed || typeof parsed !== "object") {
293
+ if (stored === null || stored === "") return {};
294
+ const value = JSON.parse(stored);
295
+ const parsed = recordSchema.safeParse(value);
296
+ if (!parsed.success) {
288
297
  await this.clearPool();
289
298
  return {};
290
299
  }
291
300
  const result = {};
292
- for (const [key, value] of Object.entries(parsed)) if (isValidPoolEntry$1(key, value)) result[key] = value;
293
- else logWarn(`[butr] dropping invalid pool entry for ${key}`);
301
+ for (const [key, entryValue] of Object.entries(parsed.data)) {
302
+ const entry = parseStoredPoolEntry(key, entryValue);
303
+ if (entry === null) logWarn(`[butr] dropping invalid pool entry for ${key}`);
304
+ else result[key] = entry;
305
+ }
294
306
  return result;
295
307
  } catch (error) {
296
308
  logWarn("[butr] failed to parse pool from storage:", error);
@@ -302,14 +314,14 @@ var WalletStorage = class {
302
314
  * Upsert the in-memory pool into storage. Additive: entries in
303
315
  * `pool` are written; entries already in storage that aren't in
304
316
  * `pool` are kept. The in-memory pool reflects "what's live right
305
- * now", not "the complete list of remembered connections" — a
317
+ * now", not "the complete list of remembered connections"; a
306
318
  * silent reconnect that fails on reload leaves the entry out of
307
319
  * the pool but the saved entry stays so the next load can retry.
308
320
  * Use `removePoolEntry` for explicit eviction (the user clicked
309
321
  * Disconnect) and `clearAll` for a full wipe (reset).
310
322
  */
311
- setPool(pool) {
312
- return this.serializePoolMutation(async () => {
323
+ async setPool(pool) {
324
+ await this.serializePoolMutation(async () => {
313
325
  try {
314
326
  const serializable = { ...await this.getPool() };
315
327
  for (const [connectorId, wallet] of pool) {
@@ -321,7 +333,7 @@ var WalletStorage = class {
321
333
  icon: wallet.connector.icon,
322
334
  name: wallet.connector.name
323
335
  };
324
- if (!isValidPoolEntry$1(connectorId, entry)) throw new Error(`[butr] refusing to persist invalid pool entry for ${connectorId}`);
336
+ if (parseStoredPoolEntry(connectorId, entry) === null) throw new Error(`[butr] refusing to persist invalid pool entry for ${connectorId}`);
325
337
  serializable[connectorId] = entry;
326
338
  }
327
339
  await this.persistent.setItem(this.poolKey, JSON.stringify(serializable));
@@ -330,8 +342,8 @@ var WalletStorage = class {
330
342
  }
331
343
  });
332
344
  }
333
- removePoolEntry(connectorId) {
334
- return this.serializePoolMutation(async () => {
345
+ async removePoolEntry(connectorId) {
346
+ await this.serializePoolMutation(async () => {
335
347
  try {
336
348
  const stored = await this.getPool();
337
349
  if (stored[connectorId]) {
@@ -343,19 +355,23 @@ var WalletStorage = class {
343
355
  }
344
356
  });
345
357
  }
346
- clearPool() {
347
- return this.serializePoolMutation(async () => {
358
+ async clearPool() {
359
+ await this.serializePoolMutation(async () => {
348
360
  await this.persistent.removeItem(this.poolKey);
349
361
  });
350
362
  }
351
363
  async getSelection() {
352
364
  try {
353
365
  const stored = await this.persistent.getItem(this.selectionKey);
354
- if (!stored) return {};
355
- const parsed = JSON.parse(stored);
356
- if (!parsed || typeof parsed !== "object") return {};
366
+ if (stored === null || stored === "") return {};
367
+ const value = JSON.parse(stored);
368
+ const parsed = recordSchema.safeParse(value);
369
+ if (!parsed.success) return {};
357
370
  const result = {};
358
- for (const [key, value] of Object.entries(parsed)) if (VALID_CHAIN_PLATFORMS$1.has(key) && typeof value === "string" && value.length > 0) result[key] = value;
371
+ for (const [key, selectionValue] of Object.entries(parsed.data)) {
372
+ const platform = chainPlatformSchema.safeParse(key);
373
+ if (platform.success && typeof selectionValue === "string" && selectionValue.length > 0) result[platform.data] = selectionValue;
374
+ }
359
375
  return result;
360
376
  } catch (error) {
361
377
  logWarn("[butr] failed to parse selection from storage:", error);
@@ -374,7 +390,7 @@ var WalletStorage = class {
374
390
  async getActiveConnectorId() {
375
391
  try {
376
392
  const value = await this.persistent.getItem(this.activeKey);
377
- return value && value.length > 0 ? value : null;
393
+ return value !== null && value.length > 0 ? value : null;
378
394
  } catch {
379
395
  return null;
380
396
  }
@@ -462,6 +478,8 @@ const createConnectorLifecycle = (handlers) => {
462
478
 
463
479
  //#endregion
464
480
  //#region src/store/hydration.ts
481
+ const VALID_CHAIN_PLATFORMS$1 = new Set(CHAIN_PLATFORMS);
482
+ const isChainPlatform$1 = (value) => VALID_CHAIN_PLATFORMS$1.has(value);
465
483
  /** Pick the right `accounts` list: fresh from the connector if it
466
484
  * exposes `getAccounts`, otherwise the persisted list, otherwise just
467
485
  * the active account. */
@@ -476,7 +494,7 @@ const resolveHydratedAccounts = async (connector, storedAccounts, fallbackAccoun
476
494
  const restoreOneEntry = async (connectorId, entry, connector) => {
477
495
  try {
478
496
  await connector.connect({ silent: true });
479
- const accountToUse = await connector.getAccount() || entry.account;
497
+ const accountToUse = await connector.getAccount() ?? entry.account;
480
498
  return {
481
499
  connectorId,
482
500
  entry: {
@@ -538,13 +556,13 @@ const createHydrationCoordinator = (storage, createConnector) => {
538
556
  });
539
557
  }
540
558
  const selection = /* @__PURE__ */ new Map();
541
- for (const [platform, connectorId] of Object.entries(storedSelection)) if (connectorId && pool.has(connectorId)) selection.set(platform, connectorId);
559
+ for (const [platform, connectorId] of Object.entries(storedSelection)) if (isChainPlatform$1(platform) && connectorId !== void 0 && pool.has(connectorId)) selection.set(platform, connectorId);
542
560
  for (const [connectorId, wallet] of pool) {
543
561
  const platform = wallet.connector.chainPlatform;
544
562
  if (!selection.has(platform)) selection.set(platform, connectorId);
545
563
  }
546
564
  let activeConnectorId = null;
547
- if (storedActive && pool.has(storedActive)) activeConnectorId = storedActive;
565
+ if (storedActive !== null && pool.has(storedActive)) activeConnectorId = storedActive;
548
566
  else if (pool.size > 0) activeConnectorId = pool.keys().next().value ?? null;
549
567
  return {
550
568
  activeConnectorId,
@@ -586,8 +604,8 @@ const reducer = (state, event) => {
586
604
  const selection = new Map(state.selection);
587
605
  for (const [platform, id] of event.selection) selection.set(platform, id);
588
606
  let activeConnectorId = null;
589
- if (event.activeConnectorId && pool.has(event.activeConnectorId)) activeConnectorId = event.activeConnectorId;
590
- else if (state.activeConnectorId && pool.has(state.activeConnectorId)) activeConnectorId = state.activeConnectorId;
607
+ if (event.activeConnectorId !== null && pool.has(event.activeConnectorId)) activeConnectorId = event.activeConnectorId;
608
+ else if (state.activeConnectorId !== null && pool.has(state.activeConnectorId)) activeConnectorId = state.activeConnectorId;
591
609
  else if (pool.size > 0) activeConnectorId = pool.keys().next().value ?? null;
592
610
  let nextReconnecting = state.reconnectingIds;
593
611
  if (state.reconnectingIds.size > 0 && event.pool.size > 0) {
@@ -655,7 +673,7 @@ const reducer = (state, event) => {
655
673
  if (newSelection.get(platform) === event.connectorId) {
656
674
  newSelection.delete(platform);
657
675
  const fallback = findConnectorForPlatform(newPool, platform);
658
- if (fallback) newSelection.set(platform, fallback);
676
+ if (fallback !== void 0) newSelection.set(platform, fallback);
659
677
  }
660
678
  const firstId = newPool.keys().next();
661
679
  const activeConnectorId = state.activeConnectorId === event.connectorId ? firstId.value ?? null : state.activeConnectorId;
@@ -734,12 +752,12 @@ const reducer = (state, event) => {
734
752
  //#endregion
735
753
  //#region src/store/shadow-adapter.ts
736
754
  /**
737
- * Error thrown when a method is called on a shadow adapter — the
755
+ * Error thrown when a method is called on a shadow adapter; the
738
756
  * placeholder `WalletAdapter` that the store seeds into the pool when
739
757
  * an `initialState` is provided (e.g. from a server-rendered cookie
740
758
  * snapshot). Shadow adapters carry the identity and account data of a
741
759
  * previously-connected wallet, but the live wallet extension hasn't
742
- * been verified yet — the silent reconnect happens asynchronously
760
+ * been verified yet; the silent reconnect happens asynchronously
743
761
  * after mount.
744
762
  *
745
763
  * UI code that gates affordances on `wallet.connector.capabilities.*`
@@ -780,7 +798,7 @@ const ALL_FALSE_CAPABILITIES = Object.freeze({
780
798
  * is provided: each stored entry becomes a `ConnectedWallet` whose
781
799
  * `connector` is one of these. The store flips `isHydrated` true
782
800
  * synchronously and exposes the data through the usual hooks
783
- * (`useActiveWallet`, `useConnectedWallets`, …) — but the connector
801
+ * (`useActiveWallet`, `useConnectedWallets`, …), but the connector
784
802
  * can't actually talk to a wallet yet, so its capabilities are all
785
803
  * `false` and its methods throw `ShadowConnectorError` if called.
786
804
  *
@@ -856,13 +874,15 @@ const run = async (fn, onError) => {
856
874
 
857
875
  //#endregion
858
876
  //#region src/store/wallet-store.ts
877
+ const VALID_CHAIN_PLATFORMS = new Set(CHAIN_PLATFORMS);
878
+ const isChainPlatform = (value) => VALID_CHAIN_PLATFORMS.has(value);
859
879
  /**
860
880
  * Build a synchronously-populated `State` from `config.initialState`.
861
881
  * Each pool entry becomes a `ConnectedWallet` whose `connector` is a
862
882
  * shadow adapter; every connector id enters `reconnectingIds` so
863
883
  * consumers can branch on "is this connection verified" without
864
884
  * waiting for the async silent reconnect. `isHydrated` flips true
865
- * synchronously — the consumer's first render sees the persisted
885
+ * synchronously: the consumer's first render sees the persisted
866
886
  * state in the live store, not undefined.
867
887
  */
868
888
  const seedStateFromSnapshot = (snapshot) => {
@@ -879,8 +899,8 @@ const seedStateFromSnapshot = (snapshot) => {
879
899
  reconnectingIds.add(connectorId);
880
900
  }
881
901
  const selection = /* @__PURE__ */ new Map();
882
- for (const [platform, connectorId] of Object.entries(snapshot.selection)) if (connectorId && pool.has(connectorId)) selection.set(platform, connectorId);
883
- const activeConnectorId = snapshot.activeConnectorId && pool.has(snapshot.activeConnectorId) ? snapshot.activeConnectorId : pool.keys().next().value ?? null;
902
+ for (const [platform, connectorId] of Object.entries(snapshot.selection)) if (isChainPlatform(platform) && connectorId !== void 0 && pool.has(connectorId)) selection.set(platform, connectorId);
903
+ const activeConnectorId = snapshot.activeConnectorId !== null && pool.has(snapshot.activeConnectorId) ? snapshot.activeConnectorId : pool.keys().next().value ?? null;
884
904
  return {
885
905
  ...initialState,
886
906
  activeConnectorId,
@@ -894,8 +914,8 @@ const CONNECT_TIMEOUT_MS = 9e4;
894
914
  const DEFAULT_SLOW_CONNECT_THRESHOLD_MS = 5e3;
895
915
  const normaliseAddress = (addr) => addr.toLowerCase();
896
916
  const createWalletStore = (config) => {
897
- const storageKeyPrefix = config.storageKeyPrefix || "butr";
898
- const storage = config.storage || new WalletStorage({ keyPrefix: storageKeyPrefix });
917
+ const storageKeyPrefix = config.storageKeyPrefix === void 0 || config.storageKeyPrefix === "" ? "butr" : config.storageKeyPrefix;
918
+ const storage = config.storage ?? new WalletStorage({ keyPrefix: storageKeyPrefix });
899
919
  const reportStorageError = (context) => (error) => {
900
920
  if (config.onStorageError) {
901
921
  try {
@@ -956,7 +976,7 @@ const createWalletStore = (config) => {
956
976
  logWarn("[butr] onSlowConnect threw:", cbError);
957
977
  }
958
978
  }, slowThreshold) : null;
959
- let connectTimeoutId = null;
979
+ let connectTimeoutId;
960
980
  try {
961
981
  const connectPromise = connector.connect();
962
982
  connectPromise.catch(() => {});
@@ -1002,10 +1022,10 @@ const createWalletStore = (config) => {
1002
1022
  } catch (cbError) {
1003
1023
  logWarn("[butr] onConnectError threw:", cbError);
1004
1024
  }
1005
- onError?.(error);
1025
+ onError?.(error instanceof Error ? error : new Error(String(error)));
1006
1026
  throw error;
1007
1027
  } finally {
1008
- if (connectTimeoutId) clearTimeout(connectTimeoutId);
1028
+ clearTimeout(connectTimeoutId);
1009
1029
  if (slowTimer) clearTimeout(slowTimer);
1010
1030
  }
1011
1031
  },
@@ -1042,7 +1062,9 @@ const createWalletStore = (config) => {
1042
1062
  });
1043
1063
  for (const [connectorId, wallet] of result.pool) lifecycle.attach(connectorId, wallet.connector);
1044
1064
  await Promise.all([persistSelection(), persistActive()]);
1045
- for (const id of hydration.pendingIds()) run(() => get().tryRestoreFromPending(id), (e) => logWarn(`[butr] late restore rejected for ${id}:`, e));
1065
+ for (const id of hydration.pendingIds()) run(() => get().tryRestoreFromPending(id), (e) => {
1066
+ logWarn(`[butr] late restore rejected for ${id}:`, e);
1067
+ });
1046
1068
  if (config.onHydrated) try {
1047
1069
  config.onHydrated({
1048
1070
  dropped: result.dropped,
@@ -1173,7 +1195,7 @@ const readCookies = () => {
1173
1195
  };
1174
1196
  const buildCookieString = (name, value, options, expired = false) => {
1175
1197
  const parts = [`${name}=${encode(value)}`, `Path=${options.path ?? "/"}`];
1176
- if (options.domain) parts.push(`Domain=${options.domain}`);
1198
+ if (options.domain !== void 0 && options.domain !== "") parts.push(`Domain=${options.domain}`);
1177
1199
  if (expired) parts.push("Max-Age=0");
1178
1200
  else {
1179
1201
  const maxAge = options.maxAgeSeconds ?? DEFAULT_MAX_AGE_SECONDS;
@@ -1185,11 +1207,11 @@ const buildCookieString = (name, value, options, expired = false) => {
1185
1207
  };
1186
1208
  const toCookieMap$1 = (input) => {
1187
1209
  if (!input) return null;
1188
- if (typeof input[Symbol.iterator] === "function") return new Map(input);
1210
+ if (Symbol.iterator in input) return new Map(input);
1189
1211
  return new Map(Object.entries(input));
1190
1212
  };
1191
1213
  /**
1192
- * Cookie-backed storage driver. Reads/writes `document.cookie` —
1214
+ * Cookie-backed storage driver. Reads/writes `document.cookie`;
1193
1215
  * server-readable, survives reloads, scoped per `domain`/`path`.
1194
1216
  *
1195
1217
  * **When to use this:** SSR apps that need to know who's connected
@@ -1203,13 +1225,13 @@ const toCookieMap$1 = (input) => {
1203
1225
  * **Trade-offs vs `localStorage`:** cookies travel with every
1204
1226
  * request, so they cost bytes on the wire. Keep the storage key
1205
1227
  * prefix short, and prefer this driver for the `persistent` slot
1206
- * only — the `session` slot can stay in `sessionStorage` (which
1228
+ * only: the `session` slot can stay in `sessionStorage` (which
1207
1229
  * cookies can't natively model anyway).
1208
1230
  *
1209
1231
  * **Server-side writes are no-ops.** Emitting `Set-Cookie` requires
1210
1232
  * access to the framework's response object, which a storage driver
1211
1233
  * shouldn't reach into. The store doesn't mutate persisted state
1212
- * during the SSR pass anyway — writes only fire after client mount,
1234
+ * during the SSR pass anyway; writes only fire after client mount,
1213
1235
  * once `document.cookie` is reachable.
1214
1236
  */
1215
1237
  const createCookieStorageDriver = (options = {}) => {
@@ -1245,14 +1267,13 @@ const createCookieStorageDriver = (options = {}) => {
1245
1267
 
1246
1268
  //#endregion
1247
1269
  //#region src/storage/snapshot.ts
1248
- const VALID_CHAIN_PLATFORMS = new Set(CHAIN_PLATFORMS);
1249
1270
  const EMPTY_SNAPSHOT = Object.freeze({
1250
1271
  activeConnectorId: null,
1251
1272
  pool: Object.freeze({}),
1252
1273
  selection: Object.freeze({})
1253
1274
  });
1254
1275
  const toCookieMap = (input) => {
1255
- if (typeof input[Symbol.iterator] !== "function") return new Map(Object.entries(input));
1276
+ if (!(Symbol.iterator in input)) return new Map(Object.entries(input));
1256
1277
  const out = /* @__PURE__ */ new Map();
1257
1278
  for (const entry of input) {
1258
1279
  if (Array.isArray(entry)) {
@@ -1260,37 +1281,22 @@ const toCookieMap = (input) => {
1260
1281
  if (typeof name === "string" && typeof value === "string") out.set(name, value);
1261
1282
  continue;
1262
1283
  }
1263
- if (entry && typeof entry === "object" && "name" in entry && "value" in entry && typeof entry.name === "string" && typeof entry.value === "string") out.set(entry.name, entry.value);
1284
+ if (typeof entry.name === "string" && typeof entry.value === "string") out.set(entry.name, entry.value);
1264
1285
  }
1265
1286
  return out;
1266
1287
  };
1267
- const isValidAccount = (value) => {
1268
- if (!value || typeof value !== "object") return false;
1269
- const account = value;
1270
- if (typeof account.walletAddress !== "string" || typeof account.id !== "string") return false;
1271
- if (!account.chain || typeof account.chain !== "object") return false;
1272
- return true;
1273
- };
1274
- const isValidPoolEntry = (key, value) => {
1275
- if (!value || typeof value !== "object") return false;
1276
- const entry = value;
1277
- if (typeof entry.connectorId !== "string" || entry.connectorId !== key) return false;
1278
- if (typeof entry.chainPlatform !== "string") return false;
1279
- if (!VALID_CHAIN_PLATFORMS.has(entry.chainPlatform)) return false;
1280
- if (typeof entry.name !== "string" || entry.name.length === 0) return false;
1281
- if (entry.icon !== void 0 && typeof entry.icon !== "string") return false;
1282
- if (!isValidAccount(entry.account)) return false;
1283
- if (!Array.isArray(entry.accounts) || !entry.accounts.every(isValidAccount)) return false;
1284
- return true;
1285
- };
1286
1288
  const parsePool = (raw) => {
1287
- if (!raw) return {};
1289
+ if (raw === void 0 || raw === "") return {};
1288
1290
  try {
1289
- const parsed = JSON.parse(raw);
1290
- if (!parsed || typeof parsed !== "object") return {};
1291
+ const value = JSON.parse(raw);
1292
+ const parsed = recordSchema.safeParse(value);
1293
+ if (!parsed.success) return {};
1291
1294
  const result = {};
1292
- for (const [key, value] of Object.entries(parsed)) if (isValidPoolEntry(key, value)) result[key] = value;
1293
- else logWarn(`[butr] readWalletSnapshot: dropping invalid pool entry for ${key}`);
1295
+ for (const [key, entryValue] of Object.entries(parsed.data)) {
1296
+ const entry = parseStoredPoolEntry(key, entryValue);
1297
+ if (entry === null) logWarn(`[butr] readWalletSnapshot: dropping invalid pool entry for ${key}`);
1298
+ else result[key] = entry;
1299
+ }
1294
1300
  return result;
1295
1301
  } catch (error) {
1296
1302
  logWarn("[butr] readWalletSnapshot: failed to parse pool cookie:", error);
@@ -1298,12 +1304,16 @@ const parsePool = (raw) => {
1298
1304
  }
1299
1305
  };
1300
1306
  const parseSelection = (raw) => {
1301
- if (!raw) return {};
1307
+ if (raw === void 0 || raw === "") return {};
1302
1308
  try {
1303
- const parsed = JSON.parse(raw);
1304
- if (!parsed || typeof parsed !== "object") return {};
1309
+ const value = JSON.parse(raw);
1310
+ const parsed = recordSchema.safeParse(value);
1311
+ if (!parsed.success) return {};
1305
1312
  const result = {};
1306
- for (const [key, value] of Object.entries(parsed)) if (VALID_CHAIN_PLATFORMS.has(key) && typeof value === "string" && value.length > 0) result[key] = value;
1313
+ for (const [key, selectionValue] of Object.entries(parsed.data)) {
1314
+ const platform = chainPlatformSchema.safeParse(key);
1315
+ if (platform.success && typeof selectionValue === "string" && selectionValue.length > 0) result[platform.data] = selectionValue;
1316
+ }
1307
1317
  return result;
1308
1318
  } catch (error) {
1309
1319
  logWarn("[butr] readWalletSnapshot: failed to parse selection cookie:", error);
@@ -1313,7 +1323,7 @@ const parseSelection = (raw) => {
1313
1323
  /**
1314
1324
  * Parse a cookie source into a server-safe `WalletSnapshot`.
1315
1325
  *
1316
- * Pure, sync, no `document`, no React — runnable in any environment
1326
+ * Pure, sync, no `document`, no React; runnable in any environment
1317
1327
  * (Server Component, route handler, edge middleware, even client
1318
1328
  * code). Pair with `createCookieStorageDriver({ initialCookies })`
1319
1329
  * and `<WalletManagerProvider initialSnapshot={…} />` to render a
@@ -1324,7 +1334,7 @@ const parseSelection = (raw) => {
1324
1334
  * the wallet, switched accounts, or disconnected in another tab, the
1325
1335
  * client-side hydration will reconcile reality and the live store
1326
1336
  * will diverge from the snapshot. Treat the snapshot as an
1327
- * *optimistic* shell — accurate enough to avoid a paint flicker,
1337
+ * *optimistic* shell; accurate enough to avoid a paint flicker,
1328
1338
  * authoritative only after `useIsHydrated()` is true.
1329
1339
  *
1330
1340
  * **Inputs.** Accepts the three shapes Next.js / Express / Hono /
@@ -1334,17 +1344,17 @@ const parseSelection = (raw) => {
1334
1344
  * - An iterable of `[name, value]` tuples
1335
1345
  *
1336
1346
  * Malformed entries are dropped with a `logWarn` (same policy as
1337
- * `WalletStorage.getPool`) — a cross-tab corruption shouldn't crash
1347
+ * `WalletStorage.getPool`); a cross-tab corruption shouldn't crash
1338
1348
  * the server render.
1339
1349
  */
1340
1350
  const readWalletSnapshot = (source, options = {}) => {
1341
- const keyPrefix = options.keyPrefix || "butr";
1351
+ const keyPrefix = options.keyPrefix === void 0 || options.keyPrefix === "" ? "butr" : options.keyPrefix;
1342
1352
  const cookies = toCookieMap(source);
1343
1353
  const pool = parsePool(cookies.get(`${keyPrefix}-pool`));
1344
1354
  const selection = parseSelection(cookies.get(`${keyPrefix}-selection`));
1345
1355
  const rawActive = cookies.get(`${keyPrefix}-active`);
1346
1356
  let activeConnectorId = null;
1347
- if (rawActive && rawActive.length > 0 && pool[rawActive]) activeConnectorId = rawActive;
1357
+ if (rawActive !== void 0 && rawActive.length > 0 && pool[rawActive] !== void 0) activeConnectorId = rawActive;
1348
1358
  else {
1349
1359
  const firstKey = Object.keys(pool)[0];
1350
1360
  if (firstKey) activeConnectorId = firstKey;
@@ -1365,8 +1375,8 @@ const readWalletSnapshot = (source, options = {}) => {
1365
1375
  * selected-wallet, useWalletEntry) to suppress spurious re-renders
1366
1376
  * when the underlying Map churns but the resolved entry hasn't changed.
1367
1377
  *
1368
- * Hoisted to its own module so the equivalence rule lives in one place
1369
- * — if we ever extend the snapshot (e.g. to consider `accounts.length`),
1378
+ * Hoisted to its own module so the equivalence rule lives in one place;
1379
+ * if we ever extend the snapshot (e.g. to consider `accounts.length`),
1370
1380
  * every selector hook picks up the new rule for free.
1371
1381
  */
1372
1382
  const walletEqual = (a, b) => {
@@ -1380,7 +1390,7 @@ const walletEqual = (a, b) => {
1380
1390
  /**
1381
1391
  * Normalize a wallet-announced icon string.
1382
1392
  *
1383
- * Wallets announce their icon through external metadata — EIP-6963
1393
+ * Wallets announce their icon through external metadata; EIP-6963
1384
1394
  * `providerInfo.icon`, Wallet Standard `wallet.icon`. That value is
1385
1395
  * not under butr's control, and some wallets ship data-URI icons with
1386
1396
  * surrounding whitespace (a newline left over from a pretty-printed
@@ -1389,7 +1399,7 @@ const walletEqual = (a, b) => {
1389
1399
  *
1390
1400
  * Trims surrounding whitespace and treats an all-whitespace (or empty)
1391
1401
  * icon as absent, so consumers get either a usable string or
1392
- * `undefined` — never a blank or malformed one. `undefined` passes
1402
+ * `undefined`: never a blank or malformed one. `undefined` passes
1393
1403
  * through untouched.
1394
1404
  */
1395
1405
  const sanitizeIcon = (icon) => {
@@ -1416,7 +1426,7 @@ const sanitizeIcon = (icon) => {
1416
1426
  * - {@link bytesToHexPrefixed} returns `0x`-prefixed hex (EVM, Polkadot).
1417
1427
  * - {@link hexToBytes} tolerantly strips an optional `0x` (all callers).
1418
1428
  */
1419
- /** Bare lowercase hex — no `0x` prefix (Bitcoin, Ledger). */
1429
+ /** Bare lowercase hex, no `0x` prefix (Bitcoin, Ledger). */
1420
1430
  const bytesToHex = (bytes) => {
1421
1431
  let hex = "";
1422
1432
  for (const byte of bytes) hex += byte.toString(16).padStart(2, "0");
@@ -1458,5 +1468,5 @@ const bytesToBase64 = (bytes) => {
1458
1468
  };
1459
1469
 
1460
1470
  //#endregion
1461
- export { CHAIN_PLATFORMS, EMPTY_SNAPSHOT, WalletStorage, base64ToBytes, buildChainsByPlatform, bytesToBase64, bytesToHex, bytesToHexPrefixed, createBrowserStorageDriver, createCookieStorageDriver, createMemoryStorageDriver, createWalletSource, createWalletStore, hexToBytes, logError, logWarn, mapConnectionError, readWalletSnapshot, sanitizeIcon, walletEqual };
1471
+ export { CHAIN_PLATFORMS, EMPTY_SNAPSHOT, WalletStorage, base64ToBytes, buildAccount, buildChainsByPlatform, bytesToBase64, bytesToHex, bytesToHexPrefixed, createBrowserStorageDriver, createCookieStorageDriver, createMemoryStorageDriver, createWalletSource, createWalletStore, hexToBytes, logError, logWarn, mapConnectionError, readWalletSnapshot, sanitizeIcon, walletEqual };
1462
1472
  //# sourceMappingURL=index.js.map