@kheopskit/core 0.1.0 → 0.1.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.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/utils/getCachedObservable.ts","../src/utils/polkadotExtensions.ts","../src/utils/isWalletPlatform.ts","../src/utils/WalletId.ts","../src/utils/hydrateState.ts","../src/utils/storage.ts","../src/utils/iconCache.ts","../src/api/appKit.ts","../src/api/config.ts","../src/api/kheopskit.ts","../src/utils/createHydrationBuffer.ts","../src/utils/logObservable.ts","../src/api/accounts.ts","../src/utils/sortAccounts.ts","../src/api/ethereum/accounts.ts","../src/utils/createStore.ts","../src/utils/isEthereumAddress.ts","../src/utils/isSs58Address.ts","../src/utils/isValidAddress.ts","../src/utils/WalletAccountId.ts","../src/api/polkadot/accounts.ts","../src/api/store.ts","../src/api/wallets.ts","../src/utils/sortWallets.ts","../src/api/ethereum/wallets.ts","../src/api/polkadot/wallets.ts"],"sourcesContent":["export * from \"./api\";\n","import type { Observable } from \"rxjs\";\n\nconst CACHE = new Map<string, Observable<unknown>>();\n\nexport const getCachedObservable$ = <T, Obs = Observable<T>>(\n\tkey: string,\n\tcreate: () => Obs,\n): Obs => {\n\tif (!CACHE.has(key)) CACHE.set(key, create() as Observable<unknown>);\n\n\treturn CACHE.get(key) as Obs;\n};\n\n/**\n * Clears an observable from the cache.\n * Use when a wallet disconnects or configuration changes.\n */\nexport const clearCachedObservable = (key: string): void => {\n\tCACHE.delete(key);\n};\n\n/**\n * Clears all cached observables.\n * Use when resetting the entire kheopskit state.\n */\nexport const clearAllCachedObservables = (): void => {\n\tCACHE.clear();\n};\n","export const POLKADOT_EXTENSIONS: Record<\n\tstring,\n\t{ name: string; icon: string }\n> = {\n\ttalisman: {\n\t\tname: \"Talisman\",\n\t\ticon: \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K\",\n\t},\n\t\"polkadot-js\": {\n\t\tname: \"Polkadot.js\",\n\t\ticon: \"data:image/svg+xml;base64,ICA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwNi4yIDEwNi4yIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPgogICAgICA8ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPgogICAgICAgIDxjaXJjbGUgY3g9IjUzLjEiIGN5PSI1My4xIiByPSI1My4xIiBmaWxsPSIjZjI5MjM1IiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU0LjQ3IDEzLjc2YTI4Ljg1IDI4Ljg1IDAgMDAtMjguNzMgMjguNzMgMjkuMzQgMjkuMzQgMCAwMDEuNTIgOS4zNCA0IDQgMCAxMDcuNDktMi41MkExOC42NyAxOC42NyAwIDAxMzMuNjMgNDJhMjAuNzIgMjAuNzIgMCAxMTIyIDIxLjMxcy00IC4yNS02IC40OWMtLjc0LjExLTEuNDguMjYtMi4yLjQ0YS4yOC4yOCAwIDAxLS4zOCAwIC4yNy4yNyAwIDAxMC0uMzJsLjYzLTMuNDEgMy43OS0xN2EzLjk0IDMuOTQgMCAxMC03LjcxLTEuNjVzLTkgNDEuNy05IDQyLjA4YTMuNzkgMy43OSAwIDAwMi43NCA0LjZoLjI4YTMuNzggMy43OCAwIDAwNC42MS0yLjcxLjQzLjQzIDAgMDAwLS4xMXYtLjE5Yy4xMS0uNDkgMS4yNS02IDEuMjUtNmExMC4yMyAxMC4yMyAwIDAxOC40Ni04Yy44Ny0uMTMgNC41My0uMzggNC41My0uMzhhMjguNzEgMjguNzEgMCAwMC0yLjExLTU3LjI3eiIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU2LjIxIDgwYTQuNzggNC43OCAwIDAwLTUuNjYgMy43MS4yNC4yNCAwIDAxMCAuMDggNC43NyA0Ljc3IDAgMDAzLjY1IDUuNjdoLjE0QTQuNyA0LjcgMCAwMDYwIDg2di0uMzJBNSA1IDAgMDA1Ni4yMSA4MHoiCiAgICAgICAgLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvc3ZnPg==\",\n\t},\n\t\"subwallet-js\": {\n\t\tname: \"SubWallet\",\n\t\ticon: \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNODAgNGM1Ny42MyAwIDc2IDE4LjM3IDc2IDc2IDAgNTcuNjMtMTguMzcgNzYtNzYgNzYtNTcuNjMgMC03Ni0xOC4zNy03Ni03NkM0IDIyLjM3IDIyLjM3IDQgODAgNFoiIGZpbGw9InVybCgjYSkiLz48ZyBjbGlwLXBhdGg9InVybCgjYikiPjxwYXRoIGQ9Ik0xMTIuNjE1IDY2LjcyVjUzLjM5OEw1OC43NiAzMiA0OCAzNy40MTJsLjA1NyA0MS40NjQgNDAuMjkyIDE2LjA3LTIxLjUyIDkuMDc1di03LjAxOEw1Ni45NSA5My4wM2wtOC44OTMgNC4xNjN2MjUuMzk1TDU4Ljc2OSAxMjhsNTMuODQ2LTI0LjA2MlY4Ni44NjlMNjQuMTU0IDY3LjY1N1Y1NmwzOC40NDkgMTUuMjE2IDEwLjAxMi00LjQ5NloiIGZpbGw9IiNmZmYiLz48L2c+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iODAiIHkxPSI0IiB4Mj0iODAiIHkyPSIxNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNENFQUFDIi8+PC9saW5lYXJHcmFkaWVudD48Y2xpcFBhdGggaWQ9ImIiPjxwYXRoIGZpbGw9IiNmZmYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4IDMyKSIgZD0iTTAgMGg2NC42MTV2OTZIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4=\",\n\t},\n\tenkrypt: {\n\t\tname: \"Enkrypt\",\n\t\ticon: \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODEiIGhlaWdodD0iODEiIHZpZXdCb3g9IjAgMCA4MSA4MSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNy4wMDU3IDE3LjAwNjJDMTguOTMwMyAxNS4wODE2IDIxLjU0MDUgMTQuMDAwNCAyNC4yNjIyIDE0LjAwMDRMNjcuMzI5NiAxNFYyMS44NzQxQzY3LjMyOTYgMjMuODMwNSA2Ni41NTIzIDI1LjcwNjcgNjUuMTY5IDI3LjA5QzYzLjc4NTcgMjguNDczMyA2MS45MDk1IDI5LjI1MDQgNTkuOTUzMiAyOS4yNTA0SDM5LjcwNDVDMzYuOTgyOCAyOS4yNTA0IDM0LjM3MjYgMzAuMzMxNiAzMi40NDggMzIuMjU2MUMzMC41MjM1IDM0LjE4MDcgMjkuNDQyMyAzNi43OTA5IDI5LjQ0MjMgMzkuNTEyNlY0Mi4xMjQyQzI5LjQ0MjMgNDQuODQ1OSAzMC41MjM1IDQ3LjQ1NjEgMzIuNDQ4IDQ5LjM4MDZDMzQuMzcyNiA1MS4zMDUxIDM2Ljk4MjggNTIuMzg2MyAzOS43MDQ1IDUyLjM4NjNINTkuOTUzMkM2MS45MDk1IDUyLjM4NjMgNjMuNzg1NyA1My4xNjM1IDY1LjE2OSA1NC41NDY4QzY2LjU1MjMgNTUuOTMwMSA2Ny4zMjk2IDU3LjgwNjMgNjcuMzI5NiA1OS43NjI2VjY3LjMzSDI0LjI2MjJDMjEuNTQwNSA2Ny4zMyAxOC45MzAzIDY2LjI0ODggMTcuMDA1NyA2NC4zMjQzQzE1LjA4MTIgNjIuMzk5NyAxNCA1OS43ODk1IDE0IDU3LjA2NzhWMjQuMjYyNkMxNCAyMS41NDA5IDE1LjA4MTIgMTguOTMwNyAxNy4wMDU3IDE3LjAwNjJaTTQwLjE0NzkgMzMuNTQyM0g2MC45MTU3QzY0LjQ1OCAzMy41NDIzIDY3LjMyOTUgMzYuNDEzOCA2Ny4zMjk1IDM5Ljk1NjFWNDEuNjgxNkM2Ny4zMjk1IDQ1LjIyMzggNjQuNDU4IDQ4LjA5NTQgNjAuOTE1NyA0OC4wOTU0SDQwLjE0NzlDMzYuNjA1NyA0OC4wOTU0IDMzLjczNDEgNDUuMjIzOCAzMy43MzQxIDQxLjY4MTZWMzkuOTU2MUMzMy43MzQxIDM2LjQxMzggMzYuNjA1NyAzMy41NDIzIDQwLjE0NzkgMzMuNTQyM1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8yODdfMjM1OSkiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yODdfMjM1OSIgeDE9IjE5LjM2MDIiIHkxPSIxNCIgeDI9IjU2Ljc2OTYiIHkyPSI2OS44MDA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDNTQ5RkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjU0QkZGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==\",\n\t},\n};\n","import type { WalletPlatform } from \"../api/types\";\n\nexport const isWalletPlatform = (\n\tplatform: unknown,\n): platform is WalletPlatform =>\n\ttypeof platform === \"string\" &&\n\t[\"polkadot\", \"ethereum\"].includes(platform as WalletPlatform);\n","import type { WalletPlatform } from \"../api/types\";\nimport { isWalletPlatform } from \"./isWalletPlatform\";\n\nexport type WalletId = string;\n\nexport const getWalletId = (\n\tplatform: WalletPlatform,\n\tidentifier: string,\n): WalletId => {\n\tif (!isWalletPlatform(platform)) throw new Error(\"Invalid platform\");\n\tif (!identifier) throw new Error(\"Invalid name\");\n\treturn `${platform}:${identifier}`;\n};\n\nexport const parseWalletId = (walletId: string) => {\n\tif (!walletId) throw new Error(\"Invalid walletId\");\n\tconst [platform, identifier] = walletId.split(\":\");\n\tif (!isWalletPlatform(platform)) throw new Error(\"Invalid platform\");\n\tif (!identifier) throw new Error(\"Invalid address\");\n\treturn { platform, identifier };\n};\n","import type {\n\tCachedAccount,\n\tCachedWallet,\n\tEthereumAccount,\n\tEthereumInjectedWallet,\n\tPolkadotAccount,\n\tPolkadotInjectedWallet,\n\tWallet,\n\tWalletAccount,\n} from \"../api/types\";\nimport { POLKADOT_EXTENSIONS } from \"./polkadotExtensions\";\nimport type { WalletAccountId } from \"./WalletAccountId\";\nimport { parseWalletId, type WalletId } from \"./WalletId\";\n\n/**\n * Looks up the icon for a wallet from known Polkadot extensions only.\n * Ethereum icons will be populated from the localStorage icon cache via the merge function.\n *\n * Note: We DON'T use localStorage icon cache here because hydrateWallet is called\n * during SSR (server) and client hydration. localStorage isn't available on server,\n * so using it would cause a hydration mismatch. Icons for Ethereum wallets will be\n * populated when the hydration buffer merges cached wallets with live wallets.\n */\nconst lookupWalletIcon = (platform: string, identifier: string): string => {\n\t// Only Polkadot extensions have hardcoded icons that are safe for SSR\n\tif (platform === \"polkadot\") {\n\t\treturn POLKADOT_EXTENSIONS[identifier]?.icon ?? \"\";\n\t}\n\t// Ethereum icons come from localStorage or live wallets - not here\n\treturn \"\";\n};\n\n/**\n * Error thrown when trying to use a placeholder wallet that hasn't fully loaded yet.\n */\nclass PendingWalletError extends Error {\n\tconstructor(walletId: string) {\n\t\tsuper(\n\t\t\t`Wallet ${walletId} is still loading. Wait for isHydrating to be false before calling connect/disconnect.`,\n\t\t);\n\t\tthis.name = \"PendingWalletError\";\n\t}\n}\n\n/**\n * Converts a CachedWallet to a placeholder Wallet object.\n * The placeholder has the same display properties but connect/disconnect throw errors.\n *\n * @param cached - The cached wallet data from storage\n * @returns A placeholder Wallet object that can be displayed but not interacted with\n */\nexport const hydrateWallet = (cached: CachedWallet): Wallet => {\n\tconst { platform, identifier } = parseWalletId(cached.id);\n\n\tconst throwPending = () => {\n\t\tthrow new PendingWalletError(cached.id);\n\t};\n\n\t// All wallet types (injected + AppKit) are hydrated as injected placeholders.\n\t// AppKit wallets can't be hydrated properly without the AppKit instance,\n\t// so they use injected type as a display fallback and will be replaced\n\t// when the real wallet loads.\n\n\tconst icon = lookupWalletIcon(platform, identifier);\n\n\tif (platform === \"polkadot\") {\n\t\treturn {\n\t\t\tid: cached.id,\n\t\t\tplatform: \"polkadot\",\n\t\t\ttype: \"injected\",\n\t\t\textensionId: identifier,\n\t\t\textension: undefined,\n\t\t\tname: cached.name,\n\t\t\ticon,\n\t\t\tisConnected: cached.isConnected,\n\t\t\tconnect: throwPending,\n\t\t\tdisconnect: throwPending,\n\t\t} satisfies PolkadotInjectedWallet;\n\t}\n\n\tif (platform === \"ethereum\") {\n\t\treturn {\n\t\t\tid: cached.id,\n\t\t\tplatform: \"ethereum\",\n\t\t\ttype: \"injected\",\n\t\t\tproviderId: identifier,\n\t\t\tprovider: {} as never, // Placeholder - will be replaced by real wallet\n\t\t\tname: cached.name,\n\t\t\ticon,\n\t\t\tisConnected: cached.isConnected,\n\t\t\tconnect: throwPending,\n\t\t\tdisconnect: throwPending,\n\t\t} satisfies EthereumInjectedWallet;\n\t}\n\n\t// Should never happen if CachedWallet is properly typed\n\tthrow new Error(`Unknown platform: ${platform}`);\n};\n\n/**\n * Converts a CachedAccount to a placeholder WalletAccount object.\n *\n * @param cached - The cached account data from storage\n * @returns A placeholder WalletAccount object that can be displayed\n */\nexport const hydrateAccount = (cached: CachedAccount): WalletAccount => {\n\tif (cached.platform === \"polkadot\") {\n\t\treturn {\n\t\t\tid: cached.id as WalletAccountId,\n\t\t\tplatform: \"polkadot\",\n\t\t\taddress: cached.address,\n\t\t\tname: cached.name,\n\t\t\twalletId: cached.walletId,\n\t\t\twalletName: cached.walletName,\n\t\t\t// PolkadotSigner is required but we can't provide a real one\n\t\t\t// This is a placeholder that will be replaced by the real account\n\t\t\tpolkadotSigner: {} as never,\n\t\t} satisfies PolkadotAccount;\n\t}\n\n\tif (cached.platform === \"ethereum\") {\n\t\treturn {\n\t\t\tid: cached.id as WalletAccountId,\n\t\t\tplatform: \"ethereum\",\n\t\t\taddress: cached.address as `0x${string}`,\n\t\t\twalletId: cached.walletId,\n\t\t\twalletName: cached.walletName,\n\t\t\tisWalletDefault: false,\n\t\t\tclient: {} as never, // Placeholder\n\t\t} satisfies EthereumAccount;\n\t}\n\n\tthrow new Error(`Unknown platform: ${cached.platform}`);\n};\n\n/**\n * Converts a Wallet to a CachedWallet for storage.\n * Only extracts the serializable properties needed for hydration.\n *\n * @param wallet - The wallet to serialize\n * @returns A CachedWallet suitable for storage\n */\nexport const serializeWallet = (wallet: Wallet): CachedWallet => ({\n\tid: wallet.id,\n\tplatform: wallet.platform,\n\ttype: wallet.type,\n\tname: wallet.name,\n\t// Note: icon is NOT stored to save cookie space\n\tisConnected: wallet.isConnected,\n});\n\n/**\n * Converts a WalletAccount to a CachedAccount for storage.\n * Only extracts the serializable properties needed for hydration.\n *\n * @param account - The account to serialize\n * @returns A CachedAccount suitable for storage\n */\nexport const serializeAccount = (account: WalletAccount): CachedAccount => ({\n\tid: account.id,\n\tplatform: account.platform,\n\taddress: account.address,\n\tname: \"name\" in account ? account.name : undefined,\n\twalletId: account.walletId as WalletId,\n\twalletName: account.walletName,\n});\n","export type Storage = {\n\tgetItem: (key: string) => string | null;\n\tsetItem: (key: string, value: string) => void;\n\tremoveItem: (key: string) => void;\n};\n\n/**\n * Extended storage interface with cross-tab sync support.\n */\nexport type SyncableStorage = Storage & {\n\t/**\n\t * Subscribe to storage changes from other tabs.\n\t * Returns an unsubscribe function.\n\t */\n\tsubscribe?: (\n\t\tkey: string,\n\t\tcallback: (value: string | null) => void,\n\t) => () => void;\n};\n\n/**\n * A no-op storage implementation that does nothing.\n * Useful for testing or SSR environments where no storage is needed.\n */\nexport const noopStorage: SyncableStorage = {\n\tgetItem: () => null,\n\tsetItem: () => {},\n\tremoveItem: () => {},\n};\n\n/**\n * A safe localStorage wrapper that falls back to noopStorage\n * when localStorage is not available (e.g., during SSR).\n * Includes cross-tab sync via the native 'storage' event.\n */\nexport const safeLocalStorage: SyncableStorage = (() => {\n\tif (typeof window === \"undefined\") return noopStorage;\n\n\ttry {\n\t\t// Test that localStorage is accessible (may throw in private browsing)\n\t\tconst testKey = \"__kheopskit_test__\";\n\t\twindow.localStorage.setItem(testKey, testKey);\n\t\twindow.localStorage.removeItem(testKey);\n\n\t\treturn {\n\t\t\tgetItem: (key: string) => window.localStorage.getItem(key),\n\t\t\tsetItem: (key: string, value: string) =>\n\t\t\t\twindow.localStorage.setItem(key, value),\n\t\t\tremoveItem: (key: string) => window.localStorage.removeItem(key),\n\t\t\tsubscribe: (key: string, callback: (value: string | null) => void) => {\n\t\t\t\tconst handler = (event: StorageEvent) => {\n\t\t\t\t\tif (event.key === key) {\n\t\t\t\t\t\tcallback(event.newValue);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\twindow.addEventListener(\"storage\", handler);\n\t\t\t\treturn () => window.removeEventListener(\"storage\", handler);\n\t\t\t},\n\t\t};\n\t} catch {\n\t\treturn noopStorage;\n\t}\n})();\n\n/**\n * Parse a cookie string to extract the value for a specific key.\n * @param cookieString - The full cookie header string (e.g., document.cookie or req.headers.cookie)\n * @param key - The cookie key to find\n * @returns The cookie value or null if not found\n */\nexport const parseCookie = (\n\tcookieString: string | undefined,\n\tkey: string,\n): string | null => {\n\tif (!cookieString) return null;\n\n\tfor (const cookie of cookieString.split(\";\")) {\n\t\tconst [k, ...v] = cookie.split(\"=\");\n\t\tconst cookieKey = k?.trim();\n\t\tif (cookieKey === key) {\n\t\t\ttry {\n\t\t\t\treturn decodeURIComponent(v.join(\"=\").trim());\n\t\t\t} catch {\n\t\t\t\treturn null; // Malformed cookie value\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Maximum recommended size for cookie storage (3KB to stay well under 4KB limit).\n *\n * @remarks\n * Cookie storage is subject to browser limits (typically 4KB per cookie).\n * When users connect many wallets, the auto-reconnect list may exceed this limit.\n * If this happens:\n * - A console warning will be logged\n * - Some browsers may silently reject the cookie\n * - Consider using fewer simultaneous wallet connections\n *\n * The stored data includes wallet IDs in format `platform:identifier`\n * (e.g., `polkadot:talisman`, `ethereum:io.metamask`).\n */\nexport const COOKIE_MAX_SIZE = 3 * 1024;\n\n/**\n * BroadcastChannel name for cross-tab cookie sync.\n */\nconst BROADCAST_CHANNEL_NAME = \"kheopskit-storage-sync\";\n\n/**\n * Singleton BroadcastChannel for cross-tab cookie sync.\n * Created once and shared across all cookieStorage instances.\n */\nlet sharedBroadcastChannel: BroadcastChannel | null = null;\n\nconst getBroadcastChannel = (): BroadcastChannel | null => {\n\tif (sharedBroadcastChannel) return sharedBroadcastChannel;\n\tif (typeof BroadcastChannel === \"undefined\") return null;\n\n\ttry {\n\t\tsharedBroadcastChannel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);\n\t} catch {\n\t\t// BroadcastChannel not supported or failed\n\t}\n\treturn sharedBroadcastChannel;\n};\n\n/**\n * Check if the current connection is secure (HTTPS).\n * Must be called at runtime (inside methods) to work correctly after SSR hydration.\n */\nconst isSecureConnection = (): boolean =>\n\ttypeof window !== \"undefined\" && window.location.protocol === \"https:\";\n\n/**\n * A cookie-based storage implementation for SSR environments.\n * Reads cookies from an optional initial cookie string (for SSR hydration),\n * writes to document.cookie on the client.\n *\n * Features:\n * - Secure flag automatically added for HTTPS connections\n * - Cross-tab synchronization via BroadcastChannel API\n * - Size limit warning when data exceeds recommended limits\n *\n * @param initialCookies - Optional cookie string for server-side hydration\n */\nexport const cookieStorage = (initialCookies?: string): SyncableStorage => {\n\treturn {\n\t\tgetItem: (key: string) => {\n\t\t\t// On server, use initialCookies. On client, read from document.cookie\n\t\t\tconst cookieString =\n\t\t\t\ttypeof document !== \"undefined\" ? document.cookie : initialCookies;\n\t\t\treturn parseCookie(cookieString, key);\n\t\t},\n\t\tsetItem: (key: string, value: string) => {\n\t\t\tif (typeof document === \"undefined\") return;\n\n\t\t\t// Warn if value exceeds recommended size\n\t\t\tconst encodedValue = encodeURIComponent(value);\n\t\t\tif (encodedValue.length > COOKIE_MAX_SIZE) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[kheopskit] Cookie value for \"${key}\" exceeds recommended size limit (${encodedValue.length} > ${COOKIE_MAX_SIZE} bytes). ` +\n\t\t\t\t\t\t\"This may cause issues with cookie storage. Consider reducing the number of connected wallets.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Set cookie with 1 year expiry\n\t\t\tconst expires = new Date();\n\t\t\texpires.setFullYear(expires.getFullYear() + 1);\n\n\t\t\t// Build cookie string with security attributes\n\t\t\tlet cookieStr = `${key}=${encodedValue};expires=${expires.toUTCString()};path=/;SameSite=Lax`;\n\t\t\tif (isSecureConnection()) {\n\t\t\t\tcookieStr += \";Secure\";\n\t\t\t}\n\n\t\t\t// biome-ignore lint: necessary for cookie storage - direct cookie assignment is the standard API\n\t\t\tdocument.cookie = cookieStr;\n\n\t\t\t// Broadcast change to other tabs\n\t\t\tgetBroadcastChannel()?.postMessage({ type: \"set\", key, value });\n\t\t},\n\t\tremoveItem: (key: string) => {\n\t\t\tif (typeof document === \"undefined\") return;\n\n\t\t\t// Build delete cookie string\n\t\t\tlet cookieStr = `${key}=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/;SameSite=Lax`;\n\t\t\tif (isSecureConnection()) {\n\t\t\t\tcookieStr += \";Secure\";\n\t\t\t}\n\n\t\t\t// biome-ignore lint: necessary for cookie storage - direct cookie assignment is the standard API\n\t\t\tdocument.cookie = cookieStr;\n\n\t\t\t// Broadcast change to other tabs\n\t\t\tgetBroadcastChannel()?.postMessage({ type: \"remove\", key });\n\t\t},\n\t\tsubscribe: (key: string, callback: (value: string | null) => void) => {\n\t\t\tconst channel = getBroadcastChannel();\n\t\t\tif (!channel) return () => {};\n\n\t\t\tconst handler = (event: MessageEvent) => {\n\t\t\t\tconst data = event.data as {\n\t\t\t\t\ttype: string;\n\t\t\t\t\tkey: string;\n\t\t\t\t\tvalue?: string;\n\t\t\t\t};\n\t\t\t\tif (data.key === key) {\n\t\t\t\t\tif (data.type === \"set\") {\n\t\t\t\t\t\tcallback(data.value ?? null);\n\t\t\t\t\t} else if (data.type === \"remove\") {\n\t\t\t\t\t\tcallback(null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tchannel.addEventListener(\"message\", handler);\n\t\t\treturn () => {\n\t\t\t\tchannel.removeEventListener(\"message\", handler);\n\t\t\t};\n\t\t},\n\t};\n};\n\n/**\n * Cleanup the shared BroadcastChannel used for cross-tab cookie sync.\n * Call this when you're done using cookie storage (e.g., in tests or when unmounting).\n *\n * @remarks\n * In normal browser usage, you typically don't need to call this -\n * the channel will be cleaned up when the page is closed.\n * This is primarily useful for testing environments where multiple\n * test runs may accumulate channels.\n */\nexport const cleanupBroadcastChannel = (): void => {\n\tif (sharedBroadcastChannel) {\n\t\tsharedBroadcastChannel.close();\n\t\tsharedBroadcastChannel = null;\n\t}\n};\n","import { safeLocalStorage } from \"./storage\";\n\n/**\n * Storage key for the icon cache in localStorage.\n */\nconst ICON_CACHE_KEY = \"kheopskit-icons\";\n\n/**\n * Icon cache type: a map of wallet ID to icon data URI or URL.\n */\ntype IconCache = Record<string, string>;\n\n/**\n * In-memory cache to avoid repeated localStorage reads.\n */\nlet memoryCache: IconCache | null = null;\n\n/**\n * Loads the icon cache from localStorage.\n */\nconst loadCache = (): IconCache => {\n\tif (memoryCache !== null) return memoryCache;\n\n\ttry {\n\t\tconst stored = safeLocalStorage.getItem(ICON_CACHE_KEY);\n\t\tmemoryCache = stored ? (JSON.parse(stored) as IconCache) : {};\n\t} catch {\n\t\tmemoryCache = {};\n\t}\n\treturn memoryCache;\n};\n\n/**\n * Saves the icon cache to localStorage.\n */\nconst saveCache = (cache: IconCache): void => {\n\ttry {\n\t\tsafeLocalStorage.setItem(ICON_CACHE_KEY, JSON.stringify(cache));\n\t\tmemoryCache = cache;\n\t} catch {\n\t\t// localStorage may be full or unavailable\n\t}\n};\n\n/**\n * Gets a cached icon for a wallet.\n * @param walletId - The wallet ID (e.g., \"ethereum:io.talisman\")\n * @returns The cached icon data URI, or undefined if not cached\n */\nexport const getCachedIcon = (walletId: string): string | undefined => {\n\tconst cache = loadCache();\n\treturn cache[walletId] || undefined;\n};\n\n/**\n * Sets multiple cached icons at once.\n * More efficient than calling setCachedIcon multiple times.\n * @param icons - Map of wallet ID to icon\n */\nexport const setCachedIcons = (icons: Record<string, string>): void => {\n\tconst cache = loadCache();\n\tlet changed = false;\n\n\tfor (const [walletId, icon] of Object.entries(icons)) {\n\t\tif (icon && cache[walletId] !== icon) {\n\t\t\tcache[walletId] = icon;\n\t\t\tchanged = true;\n\t\t}\n\t}\n\n\tif (changed) {\n\t\tsaveCache(cache);\n\t}\n};\n","import { createAppKit } from \"@reown/appkit/core\";\nimport {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tof,\n\tshareReplay,\n} from \"rxjs\";\nimport { getWalletId } from \"../utils/WalletId\";\nimport type {\n\tEthereumAppKitWallet,\n\tKheopskitConfig,\n\tPolkadotAppKitWallet,\n} from \"./types\";\n\nconst WALLET_CONNECT_ICON =\n\t\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+\";\n\ntype AppKitWallets = {\n\tpolkadot?: PolkadotAppKitWallet;\n\tethereum?: EthereumAppKitWallet;\n};\n\n// once it exists, appKit object should never be recreated\nlet cachedAppKit: Observable<AppKitWallets> | null = null;\n\n/**\n * Clears the cached AppKit observable.\n * Use when configuration changes or for testing purposes.\n * Note: This does NOT destroy the appKit instance created by Reown.\n */\nexport const resetAppKitCache = (): void => {\n\tcachedAppKit = null;\n};\n\nexport const getAppKitWallets$ = (\n\tconfig: KheopskitConfig,\n): Observable<AppKitWallets> => {\n\tif (!config.walletConnect) return of({});\n\n\tconst walletConnect = config.walletConnect;\n\n\tif (!cachedAppKit) {\n\t\tcachedAppKit = new Observable<AppKitWallets>((subscriber) => {\n\t\t\tconst appKit = createAppKit({\n\t\t\t\tprojectId: walletConnect.projectId,\n\t\t\t\tmetadata: walletConnect.metadata,\n\t\t\t\tnetworks: walletConnect.networks,\n\t\t\t\tthemeMode: walletConnect.themeMode,\n\t\t\t\tthemeVariables: walletConnect.themeVariables,\n\t\t\t\tuniversalProviderConfigOverride: {\n\t\t\t\t\tmethods: {\n\t\t\t\t\t\tpolkadot: [\"polkadot_signTransaction\", \"polkadot_signMessage\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tallWallets: \"HIDE\",\n\t\t\t\tdebug: config.debug,\n\t\t\t\tallowUnsupportedChain: true,\n\t\t\t});\n\n\t\t\tconst status$ = new BehaviorSubject({\n\t\t\t\tisPolkadotConnected: false,\n\t\t\t\tisEthereumConnected: false,\n\t\t\t});\n\n\t\t\tconst unsubProviders = appKit.subscribeProviders((providers) => {\n\t\t\t\tstatus$.next({\n\t\t\t\t\tisPolkadotConnected: !!providers.polkadot,\n\t\t\t\t\tisEthereumConnected: !!providers.eip155,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst polkadotWallet$ = appKit.chainNamespaces.includes(\"polkadot\")\n\t\t\t\t? status$.pipe(\n\t\t\t\t\t\tmap((s) => s.isPolkadotConnected),\n\t\t\t\t\t\tdistinctUntilChanged(),\n\t\t\t\t\t\tmap((isConnected): PolkadotAppKitWallet => {\n\t\t\t\t\t\t\tconst walletInfo = appKit.getWalletInfo();\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid: getWalletId(\"polkadot\", \"walletconnect\"),\n\t\t\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\t\t\ttype: \"appKit\",\n\t\t\t\t\t\t\t\tappKit, // todo maybe we dont want to expose the appKit instance\n\t\t\t\t\t\t\t\tname: walletInfo?.name ?? \"WalletConnect\",\n\t\t\t\t\t\t\t\ticon: walletInfo?.icon ?? WALLET_CONNECT_ICON,\n\t\t\t\t\t\t\t\tconnect: async () => {\n\t\t\t\t\t\t\t\t\tif (!isConnected) await appKit.open();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tdisconnect: () => {\n\t\t\t\t\t\t\t\t\tif (isConnected) appKit.disconnect();\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tisConnected,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t: of(undefined);\n\n\t\t\tconst ethereumWallet$ = appKit.chainNamespaces.includes(\"eip155\")\n\t\t\t\t? status$.pipe(\n\t\t\t\t\t\tmap((s) => s.isEthereumConnected),\n\t\t\t\t\t\tdistinctUntilChanged(),\n\t\t\t\t\t\tmap((isConnected): EthereumAppKitWallet => {\n\t\t\t\t\t\t\tconst walletInfo = appKit.getWalletInfo();\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid: getWalletId(\"ethereum\", \"walletconnect\"),\n\t\t\t\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\t\t\t\ttype: \"appKit\",\n\t\t\t\t\t\t\t\tappKit,\n\t\t\t\t\t\t\t\tname: walletInfo?.name ?? \"WalletConnect\",\n\t\t\t\t\t\t\t\ticon: walletInfo?.icon ?? WALLET_CONNECT_ICON,\n\t\t\t\t\t\t\t\tconnect: () => appKit.open(),\n\t\t\t\t\t\t\t\tdisconnect: () => appKit.disconnect(),\n\t\t\t\t\t\t\t\tisConnected,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t: of(undefined);\n\n\t\t\tconst sub = combineLatest({\n\t\t\t\tpolkadot: polkadotWallet$,\n\t\t\t\tethereum: ethereumWallet$,\n\t\t\t}).subscribe(subscriber);\n\n\t\t\treturn () => {\n\t\t\t\tsub.unsubscribe();\n\t\t\t\tunsubProviders();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\t}\n\n\treturn cachedAppKit;\n};\n","import type { KheopskitConfig } from \"./types\";\n\n/**\n * Default storage key for persisting wallet connection state.\n * Can be overridden via config.storageKey to avoid conflicts\n * when running multiple dapps on the same domain.\n */\nexport const DEFAULT_STORAGE_KEY = \"kheopskit\";\n\nconst DEFAULT_CONFIG: KheopskitConfig = {\n\tautoReconnect: true,\n\tplatforms: [\"polkadot\"],\n\tdebug: false,\n\tstorageKey: DEFAULT_STORAGE_KEY,\n\thydrationGracePeriod: 500,\n};\n\nexport const resolveConfig = (\n\tconfig: Partial<KheopskitConfig> | undefined,\n): KheopskitConfig => {\n\treturn Object.assign({}, DEFAULT_CONFIG, config);\n};\n","import {\n\tcombineLatest,\n\tdebounceTime,\n\tdistinctUntilChanged,\n\tfilter,\n\tmap,\n\tObservable,\n\tshareReplay,\n\tthrottleTime,\n} from \"rxjs\";\nimport {\n\tcreateAccountHydrationBuffer,\n\tcreateHydrationBuffer,\n} from \"../utils/createHydrationBuffer\";\nimport {\n\thydrateAccount,\n\thydrateWallet,\n\tserializeAccount,\n\tserializeWallet,\n} from \"../utils/hydrateState\";\nimport { getCachedIcon, setCachedIcons } from \"../utils/iconCache\";\nimport { logObservable } from \"../utils/logObservable\";\nimport { getAccounts$ } from \"./accounts\";\nimport { resolveConfig } from \"./config\";\nimport { createKheopskitStore } from \"./store\";\nimport type { KheopskitConfig, Wallet, WalletAccount } from \"./types\";\nimport { getWallets$ } from \"./wallets\";\n\nexport type { KheopskitConfig } from \"./types\";\n\nexport type KheopskitState = {\n\twallets: Wallet[];\n\taccounts: WalletAccount[];\n\tconfig: KheopskitConfig;\n\t/**\n\t * Whether the state is still being hydrated from cache.\n\t * During hydration, cached wallets/accounts may be displayed\n\t * before the actual wallet extensions have injected.\n\t *\n\t * Use this to show loading indicators or disable certain actions.\n\t */\n\tisHydrating: boolean;\n};\n\nexport const getKheopskit$ = (\n\tconfig?: Partial<KheopskitConfig>,\n\tssrCookies?: string,\n\texistingStore?: ReturnType<typeof createKheopskitStore>,\n) => {\n\tconst kc = resolveConfig(config);\n\tconst store =\n\t\texistingStore ??\n\t\tcreateKheopskitStore({ ssrCookies, storageKey: kc.storageKey });\n\n\tif (kc.debug) console.debug(\"[kheopskit] config\", kc);\n\n\t// Warn about SSR environment without cookies\n\tif (kc.debug && typeof window === \"undefined\" && ssrCookies === undefined) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] Running on server without `ssrCookies`. \" +\n\t\t\t\t\"Wallet state will not be hydrated. Pass cookies for SSR support.\",\n\t\t);\n\t}\n\n\t// Get cached state for hydration\n\tconst cachedState = store.getCachedState();\n\t// Hydrate wallets and enrich with icons from localStorage cache\n\tconst cachedWallets = cachedState.wallets.map((w) => {\n\t\tconst wallet = hydrateWallet(w);\n\t\t// If wallet doesn't have icon (e.g., Ethereum), try localStorage cache\n\t\tif (!wallet.icon) {\n\t\t\tconst cachedIcon = getCachedIcon(wallet.id);\n\t\t\tif (cachedIcon) {\n\t\t\t\treturn { ...wallet, icon: cachedIcon };\n\t\t\t}\n\t\t}\n\t\treturn wallet;\n\t});\n\tconst cachedAccounts = cachedState.accounts.map(hydrateAccount);\n\n\tif (kc.debug && cachedWallets.length > 0) {\n\t\tconsole.debug(\"[kheopskit] hydrating from cache:\", {\n\t\t\twallets: cachedWallets.length,\n\t\t\taccounts: cachedAccounts.length,\n\t\t});\n\t}\n\n\treturn new Observable<KheopskitState>((subscriber) => {\n\t\t// Get live wallets and accounts\n\t\tconst liveWallets$ = getWallets$(kc, store);\n\t\tconst liveAccounts$ = getAccounts$(kc, liveWallets$);\n\n\t\t// Apply hydration buffer to wallets\n\t\tconst bufferedWallets$ = createHydrationBuffer(\n\t\t\tcachedWallets,\n\t\t\tliveWallets$,\n\t\t\tkc.hydrationGracePeriod,\n\t\t\t(w) => w.id,\n\t\t\t// Hydration converges when all cached-connected wallets are connected in live\n\t\t\t(liveWallets, cached) => {\n\t\t\t\tconst cachedConnectedIds = new Set(\n\t\t\t\t\tcached.filter((w) => w.isConnected).map((w) => w.id),\n\t\t\t\t);\n\t\t\t\tif (cachedConnectedIds.size === 0) return true;\n\t\t\t\treturn [...cachedConnectedIds].every((id) =>\n\t\t\t\t\tliveWallets.some((w) => w.id === id && w.isConnected),\n\t\t\t\t);\n\t\t\t},\n\t\t\t// Merge: prefer cached isConnected state but get icon from cache or live\n\t\t\t(live, cached) => ({\n\t\t\t\t...cached,\n\t\t\t\t// Priority: cached icon > localStorage cache > live icon\n\t\t\t\ticon: cached.icon || getCachedIcon(cached.id) || live.icon,\n\t\t\t\t// Use live wallet's connect/disconnect functions\n\t\t\t\tconnect: live.connect,\n\t\t\t\tdisconnect: live.disconnect,\n\t\t\t}),\n\t\t\t// Transform cached-only items: add icon from localStorage cache\n\t\t\t(cached) => ({\n\t\t\t\t...cached,\n\t\t\t\ticon: cached.icon || getCachedIcon(cached.id) || \"\",\n\t\t\t}),\n\t\t);\n\n\t\t// Apply hydration buffer to accounts\n\t\tconst bufferedAccounts$ = createAccountHydrationBuffer(\n\t\t\tcachedAccounts,\n\t\t\tliveAccounts$,\n\t\t\tkc.hydrationGracePeriod,\n\t\t\t(a) => a.walletId,\n\t\t\t// Hydration converges when all wallets with cached accounts have provided live accounts\n\t\t\t(liveAccounts, cached) => {\n\t\t\t\tconst cachedWalletIds = new Set(cached.map((a) => a.walletId));\n\t\t\t\tif (cachedWalletIds.size === 0) return true;\n\t\t\t\tconst liveWalletIds = new Set(liveAccounts.map((a) => a.walletId));\n\t\t\t\treturn [...cachedWalletIds].every((id) => liveWalletIds.has(id));\n\t\t\t},\n\t\t);\n\n\t\t// Combine buffered wallets and accounts\n\t\tconst subscription = combineLatest({\n\t\t\twallets: bufferedWallets$,\n\t\t\taccounts: bufferedAccounts$,\n\t\t})\n\t\t\t.pipe(\n\t\t\t\tmap(({ wallets, accounts }) => {\n\t\t\t\t\tif (kc.debug) {\n\t\t\t\t\t\tconsole.debug(\"[kheopskit] hydration state\", {\n\t\t\t\t\t\t\twalletsHydrating: wallets.isHydrating,\n\t\t\t\t\t\t\taccountsHydrating: accounts.isHydrating,\n\t\t\t\t\t\t\twalletsConnected: wallets.items.filter((w) => w.isConnected)\n\t\t\t\t\t\t\t\t.length,\n\t\t\t\t\t\t\twalletsTotal: wallets.items.length,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tconfig: kc,\n\t\t\t\t\t\twallets: wallets.items,\n\t\t\t\t\t\taccounts: accounts.items,\n\t\t\t\t\t\tisHydrating: wallets.isHydrating || accounts.isHydrating,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\t// Persist state snapshot when hydration completes and state stabilizes\n\t\tconst persistSub = combineLatest({\n\t\t\twallets: bufferedWallets$,\n\t\t\taccounts: bufferedAccounts$,\n\t\t})\n\t\t\t.pipe(\n\t\t\t\t// Wait for hydration to complete\n\t\t\t\tfilter(\n\t\t\t\t\t({ wallets, accounts }) =>\n\t\t\t\t\t\t!wallets.isHydrating && !accounts.isHydrating,\n\t\t\t\t),\n\t\t\t\t// Debounce to avoid excessive writes\n\t\t\t\tdebounceTime(1000),\n\t\t\t\t// Only persist if state actually changed\n\t\t\t\tdistinctUntilChanged((prev, curr) => {\n\t\t\t\t\tconst prevWalletIds = prev.wallets.items.map((w) => w.id);\n\t\t\t\t\tconst currWalletIds = curr.wallets.items.map((w) => w.id);\n\t\t\t\t\tconst prevAccountIds = prev.accounts.items.map((a) => a.id);\n\t\t\t\t\tconst currAccountIds = curr.accounts.items.map((a) => a.id);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tarraysEqual(prevWalletIds, currWalletIds) &&\n\t\t\t\t\t\tarraysEqual(prevAccountIds, currAccountIds)\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe(({ wallets, accounts }) => {\n\t\t\t\t// Cache ALL wallets to avoid wallet list flash on reload\n\t\t\t\t// Only accounts from connected wallets are cached\n\t\t\t\tconst connectedWalletIds = new Set(\n\t\t\t\t\twallets.items.filter((w) => w.isConnected).map((w) => w.id),\n\t\t\t\t);\n\t\t\t\tconst relevantAccounts = accounts.items.filter((a) =>\n\t\t\t\t\tconnectedWalletIds.has(a.walletId),\n\t\t\t\t);\n\n\t\t\t\tif (kc.debug) {\n\t\t\t\t\tconsole.debug(\"[kheopskit] persisting state snapshot:\", {\n\t\t\t\t\t\twallets: wallets.items.length,\n\t\t\t\t\t\taccounts: relevantAccounts.length,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tstore.setCachedState(\n\t\t\t\t\twallets.items.map(serializeWallet),\n\t\t\t\t\trelevantAccounts.map(serializeAccount),\n\t\t\t\t);\n\n\t\t\t\t// Cache wallet icons in localStorage (separate from cookies for size)\n\t\t\t\tconst icons: Record<string, string> = {};\n\t\t\t\tfor (const wallet of wallets.items) {\n\t\t\t\t\tif (wallet.icon) {\n\t\t\t\t\t\ticons[wallet.id] = wallet.icon;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetCachedIcons(icons);\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t\tpersistSub.unsubscribe();\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged(statesEqual),\n\t\tthrottleTime(16, undefined, { leading: true, trailing: true }), // ~1 frame at 60fps\n\t\tlogObservable(\"kheopskit$\", { enabled: kc.debug, printValue: true }),\n\t\tshareReplay({ bufferSize: 1, refCount: true }),\n\t);\n};\n\nconst arraysEqual = (a: string[], b: string[]) =>\n\ta.length === b.length && a.every((v, i) => v === b[i]);\n\n/**\n * Deep equality check for KheopskitState to prevent unnecessary emissions.\n */\nconst statesEqual = (a: KheopskitState, b: KheopskitState): boolean =>\n\ta.isHydrating === b.isHydrating &&\n\ta.wallets.length === b.wallets.length &&\n\ta.accounts.length === b.accounts.length &&\n\ta.wallets.every(\n\t\t(w, i) =>\n\t\t\tw.id === b.wallets[i]?.id && w.isConnected === b.wallets[i]?.isConnected,\n\t) &&\n\ta.accounts.every((acc, i) => acc.id === b.accounts[i]?.id);\n","import {\n\tBehaviorSubject,\n\tcombineLatest,\n\tfilter,\n\tmap,\n\tObservable,\n\tSubscription,\n\tshareReplay,\n\tstartWith,\n\ttake,\n\ttimer,\n} from \"rxjs\";\n\ntype HydrationBufferResult<T> = {\n\titems: T[];\n\tisHydrating: boolean;\n};\n\n/**\n * Core hydration buffer logic shared between wallets and accounts.\n *\n * During the grace period:\n * - Emits cached items immediately (before any live emissions)\n * - As live items arrive, merges them using the provided merge function\n *\n * After the grace period (and convergence, if provided):\n * - Only live items are returned\n * - isHydrating becomes false\n *\n * If an `isConverged` function is provided, hydration ends only when BOTH\n * the grace period has elapsed AND the live items have converged with cached\n * items (e.g., all previously-connected wallets have reconnected).\n * A max timeout (6x grace period) prevents infinite hydration.\n *\n * @param cachedItems - Initial cached items from storage\n * @param liveItems$ - Observable of live items as they become available\n * @param gracePeriodMs - Time in ms to wait before syncing to live state\n * @param mergeFn - Function to merge live and cached items during hydration\n * @param isConverged - Optional function to check if live items have caught up to cached items\n */\nconst createBufferCore = <T>(\n\tcachedItems: T[],\n\tliveItems$: Observable<T[]>,\n\tgracePeriodMs: number,\n\tmergeFn: (liveItems: T[], cachedItems: T[]) => T[],\n\tisConverged?: (liveItems: T[], cachedItems: T[]) => boolean,\n): Observable<HydrationBufferResult<T>> => {\n\t// If no grace period or no cached items, just pass through live items\n\tif (gracePeriodMs <= 0 || cachedItems.length === 0) {\n\t\treturn liveItems$.pipe(map((items) => ({ items, isHydrating: false })));\n\t}\n\n\t// Wrap in an Observable to properly manage all subscriptions\n\treturn new Observable<HydrationBufferResult<T>>((subscriber) => {\n\t\tconst subscriptions = new Subscription();\n\n\t\t// Track whether we're still in the hydration grace period\n\t\t// Using BehaviorSubject to keep a stateful value that doesn't complete\n\t\tconst isHydrating$ = new BehaviorSubject(true);\n\n\t\t// Use startWith to emit cached items immediately before any live emissions\n\t\tconst liveWithInitial$ = liveItems$.pipe(startWith([] as T[]));\n\n\t\tif (isConverged) {\n\t\t\t// With convergence check: hydration ends when timer fires AND live state has caught up\n\t\t\tconst timerFired$ = timer(gracePeriodMs).pipe(\n\t\t\t\tmap(() => true),\n\t\t\t\tstartWith(false),\n\t\t\t\tshareReplay({ bufferSize: 1, refCount: true }),\n\t\t\t);\n\n\t\t\t// End hydration when timer has fired AND convergence is met\n\t\t\tsubscriptions.add(\n\t\t\t\tcombineLatest([liveWithInitial$, timerFired$])\n\t\t\t\t\t.pipe(\n\t\t\t\t\t\tfilter(([, timerFired]) => timerFired),\n\t\t\t\t\t\tfilter(([liveItems]) => isConverged(liveItems, cachedItems)),\n\t\t\t\t\t\ttake(1),\n\t\t\t\t\t)\n\t\t\t\t\t.subscribe(() => {\n\t\t\t\t\t\tisHydrating$.next(false);\n\t\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Max timeout (6x grace period) to prevent infinite hydration\n\t\t\t// e.g., if auto-reconnect fails, we still end hydration\n\t\t\tsubscriptions.add(\n\t\t\t\ttimer(gracePeriodMs * 6).subscribe(() => {\n\t\t\t\t\tif (isHydrating$.value) {\n\t\t\t\t\t\tisHydrating$.next(false);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\t// Without convergence check: end hydration on timer only\n\t\t\tsubscriptions.add(\n\t\t\t\ttimer(gracePeriodMs).subscribe(() => {\n\t\t\t\t\tisHydrating$.next(false);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tsubscriptions.add(\n\t\t\tcombineLatest([liveWithInitial$, isHydrating$])\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(([liveItems, isHydrating]) => {\n\t\t\t\t\t\tif (!isHydrating) {\n\t\t\t\t\t\t\t// Hydration complete - return only live items\n\t\t\t\t\t\t\treturn { items: liveItems, isHydrating: false };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\titems: mergeFn(liveItems, cachedItems),\n\t\t\t\t\t\t\tisHydrating: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber),\n\t\t);\n\n\t\treturn () => {\n\t\t\tsubscriptions.unsubscribe();\n\t\t\tisHydrating$.complete();\n\t\t};\n\t});\n};\n\n/**\n * Creates a hydration buffer that merges cached items with live items.\n *\n * During hydration, cached items take precedence over live items with the same key.\n * This preserves the cached connected state (e.g., isConnected: true) while\n * auto-reconnect is still in progress. New live items not in the cache are added.\n *\n * @param cachedItems - Initial cached items from storage\n * @param liveItems$ - Observable of live items as they become available\n * @param gracePeriodMs - Time in ms to wait before syncing to live state\n * @param getKey - Function to extract a unique key from an item\n * @param isConverged - Optional function to check if live items have caught up to cached items\n * @param mergeItem - Optional function to merge a live item with its cached counterpart\n * @param transformCachedOnly - Optional function to transform cached items not yet in the live stream\n */\nexport const createHydrationBuffer = <T>(\n\tcachedItems: T[],\n\tliveItems$: Observable<T[]>,\n\tgracePeriodMs: number,\n\tgetKey: (item: T) => string,\n\tisConverged?: (liveItems: T[], cachedItems: T[]) => boolean,\n\tmergeItem?: (liveItem: T, cachedItem: T) => T,\n\ttransformCachedOnly?: (cachedItem: T) => T,\n): Observable<HydrationBufferResult<T>> => {\n\treturn createBufferCore(\n\t\tcachedItems,\n\t\tliveItems$,\n\t\tgracePeriodMs,\n\t\t(liveItems, cached) => {\n\t\t\tconst cachedByKey = new Map(cached.map((item) => [getKey(item), item]));\n\t\t\tconst liveKeys = new Set(liveItems.map(getKey));\n\n\t\t\t// For items in both live and cached, prefer cached (preserves connected state)\n\t\t\t// but allow mergeItem to customize how they're combined\n\t\t\t// For items only in live (newly discovered), use the live version\n\t\t\tconst mergedItems: T[] = liveItems.map((liveItem) => {\n\t\t\t\tconst key = getKey(liveItem);\n\t\t\t\tconst cachedItem = cachedByKey.get(key);\n\t\t\t\tif (!cachedItem) return liveItem;\n\t\t\t\treturn mergeItem ? mergeItem(liveItem, cachedItem) : cachedItem;\n\t\t\t});\n\n\t\t\t// Add cached items not yet in the live stream (e.g., extensions not yet detected)\n\t\t\tfor (const cachedItem of cached) {\n\t\t\t\tif (!liveKeys.has(getKey(cachedItem))) {\n\t\t\t\t\tconst transformed = transformCachedOnly\n\t\t\t\t\t\t? transformCachedOnly(cachedItem)\n\t\t\t\t\t\t: cachedItem;\n\t\t\t\t\tmergedItems.push(transformed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn mergedItems;\n\t\t},\n\t\tisConverged,\n\t);\n};\n\n/**\n * Creates a hydration buffer specifically for accounts, which need special handling.\n *\n * Accounts are grouped by wallet - when a wallet provides its account list,\n * we replace all cached accounts for that wallet with the live ones.\n * Cached accounts for wallets that haven't provided accounts yet are preserved.\n *\n * @param cachedAccounts - Initial cached accounts from storage\n * @param liveAccounts$ - Observable of live accounts as they become available\n * @param gracePeriodMs - Time in ms to wait before syncing to live state\n * @param getWalletId - Function to extract the wallet ID from an account\n * @param isConverged - Optional function to check if live accounts have caught up to cached accounts\n */\nexport const createAccountHydrationBuffer = <T>(\n\tcachedAccounts: T[],\n\tliveAccounts$: Observable<T[]>,\n\tgracePeriodMs: number,\n\tgetWalletId: (account: T) => string,\n\tisConverged?: (liveAccounts: T[], cachedAccounts: T[]) => boolean,\n): Observable<HydrationBufferResult<T>> => {\n\treturn createBufferCore(\n\t\tcachedAccounts,\n\t\tliveAccounts$,\n\t\tgracePeriodMs,\n\t\t(liveAccounts, cached) => {\n\t\t\tconst walletsWithLiveAccounts = new Set(liveAccounts.map(getWalletId));\n\t\t\tconst mergedAccounts: T[] = [...liveAccounts];\n\n\t\t\tfor (const cachedAccount of cached) {\n\t\t\t\tif (!walletsWithLiveAccounts.has(getWalletId(cachedAccount))) {\n\t\t\t\t\tmergedAccounts.push(cachedAccount);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn mergedAccounts;\n\t\t},\n\t\tisConverged,\n\t);\n};\n","import { type MonoTypeOperatorFunction, tap } from \"rxjs\";\n\ntype Opts = {\n\tprintValue?: boolean;\n\tenabled?: boolean;\n};\n\nexport const logObservable = <T>(\n\tlabel: string,\n\topts?: Opts,\n): MonoTypeOperatorFunction<T> =>\n\ttap((value) => {\n\t\tconst { printValue = false, enabled = true } = opts || {};\n\n\t\tif (!label || !enabled) return;\n\n\t\tconst text = `[kheopskit] observable ${label} emit`;\n\n\t\tif (printValue) console.debug(text, value);\n\t\telse console.debug(text);\n\t});\n","import { combineLatest, map, Observable, of, shareReplay } from \"rxjs\";\nimport { sortAccounts } from \"../utils/sortAccounts\";\nimport { getEthereumAccounts$ } from \"./ethereum/accounts\";\nimport { getPolkadotAccounts$ } from \"./polkadot/accounts\";\nimport type { KheopskitConfig, Wallet, WalletAccount } from \"./types\";\n\nexport const getAccounts$ = (\n\tconfig: KheopskitConfig,\n\twallets: Observable<Wallet[]>,\n) => {\n\treturn new Observable<WalletAccount[]>((subscriber) => {\n\t\t// biome-ignore lint/suspicious/useIterableCallbackReturn: false positive\n\t\tconst sources = config.platforms.map<Observable<WalletAccount[]>>(\n\t\t\t(platform) => {\n\t\t\t\tswitch (platform) {\n\t\t\t\t\tcase \"polkadot\":\n\t\t\t\t\t\treturn getPolkadotAccounts$(\n\t\t\t\t\t\t\twallets.pipe(\n\t\t\t\t\t\t\t\tmap((w) => w.filter((w) => w.platform === \"polkadot\")),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\tcase \"ethereum\":\n\t\t\t\t\t\treturn getEthereumAccounts$(\n\t\t\t\t\t\t\twallets.pipe(\n\t\t\t\t\t\t\t\tmap((w) => w.filter((w) => w.platform === \"ethereum\")),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tconst accounts$ = sources.length\n\t\t\t? combineLatest(sources).pipe(\n\t\t\t\t\tmap((accounts) => accounts.flat().sort(sortAccounts)),\n\t\t\t\t)\n\t\t\t: of([]);\n\n\t\tconst sub = accounts$.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n};\n","import type { WalletAccount } from \"../api\";\n\nexport const sortAccounts = (a1: WalletAccount, a2: WalletAccount) => {\n\tif (a1.platform === \"polkadot\") {\n\t\tif (a2.platform === \"polkadot\") {\n\t\t\t// sort by wallet name, fallback to address\n\t\t\tif (a1.walletName !== a2.walletName) {\n\t\t\t\tif (a1.walletName === \"talisman\") return -1;\n\t\t\t\tif (a2.walletName === \"talisman\") return 1;\n\t\t\t\treturn a1.walletName.localeCompare(a2.walletName);\n\t\t\t}\n\n\t\t\t// sort by name, fallback to address\n\t\t\treturn a1.name !== a2.name\n\t\t\t\t? (a1.name ?? \"\").localeCompare(a2.name ?? \"\")\n\t\t\t\t: a1.address.localeCompare(a2.address);\n\t\t}\n\n\t\treturn -1; // polkadot accounts first\n\t}\n\n\tif (a2.platform === \"ethereum\") {\n\t\t// sort by wallet name, fallback to address\n\t\tif (a1.walletName !== a2.walletName) {\n\t\t\tif (a1.walletName === \"Talisman\") return -1;\n\t\t\tif (a2.walletName === \"Talisman\") return 1;\n\t\t\treturn a1.walletName.localeCompare(a2.walletName);\n\t\t}\n\n\t\treturn a1.id.localeCompare(a2.id);\n\t}\n\n\t// impossible case\n\treturn 0;\n};\n","import type UniversalProvider from \"@walletconnect/universal-provider\";\nimport {\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tof,\n\tReplaySubject,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport {\n\tcreateWalletClient,\n\tcustom,\n\ttype EIP1193Provider,\n\tgetAddress,\n} from \"viem\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { getCachedObservable$ } from \"../../utils/getCachedObservable\";\nimport type {\n\tEthereumAccount,\n\tEthereumAppKitWallet,\n\tEthereumInjectedWallet,\n\tEthereumWallet,\n} from \"../types\";\n\nconst getInjectedWalletAccounts$ = (\n\twallet: EthereumInjectedWallet,\n): Observable<EthereumAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}`, () =>\n\t\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\t\tconst getAccount = (address: string, i: number): EthereumAccount => {\n\t\t\t\t// console.log(\"[Injected] createWalletClient\", address);\n\t\t\t\tconst client = createWalletClient({\n\t\t\t\t\taccount: address as `0x${string}`,\n\t\t\t\t\ttransport: custom(wallet.provider as EIP1193Provider),\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\tclient,\n\t\t\t\t\taddress: getAddress(address),\n\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\tisWalletDefault: i === 0,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst handleAccountsChanged = (addresses: string[]) => {\n\t\t\t\tsubscriber.next(addresses.map(getAccount));\n\t\t\t};\n\n\t\t\t// subscribe to changes\n\t\t\twallet.provider.on(\"accountsChanged\", handleAccountsChanged);\n\n\t\t\t// initial value\n\t\t\twallet.provider\n\t\t\t\t.request({ method: \"eth_accounts\" })\n\t\t\t\t.then((addresses: string[]) => {\n\t\t\t\t\tsubscriber.next(addresses.map(getAccount));\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tconsole.error(\"Failed to get accounts\", err);\n\t\t\t\t\tsubscriber.next([]);\n\t\t\t\t});\n\n\t\t\treturn () => {\n\t\t\t\twallet.provider.removeListener(\n\t\t\t\t\t\"accountsChanged\",\n\t\t\t\t\thandleAccountsChanged,\n\t\t\t\t);\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nconst wrapWalletConnectProvider = (\n\tprovider: EIP1193Provider,\n\tsessionTopic: string,\n\tcaipNetworkId: string,\n): EIP1193Provider => {\n\treturn new Proxy(provider, {\n\t\tget(target, prop, receiver) {\n\t\t\tif (prop !== \"request\") return Reflect.get(target, prop, receiver);\n\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: legacy\n\t\t\treturn (args: any) => {\n\t\t\t\tif (args && typeof args === \"object\" && args.method) {\n\t\t\t\t\tif (!args.topic) args.topic = sessionTopic;\n\t\t\t\t\tif (!args.chainId) args.chainId = caipNetworkId;\n\t\t\t\t}\n\t\t\t\treturn target.request(args);\n\t\t\t};\n\t\t},\n\t});\n};\n\nconst getAppKitAccounts$ = (\n\twallet: EthereumAppKitWallet,\n): Observable<EthereumAccount[]> => {\n\tconst account = wallet.appKit.getAccount(\"eip155\");\n\tconst provider = wallet.appKit.getProvider<UniversalProvider>(\"eip155\");\n\n\tif (\n\t\t!wallet.isConnected ||\n\t\t!wallet.appKit ||\n\t\t!account?.allAccounts.length ||\n\t\t!provider?.session\n\t)\n\t\treturn of([]);\n\n\treturn getCachedObservable$(\"accounts:appKit\", () =>\n\t\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\t\tconst caipNetworkId$ = new ReplaySubject<string>(1);\n\n\t\t\tconst handleChainChanged = (chainId: unknown) => {\n\t\t\t\tcaipNetworkId$.next(`eip155:${chainId}`);\n\t\t\t};\n\n\t\t\tprovider.on(\"chainChanged\", handleChainChanged);\n\t\t\tprovider.request({ method: \"eth_chainId\" }).then(handleChainChanged);\n\n\t\t\tconst sub = caipNetworkId$\n\t\t\t\t.pipe(\n\t\t\t\t\tdistinctUntilChanged(),\n\t\t\t\t\tmap((caipNetworkId) =>\n\t\t\t\t\t\tcustom(\n\t\t\t\t\t\t\twrapWalletConnectProvider(\n\t\t\t\t\t\t\t\tprovider as EIP1193Provider,\n\t\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: legacy\n\t\t\t\t\t\t\t\tprovider.session!.topic,\n\t\t\t\t\t\t\t\tcaipNetworkId,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t\tmap((transport) =>\n\t\t\t\t\t\taccount.allAccounts.map((acc, i): EthereumAccount => {\n\t\t\t\t\t\t\t// console.log(\"[AppKit] createWalletClient\", acc);\n\t\t\t\t\t\t\tconst client = createWalletClient({\n\t\t\t\t\t\t\t\taccount: acc.address as `0x${string}`,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid: getWalletAccountId(wallet.id, acc.address),\n\t\t\t\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\t\t\taddress: acc.address as `0x${string}`,\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\tisWalletDefault: i === 0,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber);\n\n\t\t\treturn () => {\n\t\t\t\tprovider.off(\"chainChanged\", handleChainChanged);\n\t\t\t\tsub.unsubscribe();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nexport const getEthereumAccounts$ = (\n\tethereumWallets: Observable<EthereumWallet[]>,\n) =>\n\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\tconst sub = ethereumWallets\n\t\t\t.pipe(\n\t\t\t\tmap((wallets) => wallets.filter((w) => w.isConnected)),\n\t\t\t\tswitchMap((wallets) => {\n\t\t\t\t\treturn wallets.length\n\t\t\t\t\t\t? combineLatest([\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"injected\")\n\t\t\t\t\t\t\t\t\t.map(getInjectedWalletAccounts$),\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"appKit\")\n\t\t\t\t\t\t\t\t\t.map(getAppKitAccounts$),\n\t\t\t\t\t\t\t\t// todo appkit\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t: of([]);\n\t\t\t\t}),\n\t\t\t\tmap((accounts) => accounts.flat()),\n\t\t\t\tdistinctUntilChanged(isSameAccountsList),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(\n\t\t// logObservable(\"ethereumAccounts$\", true),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n\nconst isSameAccountsList = (a: EthereumAccount[], b: EthereumAccount[]) => {\n\tif (a.length !== b.length) return false;\n\treturn a.every((account, i) => account.id === b[i]?.id);\n};\n","import { BehaviorSubject } from \"rxjs\";\nimport { type SyncableStorage, safeLocalStorage } from \"./storage\";\n\nexport const createStore = <T>(\n\tkey: string,\n\tdefaultValue: T,\n\tstorage: SyncableStorage = safeLocalStorage,\n) => {\n\tconst subject = new BehaviorSubject<T>(\n\t\tgetStoredData(key, defaultValue, storage),\n\t);\n\n\t// Cross-tab sync via storage.subscribe (uses storage event for localStorage, BroadcastChannel for cookies)\n\t// Only subscribe if window is available (client-side) and storage supports it\n\tlet unsubscribeStorage: (() => void) | undefined;\n\tif (typeof window !== \"undefined\" && storage.subscribe) {\n\t\tunsubscribeStorage = storage.subscribe(key, (newValue) => {\n\t\t\tsubject.next(parseData(newValue, defaultValue));\n\t\t});\n\t}\n\n\tconst update = (val: T) => {\n\t\tsetStoredData(key, val, storage);\n\t\tsubject.next(val);\n\t};\n\n\treturn {\n\t\tobservable: subject.asObservable(),\n\t\tset: (val: T) => update(val),\n\t\tmutate: (transform: (prev: T) => T) =>\n\t\t\tupdate(transform(subject.getValue())),\n\t\tget: () => structuredClone(subject.getValue()),\n\t\t/**\n\t\t * Cleanup subscriptions. Call this when the store is no longer needed.\n\t\t */\n\t\tdestroy: () => {\n\t\t\tunsubscribeStorage?.();\n\t\t\tsubject.complete();\n\t\t},\n\t};\n};\n\nconst parseData = <T>(str: string | null, defaultValue: T): T => {\n\ttry {\n\t\tif (str) return JSON.parse(str);\n\t} catch {\n\t\t// invalid data\n\t}\n\treturn defaultValue;\n};\n\nconst getStoredData = <T>(\n\tkey: string,\n\tdefaultValue: T,\n\tstorage: SyncableStorage,\n): T => {\n\tconst str = storage.getItem(key);\n\treturn parseData(str, defaultValue);\n};\n\nconst setStoredData = <T>(key: string, val: T, storage: SyncableStorage) => {\n\tconst str = JSON.stringify(val);\n\tstorage.setItem(key, str);\n};\n","import { isAddress } from \"viem\";\n\nexport const isEthereumAddress = (address: string): boolean =>\n\tisAddress(address);\n","import { AccountId, type SS58String } from \"polkadot-api\";\n\nconst accountIdEncoder = AccountId().enc;\n\nexport const isSs58Address = (\n\taddress: SS58String | string,\n): address is SS58String => {\n\ttry {\n\t\tif (!address) return false;\n\t\taccountIdEncoder(address);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n","import { isEthereumAddress } from \"./isEthereumAddress\";\nimport { isSs58Address } from \"./isSs58Address\";\n\nexport const isValidAddress = (address: string): boolean => {\n\treturn address.startsWith(\"0x\")\n\t\t? isEthereumAddress(address)\n\t\t: isSs58Address(address);\n};\n","import type { SS58String } from \"polkadot-api\";\n\nimport { isValidAddress } from \"./isValidAddress\";\n\nexport type WalletAccountId = string;\n\nexport const getWalletAccountId = (\n\twalletId: string,\n\taddress: SS58String,\n): WalletAccountId => {\n\tif (!walletId) throw new Error(\"Missing walletId\");\n\tif (!isValidAddress(address)) throw new Error(\"Invalid address\");\n\treturn `${walletId}::${address}`;\n};\n\nexport const parseWalletAccountId = (accountId: string) => {\n\tif (!accountId) throw new Error(\"Invalid walletAccountId\");\n\tconst [walletId, address] = accountId.split(\"::\");\n\tif (!walletId) throw new Error(\"Missing walletId\");\n\tif (!address || !isValidAddress(address)) throw new Error(\"Invalid address\");\n\treturn { walletId, address };\n};\n","import type { AppKit } from \"@reown/appkit/core\";\nimport type UniversalProvider from \"@walletconnect/universal-provider\";\nimport {\n\tgetPolkadotSignerFromPjs,\n\ttype InjectedExtension,\n\ttype InjectedPolkadotAccount,\n} from \"polkadot-api/pjs-signer\";\nimport {\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tof,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotAppKitWallet,\n\tPolkadotInjectedWallet,\n\tPolkadotWallet,\n} from \"../types\";\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst getAccount = (account: InjectedPolkadotAccount): PolkadotAccount => ({\n\t\t\tid: getWalletAccountId(wallet.id, account.address),\n\t\t\t...account,\n\t\t\tplatform: \"polkadot\",\n\t\t\twalletName: wallet.name,\n\t\t\twalletId: wallet.id,\n\t\t});\n\n\t\tconst extension = wallet.extension as InjectedExtension;\n\n\t\t// subscribe to changes\n\t\tconst unsubscribe = extension.subscribe((accounts) => {\n\t\t\tsubscriber.next(accounts.map(getAccount));\n\t\t});\n\n\t\t// initial value\n\t\tsubscriber.next(extension.getAccounts().map(getAccount));\n\n\t\treturn () => {\n\t\t\treturn unsubscribe();\n\t\t};\n\t});\n};\n\nconst getAppKitPolkadotSigner = (appKit: AppKit, address: string) => {\n\tconst provider = appKit.getProvider<UniversalProvider>(\"polkadot\");\n\tif (!provider) throw new Error(\"No provider found\");\n\tif (!provider.session) throw new Error(\"No session found\");\n\n\treturn getPolkadotSignerFromPjs(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session) throw new Error(\"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ address, data }) => {\n\t\t\tif (!provider.session) throw new Error(\"No session found\");\n\t\t\tconst networks = appKit.getCaipNetworks(\"polkadot\");\n\t\t\tconst chainId = networks[0]?.caipNetworkId;\n\t\t\tif (!chainId) throw new Error(\"No chainId found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tmessage: data,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t);\n};\n\nconst getAppKitAccounts$ = (wallet: PolkadotAppKitWallet) => {\n\tconst account = wallet.appKit.getAccount(\"polkadot\");\n\tconst provider = wallet.appKit.getProvider<UniversalProvider>(\"polkadot\");\n\n\tif (\n\t\t!wallet.isConnected ||\n\t\t!wallet.appKit ||\n\t\t!account?.allAccounts.length ||\n\t\t!provider?.session\n\t)\n\t\treturn of([]);\n\n\treturn of(\n\t\taccount.allAccounts.map(\n\t\t\t(acc): PolkadotAccount => ({\n\t\t\t\tid: getWalletAccountId(wallet.id, acc.address),\n\t\t\t\tplatform: \"polkadot\",\n\t\t\t\twalletName: wallet.name,\n\t\t\t\twalletId: wallet.id,\n\t\t\t\taddress: acc.address,\n\t\t\t\tpolkadotSigner: getAppKitPolkadotSigner(wallet.appKit, acc.address),\n\t\t\t\tgenesisHash: null,\n\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\ttype: \"sr25519\",\n\t\t\t}),\n\t\t),\n\t);\n};\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<PolkadotWallet[]>,\n) =>\n\tnew Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst sub = polkadotWallets$\n\t\t\t.pipe(\n\t\t\t\tmap((wallets) => wallets.filter((w) => w.isConnected)),\n\t\t\t\tswitchMap((wallets) =>\n\t\t\t\t\twallets.length\n\t\t\t\t\t\t? combineLatest([\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"injected\")\n\t\t\t\t\t\t\t\t\t.map(getInjectedWalletAccounts$),\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"appKit\")\n\t\t\t\t\t\t\t\t\t.map(getAppKitAccounts$),\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t: of([]),\n\t\t\t\t),\n\t\t\t\tmap((accounts) => accounts.flat()),\n\t\t\t\tdistinctUntilChanged(isSameAccountsList),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nconst isSameAccountsList = (a: PolkadotAccount[], b: PolkadotAccount[]) => {\n\tif (a.length !== b.length) return false;\n\treturn a.every((account, i) => account.id === b[i]?.id);\n};\n","import { uniq } from \"lodash-es\";\nimport { createStore } from \"../utils/createStore\";\nimport { cookieStorage, safeLocalStorage } from \"../utils/storage\";\nimport { getWalletAccountId } from \"../utils/WalletAccountId\";\nimport { parseWalletId, type WalletId } from \"../utils/WalletId\";\nimport { DEFAULT_STORAGE_KEY } from \"./config\";\nimport type { CachedAccount, CachedWallet } from \"./types\";\n\ntype KheopskitStoreData = {\n\tautoReconnect?: WalletId[];\n\t/** Cached wallet state for SSR hydration to prevent UI flash */\n\tcachedWallets?: CachedWallet[];\n\t/** Cached account state for SSR hydration to prevent UI flash */\n\tcachedAccounts?: CachedAccount[];\n};\n\ntype CompactWalletEntry = [WalletId, string, 0 | 1, 0 | 1];\ntype CompactAccountEntry = [WalletId, string, string | null];\n\ntype CompactStoreV1 = {\n\tv: 1;\n\t// autoReconnect\n\tr?: WalletId[];\n\t// wallets: [id, name, isConnected(0|1), type(0=injected,1=appKit)?]\n\tw?: CompactWalletEntry[];\n\t// accounts: [walletId, address, name?]\n\ta?: CompactAccountEntry[];\n};\n\nconst DEFAULT_SETTINGS: KheopskitStoreData = {};\n\ntype CreateKheopskitStoreOptions = {\n\t/**\n\t * Cookie string for SSR hydration.\n\t * When provided, uses cookieStorage instead of localStorage.\n\t */\n\tssrCookies?: string;\n\t/**\n\t * Custom storage key to namespace the stored data.\n\t * @default \"kheopskit\"\n\t */\n\tstorageKey?: string;\n};\n\n/**\n * Creates a kheopskit store with the appropriate storage backend.\n * Uses cookieStorage when ssrCookies is provided (for SSR hydration),\n * otherwise falls back to safeLocalStorage.\n *\n * @param options - Configuration options for the store\n */\nexport const createKheopskitStore = (\n\toptions: CreateKheopskitStoreOptions = {},\n) => {\n\tconst { ssrCookies, storageKey = DEFAULT_STORAGE_KEY } = options;\n\tconst storage =\n\t\tssrCookies !== undefined\n\t\t\t? createCompactCookieStorage(ssrCookies)\n\t\t\t: safeLocalStorage;\n\tconst store = createStore(storageKey, DEFAULT_SETTINGS, storage);\n\n\tconst addEnabledWalletId = (walletId: WalletId) => {\n\t\tparseWalletId(walletId); // validate walletId\n\t\tstore.mutate((prev) => ({\n\t\t\t...prev,\n\t\t\tautoReconnect: uniq((prev.autoReconnect ?? []).concat(walletId)),\n\t\t}));\n\t};\n\n\tconst removeEnabledWalletId = (walletId: WalletId) => {\n\t\tstore.mutate((prev) => ({\n\t\t\t...prev,\n\t\t\tautoReconnect: uniq(\n\t\t\t\t(prev.autoReconnect ?? []).filter((id) => id !== walletId),\n\t\t\t),\n\t\t}));\n\t};\n\n\tconst getCachedState = () => {\n\t\tconst data = store.get();\n\t\treturn {\n\t\t\twallets: data.cachedWallets ?? [],\n\t\t\taccounts: data.cachedAccounts ?? [],\n\t\t};\n\t};\n\n\tconst setCachedState = (\n\t\twallets: CachedWallet[],\n\t\taccounts: CachedAccount[],\n\t) => {\n\t\tstore.mutate((prev) => ({\n\t\t\t...prev,\n\t\t\tcachedWallets: wallets,\n\t\t\tcachedAccounts: accounts,\n\t\t}));\n\t};\n\n\treturn {\n\t\tobservable: store.observable,\n\t\taddEnabledWalletId,\n\t\tremoveEnabledWalletId,\n\t\tgetCachedState,\n\t\tsetCachedState,\n\t};\n};\n\nexport type KheopskitStore = ReturnType<typeof createKheopskitStore>;\n\n// Default store for backward compatibility (uses localStorage on client, noop on server)\nexport const store = createKheopskitStore();\n\nconst isCompactStore = (value: unknown): value is CompactStoreV1 => {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tif (\"cachedWallets\" in value || \"cachedAccounts\" in value) return false;\n\treturn \"v\" in value || \"w\" in value || \"a\" in value || \"r\" in value;\n};\n\nconst toCompactStore = (data: KheopskitStoreData): CompactStoreV1 => {\n\tconst wallets = data.cachedWallets?.map(\n\t\t(wallet): CompactWalletEntry => [\n\t\t\twallet.id,\n\t\t\twallet.name,\n\t\t\twallet.isConnected ? 1 : 0,\n\t\t\twallet.type === \"appKit\" ? 1 : 0,\n\t\t],\n\t);\n\n\tconst accounts = data.cachedAccounts?.map(\n\t\t(account): CompactAccountEntry => [\n\t\t\taccount.walletId,\n\t\t\taccount.address,\n\t\t\taccount.name ?? null,\n\t\t],\n\t);\n\n\treturn {\n\t\tv: 1,\n\t\tr: data.autoReconnect,\n\t\tw: wallets?.length ? wallets : undefined,\n\t\ta: accounts?.length ? accounts : undefined,\n\t};\n};\n\nconst fromCompactStore = (data: CompactStoreV1): KheopskitStoreData => {\n\tconst walletNameMap = new Map<WalletId, string>();\n\n\tconst wallets: CachedWallet[] = (data.w ?? []).map((item) => {\n\t\tconst [id, name, isConnected, type] = item;\n\t\twalletNameMap.set(id, name);\n\t\tconst { platform } = parseWalletId(id);\n\t\treturn {\n\t\t\tid,\n\t\t\tplatform,\n\t\t\ttype: type === 1 ? \"appKit\" : \"injected\",\n\t\t\tname,\n\t\t\tisConnected: isConnected === 1,\n\t\t};\n\t});\n\n\tconst accounts: CachedAccount[] = (data.a ?? []).map((item) => {\n\t\tconst [walletId, address, name] = item;\n\t\tconst { platform } = parseWalletId(walletId);\n\t\treturn {\n\t\t\tid: getWalletAccountId(walletId, address),\n\t\t\tplatform,\n\t\t\taddress,\n\t\t\tname: name ?? undefined,\n\t\t\twalletId,\n\t\t\twalletName: walletNameMap.get(walletId) ?? walletId,\n\t\t};\n\t});\n\n\treturn {\n\t\tautoReconnect: data.r,\n\t\tcachedWallets: wallets,\n\t\tcachedAccounts: accounts,\n\t};\n};\n\nconst decodeStore = (raw: string, fallback: KheopskitStoreData) => {\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (isCompactStore(parsed)) return fromCompactStore(parsed);\n\t\treturn parsed as KheopskitStoreData;\n\t} catch {\n\t\treturn fallback;\n\t}\n};\n\nconst encodeStore = (data: KheopskitStoreData): string =>\n\tJSON.stringify(toCompactStore(data));\n\nconst createCompactCookieStorage = (initialCookies?: string) => {\n\tconst base = cookieStorage(initialCookies);\n\n\treturn {\n\t\tgetItem: (key: string) => {\n\t\t\tconst raw = base.getItem(key);\n\t\t\tif (!raw) return null;\n\t\t\tconst expanded = decodeStore(raw, DEFAULT_SETTINGS);\n\t\t\tif (typeof document !== \"undefined\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\t\t\t\tif (!isCompactStore(parsed)) {\n\t\t\t\t\t\tbase.setItem(key, encodeStore(expanded));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore malformed cookie during migration\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn JSON.stringify(expanded);\n\t\t},\n\t\tsetItem: (key: string, value: string) => {\n\t\t\tconst expanded = decodeStore(value, DEFAULT_SETTINGS);\n\t\t\tbase.setItem(key, encodeStore(expanded));\n\t\t},\n\t\tremoveItem: base.removeItem,\n\t\tsubscribe: (key: string, callback: (value: string | null) => void) => {\n\t\t\tconst unsubscribe = base.subscribe?.(key, (value) => {\n\t\t\t\tif (!value) {\n\t\t\t\t\tcallback(null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst expanded = decodeStore(value, DEFAULT_SETTINGS);\n\t\t\t\tcallback(JSON.stringify(expanded));\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tunsubscribe?.();\n\t\t\t};\n\t\t},\n\t};\n};\n","import {\n\tcombineLatest,\n\tdistinct,\n\tfilter,\n\tmap,\n\tmergeMap,\n\tObservable,\n\tof,\n\tshareReplay,\n\ttake,\n} from \"rxjs\";\nimport { sortWallets } from \"../utils/sortWallets\";\nimport { getEthereumWallets$ } from \"./ethereum/wallets\";\nimport { getPolkadotWallets$ } from \"./polkadot/wallets\";\nimport { store as defaultStore, type KheopskitStore } from \"./store\";\nimport type { KheopskitConfig, Wallet } from \"./types\";\n\nexport const getWallets$ = (\n\tconfig: KheopskitConfig,\n\tstore: KheopskitStore = defaultStore,\n) => {\n\t// lock the list of wallets to auto reconnect on first call\n\tconst autoReconnectWalletIds$ = store.observable.pipe(\n\t\tmap((s) => s.autoReconnect ?? []),\n\t\ttake(1),\n\t\tshareReplay({ bufferSize: 1, refCount: true }),\n\t);\n\n\treturn new Observable<Wallet[]>((subscriber) => {\n\t\t// biome-ignore lint/suspicious/useIterableCallbackReturn: false positive\n\t\tconst observables = config.platforms.map(\n\t\t\t(platform): Observable<Wallet[]> => {\n\t\t\t\tswitch (platform) {\n\t\t\t\t\tcase \"polkadot\":\n\t\t\t\t\t\treturn getPolkadotWallets$(config, store);\n\t\t\t\t\tcase \"ethereum\":\n\t\t\t\t\t\treturn getEthereumWallets$(config, store);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tconst wallets$ = observables.length\n\t\t\t? combineLatest(observables).pipe(\n\t\t\t\t\tmap((wallets) => wallets.flat().sort(sortWallets)),\n\t\t\t\t\t// Note: No startWith([]) here - the hydration buffer handles initial state\n\t\t\t\t)\n\t\t\t: of([]);\n\n\t\t// Track wallets being reconnected to avoid duplicate attempts\n\t\tconst reconnectingWallets = new Set<string>();\n\n\t\tconst subAutoReconnect = combineLatest([wallets$, autoReconnectWalletIds$])\n\t\t\t.pipe(\n\t\t\t\tfilter(([, walletIds]) => config.autoReconnect && !!walletIds?.length),\n\t\t\t\tmergeMap(([wallets, walletIds]) =>\n\t\t\t\t\twallets.filter((wallet) => walletIds?.includes(wallet.id)),\n\t\t\t\t),\n\t\t\t\tdistinct((w) => w.id),\n\t\t\t)\n\t\t\t.subscribe(async (wallet) => {\n\t\t\t\tif (wallet.isConnected || reconnectingWallets.has(wallet.id)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treconnectingWallets.add(wallet.id);\n\t\t\t\ttry {\n\t\t\t\t\tawait wallet.connect();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Failed to reconnect wallet %s\", wallet.id, { err });\n\t\t\t\t} finally {\n\t\t\t\t\treconnectingWallets.delete(wallet.id);\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst subWallets = wallets$.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubAutoReconnect.unsubscribe();\n\t\t\tsubWallets.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n};\n","import type { Wallet } from \"../api\";\n\nexport const sortWallets = (w1: Wallet, w2: Wallet) => {\n\t// Sort by platform first: polkadot first, then ethereum\n\tif (w1.platform !== w2.platform) {\n\t\treturn w1.platform === \"polkadot\" ? -1 : 1;\n\t}\n\n\t// Sort by name, but Talisman first\n\tif (w1.name.toLowerCase() === \"talisman\") return -1;\n\tif (w2.name.toLowerCase() === \"talisman\") return 1;\n\n\treturn w1.name.localeCompare(w2.name);\n};\n","import {\n\tcreateStore as createMipdStore,\n\ttype EIP6963ProviderDetail,\n} from \"mipd\";\nimport {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tshareReplay,\n} from \"rxjs\";\nimport type { EIP1193Provider } from \"viem\";\nimport { getWalletId, type WalletId } from \"../../utils/WalletId\";\nimport { getAppKitWallets$ } from \"../appKit\";\nimport { store as defaultStore, type KheopskitStore } from \"../store\";\nimport type {\n\tEthereumInjectedWallet,\n\tEthereumWallet,\n\tKheopskitConfig,\n} from \"../types\";\n\n/**\n * Observable that emits EIP-6963 provider details from injected wallets.\n * Returns empty array during SSR since browser wallet APIs are not available.\n */\nconst providersDetails$ = new Observable<EIP6963ProviderDetail[]>(\n\t(subscriber) => {\n\t\t// Guard against SSR - mipd requires browser APIs\n\t\tif (typeof window === \"undefined\") {\n\t\t\tsubscriber.next([]);\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst mipdStore = createMipdStore();\n\n\t\tconst unsubscribe = mipdStore.subscribe((providerDetails) => {\n\t\t\tsubscriber.next(providerDetails as EIP6963ProviderDetail[]);\n\t\t});\n\n\t\tconst providerDetails = mipdStore.getProviders();\n\n\t\tsubscriber.next(providerDetails as EIP6963ProviderDetail[]);\n\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\tmipdStore.destroy();\n\t\t};\n\t},\n).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nconst createEthereumInjectedWallets$ = (store: KheopskitStore) =>\n\tnew Observable<EthereumInjectedWallet[]>((subscriber) => {\n\t\tconst enabledWalletIds$ = new BehaviorSubject<Set<WalletId>>(new Set());\n\n\t\tconst connectWallet = async (\n\t\t\twalletId: WalletId,\n\t\t\tprovider: EIP1193Provider,\n\t\t) => {\n\t\t\tif (enabledWalletIds$.value.has(walletId))\n\t\t\t\tthrow new Error(`Extension ${walletId} already connected`);\n\n\t\t\tawait provider.request({\n\t\t\t\tmethod: \"eth_requestAccounts\",\n\t\t\t});\n\n\t\t\tconst newSet = new Set(enabledWalletIds$.value);\n\t\t\tnewSet.add(walletId);\n\t\t\tenabledWalletIds$.next(newSet);\n\n\t\t\tstore.addEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst disconnectWallet = async (walletId: WalletId) => {\n\t\t\tif (!enabledWalletIds$.value.has(walletId))\n\t\t\t\tthrow new Error(`Extension ${walletId} is not connected`);\n\t\t\tconst newSet = new Set(enabledWalletIds$.value);\n\t\t\tnewSet.delete(walletId);\n\t\t\tenabledWalletIds$.next(newSet);\n\n\t\t\tstore.removeEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst sub = combineLatest([providersDetails$, enabledWalletIds$])\n\t\t\t.pipe(\n\t\t\t\tmap(([providerDetails, enabledWalletIds]) => {\n\t\t\t\t\treturn providerDetails.map((pd): EthereumInjectedWallet => {\n\t\t\t\t\t\tconst walletId = getWalletId(\"ethereum\", pd.info.rdns);\n\t\t\t\t\t\tconst provider = pd.provider as EIP1193Provider;\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\t\t\tid: walletId,\n\t\t\t\t\t\t\tname: pd.info.name,\n\t\t\t\t\t\t\ticon: pd.info.icon,\n\t\t\t\t\t\t\tprovider,\n\t\t\t\t\t\t\tisConnected: enabledWalletIds.has(walletId),\n\t\t\t\t\t\t\tproviderId: pd.info.rdns,\n\t\t\t\t\t\t\tconnect: () => connectWallet(walletId, provider),\n\t\t\t\t\t\t\tdisconnect: () => disconnectWallet(walletId),\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tdistinctUntilChanged(walletsEqual),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nexport const getEthereumWallets$ = (\n\tconfig: KheopskitConfig,\n\tstore: KheopskitStore = defaultStore,\n) => {\n\treturn new Observable<EthereumWallet[]>((subscriber) => {\n\t\tconst subscription = combineLatest([\n\t\t\tcreateEthereumInjectedWallets$(store),\n\t\t\tgetAppKitWallets$(config)?.pipe(map((w) => w.ethereum)),\n\t\t])\n\t\t\t.pipe(\n\t\t\t\tmap(([injectedWallets, appKitWallet]) =>\n\t\t\t\t\tappKitWallet ? [...injectedWallets, appKitWallet] : injectedWallets,\n\t\t\t\t),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n};\n\n/**\n * Compare two wallet arrays by their relevant properties (not functions).\n */\nconst walletsEqual = (\n\ta: EthereumInjectedWallet[],\n\tb: EthereumInjectedWallet[],\n): boolean => {\n\tif (a.length !== b.length) return false;\n\treturn a.every(\n\t\t(w, i) =>\n\t\t\tw.id === b[i]?.id &&\n\t\t\tw.isConnected === b[i]?.isConnected &&\n\t\t\tw.name === b[i]?.name,\n\t);\n};\n","import { isEqual } from \"lodash-es\";\nimport {\n\tconnectInjectedExtension,\n\tgetInjectedExtensions,\n\ttype InjectedExtension,\n} from \"polkadot-api/pjs-signer\";\nimport {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tshareReplay,\n} from \"rxjs\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { getAppKitWallets$ } from \"../appKit\";\nimport { store as defaultStore, type KheopskitStore } from \"../store\";\nimport type {\n\tKheopskitConfig,\n\tPolkadotInjectedWallet,\n\tPolkadotWallet,\n} from \"../types\";\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// Create a polling observable that starts immediately and polls at intervals\nconst createWalletIdsPoller$ = () => {\n\treturn new Observable<WalletId[]>((subscriber) => {\n\t\t// Emit immediately on subscribe\n\t\tsubscriber.next(getInjectedWalletsIds());\n\n\t\t// Poll at shorter intervals initially, then slow down\n\t\tconst intervals = [100, 200, 300, 500];\n\t\tlet index = 0;\n\n\t\tconst poll = () => {\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t\tif (index < intervals.length) {\n\t\t\t\tconst delay = intervals[index++];\n\t\t\t\tsetTimeout(poll, delay);\n\t\t\t}\n\t\t};\n\n\t\t// Start polling after first immediate emission\n\t\tif (intervals.length > 0) {\n\t\t\tsetTimeout(poll, intervals[index++] ?? 100);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Cleanup handled by setTimeout naturally expiring\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n};\n\nconst createPolkadotInjectedWallets$ = (store: KheopskitStore) =>\n\tnew Observable<PolkadotInjectedWallet[]>((subscriber) => {\n\t\tconst enabledExtensions$ = new BehaviorSubject<\n\t\t\tMap<WalletId, InjectedExtension>\n\t\t>(new Map());\n\n\t\tconst connect = async (walletId: WalletId) => {\n\t\t\tif (enabledExtensions$.value.has(walletId))\n\t\t\t\tthrow new Error(`Extension ${walletId} already connected`);\n\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\tconst extension = await connectInjectedExtension(identifier);\n\n\t\t\tconst newMap = new Map(enabledExtensions$.value);\n\t\t\tnewMap.set(walletId, extension);\n\t\t\tenabledExtensions$.next(newMap);\n\n\t\t\tstore.addEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst disconnect = (walletId: WalletId) => {\n\t\t\tif (!enabledExtensions$.value.has(walletId))\n\t\t\t\tthrow new Error(`Extension ${walletId} is not connected`);\n\n\t\t\tconst newMap = new Map(enabledExtensions$.value);\n\t\t\tnewMap.delete(walletId);\n\t\t\tenabledExtensions$.next(newMap);\n\n\t\t\tstore.removeEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst walletIds$ = createWalletIdsPoller$();\n\n\t\tconst subscription = combineLatest([walletIds$, enabledExtensions$])\n\t\t\t.pipe(\n\t\t\t\tmap(([walletIds, enabledExtensions]) => {\n\t\t\t\t\treturn walletIds.map((id): PolkadotInjectedWallet => {\n\t\t\t\t\t\tconst { identifier } = parseWalletId(id);\n\t\t\t\t\t\tconst extension = enabledExtensions.get(id);\n\t\t\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\t\t\textensionId: identifier,\n\t\t\t\t\t\t\textension,\n\t\t\t\t\t\t\tisConnected: !!extension,\n\t\t\t\t\t\t\tconnect: () => connect(id),\n\t\t\t\t\t\t\tdisconnect: () => disconnect(id),\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tdistinctUntilChanged(walletsEqual),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nexport const getPolkadotWallets$ = (\n\tconfig: KheopskitConfig,\n\tstore: KheopskitStore = defaultStore,\n) => {\n\treturn new Observable<PolkadotWallet[]>((subscriber) => {\n\t\tconst subscription = combineLatest([\n\t\t\tcreatePolkadotInjectedWallets$(store),\n\t\t\tgetAppKitWallets$(config)?.pipe(map((w) => w.polkadot)),\n\t\t])\n\t\t\t.pipe(\n\t\t\t\tmap(([injectedWallets, appKitWallet]) =>\n\t\t\t\t\tappKitWallet ? [...injectedWallets, appKitWallet] : injectedWallets,\n\t\t\t\t),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n};\n\n/**\n * Compare two wallet arrays by their relevant properties (not functions).\n */\nconst walletsEqual = (\n\ta: PolkadotInjectedWallet[],\n\tb: PolkadotInjectedWallet[],\n): boolean => {\n\tif (a.length !== b.length) return false;\n\treturn a.every(\n\t\t(w, i) =>\n\t\t\tw.id === b[i]?.id &&\n\t\t\tw.isConnected === b[i]?.isConnected &&\n\t\t\tw.name === b[i]?.name,\n\t);\n};\n"],"mappings":"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","names":["import_rxjs","import_rxjs","getWalletId","import_rxjs","import_rxjs","import_rxjs","import_viem","import_rxjs","import_rxjs","getInjectedWalletAccounts$","address","getAppKitAccounts$","isSameAccountsList","w","store","import_rxjs","import_rxjs","createMipdStore","providerDetails","store","import_lodash_es","import_pjs_signer","import_rxjs","store","walletsEqual","store","store"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/utils/getCachedObservable.ts","../src/utils/polkadotExtensions.ts","../src/utils/isWalletPlatform.ts","../src/utils/WalletId.ts","../src/utils/hydrateState.ts","../src/utils/storage.ts","../src/utils/iconCache.ts","../src/api/appKit.ts","../src/api/config.ts","../src/api/kheopskit.ts","../src/utils/createHydrationBuffer.ts","../src/utils/logObservable.ts","../src/api/accounts.ts","../src/utils/sortAccounts.ts","../src/api/ethereum/accounts.ts","../src/utils/createStore.ts","../src/utils/isEthereumAddress.ts","../src/utils/isSs58Address.ts","../src/utils/isValidAddress.ts","../src/utils/WalletAccountId.ts","../src/api/polkadot/accounts.ts","../src/api/store.ts","../src/api/wallets.ts","../src/utils/sortWallets.ts","../src/api/ethereum/wallets.ts","../src/api/polkadot/wallets.ts"],"sourcesContent":["export * from \"./api\";\n","import type { Observable } from \"rxjs\";\n\nconst CACHE = new Map<string, Observable<unknown>>();\n\nexport const getCachedObservable$ = <T, Obs = Observable<T>>(\n\tkey: string,\n\tcreate: () => Obs,\n): Obs => {\n\tif (!CACHE.has(key)) CACHE.set(key, create() as Observable<unknown>);\n\n\treturn CACHE.get(key) as Obs;\n};\n\n/**\n * Clears an observable from the cache.\n * Use when a wallet disconnects or configuration changes.\n */\nexport const clearCachedObservable = (key: string): void => {\n\tCACHE.delete(key);\n};\n\n/**\n * Clears all cached observables.\n * Use when resetting the entire kheopskit state.\n */\nexport const clearAllCachedObservables = (): void => {\n\tCACHE.clear();\n};\n","export const POLKADOT_EXTENSIONS: Record<\n\tstring,\n\t{ name: string; icon: string }\n> = {\n\ttalisman: {\n\t\tname: \"Talisman\",\n\t\ticon: \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K\",\n\t},\n\t\"polkadot-js\": {\n\t\tname: \"Polkadot.js\",\n\t\ticon: \"data:image/svg+xml;base64,ICA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwNi4yIDEwNi4yIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPgogICAgICA8ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPgogICAgICAgIDxjaXJjbGUgY3g9IjUzLjEiIGN5PSI1My4xIiByPSI1My4xIiBmaWxsPSIjZjI5MjM1IiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU0LjQ3IDEzLjc2YTI4Ljg1IDI4Ljg1IDAgMDAtMjguNzMgMjguNzMgMjkuMzQgMjkuMzQgMCAwMDEuNTIgOS4zNCA0IDQgMCAxMDcuNDktMi41MkExOC42NyAxOC42NyAwIDAxMzMuNjMgNDJhMjAuNzIgMjAuNzIgMCAxMTIyIDIxLjMxcy00IC4yNS02IC40OWMtLjc0LjExLTEuNDguMjYtMi4yLjQ0YS4yOC4yOCAwIDAxLS4zOCAwIC4yNy4yNyAwIDAxMC0uMzJsLjYzLTMuNDEgMy43OS0xN2EzLjk0IDMuOTQgMCAxMC03LjcxLTEuNjVzLTkgNDEuNy05IDQyLjA4YTMuNzkgMy43OSAwIDAwMi43NCA0LjZoLjI4YTMuNzggMy43OCAwIDAwNC42MS0yLjcxLjQzLjQzIDAgMDAwLS4xMXYtLjE5Yy4xMS0uNDkgMS4yNS02IDEuMjUtNmExMC4yMyAxMC4yMyAwIDAxOC40Ni04Yy44Ny0uMTMgNC41My0uMzggNC41My0uMzhhMjguNzEgMjguNzEgMCAwMC0yLjExLTU3LjI3eiIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU2LjIxIDgwYTQuNzggNC43OCAwIDAwLTUuNjYgMy43MS4yNC4yNCAwIDAxMCAuMDggNC43NyA0Ljc3IDAgMDAzLjY1IDUuNjdoLjE0QTQuNyA0LjcgMCAwMDYwIDg2di0uMzJBNSA1IDAgMDA1Ni4yMSA4MHoiCiAgICAgICAgLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvc3ZnPg==\",\n\t},\n\t\"subwallet-js\": {\n\t\tname: \"SubWallet\",\n\t\ticon: \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNODAgNGM1Ny42MyAwIDc2IDE4LjM3IDc2IDc2IDAgNTcuNjMtMTguMzcgNzYtNzYgNzYtNTcuNjMgMC03Ni0xOC4zNy03Ni03NkM0IDIyLjM3IDIyLjM3IDQgODAgNFoiIGZpbGw9InVybCgjYSkiLz48ZyBjbGlwLXBhdGg9InVybCgjYikiPjxwYXRoIGQ9Ik0xMTIuNjE1IDY2LjcyVjUzLjM5OEw1OC43NiAzMiA0OCAzNy40MTJsLjA1NyA0MS40NjQgNDAuMjkyIDE2LjA3LTIxLjUyIDkuMDc1di03LjAxOEw1Ni45NSA5My4wM2wtOC44OTMgNC4xNjN2MjUuMzk1TDU4Ljc2OSAxMjhsNTMuODQ2LTI0LjA2MlY4Ni44NjlMNjQuMTU0IDY3LjY1N1Y1NmwzOC40NDkgMTUuMjE2IDEwLjAxMi00LjQ5NloiIGZpbGw9IiNmZmYiLz48L2c+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iODAiIHkxPSI0IiB4Mj0iODAiIHkyPSIxNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNENFQUFDIi8+PC9saW5lYXJHcmFkaWVudD48Y2xpcFBhdGggaWQ9ImIiPjxwYXRoIGZpbGw9IiNmZmYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4IDMyKSIgZD0iTTAgMGg2NC42MTV2OTZIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4=\",\n\t},\n\tenkrypt: {\n\t\tname: \"Enkrypt\",\n\t\ticon: \"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODEiIGhlaWdodD0iODEiIHZpZXdCb3g9IjAgMCA4MSA4MSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNy4wMDU3IDE3LjAwNjJDMTguOTMwMyAxNS4wODE2IDIxLjU0MDUgMTQuMDAwNCAyNC4yNjIyIDE0LjAwMDRMNjcuMzI5NiAxNFYyMS44NzQxQzY3LjMyOTYgMjMuODMwNSA2Ni41NTIzIDI1LjcwNjcgNjUuMTY5IDI3LjA5QzYzLjc4NTcgMjguNDczMyA2MS45MDk1IDI5LjI1MDQgNTkuOTUzMiAyOS4yNTA0SDM5LjcwNDVDMzYuOTgyOCAyOS4yNTA0IDM0LjM3MjYgMzAuMzMxNiAzMi40NDggMzIuMjU2MUMzMC41MjM1IDM0LjE4MDcgMjkuNDQyMyAzNi43OTA5IDI5LjQ0MjMgMzkuNTEyNlY0Mi4xMjQyQzI5LjQ0MjMgNDQuODQ1OSAzMC41MjM1IDQ3LjQ1NjEgMzIuNDQ4IDQ5LjM4MDZDMzQuMzcyNiA1MS4zMDUxIDM2Ljk4MjggNTIuMzg2MyAzOS43MDQ1IDUyLjM4NjNINTkuOTUzMkM2MS45MDk1IDUyLjM4NjMgNjMuNzg1NyA1My4xNjM1IDY1LjE2OSA1NC41NDY4QzY2LjU1MjMgNTUuOTMwMSA2Ny4zMjk2IDU3LjgwNjMgNjcuMzI5NiA1OS43NjI2VjY3LjMzSDI0LjI2MjJDMjEuNTQwNSA2Ny4zMyAxOC45MzAzIDY2LjI0ODggMTcuMDA1NyA2NC4zMjQzQzE1LjA4MTIgNjIuMzk5NyAxNCA1OS43ODk1IDE0IDU3LjA2NzhWMjQuMjYyNkMxNCAyMS41NDA5IDE1LjA4MTIgMTguOTMwNyAxNy4wMDU3IDE3LjAwNjJaTTQwLjE0NzkgMzMuNTQyM0g2MC45MTU3QzY0LjQ1OCAzMy41NDIzIDY3LjMyOTUgMzYuNDEzOCA2Ny4zMjk1IDM5Ljk1NjFWNDEuNjgxNkM2Ny4zMjk1IDQ1LjIyMzggNjQuNDU4IDQ4LjA5NTQgNjAuOTE1NyA0OC4wOTU0SDQwLjE0NzlDMzYuNjA1NyA0OC4wOTU0IDMzLjczNDEgNDUuMjIzOCAzMy43MzQxIDQxLjY4MTZWMzkuOTU2MUMzMy43MzQxIDM2LjQxMzggMzYuNjA1NyAzMy41NDIzIDQwLjE0NzkgMzMuNTQyM1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8yODdfMjM1OSkiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yODdfMjM1OSIgeDE9IjE5LjM2MDIiIHkxPSIxNCIgeDI9IjU2Ljc2OTYiIHkyPSI2OS44MDA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDNTQ5RkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjU0QkZGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==\",\n\t},\n};\n","import type { WalletPlatform } from \"../api/types\";\n\nexport const isWalletPlatform = (\n\tplatform: unknown,\n): platform is WalletPlatform =>\n\ttypeof platform === \"string\" &&\n\t[\"polkadot\", \"ethereum\"].includes(platform as WalletPlatform);\n","import type { WalletPlatform } from \"../api/types\";\nimport { isWalletPlatform } from \"./isWalletPlatform\";\n\nexport type WalletId = string;\n\nexport const getWalletId = (\n\tplatform: WalletPlatform,\n\tidentifier: string,\n): WalletId => {\n\tif (!isWalletPlatform(platform)) throw new Error(\"Invalid platform\");\n\tif (!identifier) throw new Error(\"Invalid name\");\n\treturn `${platform}:${identifier}`;\n};\n\nexport const parseWalletId = (walletId: string) => {\n\tif (!walletId) throw new Error(\"Invalid walletId\");\n\tconst [platform, identifier] = walletId.split(\":\");\n\tif (!isWalletPlatform(platform)) throw new Error(\"Invalid platform\");\n\tif (!identifier) throw new Error(\"Invalid address\");\n\treturn { platform, identifier };\n};\n","import type {\n\tCachedAccount,\n\tCachedWallet,\n\tEthereumAccount,\n\tEthereumInjectedWallet,\n\tPolkadotAccount,\n\tPolkadotInjectedWallet,\n\tWallet,\n\tWalletAccount,\n} from \"../api/types\";\nimport { POLKADOT_EXTENSIONS } from \"./polkadotExtensions\";\nimport type { WalletAccountId } from \"./WalletAccountId\";\nimport { parseWalletId, type WalletId } from \"./WalletId\";\n\n/**\n * Looks up the icon for a wallet from known Polkadot extensions only.\n * Ethereum icons will be populated from the localStorage icon cache via the merge function.\n *\n * Note: We DON'T use localStorage icon cache here because hydrateWallet is called\n * during SSR (server) and client hydration. localStorage isn't available on server,\n * so using it would cause a hydration mismatch. Icons for Ethereum wallets will be\n * populated when the hydration buffer merges cached wallets with live wallets.\n */\nconst lookupWalletIcon = (platform: string, identifier: string): string => {\n\t// Only Polkadot extensions have hardcoded icons that are safe for SSR\n\tif (platform === \"polkadot\") {\n\t\treturn POLKADOT_EXTENSIONS[identifier]?.icon ?? \"\";\n\t}\n\t// Ethereum icons come from localStorage or live wallets - not here\n\treturn \"\";\n};\n\n/**\n * Error thrown when trying to use a placeholder wallet that hasn't fully loaded yet.\n */\nclass PendingWalletError extends Error {\n\tconstructor(walletId: string) {\n\t\tsuper(\n\t\t\t`Wallet ${walletId} is still loading. Wait for isHydrating to be false before calling connect/disconnect.`,\n\t\t);\n\t\tthis.name = \"PendingWalletError\";\n\t}\n}\n\n/**\n * Converts a CachedWallet to a placeholder Wallet object.\n * The placeholder has the same display properties but connect/disconnect throw errors.\n *\n * @param cached - The cached wallet data from storage\n * @returns A placeholder Wallet object that can be displayed but not interacted with\n */\nexport const hydrateWallet = (cached: CachedWallet): Wallet => {\n\tconst { platform, identifier } = parseWalletId(cached.id);\n\n\tconst throwPending = () => {\n\t\tthrow new PendingWalletError(cached.id);\n\t};\n\n\t// All wallet types (injected + AppKit) are hydrated as injected placeholders.\n\t// AppKit wallets can't be hydrated properly without the AppKit instance,\n\t// so they use injected type as a display fallback and will be replaced\n\t// when the real wallet loads.\n\n\tconst icon = lookupWalletIcon(platform, identifier);\n\n\tif (platform === \"polkadot\") {\n\t\treturn {\n\t\t\tid: cached.id,\n\t\t\tplatform: \"polkadot\",\n\t\t\ttype: \"injected\",\n\t\t\textensionId: identifier,\n\t\t\textension: undefined,\n\t\t\tname: cached.name,\n\t\t\ticon,\n\t\t\tisConnected: cached.isConnected,\n\t\t\tconnect: throwPending,\n\t\t\tdisconnect: throwPending,\n\t\t} satisfies PolkadotInjectedWallet;\n\t}\n\n\tif (platform === \"ethereum\") {\n\t\treturn {\n\t\t\tid: cached.id,\n\t\t\tplatform: \"ethereum\",\n\t\t\ttype: \"injected\",\n\t\t\tproviderId: identifier,\n\t\t\tprovider: {} as never, // Placeholder - will be replaced by real wallet\n\t\t\tname: cached.name,\n\t\t\ticon,\n\t\t\tisConnected: cached.isConnected,\n\t\t\tconnect: throwPending,\n\t\t\tdisconnect: throwPending,\n\t\t} satisfies EthereumInjectedWallet;\n\t}\n\n\t// Should never happen if CachedWallet is properly typed\n\tthrow new Error(`Unknown platform: ${platform}`);\n};\n\n/**\n * Converts a CachedAccount to a placeholder WalletAccount object.\n *\n * @param cached - The cached account data from storage\n * @returns A placeholder WalletAccount object that can be displayed\n */\nexport const hydrateAccount = (cached: CachedAccount): WalletAccount => {\n\tif (cached.platform === \"polkadot\") {\n\t\treturn {\n\t\t\tid: cached.id as WalletAccountId,\n\t\t\tplatform: \"polkadot\",\n\t\t\taddress: cached.address,\n\t\t\tname: cached.name,\n\t\t\twalletId: cached.walletId,\n\t\t\twalletName: cached.walletName,\n\t\t\t// PolkadotSigner is required but we can't provide a real one\n\t\t\t// This is a placeholder that will be replaced by the real account\n\t\t\tpolkadotSigner: {} as never,\n\t\t} satisfies PolkadotAccount;\n\t}\n\n\tif (cached.platform === \"ethereum\") {\n\t\treturn {\n\t\t\tid: cached.id as WalletAccountId,\n\t\t\tplatform: \"ethereum\",\n\t\t\taddress: cached.address as `0x${string}`,\n\t\t\tchainId: cached.chainId,\n\t\t\twalletId: cached.walletId,\n\t\t\twalletName: cached.walletName,\n\t\t\tisWalletDefault: false,\n\t\t\tclient: {} as never, // Placeholder\n\t\t} satisfies EthereumAccount;\n\t}\n\n\tthrow new Error(`Unknown platform: ${cached.platform}`);\n};\n\n/**\n * Converts a Wallet to a CachedWallet for storage.\n * Only extracts the serializable properties needed for hydration.\n *\n * @param wallet - The wallet to serialize\n * @returns A CachedWallet suitable for storage\n */\nexport const serializeWallet = (wallet: Wallet): CachedWallet => ({\n\tid: wallet.id,\n\tplatform: wallet.platform,\n\ttype: wallet.type,\n\tname: wallet.name,\n\t// Note: icon is NOT stored to save cookie space\n\tisConnected: wallet.isConnected,\n});\n\n/**\n * Converts a WalletAccount to a CachedAccount for storage.\n * Only extracts the serializable properties needed for hydration.\n *\n * @param account - The account to serialize\n * @returns A CachedAccount suitable for storage\n */\nexport const serializeAccount = (account: WalletAccount): CachedAccount => ({\n\tid: account.id,\n\tplatform: account.platform,\n\taddress: account.address,\n\tname: \"name\" in account ? account.name : undefined,\n\tchainId: account.platform === \"ethereum\" ? account.chainId : undefined,\n\twalletId: account.walletId as WalletId,\n\twalletName: account.walletName,\n});\n","export type Storage = {\n\tgetItem: (key: string) => string | null;\n\tsetItem: (key: string, value: string) => void;\n\tremoveItem: (key: string) => void;\n};\n\n/**\n * Extended storage interface with cross-tab sync support.\n */\nexport type SyncableStorage = Storage & {\n\t/**\n\t * Subscribe to storage changes from other tabs.\n\t * Returns an unsubscribe function.\n\t */\n\tsubscribe?: (\n\t\tkey: string,\n\t\tcallback: (value: string | null) => void,\n\t) => () => void;\n};\n\n/**\n * A no-op storage implementation that does nothing.\n * Useful for testing or SSR environments where no storage is needed.\n */\nexport const noopStorage: SyncableStorage = {\n\tgetItem: () => null,\n\tsetItem: () => {},\n\tremoveItem: () => {},\n};\n\n/**\n * Cached localStorage wrapper instance.\n * Lazily initialized on first access to avoid SSR issues.\n */\nlet _safeLocalStorage: SyncableStorage | null = null;\n\n/**\n * Creates the localStorage wrapper, testing for availability.\n * Returns noopStorage if localStorage is unavailable (SSR, private browsing, etc.)\n */\nconst createSafeLocalStorage = (): SyncableStorage => {\n\tif (typeof window === \"undefined\") return noopStorage;\n\n\ttry {\n\t\t// Test that localStorage is accessible (may throw in private browsing)\n\t\tconst testKey = \"__kheopskit_test__\";\n\t\twindow.localStorage.setItem(testKey, testKey);\n\t\twindow.localStorage.removeItem(testKey);\n\n\t\treturn {\n\t\t\tgetItem: (key: string) => window.localStorage.getItem(key),\n\t\t\tsetItem: (key: string, value: string) =>\n\t\t\t\twindow.localStorage.setItem(key, value),\n\t\t\tremoveItem: (key: string) => window.localStorage.removeItem(key),\n\t\t\tsubscribe: (key: string, callback: (value: string | null) => void) => {\n\t\t\t\tconst handler = (event: StorageEvent) => {\n\t\t\t\t\tif (event.key === key) {\n\t\t\t\t\t\tcallback(event.newValue);\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\twindow.addEventListener(\"storage\", handler);\n\t\t\t\treturn () => window.removeEventListener(\"storage\", handler);\n\t\t\t},\n\t\t};\n\t} catch {\n\t\treturn noopStorage;\n\t}\n};\n\n/**\n * A safe localStorage wrapper that falls back to noopStorage\n * when localStorage is not available (e.g., during SSR).\n * Includes cross-tab sync via the native 'storage' event.\n *\n * Lazily initialized on first access to be SSR-safe.\n */\nexport const getSafeLocalStorage = (): SyncableStorage => {\n\tif (_safeLocalStorage === null) {\n\t\t_safeLocalStorage = createSafeLocalStorage();\n\t}\n\treturn _safeLocalStorage;\n};\n\n/**\n * @deprecated Use getSafeLocalStorage() instead. This is kept for backward compatibility.\n * Returns a proxy that lazily initializes on first method call.\n */\nexport const safeLocalStorage: SyncableStorage = {\n\tgetItem: (key: string) => getSafeLocalStorage().getItem(key),\n\tsetItem: (key: string, value: string) =>\n\t\tgetSafeLocalStorage().setItem(key, value),\n\tremoveItem: (key: string) => getSafeLocalStorage().removeItem(key),\n\tsubscribe: (key: string, callback: (value: string | null) => void) => {\n\t\tconst storage = getSafeLocalStorage();\n\t\treturn storage.subscribe?.(key, callback) ?? (() => {});\n\t},\n};\n\n/**\n * Parse a cookie string to extract the value for a specific key.\n * @param cookieString - The full cookie header string (e.g., document.cookie or req.headers.cookie)\n * @param key - The cookie key to find\n * @returns The cookie value or null if not found\n */\nexport const parseCookie = (\n\tcookieString: string | undefined,\n\tkey: string,\n): string | null => {\n\tif (!cookieString) return null;\n\n\tfor (const cookie of cookieString.split(\";\")) {\n\t\tconst [k, ...v] = cookie.split(\"=\");\n\t\tconst cookieKey = k?.trim();\n\t\tif (cookieKey === key) {\n\t\t\ttry {\n\t\t\t\treturn decodeURIComponent(v.join(\"=\").trim());\n\t\t\t} catch {\n\t\t\t\treturn null; // Malformed cookie value\n\t\t\t}\n\t\t}\n\t}\n\n\treturn null;\n};\n\n/**\n * Maximum recommended size for cookie storage (3KB to stay well under 4KB limit).\n *\n * @remarks\n * Cookie storage is subject to browser limits (typically 4KB per cookie).\n * When users connect many wallets, the auto-reconnect list may exceed this limit.\n * If this happens:\n * - A console warning will be logged\n * - Some browsers may silently reject the cookie\n * - Consider using fewer simultaneous wallet connections\n *\n * The stored data includes wallet IDs in format `platform:identifier`\n * (e.g., `polkadot:talisman`, `ethereum:io.metamask`).\n */\nexport const COOKIE_MAX_SIZE = 3 * 1024;\n\n/**\n * BroadcastChannel name for cross-tab cookie sync.\n */\nconst BROADCAST_CHANNEL_NAME = \"kheopskit-storage-sync\";\n\n/**\n * Singleton BroadcastChannel for cross-tab cookie sync.\n * Created once and shared across all cookieStorage instances.\n */\nlet sharedBroadcastChannel: BroadcastChannel | null = null;\n\nconst getBroadcastChannel = (): BroadcastChannel | null => {\n\tif (sharedBroadcastChannel) return sharedBroadcastChannel;\n\tif (typeof BroadcastChannel === \"undefined\") return null;\n\n\ttry {\n\t\tsharedBroadcastChannel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);\n\t} catch {\n\t\t// BroadcastChannel not supported or failed\n\t}\n\treturn sharedBroadcastChannel;\n};\n\n/**\n * Check if the current connection is secure (HTTPS).\n * Must be called at runtime (inside methods) to work correctly after SSR hydration.\n */\nconst isSecureConnection = (): boolean =>\n\ttypeof window !== \"undefined\" && window.location.protocol === \"https:\";\n\n/**\n * A cookie-based storage implementation for SSR environments.\n * Reads cookies from an optional initial cookie string (for SSR hydration),\n * writes to document.cookie on the client.\n *\n * Features:\n * - Secure flag automatically added for HTTPS connections\n * - Cross-tab synchronization via BroadcastChannel API\n * - Size limit warning when data exceeds recommended limits\n *\n * @param initialCookies - Optional cookie string for server-side hydration\n */\nexport const cookieStorage = (initialCookies?: string): SyncableStorage => {\n\treturn {\n\t\tgetItem: (key: string) => {\n\t\t\t// On server, use initialCookies. On client, read from document.cookie\n\t\t\tconst cookieString =\n\t\t\t\ttypeof document !== \"undefined\" ? document.cookie : initialCookies;\n\t\t\treturn parseCookie(cookieString, key);\n\t\t},\n\t\tsetItem: (key: string, value: string) => {\n\t\t\tif (typeof document === \"undefined\") return;\n\n\t\t\t// Warn if value exceeds recommended size\n\t\t\tconst encodedValue = encodeURIComponent(value);\n\t\t\tif (encodedValue.length > COOKIE_MAX_SIZE) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[kheopskit] Cookie value for \"${key}\" exceeds recommended size limit (${encodedValue.length} > ${COOKIE_MAX_SIZE} bytes). ` +\n\t\t\t\t\t\t\"This may cause issues with cookie storage. Consider reducing the number of connected wallets.\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Set cookie with 1 year expiry\n\t\t\tconst expires = new Date();\n\t\t\texpires.setFullYear(expires.getFullYear() + 1);\n\n\t\t\t// Build cookie string with security attributes\n\t\t\tlet cookieStr = `${key}=${encodedValue};expires=${expires.toUTCString()};path=/;SameSite=Lax`;\n\t\t\tif (isSecureConnection()) {\n\t\t\t\tcookieStr += \";Secure\";\n\t\t\t}\n\n\t\t\t// biome-ignore lint: necessary for cookie storage - direct cookie assignment is the standard API\n\t\t\tdocument.cookie = cookieStr;\n\n\t\t\t// Broadcast change to other tabs\n\t\t\tgetBroadcastChannel()?.postMessage({ type: \"set\", key, value });\n\t\t},\n\t\tremoveItem: (key: string) => {\n\t\t\tif (typeof document === \"undefined\") return;\n\n\t\t\t// Build delete cookie string\n\t\t\tlet cookieStr = `${key}=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/;SameSite=Lax`;\n\t\t\tif (isSecureConnection()) {\n\t\t\t\tcookieStr += \";Secure\";\n\t\t\t}\n\n\t\t\t// biome-ignore lint: necessary for cookie storage - direct cookie assignment is the standard API\n\t\t\tdocument.cookie = cookieStr;\n\n\t\t\t// Broadcast change to other tabs\n\t\t\tgetBroadcastChannel()?.postMessage({ type: \"remove\", key });\n\t\t},\n\t\tsubscribe: (key: string, callback: (value: string | null) => void) => {\n\t\t\tconst channel = getBroadcastChannel();\n\t\t\tif (!channel) return () => {};\n\n\t\t\tconst handler = (event: MessageEvent) => {\n\t\t\t\tconst data = event.data as {\n\t\t\t\t\ttype: string;\n\t\t\t\t\tkey: string;\n\t\t\t\t\tvalue?: string;\n\t\t\t\t};\n\t\t\t\tif (data.key === key) {\n\t\t\t\t\tif (data.type === \"set\") {\n\t\t\t\t\t\tcallback(data.value ?? null);\n\t\t\t\t\t} else if (data.type === \"remove\") {\n\t\t\t\t\t\tcallback(null);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tchannel.addEventListener(\"message\", handler);\n\t\t\treturn () => {\n\t\t\t\tchannel.removeEventListener(\"message\", handler);\n\t\t\t};\n\t\t},\n\t};\n};\n\n/**\n * Cleanup the shared BroadcastChannel used for cross-tab cookie sync.\n * Call this when you're done using cookie storage (e.g., in tests or when unmounting).\n *\n * @remarks\n * In normal browser usage, you typically don't need to call this -\n * the channel will be cleaned up when the page is closed.\n * This is primarily useful for testing environments where multiple\n * test runs may accumulate channels.\n */\nexport const cleanupBroadcastChannel = (): void => {\n\tif (sharedBroadcastChannel) {\n\t\tsharedBroadcastChannel.close();\n\t\tsharedBroadcastChannel = null;\n\t}\n};\n","import { safeLocalStorage } from \"./storage\";\n\n/**\n * Storage key for the icon cache in localStorage.\n */\nconst ICON_CACHE_KEY = \"kheopskit-icons\";\n\n/**\n * Icon cache type: a map of wallet ID to icon data URI or URL.\n */\ntype IconCache = Record<string, string>;\n\n/**\n * In-memory cache to avoid repeated localStorage reads.\n */\nlet memoryCache: IconCache | null = null;\n\n/**\n * Loads the icon cache from localStorage.\n */\nconst loadCache = (): IconCache => {\n\tif (memoryCache !== null) return memoryCache;\n\n\ttry {\n\t\tconst stored = safeLocalStorage.getItem(ICON_CACHE_KEY);\n\t\tmemoryCache = stored ? (JSON.parse(stored) as IconCache) : {};\n\t} catch {\n\t\tmemoryCache = {};\n\t}\n\treturn memoryCache;\n};\n\n/**\n * Saves the icon cache to localStorage.\n */\nconst saveCache = (cache: IconCache): void => {\n\ttry {\n\t\tsafeLocalStorage.setItem(ICON_CACHE_KEY, JSON.stringify(cache));\n\t\tmemoryCache = cache;\n\t} catch {\n\t\t// localStorage may be full or unavailable\n\t}\n};\n\n/**\n * Gets a cached icon for a wallet.\n * @param walletId - The wallet ID (e.g., \"ethereum:io.talisman\")\n * @returns The cached icon data URI, or undefined if not cached\n */\nexport const getCachedIcon = (walletId: string): string | undefined => {\n\tconst cache = loadCache();\n\treturn cache[walletId] || undefined;\n};\n\n/**\n * Sets multiple cached icons at once.\n * More efficient than calling setCachedIcon multiple times.\n * @param icons - Map of wallet ID to icon\n */\nexport const setCachedIcons = (icons: Record<string, string>): void => {\n\tconst cache = loadCache();\n\tlet changed = false;\n\n\tfor (const [walletId, icon] of Object.entries(icons)) {\n\t\tif (icon && cache[walletId] !== icon) {\n\t\t\tcache[walletId] = icon;\n\t\t\tchanged = true;\n\t\t}\n\t}\n\n\tif (changed) {\n\t\tsaveCache(cache);\n\t}\n};\n","import {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tfrom,\n\tmap,\n\tObservable,\n\tof,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport { getWalletId } from \"../utils/WalletId\";\nimport type {\n\tEthereumAppKitWallet,\n\tKheopskitConfig,\n\tPolkadotAppKitWallet,\n} from \"./types\";\n\n/**\n * Dynamically import @reown/appkit/core to avoid loading browser-only code\n * during SSR or in edge runtimes like Cloudflare Workers.\n * The AppKit library uses Lit for web components which requires document.\n */\nconst loadAppKit = async () => {\n\tconst { createAppKit } = await import(\"@reown/appkit/core\");\n\treturn createAppKit;\n};\n\nconst WALLET_CONNECT_ICON =\n\t\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+\";\n\ntype AppKitWallets = {\n\tpolkadot?: PolkadotAppKitWallet;\n\tethereum?: EthereumAppKitWallet;\n};\n\n// once it exists, appKit object should never be recreated\nlet cachedAppKit: Observable<AppKitWallets> | null = null;\n\n/**\n * Clears the cached AppKit observable.\n * Use when configuration changes or for testing purposes.\n * Note: This does NOT destroy the appKit instance created by Reown.\n */\nexport const resetAppKitCache = (): void => {\n\tcachedAppKit = null;\n};\n\nexport const getAppKitWallets$ = (\n\tconfig: KheopskitConfig,\n): Observable<AppKitWallets> => {\n\tif (!config.walletConnect) return of({});\n\n\t// SSR guard - don't try to load AppKit on the server\n\tif (typeof window === \"undefined\") return of({});\n\n\tconst walletConnect = config.walletConnect;\n\n\tif (!cachedAppKit) {\n\t\t// Use dynamic import to avoid loading @reown/appkit at module evaluation time\n\t\t// This is critical for SSR and edge runtimes like Cloudflare Workers\n\t\tcachedAppKit = from(loadAppKit()).pipe(\n\t\t\tswitchMap((createAppKit) => {\n\t\t\t\treturn new Observable<AppKitWallets>((subscriber) => {\n\t\t\t\t\tconst appKit = createAppKit({\n\t\t\t\t\t\tprojectId: walletConnect.projectId,\n\t\t\t\t\t\tmetadata: walletConnect.metadata,\n\t\t\t\t\t\tnetworks: walletConnect.networks,\n\t\t\t\t\t\tthemeMode: walletConnect.themeMode,\n\t\t\t\t\t\tthemeVariables: walletConnect.themeVariables,\n\t\t\t\t\t\tuniversalProviderConfigOverride: {\n\t\t\t\t\t\t\tmethods: {\n\t\t\t\t\t\t\t\tpolkadot: [\"polkadot_signTransaction\", \"polkadot_signMessage\"],\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t\tallWallets: \"HIDE\",\n\t\t\t\t\t\tdebug: config.debug,\n\t\t\t\t\t\tallowUnsupportedChain: true,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst status$ = new BehaviorSubject({\n\t\t\t\t\t\tisPolkadotConnected: false,\n\t\t\t\t\t\tisEthereumConnected: false,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst unsubProviders = appKit.subscribeProviders((providers) => {\n\t\t\t\t\t\tstatus$.next({\n\t\t\t\t\t\t\tisPolkadotConnected: !!providers.polkadot,\n\t\t\t\t\t\t\tisEthereumConnected: !!providers.eip155,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\n\t\t\t\t\tconst polkadotWallet$ = appKit.chainNamespaces.includes(\"polkadot\")\n\t\t\t\t\t\t? status$.pipe(\n\t\t\t\t\t\t\t\tmap((s) => s.isPolkadotConnected),\n\t\t\t\t\t\t\t\tdistinctUntilChanged(),\n\t\t\t\t\t\t\t\tmap((isConnected): PolkadotAppKitWallet => {\n\t\t\t\t\t\t\t\t\tconst walletInfo = appKit.getWalletInfo();\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tid: getWalletId(\"polkadot\", \"walletconnect\"),\n\t\t\t\t\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\t\t\t\t\ttype: \"appKit\",\n\t\t\t\t\t\t\t\t\t\tappKit, // todo maybe we dont want to expose the appKit instance\n\t\t\t\t\t\t\t\t\t\tname: walletInfo?.name ?? \"WalletConnect\",\n\t\t\t\t\t\t\t\t\t\ticon: walletInfo?.icon ?? WALLET_CONNECT_ICON,\n\t\t\t\t\t\t\t\t\t\tconnect: async () => {\n\t\t\t\t\t\t\t\t\t\t\tif (!isConnected) await appKit.open();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tdisconnect: () => {\n\t\t\t\t\t\t\t\t\t\t\tif (isConnected) appKit.disconnect();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tisConnected,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: of(undefined);\n\n\t\t\t\t\tconst ethereumWallet$ = appKit.chainNamespaces.includes(\"eip155\")\n\t\t\t\t\t\t? status$.pipe(\n\t\t\t\t\t\t\t\tmap((s) => s.isEthereumConnected),\n\t\t\t\t\t\t\t\tdistinctUntilChanged(),\n\t\t\t\t\t\t\t\tmap((isConnected): EthereumAppKitWallet => {\n\t\t\t\t\t\t\t\t\tconst walletInfo = appKit.getWalletInfo();\n\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tid: getWalletId(\"ethereum\", \"walletconnect\"),\n\t\t\t\t\t\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\t\t\t\t\t\ttype: \"appKit\",\n\t\t\t\t\t\t\t\t\t\tappKit,\n\t\t\t\t\t\t\t\t\t\tname: walletInfo?.name ?? \"WalletConnect\",\n\t\t\t\t\t\t\t\t\t\ticon: walletInfo?.icon ?? WALLET_CONNECT_ICON,\n\t\t\t\t\t\t\t\t\t\tconnect: () => appKit.open(),\n\t\t\t\t\t\t\t\t\t\tdisconnect: () => appKit.disconnect(),\n\t\t\t\t\t\t\t\t\t\tisConnected,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: of(undefined);\n\n\t\t\t\t\tconst sub = combineLatest({\n\t\t\t\t\t\tpolkadot: polkadotWallet$,\n\t\t\t\t\t\tethereum: ethereumWallet$,\n\t\t\t\t\t}).subscribe(subscriber);\n\n\t\t\t\t\treturn () => {\n\t\t\t\t\t\tsub.unsubscribe();\n\t\t\t\t\t\tunsubProviders();\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t}),\n\t\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t\t);\n\t}\n\n\treturn cachedAppKit;\n};\n","import type { KheopskitConfig } from \"./types\";\n\n/**\n * Default storage key for persisting wallet connection state.\n * Can be overridden via config.storageKey to avoid conflicts\n * when running multiple dapps on the same domain.\n */\nexport const DEFAULT_STORAGE_KEY = \"kheopskit\";\n\nconst DEFAULT_CONFIG: KheopskitConfig = {\n\tautoReconnect: true,\n\tplatforms: [\"polkadot\"],\n\tdebug: false,\n\tstorageKey: DEFAULT_STORAGE_KEY,\n\thydrationGracePeriod: 500,\n};\n\nexport const resolveConfig = (\n\tconfig: Partial<KheopskitConfig> | undefined,\n): KheopskitConfig => {\n\treturn Object.assign({}, DEFAULT_CONFIG, config);\n};\n","import {\n\tcombineLatest,\n\tdebounceTime,\n\tdistinctUntilChanged,\n\tfilter,\n\tmap,\n\tObservable,\n\tshareReplay,\n\tthrottleTime,\n} from \"rxjs\";\nimport {\n\tcreateAccountHydrationBuffer,\n\tcreateHydrationBuffer,\n} from \"../utils/createHydrationBuffer\";\nimport {\n\thydrateAccount,\n\thydrateWallet,\n\tserializeAccount,\n\tserializeWallet,\n} from \"../utils/hydrateState\";\nimport { getCachedIcon, setCachedIcons } from \"../utils/iconCache\";\nimport { logObservable } from \"../utils/logObservable\";\nimport { getAccounts$ } from \"./accounts\";\nimport { resolveConfig } from \"./config\";\nimport { createKheopskitStore } from \"./store\";\nimport type { KheopskitConfig, Wallet, WalletAccount } from \"./types\";\nimport { getWallets$ } from \"./wallets\";\n\nexport type { KheopskitConfig } from \"./types\";\n\nexport type KheopskitState = {\n\twallets: Wallet[];\n\taccounts: WalletAccount[];\n\tconfig: KheopskitConfig;\n\t/**\n\t * Whether the state is still being hydrated from cache.\n\t * During hydration, cached wallets/accounts may be displayed\n\t * before the actual wallet extensions have injected.\n\t *\n\t * Use this to show loading indicators or disable certain actions.\n\t */\n\tisHydrating: boolean;\n};\n\nexport const getKheopskit$ = (\n\tconfig?: Partial<KheopskitConfig>,\n\tssrCookies?: string,\n\texistingStore?: ReturnType<typeof createKheopskitStore>,\n) => {\n\tconst kc = resolveConfig(config);\n\tconst store =\n\t\texistingStore ??\n\t\tcreateKheopskitStore({ ssrCookies, storageKey: kc.storageKey });\n\n\tif (kc.debug) console.debug(\"[kheopskit] config\", kc);\n\n\t// Warn about SSR environment without cookies\n\tif (kc.debug && typeof window === \"undefined\" && ssrCookies === undefined) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] Running on server without `ssrCookies`. \" +\n\t\t\t\t\"Wallet state will not be hydrated. Pass cookies for SSR support.\",\n\t\t);\n\t}\n\n\t// Get cached state for hydration\n\tconst cachedState = store.getCachedState();\n\t// Hydrate wallets and enrich with icons from localStorage cache\n\tconst cachedWallets = cachedState.wallets.map((w) => {\n\t\tconst wallet = hydrateWallet(w);\n\t\t// If wallet doesn't have icon (e.g., Ethereum), try localStorage cache\n\t\tif (!wallet.icon) {\n\t\t\tconst cachedIcon = getCachedIcon(wallet.id);\n\t\t\tif (cachedIcon) {\n\t\t\t\treturn { ...wallet, icon: cachedIcon };\n\t\t\t}\n\t\t}\n\t\treturn wallet;\n\t});\n\tconst cachedAccounts = cachedState.accounts.map(hydrateAccount);\n\n\tif (kc.debug && cachedWallets.length > 0) {\n\t\tconsole.debug(\"[kheopskit] hydrating from cache:\", {\n\t\t\twallets: cachedWallets.length,\n\t\t\taccounts: cachedAccounts.length,\n\t\t});\n\t}\n\n\treturn new Observable<KheopskitState>((subscriber) => {\n\t\t// Get live wallets and accounts\n\t\tconst liveWallets$ = getWallets$(kc, store);\n\t\tconst liveAccounts$ = getAccounts$(kc, liveWallets$);\n\n\t\t// Apply hydration buffer to wallets\n\t\tconst bufferedWallets$ = createHydrationBuffer(\n\t\t\tcachedWallets,\n\t\t\tliveWallets$,\n\t\t\tkc.hydrationGracePeriod,\n\t\t\t(w) => w.id,\n\t\t\t// Hydration converges when all cached-connected wallets are connected in live\n\t\t\t(liveWallets, cached) => {\n\t\t\t\tconst cachedConnectedIds = new Set(\n\t\t\t\t\tcached.filter((w) => w.isConnected).map((w) => w.id),\n\t\t\t\t);\n\t\t\t\tif (cachedConnectedIds.size === 0) return true;\n\t\t\t\treturn [...cachedConnectedIds].every((id) =>\n\t\t\t\t\tliveWallets.some((w) => w.id === id && w.isConnected),\n\t\t\t\t);\n\t\t\t},\n\t\t\t// Merge: prefer cached isConnected state but get icon from cache or live\n\t\t\t(live, cached) => ({\n\t\t\t\t...cached,\n\t\t\t\t// Priority: cached icon > localStorage cache > live icon\n\t\t\t\ticon: cached.icon || getCachedIcon(cached.id) || live.icon,\n\t\t\t\t// Use live wallet's connect/disconnect functions\n\t\t\t\tconnect: live.connect,\n\t\t\t\tdisconnect: live.disconnect,\n\t\t\t}),\n\t\t\t// Transform cached-only items: add icon from localStorage cache\n\t\t\t(cached) => ({\n\t\t\t\t...cached,\n\t\t\t\ticon: cached.icon || getCachedIcon(cached.id) || \"\",\n\t\t\t}),\n\t\t);\n\n\t\t// Apply hydration buffer to accounts\n\t\tconst bufferedAccounts$ = createAccountHydrationBuffer(\n\t\t\tcachedAccounts,\n\t\t\tliveAccounts$,\n\t\t\tkc.hydrationGracePeriod,\n\t\t\t(a) => a.walletId,\n\t\t\t// Hydration converges when all wallets with cached accounts have provided live accounts\n\t\t\t(liveAccounts, cached) => {\n\t\t\t\tconst cachedWalletIds = new Set(cached.map((a) => a.walletId));\n\t\t\t\tif (cachedWalletIds.size === 0) return true;\n\t\t\t\tconst liveWalletIds = new Set(liveAccounts.map((a) => a.walletId));\n\t\t\t\treturn [...cachedWalletIds].every((id) => liveWalletIds.has(id));\n\t\t\t},\n\t\t);\n\n\t\t// Combine buffered wallets and accounts\n\t\tconst subscription = combineLatest({\n\t\t\twallets: bufferedWallets$,\n\t\t\taccounts: bufferedAccounts$,\n\t\t})\n\t\t\t.pipe(\n\t\t\t\tmap(({ wallets, accounts }) => {\n\t\t\t\t\tif (kc.debug) {\n\t\t\t\t\t\tconsole.debug(\"[kheopskit] hydration state\", {\n\t\t\t\t\t\t\twalletsHydrating: wallets.isHydrating,\n\t\t\t\t\t\t\taccountsHydrating: accounts.isHydrating,\n\t\t\t\t\t\t\twalletsConnected: wallets.items.filter((w) => w.isConnected)\n\t\t\t\t\t\t\t\t.length,\n\t\t\t\t\t\t\twalletsTotal: wallets.items.length,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tconfig: kc,\n\t\t\t\t\t\twallets: wallets.items,\n\t\t\t\t\t\taccounts: accounts.items,\n\t\t\t\t\t\tisHydrating: wallets.isHydrating || accounts.isHydrating,\n\t\t\t\t\t};\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\t// Persist state snapshot when hydration completes and state stabilizes\n\t\tconst persistSub = combineLatest({\n\t\t\twallets: bufferedWallets$,\n\t\t\taccounts: bufferedAccounts$,\n\t\t})\n\t\t\t.pipe(\n\t\t\t\t// Wait for hydration to complete\n\t\t\t\tfilter(\n\t\t\t\t\t({ wallets, accounts }) =>\n\t\t\t\t\t\t!wallets.isHydrating && !accounts.isHydrating,\n\t\t\t\t),\n\t\t\t\t// Debounce to avoid excessive writes\n\t\t\t\tdebounceTime(1000),\n\t\t\t\t// Only persist if state actually changed\n\t\t\t\tdistinctUntilChanged((prev, curr) => {\n\t\t\t\t\tconst prevWalletIds = prev.wallets.items.map((w) => w.id);\n\t\t\t\t\tconst currWalletIds = curr.wallets.items.map((w) => w.id);\n\t\t\t\t\tconst prevAccountIds = prev.accounts.items.map((a) => a.id);\n\t\t\t\t\tconst currAccountIds = curr.accounts.items.map((a) => a.id);\n\t\t\t\t\treturn (\n\t\t\t\t\t\tarraysEqual(prevWalletIds, currWalletIds) &&\n\t\t\t\t\t\tarraysEqual(prevAccountIds, currAccountIds)\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.subscribe(({ wallets, accounts }) => {\n\t\t\t\t// Cache ALL wallets to avoid wallet list flash on reload\n\t\t\t\t// Only accounts from connected wallets are cached\n\t\t\t\tconst connectedWalletIds = new Set(\n\t\t\t\t\twallets.items.filter((w) => w.isConnected).map((w) => w.id),\n\t\t\t\t);\n\t\t\t\tconst relevantAccounts = accounts.items.filter((a) =>\n\t\t\t\t\tconnectedWalletIds.has(a.walletId),\n\t\t\t\t);\n\n\t\t\t\tif (kc.debug) {\n\t\t\t\t\tconsole.debug(\"[kheopskit] persisting state snapshot:\", {\n\t\t\t\t\t\twallets: wallets.items.length,\n\t\t\t\t\t\taccounts: relevantAccounts.length,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tstore.setCachedState(\n\t\t\t\t\twallets.items.map(serializeWallet),\n\t\t\t\t\trelevantAccounts.map(serializeAccount),\n\t\t\t\t);\n\n\t\t\t\t// Cache wallet icons in localStorage (separate from cookies for size)\n\t\t\t\tconst icons: Record<string, string> = {};\n\t\t\t\tfor (const wallet of wallets.items) {\n\t\t\t\t\tif (wallet.icon) {\n\t\t\t\t\t\ticons[wallet.id] = wallet.icon;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetCachedIcons(icons);\n\t\t\t});\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t\tpersistSub.unsubscribe();\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged(statesEqual),\n\t\tthrottleTime(16, undefined, { leading: true, trailing: true }), // ~1 frame at 60fps\n\t\tlogObservable(\"kheopskit$\", { enabled: kc.debug, printValue: true }),\n\t\tshareReplay({ bufferSize: 1, refCount: true }),\n\t);\n};\n\nconst arraysEqual = (a: string[], b: string[]) =>\n\ta.length === b.length && a.every((v, i) => v === b[i]);\n\n/**\n * Deep equality check for KheopskitState to prevent unnecessary emissions.\n */\nconst statesEqual = (a: KheopskitState, b: KheopskitState): boolean =>\n\ta.isHydrating === b.isHydrating &&\n\ta.wallets.length === b.wallets.length &&\n\ta.accounts.length === b.accounts.length &&\n\ta.wallets.every(\n\t\t(w, i) =>\n\t\t\tw.id === b.wallets[i]?.id && w.isConnected === b.wallets[i]?.isConnected,\n\t) &&\n\ta.accounts.every(\n\t\t(acc, i) =>\n\t\t\tacc.id === b.accounts[i]?.id &&\n\t\t\t(acc.platform !== \"ethereum\" ||\n\t\t\t\t(acc as { chainId?: number }).chainId ===\n\t\t\t\t\t(b.accounts[i] as { chainId?: number })?.chainId),\n\t);\n","import {\n\tBehaviorSubject,\n\tcombineLatest,\n\tfilter,\n\tmap,\n\tObservable,\n\tSubscription,\n\tshareReplay,\n\tstartWith,\n\ttake,\n\ttimer,\n} from \"rxjs\";\n\ntype HydrationBufferResult<T> = {\n\titems: T[];\n\tisHydrating: boolean;\n};\n\n/**\n * Core hydration buffer logic shared between wallets and accounts.\n *\n * During the grace period:\n * - Emits cached items immediately (before any live emissions)\n * - As live items arrive, merges them using the provided merge function\n *\n * After the grace period (and convergence, if provided):\n * - Only live items are returned\n * - isHydrating becomes false\n *\n * If an `isConverged` function is provided, hydration ends only when BOTH\n * the grace period has elapsed AND the live items have converged with cached\n * items (e.g., all previously-connected wallets have reconnected).\n * A max timeout (6x grace period) prevents infinite hydration.\n *\n * @param cachedItems - Initial cached items from storage\n * @param liveItems$ - Observable of live items as they become available\n * @param gracePeriodMs - Time in ms to wait before syncing to live state\n * @param mergeFn - Function to merge live and cached items during hydration\n * @param isConverged - Optional function to check if live items have caught up to cached items\n */\nconst createBufferCore = <T>(\n\tcachedItems: T[],\n\tliveItems$: Observable<T[]>,\n\tgracePeriodMs: number,\n\tmergeFn: (liveItems: T[], cachedItems: T[]) => T[],\n\tisConverged?: (liveItems: T[], cachedItems: T[]) => boolean,\n): Observable<HydrationBufferResult<T>> => {\n\t// If no grace period or no cached items, just pass through live items\n\tif (gracePeriodMs <= 0 || cachedItems.length === 0) {\n\t\treturn liveItems$.pipe(map((items) => ({ items, isHydrating: false })));\n\t}\n\n\t// Wrap in an Observable to properly manage all subscriptions\n\treturn new Observable<HydrationBufferResult<T>>((subscriber) => {\n\t\tconst subscriptions = new Subscription();\n\n\t\t// Track whether we're still in the hydration grace period\n\t\t// Using BehaviorSubject to keep a stateful value that doesn't complete\n\t\tconst isHydrating$ = new BehaviorSubject(true);\n\n\t\t// Use startWith to emit cached items immediately before any live emissions\n\t\tconst liveWithInitial$ = liveItems$.pipe(startWith([] as T[]));\n\n\t\tif (isConverged) {\n\t\t\t// With convergence check: hydration ends when timer fires AND live state has caught up\n\t\t\tconst timerFired$ = timer(gracePeriodMs).pipe(\n\t\t\t\tmap(() => true),\n\t\t\t\tstartWith(false),\n\t\t\t\tshareReplay({ bufferSize: 1, refCount: true }),\n\t\t\t);\n\n\t\t\t// End hydration when timer has fired AND convergence is met\n\t\t\tsubscriptions.add(\n\t\t\t\tcombineLatest([liveWithInitial$, timerFired$])\n\t\t\t\t\t.pipe(\n\t\t\t\t\t\tfilter(([, timerFired]) => timerFired),\n\t\t\t\t\t\tfilter(([liveItems]) => isConverged(liveItems, cachedItems)),\n\t\t\t\t\t\ttake(1),\n\t\t\t\t\t)\n\t\t\t\t\t.subscribe(() => {\n\t\t\t\t\t\tisHydrating$.next(false);\n\t\t\t\t\t}),\n\t\t\t);\n\n\t\t\t// Max timeout (6x grace period) to prevent infinite hydration\n\t\t\t// e.g., if auto-reconnect fails, we still end hydration\n\t\t\tsubscriptions.add(\n\t\t\t\ttimer(gracePeriodMs * 6).subscribe(() => {\n\t\t\t\t\tif (isHydrating$.value) {\n\t\t\t\t\t\tisHydrating$.next(false);\n\t\t\t\t\t}\n\t\t\t\t}),\n\t\t\t);\n\t\t} else {\n\t\t\t// Without convergence check: end hydration on timer only\n\t\t\tsubscriptions.add(\n\t\t\t\ttimer(gracePeriodMs).subscribe(() => {\n\t\t\t\t\tisHydrating$.next(false);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tsubscriptions.add(\n\t\t\tcombineLatest([liveWithInitial$, isHydrating$])\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(([liveItems, isHydrating]) => {\n\t\t\t\t\t\tif (!isHydrating) {\n\t\t\t\t\t\t\t// Hydration complete - return only live items\n\t\t\t\t\t\t\treturn { items: liveItems, isHydrating: false };\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\titems: mergeFn(liveItems, cachedItems),\n\t\t\t\t\t\t\tisHydrating: true,\n\t\t\t\t\t\t};\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber),\n\t\t);\n\n\t\treturn () => {\n\t\t\tsubscriptions.unsubscribe();\n\t\t\tisHydrating$.complete();\n\t\t};\n\t});\n};\n\n/**\n * Creates a hydration buffer that merges cached items with live items.\n *\n * During hydration, cached items take precedence over live items with the same key.\n * This preserves the cached connected state (e.g., isConnected: true) while\n * auto-reconnect is still in progress. New live items not in the cache are added.\n *\n * @param cachedItems - Initial cached items from storage\n * @param liveItems$ - Observable of live items as they become available\n * @param gracePeriodMs - Time in ms to wait before syncing to live state\n * @param getKey - Function to extract a unique key from an item\n * @param isConverged - Optional function to check if live items have caught up to cached items\n * @param mergeItem - Optional function to merge a live item with its cached counterpart\n * @param transformCachedOnly - Optional function to transform cached items not yet in the live stream\n */\nexport const createHydrationBuffer = <T>(\n\tcachedItems: T[],\n\tliveItems$: Observable<T[]>,\n\tgracePeriodMs: number,\n\tgetKey: (item: T) => string,\n\tisConverged?: (liveItems: T[], cachedItems: T[]) => boolean,\n\tmergeItem?: (liveItem: T, cachedItem: T) => T,\n\ttransformCachedOnly?: (cachedItem: T) => T,\n): Observable<HydrationBufferResult<T>> => {\n\treturn createBufferCore(\n\t\tcachedItems,\n\t\tliveItems$,\n\t\tgracePeriodMs,\n\t\t(liveItems, cached) => {\n\t\t\tconst cachedByKey = new Map(cached.map((item) => [getKey(item), item]));\n\t\t\tconst liveKeys = new Set(liveItems.map(getKey));\n\n\t\t\t// For items in both live and cached, prefer cached (preserves connected state)\n\t\t\t// but allow mergeItem to customize how they're combined\n\t\t\t// For items only in live (newly discovered), use the live version\n\t\t\tconst mergedItems: T[] = liveItems.map((liveItem) => {\n\t\t\t\tconst key = getKey(liveItem);\n\t\t\t\tconst cachedItem = cachedByKey.get(key);\n\t\t\t\tif (!cachedItem) return liveItem;\n\t\t\t\treturn mergeItem ? mergeItem(liveItem, cachedItem) : cachedItem;\n\t\t\t});\n\n\t\t\t// Add cached items not yet in the live stream (e.g., extensions not yet detected)\n\t\t\tfor (const cachedItem of cached) {\n\t\t\t\tif (!liveKeys.has(getKey(cachedItem))) {\n\t\t\t\t\tconst transformed = transformCachedOnly\n\t\t\t\t\t\t? transformCachedOnly(cachedItem)\n\t\t\t\t\t\t: cachedItem;\n\t\t\t\t\tmergedItems.push(transformed);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn mergedItems;\n\t\t},\n\t\tisConverged,\n\t);\n};\n\n/**\n * Creates a hydration buffer specifically for accounts, which need special handling.\n *\n * Accounts are grouped by wallet - when a wallet provides its account list,\n * we replace all cached accounts for that wallet with the live ones.\n * Cached accounts for wallets that haven't provided accounts yet are preserved.\n *\n * @param cachedAccounts - Initial cached accounts from storage\n * @param liveAccounts$ - Observable of live accounts as they become available\n * @param gracePeriodMs - Time in ms to wait before syncing to live state\n * @param getWalletId - Function to extract the wallet ID from an account\n * @param isConverged - Optional function to check if live accounts have caught up to cached accounts\n */\nexport const createAccountHydrationBuffer = <T>(\n\tcachedAccounts: T[],\n\tliveAccounts$: Observable<T[]>,\n\tgracePeriodMs: number,\n\tgetWalletId: (account: T) => string,\n\tisConverged?: (liveAccounts: T[], cachedAccounts: T[]) => boolean,\n): Observable<HydrationBufferResult<T>> => {\n\treturn createBufferCore(\n\t\tcachedAccounts,\n\t\tliveAccounts$,\n\t\tgracePeriodMs,\n\t\t(liveAccounts, cached) => {\n\t\t\tconst walletsWithLiveAccounts = new Set(liveAccounts.map(getWalletId));\n\t\t\tconst mergedAccounts: T[] = [...liveAccounts];\n\n\t\t\tfor (const cachedAccount of cached) {\n\t\t\t\tif (!walletsWithLiveAccounts.has(getWalletId(cachedAccount))) {\n\t\t\t\t\tmergedAccounts.push(cachedAccount);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn mergedAccounts;\n\t\t},\n\t\tisConverged,\n\t);\n};\n","import { type MonoTypeOperatorFunction, tap } from \"rxjs\";\n\ntype Opts = {\n\tprintValue?: boolean;\n\tenabled?: boolean;\n};\n\nexport const logObservable = <T>(\n\tlabel: string,\n\topts?: Opts,\n): MonoTypeOperatorFunction<T> =>\n\ttap((value) => {\n\t\tconst { printValue = false, enabled = true } = opts || {};\n\n\t\tif (!label || !enabled) return;\n\n\t\tconst text = `[kheopskit] observable ${label} emit`;\n\n\t\tif (printValue) console.debug(text, value);\n\t\telse console.debug(text);\n\t});\n","import { combineLatest, map, Observable, of, shareReplay } from \"rxjs\";\nimport { sortAccounts } from \"../utils/sortAccounts\";\nimport { getEthereumAccounts$ } from \"./ethereum/accounts\";\nimport { getPolkadotAccounts$ } from \"./polkadot/accounts\";\nimport type { KheopskitConfig, Wallet, WalletAccount } from \"./types\";\n\nexport const getAccounts$ = (\n\tconfig: KheopskitConfig,\n\twallets: Observable<Wallet[]>,\n) => {\n\treturn new Observable<WalletAccount[]>((subscriber) => {\n\t\t// biome-ignore lint/suspicious/useIterableCallbackReturn: false positive\n\t\tconst sources = config.platforms.map<Observable<WalletAccount[]>>(\n\t\t\t(platform) => {\n\t\t\t\tswitch (platform) {\n\t\t\t\t\tcase \"polkadot\":\n\t\t\t\t\t\treturn getPolkadotAccounts$(\n\t\t\t\t\t\t\twallets.pipe(\n\t\t\t\t\t\t\t\tmap((w) => w.filter((w) => w.platform === \"polkadot\")),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\tcase \"ethereum\":\n\t\t\t\t\t\treturn getEthereumAccounts$(\n\t\t\t\t\t\t\twallets.pipe(\n\t\t\t\t\t\t\t\tmap((w) => w.filter((w) => w.platform === \"ethereum\")),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tconst accounts$ = sources.length\n\t\t\t? combineLatest(sources).pipe(\n\t\t\t\t\tmap((accounts) => accounts.flat().sort(sortAccounts)),\n\t\t\t\t)\n\t\t\t: of([]);\n\n\t\tconst sub = accounts$.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n};\n","import type { WalletAccount } from \"../api\";\n\nexport const sortAccounts = (a1: WalletAccount, a2: WalletAccount) => {\n\tif (a1.platform === \"polkadot\") {\n\t\tif (a2.platform === \"polkadot\") {\n\t\t\t// sort by wallet name, fallback to address\n\t\t\tif (a1.walletName !== a2.walletName) {\n\t\t\t\tif (a1.walletName === \"talisman\") return -1;\n\t\t\t\tif (a2.walletName === \"talisman\") return 1;\n\t\t\t\treturn a1.walletName.localeCompare(a2.walletName);\n\t\t\t}\n\n\t\t\t// sort by name, fallback to address\n\t\t\treturn a1.name !== a2.name\n\t\t\t\t? (a1.name ?? \"\").localeCompare(a2.name ?? \"\")\n\t\t\t\t: a1.address.localeCompare(a2.address);\n\t\t}\n\n\t\treturn -1; // polkadot accounts first\n\t}\n\n\tif (a2.platform === \"ethereum\") {\n\t\t// sort by wallet name, fallback to address\n\t\tif (a1.walletName !== a2.walletName) {\n\t\t\tif (a1.walletName === \"Talisman\") return -1;\n\t\t\tif (a2.walletName === \"Talisman\") return 1;\n\t\t\treturn a1.walletName.localeCompare(a2.walletName);\n\t\t}\n\n\t\treturn a1.id.localeCompare(a2.id);\n\t}\n\n\t// impossible case\n\treturn 0;\n};\n","import type UniversalProvider from \"@walletconnect/universal-provider\";\nimport {\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tof,\n\tReplaySubject,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport {\n\tcreateWalletClient,\n\tcustom,\n\ttype EIP1193Provider,\n\tgetAddress,\n} from \"viem\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { getCachedObservable$ } from \"../../utils/getCachedObservable\";\nimport type {\n\tEthereumAccount,\n\tEthereumAppKitWallet,\n\tEthereumInjectedWallet,\n\tEthereumWallet,\n} from \"../types\";\n\nconst normalizeEvmChainId = (value: unknown): number | undefined => {\n\tlet raw = value;\n\n\tif (typeof raw === \"string\" && raw.startsWith(\"eip155:\")) {\n\t\traw = raw.slice(\"eip155:\".length);\n\t}\n\n\tif (typeof raw === \"bigint\") {\n\t\treturn raw >= 0n ? Number(raw) : undefined;\n\t}\n\n\tif (typeof raw === \"number\") {\n\t\treturn Number.isInteger(raw) && raw >= 0 ? raw : undefined;\n\t}\n\n\tif (typeof raw === \"string\") {\n\t\tconst normalized = raw.trim().toLowerCase();\n\t\tif (!normalized) return undefined;\n\t\tconst parsed = normalized.startsWith(\"0x\")\n\t\t\t? Number.parseInt(normalized, 16)\n\t\t\t: Number.parseInt(normalized, 10);\n\t\treturn Number.isNaN(parsed) ? undefined : parsed;\n\t}\n\n\treturn undefined;\n};\n\nconst toCaipNetworkId = (value: unknown): string | undefined => {\n\tconst chainId = normalizeEvmChainId(value);\n\treturn chainId === undefined ? undefined : `eip155:${chainId}`;\n};\n\nconst getInjectedWalletAccounts$ = (\n\twallet: EthereumInjectedWallet,\n): Observable<EthereumAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}`, () =>\n\t\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\t\tconst addresses$ = new ReplaySubject<string[]>(1);\n\t\t\tconst chainId$ = new ReplaySubject<number | undefined>(1);\n\n\t\t\tconst getAccount = (\n\t\t\t\taddress: string,\n\t\t\t\ti: number,\n\t\t\t\tchainId: number | undefined,\n\t\t\t): EthereumAccount => {\n\t\t\t\tconst client = createWalletClient({\n\t\t\t\t\taccount: address as `0x${string}`,\n\t\t\t\t\ttransport: custom(wallet.provider as EIP1193Provider),\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\tclient,\n\t\t\t\t\taddress: getAddress(address),\n\t\t\t\t\tchainId,\n\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\tisWalletDefault: i === 0,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst handleAccountsChanged = (addrs: string[]) => {\n\t\t\t\taddresses$.next(addrs);\n\t\t\t};\n\n\t\t\tconst handleChainChanged = (chainIdHex: unknown) => {\n\t\t\t\tchainId$.next(normalizeEvmChainId(chainIdHex));\n\t\t\t};\n\n\t\t\tconst handleDisconnect = () => {\n\t\t\t\tchainId$.next(undefined);\n\t\t\t};\n\n\t\t\t// Subscribe to provider events\n\t\t\twallet.provider.on(\"accountsChanged\", handleAccountsChanged);\n\t\t\twallet.provider.on(\"chainChanged\", handleChainChanged);\n\t\t\twallet.provider.on(\"disconnect\", handleDisconnect);\n\n\t\t\t// Fetch initial values\n\t\t\twallet.provider\n\t\t\t\t.request({ method: \"eth_accounts\" })\n\t\t\t\t.then((addrs: string[]) => addresses$.next(addrs))\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tconsole.error(\"Failed to get accounts\", err);\n\t\t\t\t\taddresses$.next([]);\n\t\t\t\t});\n\n\t\t\twallet.provider\n\t\t\t\t.request({ method: \"eth_chainId\" })\n\t\t\t\t.then(handleChainChanged)\n\t\t\t\t.catch(() => chainId$.next(undefined));\n\n\t\t\t// Combine addresses + chainId into account list\n\t\t\tconst sub = combineLatest([addresses$, chainId$])\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(([addresses, chainId]) =>\n\t\t\t\t\t\taddresses.map((addr, i) => getAccount(addr, i, chainId)),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber);\n\n\t\t\treturn () => {\n\t\t\t\twallet.provider.removeListener(\n\t\t\t\t\t\"accountsChanged\",\n\t\t\t\t\thandleAccountsChanged,\n\t\t\t\t);\n\t\t\t\twallet.provider.removeListener(\"chainChanged\", handleChainChanged);\n\t\t\t\twallet.provider.removeListener(\"disconnect\", handleDisconnect);\n\t\t\t\tsub.unsubscribe();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nconst wrapWalletConnectProvider = (\n\tprovider: EIP1193Provider,\n\tsessionTopic: string,\n\tcaipNetworkId: string,\n): EIP1193Provider => {\n\treturn new Proxy(provider, {\n\t\tget(target, prop, receiver) {\n\t\t\tif (prop !== \"request\") return Reflect.get(target, prop, receiver);\n\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: legacy\n\t\t\treturn (args: any) => {\n\t\t\t\tif (args && typeof args === \"object\" && args.method) {\n\t\t\t\t\tif (!args.topic) args.topic = sessionTopic;\n\t\t\t\t\tif (!args.chainId) args.chainId = caipNetworkId;\n\t\t\t\t}\n\t\t\t\treturn target.request(args);\n\t\t\t};\n\t\t},\n\t});\n};\n\nconst getAppKitAccounts$ = (\n\twallet: EthereumAppKitWallet,\n): Observable<EthereumAccount[]> => {\n\tconst account = wallet.appKit.getAccount(\"eip155\");\n\tconst provider = wallet.appKit.getProvider<UniversalProvider>(\"eip155\");\n\n\tif (\n\t\t!wallet.isConnected ||\n\t\t!wallet.appKit ||\n\t\t!account?.allAccounts.length ||\n\t\t!provider?.session\n\t)\n\t\treturn of([]);\n\n\treturn getCachedObservable$(\"accounts:appKit\", () =>\n\t\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\t\tconst caipNetworkId$ = new ReplaySubject<string>(1);\n\n\t\t\tconst handleChainChanged = (chainId: unknown) => {\n\t\t\t\tconst caipNetworkId = toCaipNetworkId(chainId);\n\t\t\t\tif (caipNetworkId) {\n\t\t\t\t\tcaipNetworkId$.next(caipNetworkId);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tprovider.on(\"chainChanged\", handleChainChanged);\n\t\t\tprovider.request({ method: \"eth_chainId\" }).then(handleChainChanged);\n\n\t\t\tconst sub = caipNetworkId$\n\t\t\t\t.pipe(\n\t\t\t\t\tdistinctUntilChanged(),\n\t\t\t\t\tmap((caipNetworkId) => {\n\t\t\t\t\t\tconst chainId = normalizeEvmChainId(caipNetworkId);\n\t\t\t\t\t\tconst transport = custom(\n\t\t\t\t\t\t\twrapWalletConnectProvider(\n\t\t\t\t\t\t\t\tprovider as EIP1193Provider,\n\t\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: legacy\n\t\t\t\t\t\t\t\tprovider.session!.topic,\n\t\t\t\t\t\t\t\tcaipNetworkId,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn { transport, chainId };\n\t\t\t\t\t}),\n\t\t\t\t\tmap(({ transport, chainId }) =>\n\t\t\t\t\t\taccount.allAccounts.map((acc, i): EthereumAccount => {\n\t\t\t\t\t\t\tconst client = createWalletClient({\n\t\t\t\t\t\t\t\taccount: acc.address as `0x${string}`,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid: getWalletAccountId(wallet.id, acc.address),\n\t\t\t\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\t\t\taddress: acc.address as `0x${string}`,\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\tchainId,\n\t\t\t\t\t\t\t\tisWalletDefault: i === 0,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber);\n\n\t\t\treturn () => {\n\t\t\t\tprovider.off(\"chainChanged\", handleChainChanged);\n\t\t\t\tsub.unsubscribe();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nexport const getEthereumAccounts$ = (\n\tethereumWallets: Observable<EthereumWallet[]>,\n) =>\n\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\tconst sub = ethereumWallets\n\t\t\t.pipe(\n\t\t\t\tmap((wallets) => wallets.filter((w) => w.isConnected)),\n\t\t\t\tswitchMap((wallets) => {\n\t\t\t\t\treturn wallets.length\n\t\t\t\t\t\t? combineLatest([\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"injected\")\n\t\t\t\t\t\t\t\t\t.map(getInjectedWalletAccounts$),\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"appKit\")\n\t\t\t\t\t\t\t\t\t.map(getAppKitAccounts$),\n\t\t\t\t\t\t\t\t// todo appkit\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t: of([]);\n\t\t\t\t}),\n\t\t\t\tmap((accounts) => accounts.flat()),\n\t\t\t\tdistinctUntilChanged(isSameAccountsList),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(\n\t\t// logObservable(\"ethereumAccounts$\", true),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n\nconst isSameAccountsList = (a: EthereumAccount[], b: EthereumAccount[]) => {\n\tif (a.length !== b.length) return false;\n\treturn a.every(\n\t\t(account, i) =>\n\t\t\taccount.id === b[i]?.id && account.chainId === b[i]?.chainId,\n\t);\n};\n","import { BehaviorSubject } from \"rxjs\";\nimport { type SyncableStorage, safeLocalStorage } from \"./storage\";\n\nexport const createStore = <T>(\n\tkey: string,\n\tdefaultValue: T,\n\tstorage: SyncableStorage = safeLocalStorage,\n) => {\n\tconst subject = new BehaviorSubject<T>(\n\t\tgetStoredData(key, defaultValue, storage),\n\t);\n\n\t// Cross-tab sync via storage.subscribe (uses storage event for localStorage, BroadcastChannel for cookies)\n\t// Only subscribe if window is available (client-side) and storage supports it\n\tlet unsubscribeStorage: (() => void) | undefined;\n\tif (typeof window !== \"undefined\" && storage.subscribe) {\n\t\tunsubscribeStorage = storage.subscribe(key, (newValue) => {\n\t\t\tsubject.next(parseData(newValue, defaultValue));\n\t\t});\n\t}\n\n\tconst update = (val: T) => {\n\t\tsetStoredData(key, val, storage);\n\t\tsubject.next(val);\n\t};\n\n\treturn {\n\t\tobservable: subject.asObservable(),\n\t\tset: (val: T) => update(val),\n\t\tmutate: (transform: (prev: T) => T) =>\n\t\t\tupdate(transform(subject.getValue())),\n\t\tget: () => structuredClone(subject.getValue()),\n\t\t/**\n\t\t * Cleanup subscriptions. Call this when the store is no longer needed.\n\t\t */\n\t\tdestroy: () => {\n\t\t\tunsubscribeStorage?.();\n\t\t\tsubject.complete();\n\t\t},\n\t};\n};\n\nconst parseData = <T>(str: string | null, defaultValue: T): T => {\n\ttry {\n\t\tif (str) return JSON.parse(str);\n\t} catch {\n\t\t// invalid data\n\t}\n\treturn defaultValue;\n};\n\nconst getStoredData = <T>(\n\tkey: string,\n\tdefaultValue: T,\n\tstorage: SyncableStorage,\n): T => {\n\tconst str = storage.getItem(key);\n\treturn parseData(str, defaultValue);\n};\n\nconst setStoredData = <T>(key: string, val: T, storage: SyncableStorage) => {\n\tconst str = JSON.stringify(val);\n\tstorage.setItem(key, str);\n};\n","import { isAddress } from \"viem\";\n\nexport const isEthereumAddress = (address: string): boolean =>\n\tisAddress(address);\n","import { AccountId, type SS58String } from \"polkadot-api\";\n\nconst accountIdEncoder = AccountId().enc;\n\nexport const isSs58Address = (\n\taddress: SS58String | string,\n): address is SS58String => {\n\ttry {\n\t\tif (!address) return false;\n\t\taccountIdEncoder(address);\n\t\treturn true;\n\t} catch {\n\t\treturn false;\n\t}\n};\n","import { isEthereumAddress } from \"./isEthereumAddress\";\nimport { isSs58Address } from \"./isSs58Address\";\n\nexport const isValidAddress = (address: string): boolean => {\n\treturn address.startsWith(\"0x\")\n\t\t? isEthereumAddress(address)\n\t\t: isSs58Address(address);\n};\n","import type { SS58String } from \"polkadot-api\";\n\nimport { isValidAddress } from \"./isValidAddress\";\n\nexport type WalletAccountId = string;\n\nexport const getWalletAccountId = (\n\twalletId: string,\n\taddress: SS58String,\n): WalletAccountId => {\n\tif (!walletId) throw new Error(\"Missing walletId\");\n\tif (!isValidAddress(address)) throw new Error(\"Invalid address\");\n\treturn `${walletId}::${address}`;\n};\n\nexport const parseWalletAccountId = (accountId: string) => {\n\tif (!accountId) throw new Error(\"Invalid walletAccountId\");\n\tconst [walletId, address] = accountId.split(\"::\");\n\tif (!walletId) throw new Error(\"Missing walletId\");\n\tif (!address || !isValidAddress(address)) throw new Error(\"Invalid address\");\n\treturn { walletId, address };\n};\n","import type { AppKit } from \"@reown/appkit/core\";\nimport type UniversalProvider from \"@walletconnect/universal-provider\";\nimport {\n\tgetPolkadotSignerFromPjs,\n\ttype InjectedExtension,\n\ttype InjectedPolkadotAccount,\n} from \"polkadot-api/pjs-signer\";\nimport {\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tof,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotAppKitWallet,\n\tPolkadotInjectedWallet,\n\tPolkadotWallet,\n} from \"../types\";\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst getAccount = (account: InjectedPolkadotAccount): PolkadotAccount => ({\n\t\t\tid: getWalletAccountId(wallet.id, account.address),\n\t\t\t...account,\n\t\t\tplatform: \"polkadot\",\n\t\t\twalletName: wallet.name,\n\t\t\twalletId: wallet.id,\n\t\t});\n\n\t\tconst extension = wallet.extension as InjectedExtension;\n\n\t\t// subscribe to changes\n\t\tconst unsubscribe = extension.subscribe((accounts) => {\n\t\t\tsubscriber.next(accounts.map(getAccount));\n\t\t});\n\n\t\t// initial value\n\t\tsubscriber.next(extension.getAccounts().map(getAccount));\n\n\t\treturn () => {\n\t\t\treturn unsubscribe();\n\t\t};\n\t});\n};\n\nconst getAppKitPolkadotSigner = (appKit: AppKit, address: string) => {\n\tconst provider = appKit.getProvider<UniversalProvider>(\"polkadot\");\n\tif (!provider) throw new Error(\"No provider found\");\n\tif (!provider.session) throw new Error(\"No session found\");\n\n\treturn getPolkadotSignerFromPjs(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session) throw new Error(\"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ address, data }) => {\n\t\t\tif (!provider.session) throw new Error(\"No session found\");\n\t\t\tconst networks = appKit.getCaipNetworks(\"polkadot\");\n\t\t\tconst chainId = networks[0]?.caipNetworkId;\n\t\t\tif (!chainId) throw new Error(\"No chainId found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tmessage: data,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t);\n};\n\nconst getAppKitAccounts$ = (wallet: PolkadotAppKitWallet) => {\n\tconst account = wallet.appKit.getAccount(\"polkadot\");\n\tconst provider = wallet.appKit.getProvider<UniversalProvider>(\"polkadot\");\n\n\tif (\n\t\t!wallet.isConnected ||\n\t\t!wallet.appKit ||\n\t\t!account?.allAccounts.length ||\n\t\t!provider?.session\n\t)\n\t\treturn of([]);\n\n\treturn of(\n\t\taccount.allAccounts.map(\n\t\t\t(acc): PolkadotAccount => ({\n\t\t\t\tid: getWalletAccountId(wallet.id, acc.address),\n\t\t\t\tplatform: \"polkadot\",\n\t\t\t\twalletName: wallet.name,\n\t\t\t\twalletId: wallet.id,\n\t\t\t\taddress: acc.address,\n\t\t\t\tpolkadotSigner: getAppKitPolkadotSigner(wallet.appKit, acc.address),\n\t\t\t\tgenesisHash: null,\n\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\ttype: \"sr25519\",\n\t\t\t}),\n\t\t),\n\t);\n};\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<PolkadotWallet[]>,\n) =>\n\tnew Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst sub = polkadotWallets$\n\t\t\t.pipe(\n\t\t\t\tmap((wallets) => wallets.filter((w) => w.isConnected)),\n\t\t\t\tswitchMap((wallets) =>\n\t\t\t\t\twallets.length\n\t\t\t\t\t\t? combineLatest([\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"injected\")\n\t\t\t\t\t\t\t\t\t.map(getInjectedWalletAccounts$),\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"appKit\")\n\t\t\t\t\t\t\t\t\t.map(getAppKitAccounts$),\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t: of([]),\n\t\t\t\t),\n\t\t\t\tmap((accounts) => accounts.flat()),\n\t\t\t\tdistinctUntilChanged(isSameAccountsList),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nconst isSameAccountsList = (a: PolkadotAccount[], b: PolkadotAccount[]) => {\n\tif (a.length !== b.length) return false;\n\treturn a.every((account, i) => account.id === b[i]?.id);\n};\n","import { uniq } from \"lodash-es\";\nimport { createStore } from \"../utils/createStore\";\nimport { cookieStorage, safeLocalStorage } from \"../utils/storage\";\nimport { getWalletAccountId } from \"../utils/WalletAccountId\";\nimport { parseWalletId, type WalletId } from \"../utils/WalletId\";\nimport { DEFAULT_STORAGE_KEY } from \"./config\";\nimport type { CachedAccount, CachedWallet } from \"./types\";\n\ntype KheopskitStoreData = {\n\tautoReconnect?: WalletId[];\n\t/** Cached wallet state for SSR hydration to prevent UI flash */\n\tcachedWallets?: CachedWallet[];\n\t/** Cached account state for SSR hydration to prevent UI flash */\n\tcachedAccounts?: CachedAccount[];\n};\n\ntype CompactWalletEntry = [WalletId, string, 0 | 1, 0 | 1];\ntype CompactAccountEntry = [WalletId, string, string | null, number | null];\n\ntype CompactStoreV1 = {\n\tv: 1;\n\t// autoReconnect\n\tr?: WalletId[];\n\t// wallets: [id, name, isConnected(0|1), type(0=injected,1=appKit)?]\n\tw?: CompactWalletEntry[];\n\t// accounts: [walletId, address, name?]\n\ta?: CompactAccountEntry[];\n};\n\nconst DEFAULT_SETTINGS: KheopskitStoreData = {};\n\ntype CreateKheopskitStoreOptions = {\n\t/**\n\t * Cookie string for SSR hydration.\n\t * When provided, uses cookieStorage instead of localStorage.\n\t */\n\tssrCookies?: string;\n\t/**\n\t * Custom storage key to namespace the stored data.\n\t * @default \"kheopskit\"\n\t */\n\tstorageKey?: string;\n};\n\n/**\n * Creates a kheopskit store with the appropriate storage backend.\n * Uses cookieStorage when ssrCookies is provided (for SSR hydration),\n * otherwise falls back to safeLocalStorage.\n *\n * @param options - Configuration options for the store\n */\nexport const createKheopskitStore = (\n\toptions: CreateKheopskitStoreOptions = {},\n) => {\n\tconst { ssrCookies, storageKey = DEFAULT_STORAGE_KEY } = options;\n\tconst storage =\n\t\tssrCookies !== undefined\n\t\t\t? createCompactCookieStorage(ssrCookies)\n\t\t\t: safeLocalStorage;\n\tconst store = createStore(storageKey, DEFAULT_SETTINGS, storage);\n\n\tconst addEnabledWalletId = (walletId: WalletId) => {\n\t\tparseWalletId(walletId); // validate walletId\n\t\tstore.mutate((prev) => ({\n\t\t\t...prev,\n\t\t\tautoReconnect: uniq((prev.autoReconnect ?? []).concat(walletId)),\n\t\t}));\n\t};\n\n\tconst removeEnabledWalletId = (walletId: WalletId) => {\n\t\tstore.mutate((prev) => ({\n\t\t\t...prev,\n\t\t\tautoReconnect: uniq(\n\t\t\t\t(prev.autoReconnect ?? []).filter((id) => id !== walletId),\n\t\t\t),\n\t\t}));\n\t};\n\n\tconst getCachedState = () => {\n\t\tconst data = store.get();\n\t\treturn {\n\t\t\twallets: data.cachedWallets ?? [],\n\t\t\taccounts: data.cachedAccounts ?? [],\n\t\t};\n\t};\n\n\tconst setCachedState = (\n\t\twallets: CachedWallet[],\n\t\taccounts: CachedAccount[],\n\t) => {\n\t\tstore.mutate((prev) => ({\n\t\t\t...prev,\n\t\t\tcachedWallets: wallets,\n\t\t\tcachedAccounts: accounts,\n\t\t}));\n\t};\n\n\treturn {\n\t\tobservable: store.observable,\n\t\taddEnabledWalletId,\n\t\tremoveEnabledWalletId,\n\t\tgetCachedState,\n\t\tsetCachedState,\n\t};\n};\n\nexport type KheopskitStore = ReturnType<typeof createKheopskitStore>;\n\n/**\n * Cached default store instance.\n * Lazily initialized on first access to be SSR-safe.\n */\nlet _defaultStore: KheopskitStore | null = null;\n\n/**\n * Gets the default store, creating it on first access.\n * Uses localStorage on client, noop on server.\n * Lazily initialized to avoid SSR issues with module-level code.\n */\nexport const getDefaultStore = (): KheopskitStore => {\n\tif (_defaultStore === null) {\n\t\t_defaultStore = createKheopskitStore();\n\t}\n\treturn _defaultStore;\n};\n\n/**\n * @deprecated Use createKheopskitStore() or getDefaultStore() instead.\n * This export is kept for backward compatibility but may cause SSR issues\n * if imported at module level in server environments.\n */\nexport const store = {\n\tget observable() {\n\t\treturn getDefaultStore().observable;\n\t},\n\taddEnabledWalletId: (walletId: WalletId) =>\n\t\tgetDefaultStore().addEnabledWalletId(walletId),\n\tremoveEnabledWalletId: (walletId: WalletId) =>\n\t\tgetDefaultStore().removeEnabledWalletId(walletId),\n\tgetCachedState: () => getDefaultStore().getCachedState(),\n\tsetCachedState: (wallets: CachedWallet[], accounts: CachedAccount[]) =>\n\t\tgetDefaultStore().setCachedState(wallets, accounts),\n};\n\nconst isCompactStore = (value: unknown): value is CompactStoreV1 => {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n\tif (\"cachedWallets\" in value || \"cachedAccounts\" in value) return false;\n\treturn \"v\" in value || \"w\" in value || \"a\" in value || \"r\" in value;\n};\n\nconst toCompactStore = (data: KheopskitStoreData): CompactStoreV1 => {\n\tconst wallets = data.cachedWallets?.map(\n\t\t(wallet): CompactWalletEntry => [\n\t\t\twallet.id,\n\t\t\twallet.name,\n\t\t\twallet.isConnected ? 1 : 0,\n\t\t\twallet.type === \"appKit\" ? 1 : 0,\n\t\t],\n\t);\n\n\tconst accounts = data.cachedAccounts?.map(\n\t\t(account): CompactAccountEntry => [\n\t\t\taccount.walletId,\n\t\t\taccount.address,\n\t\t\taccount.name ?? null,\n\t\t\taccount.chainId ?? null,\n\t\t],\n\t);\n\n\treturn {\n\t\tv: 1,\n\t\tr: data.autoReconnect,\n\t\tw: wallets?.length ? wallets : undefined,\n\t\ta: accounts?.length ? accounts : undefined,\n\t};\n};\n\nconst fromCompactStore = (data: CompactStoreV1): KheopskitStoreData => {\n\tconst walletNameMap = new Map<WalletId, string>();\n\n\tconst wallets: CachedWallet[] = (data.w ?? []).map((item) => {\n\t\tconst [id, name, isConnected, type] = item;\n\t\twalletNameMap.set(id, name);\n\t\tconst { platform } = parseWalletId(id);\n\t\treturn {\n\t\t\tid,\n\t\t\tplatform,\n\t\t\ttype: type === 1 ? \"appKit\" : \"injected\",\n\t\t\tname,\n\t\t\tisConnected: isConnected === 1,\n\t\t};\n\t});\n\n\tconst accounts: CachedAccount[] = (data.a ?? []).map((item) => {\n\t\tconst [walletId, address, name, chainId] = item;\n\t\tconst { platform } = parseWalletId(walletId);\n\t\treturn {\n\t\t\tid: getWalletAccountId(walletId, address),\n\t\t\tplatform,\n\t\t\taddress,\n\t\t\tname: name ?? undefined,\n\t\t\tchainId: chainId ?? undefined,\n\t\t\twalletId,\n\t\t\twalletName: walletNameMap.get(walletId) ?? walletId,\n\t\t};\n\t});\n\n\treturn {\n\t\tautoReconnect: data.r,\n\t\tcachedWallets: wallets,\n\t\tcachedAccounts: accounts,\n\t};\n};\n\nconst decodeStore = (raw: string, fallback: KheopskitStoreData) => {\n\ttry {\n\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\tif (isCompactStore(parsed)) return fromCompactStore(parsed);\n\t\treturn parsed as KheopskitStoreData;\n\t} catch {\n\t\treturn fallback;\n\t}\n};\n\nconst encodeStore = (data: KheopskitStoreData): string =>\n\tJSON.stringify(toCompactStore(data));\n\nconst createCompactCookieStorage = (initialCookies?: string) => {\n\tconst base = cookieStorage(initialCookies);\n\n\treturn {\n\t\tgetItem: (key: string) => {\n\t\t\tconst raw = base.getItem(key);\n\t\t\tif (!raw) return null;\n\t\t\tconst expanded = decodeStore(raw, DEFAULT_SETTINGS);\n\t\t\tif (typeof document !== \"undefined\") {\n\t\t\t\ttry {\n\t\t\t\t\tconst parsed = JSON.parse(raw) as unknown;\n\t\t\t\t\tif (!isCompactStore(parsed)) {\n\t\t\t\t\t\tbase.setItem(key, encodeStore(expanded));\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore malformed cookie during migration\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn JSON.stringify(expanded);\n\t\t},\n\t\tsetItem: (key: string, value: string) => {\n\t\t\tconst expanded = decodeStore(value, DEFAULT_SETTINGS);\n\t\t\tbase.setItem(key, encodeStore(expanded));\n\t\t},\n\t\tremoveItem: base.removeItem,\n\t\tsubscribe: (key: string, callback: (value: string | null) => void) => {\n\t\t\tconst unsubscribe = base.subscribe?.(key, (value) => {\n\t\t\t\tif (!value) {\n\t\t\t\t\tcallback(null);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconst expanded = decodeStore(value, DEFAULT_SETTINGS);\n\t\t\t\tcallback(JSON.stringify(expanded));\n\t\t\t});\n\t\t\treturn () => {\n\t\t\t\tunsubscribe?.();\n\t\t\t};\n\t\t},\n\t};\n};\n","import {\n\tcombineLatest,\n\tdistinct,\n\tfilter,\n\tmap,\n\tmergeMap,\n\tObservable,\n\tof,\n\tshareReplay,\n\ttake,\n} from \"rxjs\";\nimport { sortWallets } from \"../utils/sortWallets\";\nimport { getEthereumWallets$ } from \"./ethereum/wallets\";\nimport { getPolkadotWallets$ } from \"./polkadot/wallets\";\nimport { store as defaultStore, type KheopskitStore } from \"./store\";\nimport type { KheopskitConfig, Wallet } from \"./types\";\n\nexport const getWallets$ = (\n\tconfig: KheopskitConfig,\n\tstore: KheopskitStore = defaultStore,\n) => {\n\t// lock the list of wallets to auto reconnect on first call\n\tconst autoReconnectWalletIds$ = store.observable.pipe(\n\t\tmap((s) => s.autoReconnect ?? []),\n\t\ttake(1),\n\t\tshareReplay({ bufferSize: 1, refCount: true }),\n\t);\n\n\treturn new Observable<Wallet[]>((subscriber) => {\n\t\t// biome-ignore lint/suspicious/useIterableCallbackReturn: false positive\n\t\tconst observables = config.platforms.map(\n\t\t\t(platform): Observable<Wallet[]> => {\n\t\t\t\tswitch (platform) {\n\t\t\t\t\tcase \"polkadot\":\n\t\t\t\t\t\treturn getPolkadotWallets$(config, store);\n\t\t\t\t\tcase \"ethereum\":\n\t\t\t\t\t\treturn getEthereumWallets$(config, store);\n\t\t\t\t}\n\t\t\t},\n\t\t);\n\n\t\tconst wallets$ = observables.length\n\t\t\t? combineLatest(observables).pipe(\n\t\t\t\t\tmap((wallets) => wallets.flat().sort(sortWallets)),\n\t\t\t\t\t// Note: No startWith([]) here - the hydration buffer handles initial state\n\t\t\t\t)\n\t\t\t: of([]);\n\n\t\t// Track wallets being reconnected to avoid duplicate attempts\n\t\tconst reconnectingWallets = new Set<string>();\n\n\t\tconst subAutoReconnect = combineLatest([wallets$, autoReconnectWalletIds$])\n\t\t\t.pipe(\n\t\t\t\tfilter(([, walletIds]) => config.autoReconnect && !!walletIds?.length),\n\t\t\t\tmergeMap(([wallets, walletIds]) =>\n\t\t\t\t\twallets.filter((wallet) => walletIds?.includes(wallet.id)),\n\t\t\t\t),\n\t\t\t\tdistinct((w) => w.id),\n\t\t\t)\n\t\t\t.subscribe(async (wallet) => {\n\t\t\t\tif (wallet.isConnected || reconnectingWallets.has(wallet.id)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\treconnectingWallets.add(wallet.id);\n\t\t\t\ttry {\n\t\t\t\t\tawait wallet.connect();\n\t\t\t\t} catch (err) {\n\t\t\t\t\tconsole.error(\"Failed to reconnect wallet %s\", wallet.id, { err });\n\t\t\t\t} finally {\n\t\t\t\t\treconnectingWallets.delete(wallet.id);\n\t\t\t\t}\n\t\t\t});\n\n\t\tconst subWallets = wallets$.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubAutoReconnect.unsubscribe();\n\t\t\tsubWallets.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n};\n","import type { Wallet } from \"../api\";\n\nexport const sortWallets = (w1: Wallet, w2: Wallet) => {\n\t// Sort by platform first: polkadot first, then ethereum\n\tif (w1.platform !== w2.platform) {\n\t\treturn w1.platform === \"polkadot\" ? -1 : 1;\n\t}\n\n\t// Sort by name, but Talisman first\n\tif (w1.name.toLowerCase() === \"talisman\") return -1;\n\tif (w2.name.toLowerCase() === \"talisman\") return 1;\n\n\treturn w1.name.localeCompare(w2.name);\n};\n","import {\n\tcreateStore as createMipdStore,\n\ttype EIP6963ProviderDetail,\n} from \"mipd\";\nimport {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tshareReplay,\n} from \"rxjs\";\nimport type { EIP1193Provider } from \"viem\";\nimport { getWalletId, type WalletId } from \"../../utils/WalletId\";\nimport { getAppKitWallets$ } from \"../appKit\";\nimport { store as defaultStore, type KheopskitStore } from \"../store\";\nimport type {\n\tEthereumInjectedWallet,\n\tEthereumWallet,\n\tKheopskitConfig,\n} from \"../types\";\n\n/**\n * Observable that emits EIP-6963 provider details from injected wallets.\n * Returns empty array during SSR since browser wallet APIs are not available.\n */\nconst providersDetails$ = new Observable<EIP6963ProviderDetail[]>(\n\t(subscriber) => {\n\t\t// Guard against SSR - mipd requires browser APIs\n\t\tif (typeof window === \"undefined\") {\n\t\t\tsubscriber.next([]);\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst mipdStore = createMipdStore();\n\n\t\tconst unsubscribe = mipdStore.subscribe((providerDetails) => {\n\t\t\tsubscriber.next(providerDetails as EIP6963ProviderDetail[]);\n\t\t});\n\n\t\tconst providerDetails = mipdStore.getProviders();\n\n\t\tsubscriber.next(providerDetails as EIP6963ProviderDetail[]);\n\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\tmipdStore.destroy();\n\t\t};\n\t},\n).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nconst createEthereumInjectedWallets$ = (store: KheopskitStore) =>\n\tnew Observable<EthereumInjectedWallet[]>((subscriber) => {\n\t\tconst enabledWalletIds$ = new BehaviorSubject<Set<WalletId>>(new Set());\n\n\t\tconst connectWallet = async (\n\t\t\twalletId: WalletId,\n\t\t\tprovider: EIP1193Provider,\n\t\t) => {\n\t\t\tif (enabledWalletIds$.value.has(walletId))\n\t\t\t\tthrow new Error(`Extension ${walletId} already connected`);\n\n\t\t\tawait provider.request({\n\t\t\t\tmethod: \"eth_requestAccounts\",\n\t\t\t});\n\n\t\t\tconst newSet = new Set(enabledWalletIds$.value);\n\t\t\tnewSet.add(walletId);\n\t\t\tenabledWalletIds$.next(newSet);\n\n\t\t\tstore.addEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst disconnectWallet = async (walletId: WalletId) => {\n\t\t\tif (!enabledWalletIds$.value.has(walletId))\n\t\t\t\tthrow new Error(`Extension ${walletId} is not connected`);\n\t\t\tconst newSet = new Set(enabledWalletIds$.value);\n\t\t\tnewSet.delete(walletId);\n\t\t\tenabledWalletIds$.next(newSet);\n\n\t\t\tstore.removeEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst sub = combineLatest([providersDetails$, enabledWalletIds$])\n\t\t\t.pipe(\n\t\t\t\tmap(([providerDetails, enabledWalletIds]) => {\n\t\t\t\t\treturn providerDetails.map((pd): EthereumInjectedWallet => {\n\t\t\t\t\t\tconst walletId = getWalletId(\"ethereum\", pd.info.rdns);\n\t\t\t\t\t\tconst provider = pd.provider as EIP1193Provider;\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\t\t\tid: walletId,\n\t\t\t\t\t\t\tname: pd.info.name,\n\t\t\t\t\t\t\ticon: pd.info.icon,\n\t\t\t\t\t\t\tprovider,\n\t\t\t\t\t\t\tisConnected: enabledWalletIds.has(walletId),\n\t\t\t\t\t\t\tproviderId: pd.info.rdns,\n\t\t\t\t\t\t\tconnect: () => connectWallet(walletId, provider),\n\t\t\t\t\t\t\tdisconnect: () => disconnectWallet(walletId),\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tdistinctUntilChanged(walletsEqual),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nexport const getEthereumWallets$ = (\n\tconfig: KheopskitConfig,\n\tstore: KheopskitStore = defaultStore,\n) => {\n\treturn new Observable<EthereumWallet[]>((subscriber) => {\n\t\tconst subscription = combineLatest([\n\t\t\tcreateEthereumInjectedWallets$(store),\n\t\t\tgetAppKitWallets$(config)?.pipe(map((w) => w.ethereum)),\n\t\t])\n\t\t\t.pipe(\n\t\t\t\tmap(([injectedWallets, appKitWallet]) =>\n\t\t\t\t\tappKitWallet ? [...injectedWallets, appKitWallet] : injectedWallets,\n\t\t\t\t),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n};\n\n/**\n * Compare two wallet arrays by their relevant properties (not functions).\n */\nconst walletsEqual = (\n\ta: EthereumInjectedWallet[],\n\tb: EthereumInjectedWallet[],\n): boolean => {\n\tif (a.length !== b.length) return false;\n\treturn a.every(\n\t\t(w, i) =>\n\t\t\tw.id === b[i]?.id &&\n\t\t\tw.isConnected === b[i]?.isConnected &&\n\t\t\tw.name === b[i]?.name,\n\t);\n};\n","import { isEqual } from \"lodash-es\";\nimport {\n\tconnectInjectedExtension,\n\tgetInjectedExtensions,\n\ttype InjectedExtension,\n} from \"polkadot-api/pjs-signer\";\nimport {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tshareReplay,\n} from \"rxjs\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { getAppKitWallets$ } from \"../appKit\";\nimport { store as defaultStore, type KheopskitStore } from \"../store\";\nimport type {\n\tKheopskitConfig,\n\tPolkadotInjectedWallet,\n\tPolkadotWallet,\n} from \"../types\";\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// Create a polling observable that starts immediately and polls at intervals\nconst createWalletIdsPoller$ = () => {\n\treturn new Observable<WalletId[]>((subscriber) => {\n\t\t// Emit immediately on subscribe\n\t\tsubscriber.next(getInjectedWalletsIds());\n\n\t\t// Poll at shorter intervals initially, then slow down\n\t\tconst intervals = [100, 200, 300, 500];\n\t\tlet index = 0;\n\n\t\tconst poll = () => {\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t\tif (index < intervals.length) {\n\t\t\t\tconst delay = intervals[index++];\n\t\t\t\tsetTimeout(poll, delay);\n\t\t\t}\n\t\t};\n\n\t\t// Start polling after first immediate emission\n\t\tif (intervals.length > 0) {\n\t\t\tsetTimeout(poll, intervals[index++] ?? 100);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Cleanup handled by setTimeout naturally expiring\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n};\n\nconst createPolkadotInjectedWallets$ = (store: KheopskitStore) =>\n\tnew Observable<PolkadotInjectedWallet[]>((subscriber) => {\n\t\tconst enabledExtensions$ = new BehaviorSubject<\n\t\t\tMap<WalletId, InjectedExtension>\n\t\t>(new Map());\n\n\t\tconst connect = async (walletId: WalletId) => {\n\t\t\tif (enabledExtensions$.value.has(walletId))\n\t\t\t\tthrow new Error(`Extension ${walletId} already connected`);\n\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\tconst extension = await connectInjectedExtension(identifier);\n\n\t\t\tconst newMap = new Map(enabledExtensions$.value);\n\t\t\tnewMap.set(walletId, extension);\n\t\t\tenabledExtensions$.next(newMap);\n\n\t\t\tstore.addEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst disconnect = (walletId: WalletId) => {\n\t\t\tif (!enabledExtensions$.value.has(walletId))\n\t\t\t\tthrow new Error(`Extension ${walletId} is not connected`);\n\n\t\t\tconst newMap = new Map(enabledExtensions$.value);\n\t\t\tnewMap.delete(walletId);\n\t\t\tenabledExtensions$.next(newMap);\n\n\t\t\tstore.removeEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst walletIds$ = createWalletIdsPoller$();\n\n\t\tconst subscription = combineLatest([walletIds$, enabledExtensions$])\n\t\t\t.pipe(\n\t\t\t\tmap(([walletIds, enabledExtensions]) => {\n\t\t\t\t\treturn walletIds.map((id): PolkadotInjectedWallet => {\n\t\t\t\t\t\tconst { identifier } = parseWalletId(id);\n\t\t\t\t\t\tconst extension = enabledExtensions.get(id);\n\t\t\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\t\t\textensionId: identifier,\n\t\t\t\t\t\t\textension,\n\t\t\t\t\t\t\tisConnected: !!extension,\n\t\t\t\t\t\t\tconnect: () => connect(id),\n\t\t\t\t\t\t\tdisconnect: () => disconnect(id),\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tdistinctUntilChanged(walletsEqual),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nexport const getPolkadotWallets$ = (\n\tconfig: KheopskitConfig,\n\tstore: KheopskitStore = defaultStore,\n) => {\n\treturn new Observable<PolkadotWallet[]>((subscriber) => {\n\t\tconst subscription = combineLatest([\n\t\t\tcreatePolkadotInjectedWallets$(store),\n\t\t\tgetAppKitWallets$(config)?.pipe(map((w) => w.polkadot)),\n\t\t])\n\t\t\t.pipe(\n\t\t\t\tmap(([injectedWallets, appKitWallet]) =>\n\t\t\t\t\tappKitWallet ? [...injectedWallets, appKitWallet] : injectedWallets,\n\t\t\t\t),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n};\n\n/**\n * Compare two wallet arrays by their relevant properties (not functions).\n */\nconst walletsEqual = (\n\ta: PolkadotInjectedWallet[],\n\tb: PolkadotInjectedWallet[],\n): boolean => {\n\tif (a.length !== b.length) return false;\n\treturn a.every(\n\t\t(w, i) =>\n\t\t\tw.id === b[i]?.id &&\n\t\t\tw.isConnected === b[i]?.isConnected &&\n\t\t\tw.name === b[i]?.name,\n\t);\n};\n"],"mappings":"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","names":["import_rxjs","import_rxjs","getWalletId","import_rxjs","import_rxjs","import_rxjs","import_viem","import_rxjs","import_rxjs","getInjectedWalletAccounts$","address","getAppKitAccounts$","isSameAccountsList","w","store","import_rxjs","import_rxjs","createMipdStore","providerDetails","store","import_lodash_es","import_pjs_signer","import_rxjs","store","walletsEqual","store","store"]}