@kheopskit/core 0.0.22 → 0.1.1

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.mjs CHANGED
@@ -1,8 +1,438 @@
1
+ // src/utils/getCachedObservable.ts
2
+ var CACHE = /* @__PURE__ */ new Map();
3
+ var getCachedObservable$ = (key, create) => {
4
+ if (!CACHE.has(key)) CACHE.set(key, create());
5
+ return CACHE.get(key);
6
+ };
7
+ var clearCachedObservable = (key) => {
8
+ CACHE.delete(key);
9
+ };
10
+ var clearAllCachedObservables = () => {
11
+ CACHE.clear();
12
+ };
13
+
14
+ // src/utils/polkadotExtensions.ts
15
+ var POLKADOT_EXTENSIONS = {
16
+ talisman: {
17
+ name: "Talisman",
18
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K"
19
+ },
20
+ "polkadot-js": {
21
+ name: "Polkadot.js",
22
+ icon: "data:image/svg+xml;base64,ICA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwNi4yIDEwNi4yIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPgogICAgICA8ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPgogICAgICAgIDxjaXJjbGUgY3g9IjUzLjEiIGN5PSI1My4xIiByPSI1My4xIiBmaWxsPSIjZjI5MjM1IiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU0LjQ3IDEzLjc2YTI4Ljg1IDI4Ljg1IDAgMDAtMjguNzMgMjguNzMgMjkuMzQgMjkuMzQgMCAwMDEuNTIgOS4zNCA0IDQgMCAxMDcuNDktMi41MkExOC42NyAxOC42NyAwIDAxMzMuNjMgNDJhMjAuNzIgMjAuNzIgMCAxMTIyIDIxLjMxcy00IC4yNS02IC40OWMtLjc0LjExLTEuNDguMjYtMi4yLjQ0YS4yOC4yOCAwIDAxLS4zOCAwIC4yNy4yNyAwIDAxMC0uMzJsLjYzLTMuNDEgMy43OS0xN2EzLjk0IDMuOTQgMCAxMC03LjcxLTEuNjVzLTkgNDEuNy05IDQyLjA4YTMuNzkgMy43OSAwIDAwMi43NCA0LjZoLjI4YTMuNzggMy43OCAwIDAwNC42MS0yLjcxLjQzLjQzIDAgMDAwLS4xMXYtLjE5Yy4xMS0uNDkgMS4yNS02IDEuMjUtNmExMC4yMyAxMC4yMyAwIDAxOC40Ni04Yy44Ny0uMTMgNC41My0uMzggNC41My0uMzhhMjguNzEgMjguNzEgMCAwMC0yLjExLTU3LjI3eiIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU2LjIxIDgwYTQuNzggNC43OCAwIDAwLTUuNjYgMy43MS4yNC4yNCAwIDAxMCAuMDggNC43NyA0Ljc3IDAgMDAzLjY1IDUuNjdoLjE0QTQuNyA0LjcgMCAwMDYwIDg2di0uMzJBNSA1IDAgMDA1Ni4yMSA4MHoiCiAgICAgICAgLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvc3ZnPg=="
23
+ },
24
+ "subwallet-js": {
25
+ name: "SubWallet",
26
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNODAgNGM1Ny42MyAwIDc2IDE4LjM3IDc2IDc2IDAgNTcuNjMtMTguMzcgNzYtNzYgNzYtNTcuNjMgMC03Ni0xOC4zNy03Ni03NkM0IDIyLjM3IDIyLjM3IDQgODAgNFoiIGZpbGw9InVybCgjYSkiLz48ZyBjbGlwLXBhdGg9InVybCgjYikiPjxwYXRoIGQ9Ik0xMTIuNjE1IDY2LjcyVjUzLjM5OEw1OC43NiAzMiA0OCAzNy40MTJsLjA1NyA0MS40NjQgNDAuMjkyIDE2LjA3LTIxLjUyIDkuMDc1di03LjAxOEw1Ni45NSA5My4wM2wtOC44OTMgNC4xNjN2MjUuMzk1TDU4Ljc2OSAxMjhsNTMuODQ2LTI0LjA2MlY4Ni44NjlMNjQuMTU0IDY3LjY1N1Y1NmwzOC40NDkgMTUuMjE2IDEwLjAxMi00LjQ5NloiIGZpbGw9IiNmZmYiLz48L2c+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iODAiIHkxPSI0IiB4Mj0iODAiIHkyPSIxNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNENFQUFDIi8+PC9saW5lYXJHcmFkaWVudD48Y2xpcFBhdGggaWQ9ImIiPjxwYXRoIGZpbGw9IiNmZmYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4IDMyKSIgZD0iTTAgMGg2NC42MTV2OTZIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4="
27
+ },
28
+ enkrypt: {
29
+ name: "Enkrypt",
30
+ icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODEiIGhlaWdodD0iODEiIHZpZXdCb3g9IjAgMCA4MSA4MSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNy4wMDU3IDE3LjAwNjJDMTguOTMwMyAxNS4wODE2IDIxLjU0MDUgMTQuMDAwNCAyNC4yNjIyIDE0LjAwMDRMNjcuMzI5NiAxNFYyMS44NzQxQzY3LjMyOTYgMjMuODMwNSA2Ni41NTIzIDI1LjcwNjcgNjUuMTY5IDI3LjA5QzYzLjc4NTcgMjguNDczMyA2MS45MDk1IDI5LjI1MDQgNTkuOTUzMiAyOS4yNTA0SDM5LjcwNDVDMzYuOTgyOCAyOS4yNTA0IDM0LjM3MjYgMzAuMzMxNiAzMi40NDggMzIuMjU2MUMzMC41MjM1IDM0LjE4MDcgMjkuNDQyMyAzNi43OTA5IDI5LjQ0MjMgMzkuNTEyNlY0Mi4xMjQyQzI5LjQ0MjMgNDQuODQ1OSAzMC41MjM1IDQ3LjQ1NjEgMzIuNDQ4IDQ5LjM4MDZDMzQuMzcyNiA1MS4zMDUxIDM2Ljk4MjggNTIuMzg2MyAzOS43MDQ1IDUyLjM4NjNINTkuOTUzMkM2MS45MDk1IDUyLjM4NjMgNjMuNzg1NyA1My4xNjM1IDY1LjE2OSA1NC41NDY4QzY2LjU1MjMgNTUuOTMwMSA2Ny4zMjk2IDU3LjgwNjMgNjcuMzI5NiA1OS43NjI2VjY3LjMzSDI0LjI2MjJDMjEuNTQwNSA2Ny4zMyAxOC45MzAzIDY2LjI0ODggMTcuMDA1NyA2NC4zMjQzQzE1LjA4MTIgNjIuMzk5NyAxNCA1OS43ODk1IDE0IDU3LjA2NzhWMjQuMjYyNkMxNCAyMS41NDA5IDE1LjA4MTIgMTguOTMwNyAxNy4wMDU3IDE3LjAwNjJaTTQwLjE0NzkgMzMuNTQyM0g2MC45MTU3QzY0LjQ1OCAzMy41NDIzIDY3LjMyOTUgMzYuNDEzOCA2Ny4zMjk1IDM5Ljk1NjFWNDEuNjgxNkM2Ny4zMjk1IDQ1LjIyMzggNjQuNDU4IDQ4LjA5NTQgNjAuOTE1NyA0OC4wOTU0SDQwLjE0NzlDMzYuNjA1NyA0OC4wOTU0IDMzLjczNDEgNDUuMjIzOCAzMy43MzQxIDQxLjY4MTZWMzkuOTU2MUMzMy43MzQxIDM2LjQxMzggMzYuNjA1NyAzMy41NDIzIDQwLjE0NzkgMzMuNTQyM1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8yODdfMjM1OSkiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yODdfMjM1OSIgeDE9IjE5LjM2MDIiIHkxPSIxNCIgeDI9IjU2Ljc2OTYiIHkyPSI2OS44MDA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDNTQ5RkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjU0QkZGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg=="
31
+ }
32
+ };
33
+
34
+ // src/utils/isWalletPlatform.ts
35
+ var isWalletPlatform = (platform) => typeof platform === "string" && ["polkadot", "ethereum"].includes(platform);
36
+
37
+ // src/utils/WalletId.ts
38
+ var getWalletId = (platform, identifier) => {
39
+ if (!isWalletPlatform(platform)) throw new Error("Invalid platform");
40
+ if (!identifier) throw new Error("Invalid name");
41
+ return `${platform}:${identifier}`;
42
+ };
43
+ var parseWalletId = (walletId) => {
44
+ if (!walletId) throw new Error("Invalid walletId");
45
+ const [platform, identifier] = walletId.split(":");
46
+ if (!isWalletPlatform(platform)) throw new Error("Invalid platform");
47
+ if (!identifier) throw new Error("Invalid address");
48
+ return { platform, identifier };
49
+ };
50
+
51
+ // src/utils/hydrateState.ts
52
+ var lookupWalletIcon = (platform, identifier) => {
53
+ if (platform === "polkadot") {
54
+ return POLKADOT_EXTENSIONS[identifier]?.icon ?? "";
55
+ }
56
+ return "";
57
+ };
58
+ var PendingWalletError = class extends Error {
59
+ constructor(walletId) {
60
+ super(
61
+ `Wallet ${walletId} is still loading. Wait for isHydrating to be false before calling connect/disconnect.`
62
+ );
63
+ this.name = "PendingWalletError";
64
+ }
65
+ };
66
+ var hydrateWallet = (cached) => {
67
+ const { platform, identifier } = parseWalletId(cached.id);
68
+ const throwPending = () => {
69
+ throw new PendingWalletError(cached.id);
70
+ };
71
+ const icon = lookupWalletIcon(platform, identifier);
72
+ if (platform === "polkadot") {
73
+ return {
74
+ id: cached.id,
75
+ platform: "polkadot",
76
+ type: "injected",
77
+ extensionId: identifier,
78
+ extension: void 0,
79
+ name: cached.name,
80
+ icon,
81
+ isConnected: cached.isConnected,
82
+ connect: throwPending,
83
+ disconnect: throwPending
84
+ };
85
+ }
86
+ if (platform === "ethereum") {
87
+ return {
88
+ id: cached.id,
89
+ platform: "ethereum",
90
+ type: "injected",
91
+ providerId: identifier,
92
+ provider: {},
93
+ // Placeholder - will be replaced by real wallet
94
+ name: cached.name,
95
+ icon,
96
+ isConnected: cached.isConnected,
97
+ connect: throwPending,
98
+ disconnect: throwPending
99
+ };
100
+ }
101
+ throw new Error(`Unknown platform: ${platform}`);
102
+ };
103
+ var hydrateAccount = (cached) => {
104
+ if (cached.platform === "polkadot") {
105
+ return {
106
+ id: cached.id,
107
+ platform: "polkadot",
108
+ address: cached.address,
109
+ name: cached.name,
110
+ walletId: cached.walletId,
111
+ walletName: cached.walletName,
112
+ // PolkadotSigner is required but we can't provide a real one
113
+ // This is a placeholder that will be replaced by the real account
114
+ polkadotSigner: {}
115
+ };
116
+ }
117
+ if (cached.platform === "ethereum") {
118
+ return {
119
+ id: cached.id,
120
+ platform: "ethereum",
121
+ address: cached.address,
122
+ walletId: cached.walletId,
123
+ walletName: cached.walletName,
124
+ isWalletDefault: false,
125
+ client: {}
126
+ // Placeholder
127
+ };
128
+ }
129
+ throw new Error(`Unknown platform: ${cached.platform}`);
130
+ };
131
+ var serializeWallet = (wallet) => ({
132
+ id: wallet.id,
133
+ platform: wallet.platform,
134
+ type: wallet.type,
135
+ name: wallet.name,
136
+ // Note: icon is NOT stored to save cookie space
137
+ isConnected: wallet.isConnected
138
+ });
139
+ var serializeAccount = (account) => ({
140
+ id: account.id,
141
+ platform: account.platform,
142
+ address: account.address,
143
+ name: "name" in account ? account.name : void 0,
144
+ walletId: account.walletId,
145
+ walletName: account.walletName
146
+ });
147
+
148
+ // src/utils/storage.ts
149
+ var noopStorage = {
150
+ getItem: () => null,
151
+ setItem: () => {
152
+ },
153
+ removeItem: () => {
154
+ }
155
+ };
156
+ var _safeLocalStorage = null;
157
+ var createSafeLocalStorage = () => {
158
+ if (typeof window === "undefined") return noopStorage;
159
+ try {
160
+ const testKey = "__kheopskit_test__";
161
+ window.localStorage.setItem(testKey, testKey);
162
+ window.localStorage.removeItem(testKey);
163
+ return {
164
+ getItem: (key) => window.localStorage.getItem(key),
165
+ setItem: (key, value) => window.localStorage.setItem(key, value),
166
+ removeItem: (key) => window.localStorage.removeItem(key),
167
+ subscribe: (key, callback) => {
168
+ const handler = (event) => {
169
+ if (event.key === key) {
170
+ callback(event.newValue);
171
+ }
172
+ };
173
+ window.addEventListener("storage", handler);
174
+ return () => window.removeEventListener("storage", handler);
175
+ }
176
+ };
177
+ } catch {
178
+ return noopStorage;
179
+ }
180
+ };
181
+ var getSafeLocalStorage = () => {
182
+ if (_safeLocalStorage === null) {
183
+ _safeLocalStorage = createSafeLocalStorage();
184
+ }
185
+ return _safeLocalStorage;
186
+ };
187
+ var safeLocalStorage = {
188
+ getItem: (key) => getSafeLocalStorage().getItem(key),
189
+ setItem: (key, value) => getSafeLocalStorage().setItem(key, value),
190
+ removeItem: (key) => getSafeLocalStorage().removeItem(key),
191
+ subscribe: (key, callback) => {
192
+ const storage = getSafeLocalStorage();
193
+ return storage.subscribe?.(key, callback) ?? (() => {
194
+ });
195
+ }
196
+ };
197
+ var parseCookie = (cookieString, key) => {
198
+ if (!cookieString) return null;
199
+ for (const cookie of cookieString.split(";")) {
200
+ const [k, ...v] = cookie.split("=");
201
+ const cookieKey = k?.trim();
202
+ if (cookieKey === key) {
203
+ try {
204
+ return decodeURIComponent(v.join("=").trim());
205
+ } catch {
206
+ return null;
207
+ }
208
+ }
209
+ }
210
+ return null;
211
+ };
212
+ var COOKIE_MAX_SIZE = 3 * 1024;
213
+ var BROADCAST_CHANNEL_NAME = "kheopskit-storage-sync";
214
+ var sharedBroadcastChannel = null;
215
+ var getBroadcastChannel = () => {
216
+ if (sharedBroadcastChannel) return sharedBroadcastChannel;
217
+ if (typeof BroadcastChannel === "undefined") return null;
218
+ try {
219
+ sharedBroadcastChannel = new BroadcastChannel(BROADCAST_CHANNEL_NAME);
220
+ } catch {
221
+ }
222
+ return sharedBroadcastChannel;
223
+ };
224
+ var isSecureConnection = () => typeof window !== "undefined" && window.location.protocol === "https:";
225
+ var cookieStorage = (initialCookies) => {
226
+ return {
227
+ getItem: (key) => {
228
+ const cookieString = typeof document !== "undefined" ? document.cookie : initialCookies;
229
+ return parseCookie(cookieString, key);
230
+ },
231
+ setItem: (key, value) => {
232
+ if (typeof document === "undefined") return;
233
+ const encodedValue = encodeURIComponent(value);
234
+ if (encodedValue.length > COOKIE_MAX_SIZE) {
235
+ console.warn(
236
+ `[kheopskit] Cookie value for "${key}" exceeds recommended size limit (${encodedValue.length} > ${COOKIE_MAX_SIZE} bytes). This may cause issues with cookie storage. Consider reducing the number of connected wallets.`
237
+ );
238
+ }
239
+ const expires = /* @__PURE__ */ new Date();
240
+ expires.setFullYear(expires.getFullYear() + 1);
241
+ let cookieStr = `${key}=${encodedValue};expires=${expires.toUTCString()};path=/;SameSite=Lax`;
242
+ if (isSecureConnection()) {
243
+ cookieStr += ";Secure";
244
+ }
245
+ document.cookie = cookieStr;
246
+ getBroadcastChannel()?.postMessage({ type: "set", key, value });
247
+ },
248
+ removeItem: (key) => {
249
+ if (typeof document === "undefined") return;
250
+ let cookieStr = `${key}=;expires=Thu, 01 Jan 1970 00:00:01 GMT;path=/;SameSite=Lax`;
251
+ if (isSecureConnection()) {
252
+ cookieStr += ";Secure";
253
+ }
254
+ document.cookie = cookieStr;
255
+ getBroadcastChannel()?.postMessage({ type: "remove", key });
256
+ },
257
+ subscribe: (key, callback) => {
258
+ const channel = getBroadcastChannel();
259
+ if (!channel) return () => {
260
+ };
261
+ const handler = (event) => {
262
+ const data = event.data;
263
+ if (data.key === key) {
264
+ if (data.type === "set") {
265
+ callback(data.value ?? null);
266
+ } else if (data.type === "remove") {
267
+ callback(null);
268
+ }
269
+ }
270
+ };
271
+ channel.addEventListener("message", handler);
272
+ return () => {
273
+ channel.removeEventListener("message", handler);
274
+ };
275
+ }
276
+ };
277
+ };
278
+
279
+ // src/utils/iconCache.ts
280
+ var ICON_CACHE_KEY = "kheopskit-icons";
281
+ var memoryCache = null;
282
+ var loadCache = () => {
283
+ if (memoryCache !== null) return memoryCache;
284
+ try {
285
+ const stored = safeLocalStorage.getItem(ICON_CACHE_KEY);
286
+ memoryCache = stored ? JSON.parse(stored) : {};
287
+ } catch {
288
+ memoryCache = {};
289
+ }
290
+ return memoryCache;
291
+ };
292
+ var saveCache = (cache) => {
293
+ try {
294
+ safeLocalStorage.setItem(ICON_CACHE_KEY, JSON.stringify(cache));
295
+ memoryCache = cache;
296
+ } catch {
297
+ }
298
+ };
299
+ var getCachedIcon = (walletId) => {
300
+ const cache = loadCache();
301
+ return cache[walletId] || void 0;
302
+ };
303
+ var setCachedIcons = (icons) => {
304
+ const cache = loadCache();
305
+ let changed = false;
306
+ for (const [walletId, icon] of Object.entries(icons)) {
307
+ if (icon && cache[walletId] !== icon) {
308
+ cache[walletId] = icon;
309
+ changed = true;
310
+ }
311
+ }
312
+ if (changed) {
313
+ saveCache(cache);
314
+ }
315
+ };
316
+
317
+ // src/api/appKit.ts
318
+ import {
319
+ BehaviorSubject,
320
+ combineLatest,
321
+ distinctUntilChanged,
322
+ from,
323
+ map,
324
+ Observable,
325
+ of,
326
+ shareReplay,
327
+ switchMap
328
+ } from "rxjs";
329
+ var loadAppKit = async () => {
330
+ const { createAppKit } = await import("@reown/appkit/core");
331
+ return createAppKit;
332
+ };
333
+ var WALLET_CONNECT_ICON = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+";
334
+ var cachedAppKit = null;
335
+ var resetAppKitCache = () => {
336
+ cachedAppKit = null;
337
+ };
338
+ var getAppKitWallets$ = (config) => {
339
+ if (!config.walletConnect) return of({});
340
+ if (typeof window === "undefined") return of({});
341
+ const walletConnect = config.walletConnect;
342
+ if (!cachedAppKit) {
343
+ cachedAppKit = from(loadAppKit()).pipe(
344
+ switchMap((createAppKit) => {
345
+ return new Observable((subscriber) => {
346
+ const appKit = createAppKit({
347
+ projectId: walletConnect.projectId,
348
+ metadata: walletConnect.metadata,
349
+ networks: walletConnect.networks,
350
+ themeMode: walletConnect.themeMode,
351
+ themeVariables: walletConnect.themeVariables,
352
+ universalProviderConfigOverride: {
353
+ methods: {
354
+ polkadot: ["polkadot_signTransaction", "polkadot_signMessage"]
355
+ }
356
+ },
357
+ allWallets: "HIDE",
358
+ debug: config.debug,
359
+ allowUnsupportedChain: true
360
+ });
361
+ const status$ = new BehaviorSubject({
362
+ isPolkadotConnected: false,
363
+ isEthereumConnected: false
364
+ });
365
+ const unsubProviders = appKit.subscribeProviders((providers) => {
366
+ status$.next({
367
+ isPolkadotConnected: !!providers.polkadot,
368
+ isEthereumConnected: !!providers.eip155
369
+ });
370
+ });
371
+ const polkadotWallet$ = appKit.chainNamespaces.includes("polkadot") ? status$.pipe(
372
+ map((s) => s.isPolkadotConnected),
373
+ distinctUntilChanged(),
374
+ map((isConnected) => {
375
+ const walletInfo = appKit.getWalletInfo();
376
+ return {
377
+ id: getWalletId("polkadot", "walletconnect"),
378
+ platform: "polkadot",
379
+ type: "appKit",
380
+ appKit,
381
+ // todo maybe we dont want to expose the appKit instance
382
+ name: walletInfo?.name ?? "WalletConnect",
383
+ icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
384
+ connect: async () => {
385
+ if (!isConnected) await appKit.open();
386
+ },
387
+ disconnect: () => {
388
+ if (isConnected) appKit.disconnect();
389
+ },
390
+ isConnected
391
+ };
392
+ })
393
+ ) : of(void 0);
394
+ const ethereumWallet$ = appKit.chainNamespaces.includes("eip155") ? status$.pipe(
395
+ map((s) => s.isEthereumConnected),
396
+ distinctUntilChanged(),
397
+ map((isConnected) => {
398
+ const walletInfo = appKit.getWalletInfo();
399
+ return {
400
+ id: getWalletId("ethereum", "walletconnect"),
401
+ platform: "ethereum",
402
+ type: "appKit",
403
+ appKit,
404
+ name: walletInfo?.name ?? "WalletConnect",
405
+ icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
406
+ connect: () => appKit.open(),
407
+ disconnect: () => appKit.disconnect(),
408
+ isConnected
409
+ };
410
+ })
411
+ ) : of(void 0);
412
+ const sub = combineLatest({
413
+ polkadot: polkadotWallet$,
414
+ ethereum: ethereumWallet$
415
+ }).subscribe(subscriber);
416
+ return () => {
417
+ sub.unsubscribe();
418
+ unsubProviders();
419
+ };
420
+ });
421
+ }),
422
+ shareReplay({ refCount: true, bufferSize: 1 })
423
+ );
424
+ }
425
+ return cachedAppKit;
426
+ };
427
+
1
428
  // src/api/config.ts
429
+ var DEFAULT_STORAGE_KEY = "kheopskit";
2
430
  var DEFAULT_CONFIG = {
3
431
  autoReconnect: true,
4
432
  platforms: ["polkadot"],
5
- debug: false
433
+ debug: false,
434
+ storageKey: DEFAULT_STORAGE_KEY,
435
+ hydrationGracePeriod: 500
6
436
  };
7
437
  var resolveConfig = (config) => {
8
438
  return Object.assign({}, DEFAULT_CONFIG, config);
@@ -10,13 +440,129 @@ var resolveConfig = (config) => {
10
440
 
11
441
  // src/api/kheopskit.ts
12
442
  import {
13
- combineLatest as combineLatest8,
443
+ combineLatest as combineLatest9,
444
+ debounceTime,
445
+ distinctUntilChanged as distinctUntilChanged6,
446
+ filter as filter3,
14
447
  map as map9,
15
- Observable as Observable8,
16
- shareReplay as shareReplay8,
448
+ Observable as Observable9,
449
+ shareReplay as shareReplay9,
17
450
  throttleTime
18
451
  } from "rxjs";
19
452
 
453
+ // src/utils/createHydrationBuffer.ts
454
+ import {
455
+ BehaviorSubject as BehaviorSubject2,
456
+ combineLatest as combineLatest2,
457
+ filter,
458
+ map as map2,
459
+ Observable as Observable2,
460
+ Subscription,
461
+ shareReplay as shareReplay2,
462
+ startWith,
463
+ take,
464
+ timer
465
+ } from "rxjs";
466
+ var createBufferCore = (cachedItems, liveItems$, gracePeriodMs, mergeFn, isConverged) => {
467
+ if (gracePeriodMs <= 0 || cachedItems.length === 0) {
468
+ return liveItems$.pipe(map2((items) => ({ items, isHydrating: false })));
469
+ }
470
+ return new Observable2((subscriber) => {
471
+ const subscriptions = new Subscription();
472
+ const isHydrating$ = new BehaviorSubject2(true);
473
+ const liveWithInitial$ = liveItems$.pipe(startWith([]));
474
+ if (isConverged) {
475
+ const timerFired$ = timer(gracePeriodMs).pipe(
476
+ map2(() => true),
477
+ startWith(false),
478
+ shareReplay2({ bufferSize: 1, refCount: true })
479
+ );
480
+ subscriptions.add(
481
+ combineLatest2([liveWithInitial$, timerFired$]).pipe(
482
+ filter(([, timerFired]) => timerFired),
483
+ filter(([liveItems]) => isConverged(liveItems, cachedItems)),
484
+ take(1)
485
+ ).subscribe(() => {
486
+ isHydrating$.next(false);
487
+ })
488
+ );
489
+ subscriptions.add(
490
+ timer(gracePeriodMs * 6).subscribe(() => {
491
+ if (isHydrating$.value) {
492
+ isHydrating$.next(false);
493
+ }
494
+ })
495
+ );
496
+ } else {
497
+ subscriptions.add(
498
+ timer(gracePeriodMs).subscribe(() => {
499
+ isHydrating$.next(false);
500
+ })
501
+ );
502
+ }
503
+ subscriptions.add(
504
+ combineLatest2([liveWithInitial$, isHydrating$]).pipe(
505
+ map2(([liveItems, isHydrating]) => {
506
+ if (!isHydrating) {
507
+ return { items: liveItems, isHydrating: false };
508
+ }
509
+ return {
510
+ items: mergeFn(liveItems, cachedItems),
511
+ isHydrating: true
512
+ };
513
+ })
514
+ ).subscribe(subscriber)
515
+ );
516
+ return () => {
517
+ subscriptions.unsubscribe();
518
+ isHydrating$.complete();
519
+ };
520
+ });
521
+ };
522
+ var createHydrationBuffer = (cachedItems, liveItems$, gracePeriodMs, getKey, isConverged, mergeItem, transformCachedOnly) => {
523
+ return createBufferCore(
524
+ cachedItems,
525
+ liveItems$,
526
+ gracePeriodMs,
527
+ (liveItems, cached) => {
528
+ const cachedByKey = new Map(cached.map((item) => [getKey(item), item]));
529
+ const liveKeys = new Set(liveItems.map(getKey));
530
+ const mergedItems = liveItems.map((liveItem) => {
531
+ const key = getKey(liveItem);
532
+ const cachedItem = cachedByKey.get(key);
533
+ if (!cachedItem) return liveItem;
534
+ return mergeItem ? mergeItem(liveItem, cachedItem) : cachedItem;
535
+ });
536
+ for (const cachedItem of cached) {
537
+ if (!liveKeys.has(getKey(cachedItem))) {
538
+ const transformed = transformCachedOnly ? transformCachedOnly(cachedItem) : cachedItem;
539
+ mergedItems.push(transformed);
540
+ }
541
+ }
542
+ return mergedItems;
543
+ },
544
+ isConverged
545
+ );
546
+ };
547
+ var createAccountHydrationBuffer = (cachedAccounts, liveAccounts$, gracePeriodMs, getWalletId2, isConverged) => {
548
+ return createBufferCore(
549
+ cachedAccounts,
550
+ liveAccounts$,
551
+ gracePeriodMs,
552
+ (liveAccounts, cached) => {
553
+ const walletsWithLiveAccounts = new Set(liveAccounts.map(getWalletId2));
554
+ const mergedAccounts = [...liveAccounts];
555
+ for (const cachedAccount of cached) {
556
+ if (!walletsWithLiveAccounts.has(getWalletId2(cachedAccount))) {
557
+ mergedAccounts.push(cachedAccount);
558
+ }
559
+ }
560
+ return mergedAccounts;
561
+ },
562
+ isConverged
563
+ );
564
+ };
565
+
20
566
  // src/utils/logObservable.ts
21
567
  import { tap } from "rxjs";
22
568
  var logObservable = (label, opts) => tap((value) => {
@@ -28,7 +574,7 @@ var logObservable = (label, opts) => tap((value) => {
28
574
  });
29
575
 
30
576
  // src/api/accounts.ts
31
- import { combineLatest as combineLatest3, map as map4, Observable as Observable3, of as of3, shareReplay as shareReplay3 } from "rxjs";
577
+ import { combineLatest as combineLatest5, map as map5, Observable as Observable5, of as of4, shareReplay as shareReplay5 } from "rxjs";
32
578
 
33
579
  // src/utils/sortAccounts.ts
34
580
  var sortAccounts = (a1, a2) => {
@@ -49,21 +595,21 @@ var sortAccounts = (a1, a2) => {
49
595
  if (a2.walletName === "Talisman") return 1;
50
596
  return a1.walletName.localeCompare(a2.walletName);
51
597
  }
52
- return 0;
598
+ return a1.id.localeCompare(a2.id);
53
599
  }
54
600
  return 0;
55
601
  };
56
602
 
57
603
  // src/api/ethereum/accounts.ts
58
604
  import {
59
- combineLatest,
60
- distinctUntilChanged,
61
- map as map2,
62
- Observable,
63
- of,
605
+ combineLatest as combineLatest3,
606
+ distinctUntilChanged as distinctUntilChanged2,
607
+ map as map3,
608
+ Observable as Observable3,
609
+ of as of2,
64
610
  ReplaySubject,
65
- shareReplay,
66
- switchMap
611
+ shareReplay as shareReplay3,
612
+ switchMap as switchMap2
67
613
  } from "rxjs";
68
614
  import {
69
615
  createWalletClient,
@@ -72,22 +618,33 @@ import {
72
618
  } from "viem";
73
619
 
74
620
  // src/utils/createStore.ts
75
- import { BehaviorSubject, filter, fromEvent, map } from "rxjs";
76
- var createStore = (key, defaultValue) => {
77
- const subject = new BehaviorSubject(getStoredData(key, defaultValue));
78
- fromEvent(window, "storage").pipe(
79
- filter((event) => event.key === key),
80
- map((event) => parseData(event.newValue, defaultValue))
81
- ).subscribe((newValue) => subject.next(newValue));
621
+ import { BehaviorSubject as BehaviorSubject3 } from "rxjs";
622
+ var createStore = (key, defaultValue, storage = safeLocalStorage) => {
623
+ const subject = new BehaviorSubject3(
624
+ getStoredData(key, defaultValue, storage)
625
+ );
626
+ let unsubscribeStorage;
627
+ if (typeof window !== "undefined" && storage.subscribe) {
628
+ unsubscribeStorage = storage.subscribe(key, (newValue) => {
629
+ subject.next(parseData(newValue, defaultValue));
630
+ });
631
+ }
82
632
  const update = (val) => {
83
- setStoredData(key, val);
633
+ setStoredData(key, val, storage);
84
634
  subject.next(val);
85
635
  };
86
636
  return {
87
637
  observable: subject.asObservable(),
88
638
  set: (val) => update(val),
89
639
  mutate: (transform) => update(transform(subject.getValue())),
90
- get: () => structuredClone(subject.getValue())
640
+ get: () => structuredClone(subject.getValue()),
641
+ /**
642
+ * Cleanup subscriptions. Call this when the store is no longer needed.
643
+ */
644
+ destroy: () => {
645
+ unsubscribeStorage?.();
646
+ subject.complete();
647
+ }
91
648
  };
92
649
  };
93
650
  var parseData = (str, defaultValue) => {
@@ -97,13 +654,13 @@ var parseData = (str, defaultValue) => {
97
654
  }
98
655
  return defaultValue;
99
656
  };
100
- var getStoredData = (key, defaultValue) => {
101
- const str = localStorage.getItem(key);
657
+ var getStoredData = (key, defaultValue, storage) => {
658
+ const str = storage.getItem(key);
102
659
  return parseData(str, defaultValue);
103
660
  };
104
- var setStoredData = (key, val) => {
661
+ var setStoredData = (key, val, storage) => {
105
662
  const str = JSON.stringify(val);
106
- localStorage.setItem(key, str);
663
+ storage.setItem(key, str);
107
664
  };
108
665
 
109
666
  // src/utils/isEthereumAddress.ts
@@ -128,9 +685,6 @@ var isValidAddress = (address) => {
128
685
  return address.startsWith("0x") ? isEthereumAddress(address) : isSs58Address(address);
129
686
  };
130
687
 
131
- // src/utils/isWalletPlatform.ts
132
- var isWalletPlatform = (platform) => typeof platform === "string" && ["polkadot", "ethereum"].includes(platform);
133
-
134
688
  // src/utils/WalletAccountId.ts
135
689
  var getWalletAccountId = (walletId, address) => {
136
690
  if (!walletId) throw new Error("Missing walletId");
@@ -138,19 +692,12 @@ var getWalletAccountId = (walletId, address) => {
138
692
  return `${walletId}::${address}`;
139
693
  };
140
694
 
141
- // src/utils/getCachedObservable.ts
142
- var CACHE = /* @__PURE__ */ new Map();
143
- var getCachedObservable$ = (key, create) => {
144
- if (!CACHE.has(key)) CACHE.set(key, create());
145
- return CACHE.get(key);
146
- };
147
-
148
695
  // src/api/ethereum/accounts.ts
149
696
  var getInjectedWalletAccounts$ = (wallet) => {
150
- if (!wallet.isConnected) return of([]);
697
+ if (!wallet.isConnected) return of2([]);
151
698
  return getCachedObservable$(
152
699
  `accounts:${wallet.id}`,
153
- () => new Observable((subscriber) => {
700
+ () => new Observable3((subscriber) => {
154
701
  const getAccount = (address, i) => {
155
702
  const client = createWalletClient({
156
703
  account: address,
@@ -182,7 +729,7 @@ var getInjectedWalletAccounts$ = (wallet) => {
182
729
  handleAccountsChanged
183
730
  );
184
731
  };
185
- }).pipe(shareReplay({ refCount: true, bufferSize: 1 }))
732
+ }).pipe(shareReplay3({ refCount: true, bufferSize: 1 }))
186
733
  );
187
734
  };
188
735
  var wrapWalletConnectProvider = (provider, sessionTopic, caipNetworkId) => {
@@ -203,10 +750,10 @@ var getAppKitAccounts$ = (wallet) => {
203
750
  const account = wallet.appKit.getAccount("eip155");
204
751
  const provider = wallet.appKit.getProvider("eip155");
205
752
  if (!wallet.isConnected || !wallet.appKit || !account?.allAccounts.length || !provider?.session)
206
- return of([]);
753
+ return of2([]);
207
754
  return getCachedObservable$(
208
755
  "accounts:appKit",
209
- () => new Observable((subscriber) => {
756
+ () => new Observable3((subscriber) => {
210
757
  const caipNetworkId$ = new ReplaySubject(1);
211
758
  const handleChainChanged = (chainId) => {
212
759
  caipNetworkId$.next(`eip155:${chainId}`);
@@ -214,8 +761,8 @@ var getAppKitAccounts$ = (wallet) => {
214
761
  provider.on("chainChanged", handleChainChanged);
215
762
  provider.request({ method: "eth_chainId" }).then(handleChainChanged);
216
763
  const sub = caipNetworkId$.pipe(
217
- distinctUntilChanged(),
218
- map2(
764
+ distinctUntilChanged2(),
765
+ map3(
219
766
  (caipNetworkId) => custom(
220
767
  wrapWalletConnectProvider(
221
768
  provider,
@@ -225,7 +772,7 @@ var getAppKitAccounts$ = (wallet) => {
225
772
  )
226
773
  )
227
774
  ),
228
- map2(
775
+ map3(
229
776
  (transport) => account.allAccounts.map((acc, i) => {
230
777
  const client = createWalletClient({
231
778
  account: acc.address,
@@ -247,28 +794,28 @@ var getAppKitAccounts$ = (wallet) => {
247
794
  provider.off("chainChanged", handleChainChanged);
248
795
  sub.unsubscribe();
249
796
  };
250
- }).pipe(shareReplay({ refCount: true, bufferSize: 1 }))
797
+ }).pipe(shareReplay3({ refCount: true, bufferSize: 1 }))
251
798
  );
252
799
  };
253
- var getEthereumAccounts$ = (ethereumWallets) => new Observable((subscriber) => {
800
+ var getEthereumAccounts$ = (ethereumWallets) => new Observable3((subscriber) => {
254
801
  const sub = ethereumWallets.pipe(
255
- map2((wallets) => wallets.filter((w) => w.isConnected)),
256
- switchMap((wallets) => {
257
- return wallets.length ? combineLatest([
802
+ map3((wallets) => wallets.filter((w) => w.isConnected)),
803
+ switchMap2((wallets) => {
804
+ return wallets.length ? combineLatest3([
258
805
  ...wallets.filter((w) => w.type === "injected").map(getInjectedWalletAccounts$),
259
806
  ...wallets.filter((w) => w.type === "appKit").map(getAppKitAccounts$)
260
807
  // todo appkit
261
- ]) : of([]);
808
+ ]) : of2([]);
262
809
  }),
263
- map2((accounts) => accounts.flat()),
264
- distinctUntilChanged(isSameAccountsList)
810
+ map3((accounts) => accounts.flat()),
811
+ distinctUntilChanged2(isSameAccountsList)
265
812
  ).subscribe(subscriber);
266
813
  return () => {
267
814
  sub.unsubscribe();
268
815
  };
269
816
  }).pipe(
270
817
  // logObservable("ethereumAccounts$", true),
271
- shareReplay({ refCount: true, bufferSize: 1 })
818
+ shareReplay3({ refCount: true, bufferSize: 1 })
272
819
  );
273
820
  var isSameAccountsList = (a, b) => {
274
821
  if (a.length !== b.length) return false;
@@ -280,17 +827,17 @@ import {
280
827
  getPolkadotSignerFromPjs
281
828
  } from "polkadot-api/pjs-signer";
282
829
  import {
283
- combineLatest as combineLatest2,
284
- distinctUntilChanged as distinctUntilChanged2,
285
- map as map3,
286
- Observable as Observable2,
287
- of as of2,
288
- shareReplay as shareReplay2,
289
- switchMap as switchMap2
830
+ combineLatest as combineLatest4,
831
+ distinctUntilChanged as distinctUntilChanged3,
832
+ map as map4,
833
+ Observable as Observable4,
834
+ of as of3,
835
+ shareReplay as shareReplay4,
836
+ switchMap as switchMap3
290
837
  } from "rxjs";
291
838
  var getInjectedWalletAccounts$2 = (wallet) => {
292
- if (!wallet.isConnected) return of2([]);
293
- return new Observable2((subscriber) => {
839
+ if (!wallet.isConnected) return of3([]);
840
+ return new Observable4((subscriber) => {
294
841
  const getAccount = (account) => ({
295
842
  id: getWalletAccountId(wallet.id, account.address),
296
843
  ...account,
@@ -351,8 +898,8 @@ var getAppKitAccounts$2 = (wallet) => {
351
898
  const account = wallet.appKit.getAccount("polkadot");
352
899
  const provider = wallet.appKit.getProvider("polkadot");
353
900
  if (!wallet.isConnected || !wallet.appKit || !account?.allAccounts.length || !provider?.session)
354
- return of2([]);
355
- return of2(
901
+ return of3([]);
902
+ return of3(
356
903
  account.allAccounts.map(
357
904
  (acc) => ({
358
905
  id: getWalletAccountId(wallet.id, acc.address),
@@ -368,22 +915,22 @@ var getAppKitAccounts$2 = (wallet) => {
368
915
  )
369
916
  );
370
917
  };
371
- var getPolkadotAccounts$ = (polkadotWallets$) => new Observable2((subscriber) => {
918
+ var getPolkadotAccounts$ = (polkadotWallets$) => new Observable4((subscriber) => {
372
919
  const sub = polkadotWallets$.pipe(
373
- map3((wallets) => wallets.filter((w) => w.isConnected)),
374
- switchMap2(
375
- (wallets) => wallets.length ? combineLatest2([
920
+ map4((wallets) => wallets.filter((w) => w.isConnected)),
921
+ switchMap3(
922
+ (wallets) => wallets.length ? combineLatest4([
376
923
  ...wallets.filter((w) => w.type === "injected").map(getInjectedWalletAccounts$2),
377
924
  ...wallets.filter((w) => w.type === "appKit").map(getAppKitAccounts$2)
378
- ]) : of2([])
925
+ ]) : of3([])
379
926
  ),
380
- map3((accounts) => accounts.flat()),
381
- distinctUntilChanged2(isSameAccountsList2)
927
+ map4((accounts) => accounts.flat()),
928
+ distinctUntilChanged3(isSameAccountsList2)
382
929
  ).subscribe(subscriber);
383
930
  return () => {
384
931
  sub.unsubscribe();
385
932
  };
386
- }).pipe(shareReplay2({ refCount: true, bufferSize: 1 }));
933
+ }).pipe(shareReplay4({ refCount: true, bufferSize: 1 }));
387
934
  var isSameAccountsList2 = (a, b) => {
388
935
  if (a.length !== b.length) return false;
389
936
  return a.every((account, i) => account.id === b[i]?.id);
@@ -391,47 +938,215 @@ var isSameAccountsList2 = (a, b) => {
391
938
 
392
939
  // src/api/accounts.ts
393
940
  var getAccounts$ = (config, wallets) => {
394
- return new Observable3((subscriber) => {
941
+ return new Observable5((subscriber) => {
395
942
  const sources = config.platforms.map(
396
943
  (platform) => {
397
944
  switch (platform) {
398
945
  case "polkadot":
399
946
  return getPolkadotAccounts$(
400
947
  wallets.pipe(
401
- map4((w) => w.filter((w2) => w2.platform === "polkadot"))
948
+ map5((w) => w.filter((w2) => w2.platform === "polkadot"))
402
949
  )
403
950
  );
404
951
  case "ethereum":
405
952
  return getEthereumAccounts$(
406
953
  wallets.pipe(
407
- map4((w) => w.filter((w2) => w2.platform === "ethereum"))
954
+ map5((w) => w.filter((w2) => w2.platform === "ethereum"))
408
955
  )
409
956
  );
410
957
  }
411
958
  }
412
959
  );
413
- const accounts$ = sources.length ? combineLatest3(sources).pipe(
414
- map4((accounts) => accounts.flat().sort(sortAccounts))
415
- ) : of3([]);
960
+ const accounts$ = sources.length ? combineLatest5(sources).pipe(
961
+ map5((accounts) => accounts.flat().sort(sortAccounts))
962
+ ) : of4([]);
416
963
  const sub = accounts$.subscribe(subscriber);
417
964
  return () => {
418
965
  sub.unsubscribe();
419
966
  };
420
- }).pipe(shareReplay3({ refCount: true, bufferSize: 1 }));
967
+ }).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
968
+ };
969
+
970
+ // src/api/store.ts
971
+ import { uniq } from "lodash-es";
972
+ var DEFAULT_SETTINGS = {};
973
+ var createKheopskitStore = (options = {}) => {
974
+ const { ssrCookies, storageKey = DEFAULT_STORAGE_KEY } = options;
975
+ const storage = ssrCookies !== void 0 ? createCompactCookieStorage(ssrCookies) : safeLocalStorage;
976
+ const store2 = createStore(storageKey, DEFAULT_SETTINGS, storage);
977
+ const addEnabledWalletId = (walletId) => {
978
+ parseWalletId(walletId);
979
+ store2.mutate((prev) => ({
980
+ ...prev,
981
+ autoReconnect: uniq((prev.autoReconnect ?? []).concat(walletId))
982
+ }));
983
+ };
984
+ const removeEnabledWalletId = (walletId) => {
985
+ store2.mutate((prev) => ({
986
+ ...prev,
987
+ autoReconnect: uniq(
988
+ (prev.autoReconnect ?? []).filter((id) => id !== walletId)
989
+ )
990
+ }));
991
+ };
992
+ const getCachedState = () => {
993
+ const data = store2.get();
994
+ return {
995
+ wallets: data.cachedWallets ?? [],
996
+ accounts: data.cachedAccounts ?? []
997
+ };
998
+ };
999
+ const setCachedState = (wallets, accounts) => {
1000
+ store2.mutate((prev) => ({
1001
+ ...prev,
1002
+ cachedWallets: wallets,
1003
+ cachedAccounts: accounts
1004
+ }));
1005
+ };
1006
+ return {
1007
+ observable: store2.observable,
1008
+ addEnabledWalletId,
1009
+ removeEnabledWalletId,
1010
+ getCachedState,
1011
+ setCachedState
1012
+ };
1013
+ };
1014
+ var _defaultStore = null;
1015
+ var getDefaultStore = () => {
1016
+ if (_defaultStore === null) {
1017
+ _defaultStore = createKheopskitStore();
1018
+ }
1019
+ return _defaultStore;
1020
+ };
1021
+ var store = {
1022
+ get observable() {
1023
+ return getDefaultStore().observable;
1024
+ },
1025
+ addEnabledWalletId: (walletId) => getDefaultStore().addEnabledWalletId(walletId),
1026
+ removeEnabledWalletId: (walletId) => getDefaultStore().removeEnabledWalletId(walletId),
1027
+ getCachedState: () => getDefaultStore().getCachedState(),
1028
+ setCachedState: (wallets, accounts) => getDefaultStore().setCachedState(wallets, accounts)
1029
+ };
1030
+ var isCompactStore = (value) => {
1031
+ if (!value || typeof value !== "object" || Array.isArray(value)) return false;
1032
+ if ("cachedWallets" in value || "cachedAccounts" in value) return false;
1033
+ return "v" in value || "w" in value || "a" in value || "r" in value;
1034
+ };
1035
+ var toCompactStore = (data) => {
1036
+ const wallets = data.cachedWallets?.map(
1037
+ (wallet) => [
1038
+ wallet.id,
1039
+ wallet.name,
1040
+ wallet.isConnected ? 1 : 0,
1041
+ wallet.type === "appKit" ? 1 : 0
1042
+ ]
1043
+ );
1044
+ const accounts = data.cachedAccounts?.map(
1045
+ (account) => [
1046
+ account.walletId,
1047
+ account.address,
1048
+ account.name ?? null
1049
+ ]
1050
+ );
1051
+ return {
1052
+ v: 1,
1053
+ r: data.autoReconnect,
1054
+ w: wallets?.length ? wallets : void 0,
1055
+ a: accounts?.length ? accounts : void 0
1056
+ };
1057
+ };
1058
+ var fromCompactStore = (data) => {
1059
+ const walletNameMap = /* @__PURE__ */ new Map();
1060
+ const wallets = (data.w ?? []).map((item) => {
1061
+ const [id, name, isConnected, type] = item;
1062
+ walletNameMap.set(id, name);
1063
+ const { platform } = parseWalletId(id);
1064
+ return {
1065
+ id,
1066
+ platform,
1067
+ type: type === 1 ? "appKit" : "injected",
1068
+ name,
1069
+ isConnected: isConnected === 1
1070
+ };
1071
+ });
1072
+ const accounts = (data.a ?? []).map((item) => {
1073
+ const [walletId, address, name] = item;
1074
+ const { platform } = parseWalletId(walletId);
1075
+ return {
1076
+ id: getWalletAccountId(walletId, address),
1077
+ platform,
1078
+ address,
1079
+ name: name ?? void 0,
1080
+ walletId,
1081
+ walletName: walletNameMap.get(walletId) ?? walletId
1082
+ };
1083
+ });
1084
+ return {
1085
+ autoReconnect: data.r,
1086
+ cachedWallets: wallets,
1087
+ cachedAccounts: accounts
1088
+ };
1089
+ };
1090
+ var decodeStore = (raw, fallback) => {
1091
+ try {
1092
+ const parsed = JSON.parse(raw);
1093
+ if (isCompactStore(parsed)) return fromCompactStore(parsed);
1094
+ return parsed;
1095
+ } catch {
1096
+ return fallback;
1097
+ }
1098
+ };
1099
+ var encodeStore = (data) => JSON.stringify(toCompactStore(data));
1100
+ var createCompactCookieStorage = (initialCookies) => {
1101
+ const base = cookieStorage(initialCookies);
1102
+ return {
1103
+ getItem: (key) => {
1104
+ const raw = base.getItem(key);
1105
+ if (!raw) return null;
1106
+ const expanded = decodeStore(raw, DEFAULT_SETTINGS);
1107
+ if (typeof document !== "undefined") {
1108
+ try {
1109
+ const parsed = JSON.parse(raw);
1110
+ if (!isCompactStore(parsed)) {
1111
+ base.setItem(key, encodeStore(expanded));
1112
+ }
1113
+ } catch {
1114
+ }
1115
+ }
1116
+ return JSON.stringify(expanded);
1117
+ },
1118
+ setItem: (key, value) => {
1119
+ const expanded = decodeStore(value, DEFAULT_SETTINGS);
1120
+ base.setItem(key, encodeStore(expanded));
1121
+ },
1122
+ removeItem: base.removeItem,
1123
+ subscribe: (key, callback) => {
1124
+ const unsubscribe = base.subscribe?.(key, (value) => {
1125
+ if (!value) {
1126
+ callback(null);
1127
+ return;
1128
+ }
1129
+ const expanded = decodeStore(value, DEFAULT_SETTINGS);
1130
+ callback(JSON.stringify(expanded));
1131
+ });
1132
+ return () => {
1133
+ unsubscribe?.();
1134
+ };
1135
+ }
1136
+ };
421
1137
  };
422
1138
 
423
1139
  // src/api/wallets.ts
424
1140
  import {
425
- combineLatest as combineLatest7,
1141
+ combineLatest as combineLatest8,
426
1142
  distinct,
427
1143
  filter as filter2,
428
1144
  map as map8,
429
1145
  mergeMap,
430
- Observable as Observable7,
1146
+ Observable as Observable8,
431
1147
  of as of5,
432
- shareReplay as shareReplay7,
433
- startWith,
434
- take
1148
+ shareReplay as shareReplay8,
1149
+ take as take2
435
1150
  } from "rxjs";
436
1151
 
437
1152
  // src/utils/sortWallets.ts
@@ -445,220 +1160,86 @@ var sortWallets = (w1, w2) => {
445
1160
  };
446
1161
 
447
1162
  // src/api/ethereum/wallets.ts
448
- import { createStore as createStore2 } from "mipd";
449
1163
  import {
450
- BehaviorSubject as BehaviorSubject3,
451
- combineLatest as combineLatest5,
452
- map as map6,
453
- Observable as Observable5,
454
- shareReplay as shareReplay5
455
- } from "rxjs";
456
-
457
- // src/api/store.ts
458
- import { uniq } from "lodash";
459
-
460
- // src/utils/WalletId.ts
461
- var getWalletId = (platform, identifier) => {
462
- if (!isWalletPlatform(platform)) throw new Error("Invalid platform");
463
- if (!identifier) throw new Error("Invalid name");
464
- return `${platform}:${identifier}`;
465
- };
466
- var parseWalletId = (walletId) => {
467
- if (!walletId) throw new Error("Invalid walletId");
468
- const [platform, identifier] = walletId.split(":");
469
- if (!isWalletPlatform(platform)) throw new Error("Invalid platform");
470
- if (!identifier) throw new Error("Invalid address");
471
- return { platform, identifier };
472
- };
473
-
474
- // src/api/store.ts
475
- var LOCAL_STORAGE_KEY = "kheopskit";
476
- var DEFAULT_SETTINGS = {};
477
- var storage = createStore(LOCAL_STORAGE_KEY, DEFAULT_SETTINGS);
478
- var addEnabledWalletId = (walletId) => {
479
- parseWalletId(walletId);
480
- storage.mutate((prev) => ({
481
- ...prev,
482
- autoReconnect: uniq((prev.autoReconnect ?? []).concat(walletId))
483
- }));
484
- };
485
- var removeEnabledWalletId = (walletId) => {
486
- storage.mutate((prev) => ({
487
- ...prev,
488
- autoReconnect: uniq(
489
- (prev.autoReconnect ?? []).filter((id) => id !== walletId)
490
- )
491
- }));
492
- };
493
- var store = {
494
- observable: storage.observable,
495
- addEnabledWalletId,
496
- removeEnabledWalletId
497
- };
498
-
499
- // src/api/appKit.ts
500
- import { createAppKit } from "@reown/appkit/core";
1164
+ createStore as createMipdStore
1165
+ } from "mipd";
501
1166
  import {
502
- BehaviorSubject as BehaviorSubject2,
503
- combineLatest as combineLatest4,
504
- distinctUntilChanged as distinctUntilChanged3,
505
- map as map5,
506
- Observable as Observable4,
507
- of as of4,
508
- shareReplay as shareReplay4
1167
+ BehaviorSubject as BehaviorSubject4,
1168
+ combineLatest as combineLatest6,
1169
+ distinctUntilChanged as distinctUntilChanged4,
1170
+ map as map6,
1171
+ Observable as Observable6,
1172
+ shareReplay as shareReplay6
509
1173
  } from "rxjs";
510
- var WALLET_CONNECT_ICON = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+";
511
- var cachedAppKit = null;
512
- var getAppKitWallets$ = (config) => {
513
- if (!config.walletConnect) return of4({});
514
- const walletConnect = config.walletConnect;
515
- if (!cachedAppKit) {
516
- cachedAppKit = new Observable4((subscriber) => {
517
- const appKit = createAppKit({
518
- projectId: walletConnect.projectId,
519
- metadata: walletConnect.metadata,
520
- networks: walletConnect.networks,
521
- themeMode: walletConnect.themeMode,
522
- themeVariables: walletConnect.themeVariables,
523
- universalProviderConfigOverride: {
524
- methods: {
525
- polkadot: ["polkadot_signTransaction", "polkadot_signMessage"]
526
- }
527
- },
528
- allWallets: "HIDE",
529
- debug: config.debug,
530
- allowUnsupportedChain: true
531
- });
532
- const status$ = new BehaviorSubject2({
533
- isPolkadotConnected: false,
534
- isEthereumConnected: false
535
- });
536
- const unsubProviders = appKit.subscribeProviders((providers) => {
537
- status$.next({
538
- isPolkadotConnected: !!providers.polkadot,
539
- isEthereumConnected: !!providers.eip155
540
- });
541
- });
542
- const polkadotWallet$ = appKit.chainNamespaces.includes("polkadot") ? status$.pipe(
543
- map5((s) => s.isPolkadotConnected),
544
- distinctUntilChanged3(),
545
- map5((isConnected) => {
546
- const walletInfo = appKit.getWalletInfo();
547
- return {
548
- id: getWalletId("polkadot", "walletconnect"),
549
- platform: "polkadot",
550
- type: "appKit",
551
- appKit,
552
- // todo maybe we dont want to expose the appKit instance
553
- name: walletInfo?.name ?? "WalletConnect",
554
- icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
555
- connect: async () => {
556
- if (!isConnected) await appKit.open();
557
- },
558
- disconnect: () => {
559
- if (isConnected) appKit.disconnect();
560
- },
561
- isConnected
562
- };
563
- })
564
- ) : of4(void 0);
565
- const ethereumWallet$ = appKit.chainNamespaces.includes("eip155") ? status$.pipe(
566
- map5((s) => s.isEthereumConnected),
567
- distinctUntilChanged3(),
568
- map5((isConnected) => {
569
- const walletInfo = appKit.getWalletInfo();
570
- return {
571
- id: getWalletId("ethereum", "walletconnect"),
572
- platform: "ethereum",
573
- type: "appKit",
574
- appKit,
575
- name: walletInfo?.name ?? "WalletConnect",
576
- icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
577
- connect: () => appKit.open(),
578
- disconnect: () => appKit.disconnect(),
579
- isConnected
580
- };
581
- })
582
- ) : of4(void 0);
583
- const sub = combineLatest4({
584
- polkadot: polkadotWallet$,
585
- ethereum: ethereumWallet$
586
- }).subscribe(subscriber);
1174
+ var providersDetails$ = new Observable6(
1175
+ (subscriber) => {
1176
+ if (typeof window === "undefined") {
1177
+ subscriber.next([]);
587
1178
  return () => {
588
- sub.unsubscribe();
589
- unsubProviders();
590
1179
  };
591
- }).pipe(shareReplay4({ refCount: true, bufferSize: 1 }));
592
- }
593
- return cachedAppKit;
594
- };
595
-
596
- // src/api/ethereum/wallets.ts
597
- var providersDetails$ = new Observable5(
598
- (subscriber) => {
599
- const store2 = createStore2();
600
- const unsubscribe = store2.subscribe((providerDetails2) => {
1180
+ }
1181
+ const mipdStore = createMipdStore();
1182
+ const unsubscribe = mipdStore.subscribe((providerDetails2) => {
601
1183
  subscriber.next(providerDetails2);
602
1184
  });
603
- const providerDetails = store2.getProviders();
1185
+ const providerDetails = mipdStore.getProviders();
604
1186
  subscriber.next(providerDetails);
605
1187
  return () => {
606
1188
  unsubscribe();
607
- store2.destroy();
1189
+ mipdStore.destroy();
608
1190
  };
609
1191
  }
610
- ).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
611
- var ethereumInjectedWallets$ = new Observable5(
612
- (subscriber) => {
613
- const enabledWalletIds$ = new BehaviorSubject3(/* @__PURE__ */ new Set());
614
- const connectWallet = async (walletId, provider) => {
615
- if (enabledWalletIds$.value.has(walletId))
616
- throw new Error(`Extension ${walletId} already connected`);
617
- await provider.request({
618
- method: "eth_requestAccounts"
1192
+ ).pipe(shareReplay6({ refCount: true, bufferSize: 1 }));
1193
+ var createEthereumInjectedWallets$ = (store2) => new Observable6((subscriber) => {
1194
+ const enabledWalletIds$ = new BehaviorSubject4(/* @__PURE__ */ new Set());
1195
+ const connectWallet = async (walletId, provider) => {
1196
+ if (enabledWalletIds$.value.has(walletId))
1197
+ throw new Error(`Extension ${walletId} already connected`);
1198
+ await provider.request({
1199
+ method: "eth_requestAccounts"
1200
+ });
1201
+ const newSet = new Set(enabledWalletIds$.value);
1202
+ newSet.add(walletId);
1203
+ enabledWalletIds$.next(newSet);
1204
+ store2.addEnabledWalletId(walletId);
1205
+ };
1206
+ const disconnectWallet = async (walletId) => {
1207
+ if (!enabledWalletIds$.value.has(walletId))
1208
+ throw new Error(`Extension ${walletId} is not connected`);
1209
+ const newSet = new Set(enabledWalletIds$.value);
1210
+ newSet.delete(walletId);
1211
+ enabledWalletIds$.next(newSet);
1212
+ store2.removeEnabledWalletId(walletId);
1213
+ };
1214
+ const sub = combineLatest6([providersDetails$, enabledWalletIds$]).pipe(
1215
+ map6(([providerDetails, enabledWalletIds]) => {
1216
+ return providerDetails.map((pd) => {
1217
+ const walletId = getWalletId("ethereum", pd.info.rdns);
1218
+ const provider = pd.provider;
1219
+ return {
1220
+ platform: "ethereum",
1221
+ type: "injected",
1222
+ id: walletId,
1223
+ name: pd.info.name,
1224
+ icon: pd.info.icon,
1225
+ provider,
1226
+ isConnected: enabledWalletIds.has(walletId),
1227
+ providerId: pd.info.rdns,
1228
+ connect: () => connectWallet(walletId, provider),
1229
+ disconnect: () => disconnectWallet(walletId)
1230
+ };
619
1231
  });
620
- const newSet = new Set(enabledWalletIds$.value);
621
- newSet.add(walletId);
622
- enabledWalletIds$.next(newSet);
623
- store.addEnabledWalletId(walletId);
624
- };
625
- const disconnectWallet = async (walletId) => {
626
- if (!enabledWalletIds$.value.has(walletId))
627
- throw new Error(`Extension ${walletId} is not connected`);
628
- const newSet = new Set(enabledWalletIds$.value);
629
- newSet.delete(walletId);
630
- enabledWalletIds$.next(newSet);
631
- store.removeEnabledWalletId(walletId);
632
- };
633
- const sub = combineLatest5([providersDetails$, enabledWalletIds$]).pipe(
634
- map6(([providerDetails, enabledWalletIds]) => {
635
- return providerDetails.map((pd) => {
636
- const walletId = getWalletId("ethereum", pd.info.rdns);
637
- const provider = pd.provider;
638
- return {
639
- platform: "ethereum",
640
- type: "injected",
641
- id: walletId,
642
- name: pd.info.name,
643
- icon: pd.info.icon,
644
- provider,
645
- isConnected: enabledWalletIds.has(walletId),
646
- providerId: pd.info.rdns,
647
- connect: () => connectWallet(walletId, provider),
648
- disconnect: () => disconnectWallet(walletId)
649
- };
650
- });
651
- })
652
- ).subscribe(subscriber);
653
- return () => {
654
- sub.unsubscribe();
655
- };
656
- }
657
- ).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
658
- var getEthereumWallets$ = (config) => {
659
- return new Observable5((subscriber) => {
660
- const subscription = combineLatest5([
661
- ethereumInjectedWallets$,
1232
+ }),
1233
+ distinctUntilChanged4(walletsEqual)
1234
+ ).subscribe(subscriber);
1235
+ return () => {
1236
+ sub.unsubscribe();
1237
+ };
1238
+ }).pipe(shareReplay6({ refCount: true, bufferSize: 1 }));
1239
+ var getEthereumWallets$ = (config, store2 = store) => {
1240
+ return new Observable6((subscriber) => {
1241
+ const subscription = combineLatest6([
1242
+ createEthereumInjectedWallets$(store2),
662
1243
  getAppKitWallets$(config)?.pipe(map6((w) => w.ethereum))
663
1244
  ]).pipe(
664
1245
  map6(
@@ -668,48 +1249,32 @@ var getEthereumWallets$ = (config) => {
668
1249
  return () => {
669
1250
  subscription.unsubscribe();
670
1251
  };
671
- }).pipe(shareReplay5({ refCount: true, bufferSize: 1 }));
1252
+ }).pipe(shareReplay6({ refCount: true, bufferSize: 1 }));
1253
+ };
1254
+ var walletsEqual = (a, b) => {
1255
+ if (a.length !== b.length) return false;
1256
+ return a.every(
1257
+ (w, i) => w.id === b[i]?.id && w.isConnected === b[i]?.isConnected && w.name === b[i]?.name
1258
+ );
672
1259
  };
673
1260
 
674
1261
  // src/api/polkadot/wallets.ts
675
- import { isEqual } from "lodash";
1262
+ import { isEqual } from "lodash-es";
676
1263
  import {
677
1264
  connectInjectedExtension,
678
1265
  getInjectedExtensions
679
1266
  } from "polkadot-api/pjs-signer";
680
1267
  import {
681
- BehaviorSubject as BehaviorSubject4,
682
- combineLatest as combineLatest6,
683
- distinctUntilChanged as distinctUntilChanged4,
1268
+ BehaviorSubject as BehaviorSubject5,
1269
+ combineLatest as combineLatest7,
1270
+ distinctUntilChanged as distinctUntilChanged5,
684
1271
  map as map7,
685
- Observable as Observable6,
686
- shareReplay as shareReplay6
1272
+ Observable as Observable7,
1273
+ shareReplay as shareReplay7
687
1274
  } from "rxjs";
688
-
689
- // src/utils/polkadotExtensions.ts
690
- var POLKADOT_EXTENSIONS = {
691
- talisman: {
692
- name: "Talisman",
693
- icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CiAgICA8cGF0aCBmaWxsPSIjZGRmZTc2IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0wIDcwLjI1YzAgMjEuMjU1IDAgMzEuODgzIDQuNDYzIDM5Ljg1MmEzNSAzNSAwIDAgMCAxMy40MzUgMTMuNDM1QzI1Ljg2NyAxMjggMzYuNDk1IDEyOCA1Ny43NSAxMjhoMTIuNWMyMS4yNTUgMCAzMS44ODMgMCAzOS44NTItNC40NjNhMzUgMzUgMCAwIDAgMTMuNDM1LTEzLjQzNUMxMjggMTAyLjEzMyAxMjggOTEuNTA1IDEyOCA3MC4yNXYtMTIuNWMwLTIxLjI1NSAwLTMxLjg4My00LjQ2My0zOS44NTJhMzUgMzUgMCAwIDAtMTMuNDM1LTEzLjQzNUMxMDIuMTMzIDAgOTEuNTA1IDAgNzAuMjUgMGgtMTIuNUMzNi40OTUgMCAyNS44NjcgMCAxNy44OTggNC40NjNBMzUgMzUgMCAwIDAgNC40NjMgMTcuODk4QzAgMjUuODY3IDAgMzYuNDk1IDAgNTcuNzVaIi8+CiAgICA8cGF0aCBmaWxsPSIjZWE1NzUwIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGQ9Im0zMy44NzkgMzUuMTE3LS41IDE5LjE2NWM4LjEwNyA0LjE2OCAxNS43NSA0LjA3NSAyNC43NCAyLjA2MyAzLjU2LTEuMzk3IDYuMDU2LTEuNzAyIDkuNTExIDAgOS4wNjcgMi44MTYgMTYuOTY5IDEuOTUgMjUuMTg1LTIuMjQzbC0uNDg1LTE5LjE4N2MwLTEwLjgwNS03LjAwNC0xNC45NjItMTQuNjMyLTEyLjczOS0uNzc5LjIzMi0xLjk0NCAxLjI3NC0xLjk0NCAyLjIwN2wtLjE4MSAxOC43MzNhMS43NyAxLjc3IDAgMSAxLTMuNTM4LS4wMTVWMjAuMDY3YTguODM4IDguODM4IDAgMCAwLTE3LjY3NSAwVjQzLjFhMS43NyAxLjc3IDAgMSAxLTMuNTM4LjAxNWwtLjE3Ni0xOC43NDNjMC0uOTIzLTEuMTA5LTEuOTYtMS44ODItMi4xOTItOC44LTIuNjEtMTQuODggMi41MzgtMTQuODggMTIuOTM2Wm0yLjQ3NSAyMy44NDNhNDguNDMgNDguNDMgMCAwIDEtNS4yMDktMi4yNTRjLTQuNzMtMi4yNjktMTIuMDk1LTEuNTYyLTE3LjA3MiA0LjExMS0yLjI3NCAyLjYtLjUxNSA2LjM2IDIuNzcgNy40NDggMS41ODMuNTI2IDMuMDE3IDEuNDEzIDQuMzUzIDIuNDA4bC40NjQuMzM2YzQuMTMyIDIuOTY1IDYuNzkzIDcuNDA2IDcuMDU2IDEyLjQ4NmwuMjUzIDQuODEyYTMxLjYxNiAzMS42MTYgMCAwIDAgMTkuNDI4IDI1Ljk1OSAzOC41OSAzOC41OSAwIDAgMCAyOS4zMjcgMCAzMS42MTYgMzEuNjE2IDAgMCAwIDE5LjQyOS0yNS45NTljLjA0Ni0uODI1LjA2MS0xLjY1LjA1MS0yLjQ2NWwuMTI0LTIuMzQ3Yy4yNjMtNS4wOCAyLjkyNC05LjUyIDcuMDU2LTEyLjQ4NmwuNDY0LS4zMzZjMS4zNC0uOTk1IDIuNzctMS44ODIgNC4zNTMtMi40MDggMy4yODUtMS4wODkgNS4wNS00Ljg0OSAyLjc3LTcuNDQ4LTQuOTc4LTUuNjczLTEyLjM0My02LjM3NS0xNy4wNzItNC4xMS0xLjcxOC44MjUtMy40MzUgMS42NS01LjIxIDIuMjUzbC0zLjYyIDEuMjM4LS4wMS4wNDFjLTYuNjU0IDEuODQyLTEyLjEyIDEuODQ3LTE4LjM5OC0uNzQyLTMuMTc3LTEuMzEtNi4zOC0xLjU1OC05LjQ4IDAtNS45NjcgMS44NTYtMTIuMDQ4IDIuNjQtMTguMjA2LjcwMWwtMy42MjYtMS4yMzhabTI2LjY2NSA0NC43MzJjMTMuMzkgMCAyNC4yNDEtMTUuNTk2IDI0LjI0MS0xNS41OTZTNzYuNDEgNzIuNDk5IDYzLjAyIDcyLjQ5OWMtMTMuMzg1IDAtMjQuMjM2IDE1LjU5Ny0yNC4yMzYgMTUuNTk3czEwLjg1MSAxNS41OTYgMjQuMjQgMTUuNTk2Wm0xMC44ODMtMTUuNTk2YzAgNi4wMS00Ljg3MiAxMC44ODItMTAuODgzIDEwLjg4Mi02LjAxIDAtMTAuODgyLTQuODcyLTEwLjg4Mi0xMC44ODJzNC44NzItMTAuODgzIDEwLjg4Mi0xMC44ODMgMTAuODgzIDQuODcyIDEwLjg4MyAxMC44ODNabS0xMC44ODMgNC45MzZhNC45MzYgNC45MzYgMCAxIDAgMC05Ljg3MiA0LjkzNiA0LjkzNiAwIDAgMCAwIDkuODcyWiIvPgo8L3N2Zz4K"
694
- },
695
- "polkadot-js": {
696
- name: "Polkadot.js",
697
- icon: "data:image/svg+xml;base64,ICA8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgdmlld0JveD0iMCAwIDEwNi4yIDEwNi4yIj4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJMYXllcl8yIiBkYXRhLW5hbWU9IkxheWVyIDIiPgogICAgICA8ZyBpZD0iTGF5ZXJfMS0yIiBkYXRhLW5hbWU9IkxheWVyIDEiPgogICAgICAgIDxjaXJjbGUgY3g9IjUzLjEiIGN5PSI1My4xIiByPSI1My4xIiBmaWxsPSIjZjI5MjM1IiAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU0LjQ3IDEzLjc2YTI4Ljg1IDI4Ljg1IDAgMDAtMjguNzMgMjguNzMgMjkuMzQgMjkuMzQgMCAwMDEuNTIgOS4zNCA0IDQgMCAxMDcuNDktMi41MkExOC42NyAxOC42NyAwIDAxMzMuNjMgNDJhMjAuNzIgMjAuNzIgMCAxMTIyIDIxLjMxcy00IC4yNS02IC40OWMtLjc0LjExLTEuNDguMjYtMi4yLjQ0YS4yOC4yOCAwIDAxLS4zOCAwIC4yNy4yNyAwIDAxMC0uMzJsLjYzLTMuNDEgMy43OS0xN2EzLjk0IDMuOTQgMCAxMC03LjcxLTEuNjVzLTkgNDEuNy05IDQyLjA4YTMuNzkgMy43OSAwIDAwMi43NCA0LjZoLjI4YTMuNzggMy43OCAwIDAwNC42MS0yLjcxLjQzLjQzIDAgMDAwLS4xMXYtLjE5Yy4xMS0uNDkgMS4yNS02IDEuMjUtNmExMC4yMyAxMC4yMyAwIDAxOC40Ni04Yy44Ny0uMTMgNC41My0uMzggNC41My0uMzhhMjguNzEgMjguNzEgMCAwMC0yLjExLTU3LjI3eiIKICAgICAgICAvPgogICAgICAgIDxwYXRoCiAgICAgICAgICBmaWxsPSIjZmZmIgogICAgICAgICAgZD0iTTU2LjIxIDgwYTQuNzggNC43OCAwIDAwLTUuNjYgMy43MS4yNC4yNCAwIDAxMCAuMDggNC43NyA0Ljc3IDAgMDAzLjY1IDUuNjdoLjE0QTQuNyA0LjcgMCAwMDYwIDg2di0uMzJBNSA1IDAgMDA1Ni4yMSA4MHoiCiAgICAgICAgLz4KICAgICAgPC9nPgogICAgPC9nPgogIDwvc3ZnPg=="
698
- },
699
- "subwallet-js": {
700
- name: "SubWallet",
701
- icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNODAgNGM1Ny42MyAwIDc2IDE4LjM3IDc2IDc2IDAgNTcuNjMtMTguMzcgNzYtNzYgNzYtNTcuNjMgMC03Ni0xOC4zNy03Ni03NkM0IDIyLjM3IDIyLjM3IDQgODAgNFoiIGZpbGw9InVybCgjYSkiLz48ZyBjbGlwLXBhdGg9InVybCgjYikiPjxwYXRoIGQ9Ik0xMTIuNjE1IDY2LjcyVjUzLjM5OEw1OC43NiAzMiA0OCAzNy40MTJsLjA1NyA0MS40NjQgNDAuMjkyIDE2LjA3LTIxLjUyIDkuMDc1di03LjAxOEw1Ni45NSA5My4wM2wtOC44OTMgNC4xNjN2MjUuMzk1TDU4Ljc2OSAxMjhsNTMuODQ2LTI0LjA2MlY4Ni44NjlMNjQuMTU0IDY3LjY1N1Y1NmwzOC40NDkgMTUuMjE2IDEwLjAxMi00LjQ5NloiIGZpbGw9IiNmZmYiLz48L2c+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iODAiIHkxPSI0IiB4Mj0iODAiIHkyPSIxNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNENFQUFDIi8+PC9saW5lYXJHcmFkaWVudD48Y2xpcFBhdGggaWQ9ImIiPjxwYXRoIGZpbGw9IiNmZmYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4IDMyKSIgZD0iTTAgMGg2NC42MTV2OTZIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4="
702
- },
703
- enkrypt: {
704
- name: "Enkrypt",
705
- icon: "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODEiIGhlaWdodD0iODEiIHZpZXdCb3g9IjAgMCA4MSA4MSIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNy4wMDU3IDE3LjAwNjJDMTguOTMwMyAxNS4wODE2IDIxLjU0MDUgMTQuMDAwNCAyNC4yNjIyIDE0LjAwMDRMNjcuMzI5NiAxNFYyMS44NzQxQzY3LjMyOTYgMjMuODMwNSA2Ni41NTIzIDI1LjcwNjcgNjUuMTY5IDI3LjA5QzYzLjc4NTcgMjguNDczMyA2MS45MDk1IDI5LjI1MDQgNTkuOTUzMiAyOS4yNTA0SDM5LjcwNDVDMzYuOTgyOCAyOS4yNTA0IDM0LjM3MjYgMzAuMzMxNiAzMi40NDggMzIuMjU2MUMzMC41MjM1IDM0LjE4MDcgMjkuNDQyMyAzNi43OTA5IDI5LjQ0MjMgMzkuNTEyNlY0Mi4xMjQyQzI5LjQ0MjMgNDQuODQ1OSAzMC41MjM1IDQ3LjQ1NjEgMzIuNDQ4IDQ5LjM4MDZDMzQuMzcyNiA1MS4zMDUxIDM2Ljk4MjggNTIuMzg2MyAzOS43MDQ1IDUyLjM4NjNINTkuOTUzMkM2MS45MDk1IDUyLjM4NjMgNjMuNzg1NyA1My4xNjM1IDY1LjE2OSA1NC41NDY4QzY2LjU1MjMgNTUuOTMwMSA2Ny4zMjk2IDU3LjgwNjMgNjcuMzI5NiA1OS43NjI2VjY3LjMzSDI0LjI2MjJDMjEuNTQwNSA2Ny4zMyAxOC45MzAzIDY2LjI0ODggMTcuMDA1NyA2NC4zMjQzQzE1LjA4MTIgNjIuMzk5NyAxNCA1OS43ODk1IDE0IDU3LjA2NzhWMjQuMjYyNkMxNCAyMS41NDA5IDE1LjA4MTIgMTguOTMwNyAxNy4wMDU3IDE3LjAwNjJaTTQwLjE0NzkgMzMuNTQyM0g2MC45MTU3QzY0LjQ1OCAzMy41NDIzIDY3LjMyOTUgMzYuNDEzOCA2Ny4zMjk1IDM5Ljk1NjFWNDEuNjgxNkM2Ny4zMjk1IDQ1LjIyMzggNjQuNDU4IDQ4LjA5NTQgNjAuOTE1NyA0OC4wOTU0SDQwLjE0NzlDMzYuNjA1NyA0OC4wOTU0IDMzLjczNDEgNDUuMjIzOCAzMy43MzQxIDQxLjY4MTZWMzkuOTU2MUMzMy43MzQxIDM2LjQxMzggMzYuNjA1NyAzMy41NDIzIDQwLjE0NzkgMzMuNTQyM1oiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl8yODdfMjM1OSkiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yODdfMjM1OSIgeDE9IjE5LjM2MDIiIHkxPSIxNCIgeDI9IjU2Ljc2OTYiIHkyPSI2OS44MDA1IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNDNTQ5RkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNjU0QkZGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg=="
706
- }
707
- };
708
-
709
- // src/api/polkadot/wallets.ts
710
- var getInjectedWalletsIds = () => getInjectedExtensions().map((name) => getWalletId("polkadot", name));
1275
+ var getInjectedWalletsIds = () => typeof window === "undefined" ? [] : getInjectedExtensions().map((name) => getWalletId("polkadot", name));
711
1276
  var createWalletIdsPoller$ = () => {
712
- return new Observable6((subscriber) => {
1277
+ return new Observable7((subscriber) => {
713
1278
  subscriber.next(getInjectedWalletsIds());
714
1279
  const intervals = [100, 200, 300, 500];
715
1280
  let index = 0;
@@ -726,12 +1291,12 @@ var createWalletIdsPoller$ = () => {
726
1291
  return () => {
727
1292
  };
728
1293
  }).pipe(
729
- distinctUntilChanged4(isEqual),
730
- shareReplay6({ refCount: true, bufferSize: 1 })
1294
+ distinctUntilChanged5(isEqual),
1295
+ shareReplay7({ refCount: true, bufferSize: 1 })
731
1296
  );
732
1297
  };
733
- var polkadotInjectedWallets$ = new Observable6((subscriber) => {
734
- const enabledExtensions$ = new BehaviorSubject4(/* @__PURE__ */ new Map());
1298
+ var createPolkadotInjectedWallets$ = (store2) => new Observable7((subscriber) => {
1299
+ const enabledExtensions$ = new BehaviorSubject5(/* @__PURE__ */ new Map());
735
1300
  const connect = async (walletId) => {
736
1301
  if (enabledExtensions$.value.has(walletId))
737
1302
  throw new Error(`Extension ${walletId} already connected`);
@@ -740,7 +1305,7 @@ var polkadotInjectedWallets$ = new Observable6((subscriber) => {
740
1305
  const newMap = new Map(enabledExtensions$.value);
741
1306
  newMap.set(walletId, extension);
742
1307
  enabledExtensions$.next(newMap);
743
- store.addEnabledWalletId(walletId);
1308
+ store2.addEnabledWalletId(walletId);
744
1309
  };
745
1310
  const disconnect = (walletId) => {
746
1311
  if (!enabledExtensions$.value.has(walletId))
@@ -748,10 +1313,10 @@ var polkadotInjectedWallets$ = new Observable6((subscriber) => {
748
1313
  const newMap = new Map(enabledExtensions$.value);
749
1314
  newMap.delete(walletId);
750
1315
  enabledExtensions$.next(newMap);
751
- store.removeEnabledWalletId(walletId);
1316
+ store2.removeEnabledWalletId(walletId);
752
1317
  };
753
1318
  const walletIds$ = createWalletIdsPoller$();
754
- const subscription = combineLatest6([walletIds$, enabledExtensions$]).pipe(
1319
+ const subscription = combineLatest7([walletIds$, enabledExtensions$]).pipe(
755
1320
  map7(([walletIds, enabledExtensions]) => {
756
1321
  return walletIds.map((id) => {
757
1322
  const { identifier } = parseWalletId(id);
@@ -770,19 +1335,17 @@ var polkadotInjectedWallets$ = new Observable6((subscriber) => {
770
1335
  disconnect: () => disconnect(id)
771
1336
  };
772
1337
  });
773
- })
1338
+ }),
1339
+ distinctUntilChanged5(walletsEqual2)
774
1340
  ).subscribe(subscriber);
775
1341
  return () => {
776
1342
  subscription.unsubscribe();
777
1343
  };
778
- }).pipe(
779
- // logObservable("polkadotInjectedWallets$"),
780
- shareReplay6({ refCount: true, bufferSize: 1 })
781
- );
782
- var getPolkadotWallets$ = (config) => {
783
- return new Observable6((subscriber) => {
784
- const subscription = combineLatest6([
785
- polkadotInjectedWallets$,
1344
+ }).pipe(shareReplay7({ refCount: true, bufferSize: 1 }));
1345
+ var getPolkadotWallets$ = (config, store2 = store) => {
1346
+ return new Observable7((subscriber) => {
1347
+ const subscription = combineLatest7([
1348
+ createPolkadotInjectedWallets$(store2),
786
1349
  getAppKitWallets$(config)?.pipe(map7((w) => w.polkadot))
787
1350
  ]).pipe(
788
1351
  map7(
@@ -792,37 +1355,39 @@ var getPolkadotWallets$ = (config) => {
792
1355
  return () => {
793
1356
  subscription.unsubscribe();
794
1357
  };
795
- }).pipe(
796
- // logObservable("getPolkadotWallets$"),
797
- shareReplay6({ refCount: true, bufferSize: 1 })
1358
+ }).pipe(shareReplay7({ refCount: true, bufferSize: 1 }));
1359
+ };
1360
+ var walletsEqual2 = (a, b) => {
1361
+ if (a.length !== b.length) return false;
1362
+ return a.every(
1363
+ (w, i) => w.id === b[i]?.id && w.isConnected === b[i]?.isConnected && w.name === b[i]?.name
798
1364
  );
799
1365
  };
800
1366
 
801
1367
  // src/api/wallets.ts
802
- var autoReconnectWalletIds$ = store.observable.pipe(
803
- map8((s) => s.autoReconnect ?? []),
804
- take(1),
805
- shareReplay7(1)
806
- );
807
- var getWallets$ = (config) => {
808
- return new Observable7((subscriber) => {
1368
+ var getWallets$ = (config, store2 = store) => {
1369
+ const autoReconnectWalletIds$ = store2.observable.pipe(
1370
+ map8((s) => s.autoReconnect ?? []),
1371
+ take2(1),
1372
+ shareReplay8({ bufferSize: 1, refCount: true })
1373
+ );
1374
+ return new Observable8((subscriber) => {
809
1375
  const observables = config.platforms.map(
810
1376
  (platform) => {
811
1377
  switch (platform) {
812
1378
  case "polkadot":
813
- return getPolkadotWallets$(config);
1379
+ return getPolkadotWallets$(config, store2);
814
1380
  case "ethereum":
815
- return getEthereumWallets$(config);
1381
+ return getEthereumWallets$(config, store2);
816
1382
  }
817
1383
  }
818
1384
  );
819
- const wallets$ = observables.length ? combineLatest7(observables).pipe(
820
- map8((wallets) => wallets.flat().sort(sortWallets)),
821
- // Emit empty array immediately so UI doesn't wait
822
- startWith([])
1385
+ const wallets$ = observables.length ? combineLatest8(observables).pipe(
1386
+ map8((wallets) => wallets.flat().sort(sortWallets))
1387
+ // Note: No startWith([]) here - the hydration buffer handles initial state
823
1388
  ) : of5([]);
824
1389
  const reconnectingWallets = /* @__PURE__ */ new Set();
825
- const subAutoReconnect = combineLatest7([wallets$, autoReconnectWalletIds$]).pipe(
1390
+ const subAutoReconnect = combineLatest8([wallets$, autoReconnectWalletIds$]).pipe(
826
1391
  filter2(([, walletIds]) => config.autoReconnect && !!walletIds?.length),
827
1392
  mergeMap(
828
1393
  ([wallets, walletIds]) => wallets.filter((wallet) => walletIds?.includes(wallet.id))
@@ -846,31 +1411,175 @@ var getWallets$ = (config) => {
846
1411
  subAutoReconnect.unsubscribe();
847
1412
  subWallets.unsubscribe();
848
1413
  };
849
- }).pipe(shareReplay7({ refCount: true, bufferSize: 1 }));
1414
+ }).pipe(shareReplay8({ refCount: true, bufferSize: 1 }));
850
1415
  };
851
1416
 
852
1417
  // src/api/kheopskit.ts
853
- var getKheopskit$ = (config) => {
1418
+ var getKheopskit$ = (config, ssrCookies, existingStore) => {
854
1419
  const kc = resolveConfig(config);
855
- console.debug("[kheopskit] config", kc);
856
- return new Observable8((subscriber) => {
857
- const wallets$ = getWallets$(kc);
858
- const subscription = combineLatest8({
859
- wallets: wallets$,
860
- accounts: getAccounts$(kc, wallets$)
861
- }).pipe(map9(({ wallets, accounts }) => ({ config: kc, wallets, accounts }))).subscribe(subscriber);
1420
+ const store2 = existingStore ?? createKheopskitStore({ ssrCookies, storageKey: kc.storageKey });
1421
+ if (kc.debug) console.debug("[kheopskit] config", kc);
1422
+ if (kc.debug && typeof window === "undefined" && ssrCookies === void 0) {
1423
+ console.warn(
1424
+ "[kheopskit] Running on server without `ssrCookies`. Wallet state will not be hydrated. Pass cookies for SSR support."
1425
+ );
1426
+ }
1427
+ const cachedState = store2.getCachedState();
1428
+ const cachedWallets = cachedState.wallets.map((w) => {
1429
+ const wallet = hydrateWallet(w);
1430
+ if (!wallet.icon) {
1431
+ const cachedIcon = getCachedIcon(wallet.id);
1432
+ if (cachedIcon) {
1433
+ return { ...wallet, icon: cachedIcon };
1434
+ }
1435
+ }
1436
+ return wallet;
1437
+ });
1438
+ const cachedAccounts = cachedState.accounts.map(hydrateAccount);
1439
+ if (kc.debug && cachedWallets.length > 0) {
1440
+ console.debug("[kheopskit] hydrating from cache:", {
1441
+ wallets: cachedWallets.length,
1442
+ accounts: cachedAccounts.length
1443
+ });
1444
+ }
1445
+ return new Observable9((subscriber) => {
1446
+ const liveWallets$ = getWallets$(kc, store2);
1447
+ const liveAccounts$ = getAccounts$(kc, liveWallets$);
1448
+ const bufferedWallets$ = createHydrationBuffer(
1449
+ cachedWallets,
1450
+ liveWallets$,
1451
+ kc.hydrationGracePeriod,
1452
+ (w) => w.id,
1453
+ // Hydration converges when all cached-connected wallets are connected in live
1454
+ (liveWallets, cached) => {
1455
+ const cachedConnectedIds = new Set(
1456
+ cached.filter((w) => w.isConnected).map((w) => w.id)
1457
+ );
1458
+ if (cachedConnectedIds.size === 0) return true;
1459
+ return [...cachedConnectedIds].every(
1460
+ (id) => liveWallets.some((w) => w.id === id && w.isConnected)
1461
+ );
1462
+ },
1463
+ // Merge: prefer cached isConnected state but get icon from cache or live
1464
+ (live, cached) => ({
1465
+ ...cached,
1466
+ // Priority: cached icon > localStorage cache > live icon
1467
+ icon: cached.icon || getCachedIcon(cached.id) || live.icon,
1468
+ // Use live wallet's connect/disconnect functions
1469
+ connect: live.connect,
1470
+ disconnect: live.disconnect
1471
+ }),
1472
+ // Transform cached-only items: add icon from localStorage cache
1473
+ (cached) => ({
1474
+ ...cached,
1475
+ icon: cached.icon || getCachedIcon(cached.id) || ""
1476
+ })
1477
+ );
1478
+ const bufferedAccounts$ = createAccountHydrationBuffer(
1479
+ cachedAccounts,
1480
+ liveAccounts$,
1481
+ kc.hydrationGracePeriod,
1482
+ (a) => a.walletId,
1483
+ // Hydration converges when all wallets with cached accounts have provided live accounts
1484
+ (liveAccounts, cached) => {
1485
+ const cachedWalletIds = new Set(cached.map((a) => a.walletId));
1486
+ if (cachedWalletIds.size === 0) return true;
1487
+ const liveWalletIds = new Set(liveAccounts.map((a) => a.walletId));
1488
+ return [...cachedWalletIds].every((id) => liveWalletIds.has(id));
1489
+ }
1490
+ );
1491
+ const subscription = combineLatest9({
1492
+ wallets: bufferedWallets$,
1493
+ accounts: bufferedAccounts$
1494
+ }).pipe(
1495
+ map9(({ wallets, accounts }) => {
1496
+ if (kc.debug) {
1497
+ console.debug("[kheopskit] hydration state", {
1498
+ walletsHydrating: wallets.isHydrating,
1499
+ accountsHydrating: accounts.isHydrating,
1500
+ walletsConnected: wallets.items.filter((w) => w.isConnected).length,
1501
+ walletsTotal: wallets.items.length
1502
+ });
1503
+ }
1504
+ return {
1505
+ config: kc,
1506
+ wallets: wallets.items,
1507
+ accounts: accounts.items,
1508
+ isHydrating: wallets.isHydrating || accounts.isHydrating
1509
+ };
1510
+ })
1511
+ ).subscribe(subscriber);
1512
+ const persistSub = combineLatest9({
1513
+ wallets: bufferedWallets$,
1514
+ accounts: bufferedAccounts$
1515
+ }).pipe(
1516
+ // Wait for hydration to complete
1517
+ filter3(
1518
+ ({ wallets, accounts }) => !wallets.isHydrating && !accounts.isHydrating
1519
+ ),
1520
+ // Debounce to avoid excessive writes
1521
+ debounceTime(1e3),
1522
+ // Only persist if state actually changed
1523
+ distinctUntilChanged6((prev, curr) => {
1524
+ const prevWalletIds = prev.wallets.items.map((w) => w.id);
1525
+ const currWalletIds = curr.wallets.items.map((w) => w.id);
1526
+ const prevAccountIds = prev.accounts.items.map((a) => a.id);
1527
+ const currAccountIds = curr.accounts.items.map((a) => a.id);
1528
+ return arraysEqual(prevWalletIds, currWalletIds) && arraysEqual(prevAccountIds, currAccountIds);
1529
+ })
1530
+ ).subscribe(({ wallets, accounts }) => {
1531
+ const connectedWalletIds = new Set(
1532
+ wallets.items.filter((w) => w.isConnected).map((w) => w.id)
1533
+ );
1534
+ const relevantAccounts = accounts.items.filter(
1535
+ (a) => connectedWalletIds.has(a.walletId)
1536
+ );
1537
+ if (kc.debug) {
1538
+ console.debug("[kheopskit] persisting state snapshot:", {
1539
+ wallets: wallets.items.length,
1540
+ accounts: relevantAccounts.length
1541
+ });
1542
+ }
1543
+ store2.setCachedState(
1544
+ wallets.items.map(serializeWallet),
1545
+ relevantAccounts.map(serializeAccount)
1546
+ );
1547
+ const icons = {};
1548
+ for (const wallet of wallets.items) {
1549
+ if (wallet.icon) {
1550
+ icons[wallet.id] = wallet.icon;
1551
+ }
1552
+ }
1553
+ setCachedIcons(icons);
1554
+ });
862
1555
  return () => {
863
1556
  subscription.unsubscribe();
1557
+ persistSub.unsubscribe();
864
1558
  };
865
1559
  }).pipe(
1560
+ distinctUntilChanged6(statesEqual),
866
1561
  throttleTime(16, void 0, { leading: true, trailing: true }),
867
1562
  // ~1 frame at 60fps
868
1563
  logObservable("kheopskit$", { enabled: kc.debug, printValue: true }),
869
- shareReplay8({ bufferSize: 1, refCount: true })
1564
+ shareReplay9({ bufferSize: 1, refCount: true })
870
1565
  );
871
1566
  };
1567
+ var arraysEqual = (a, b) => a.length === b.length && a.every((v, i) => v === b[i]);
1568
+ var statesEqual = (a, b) => a.isHydrating === b.isHydrating && a.wallets.length === b.wallets.length && a.accounts.length === b.accounts.length && a.wallets.every(
1569
+ (w, i) => w.id === b.wallets[i]?.id && w.isConnected === b.wallets[i]?.isConnected
1570
+ ) && a.accounts.every((acc, i) => acc.id === b.accounts[i]?.id);
872
1571
  export {
1572
+ DEFAULT_STORAGE_KEY,
1573
+ clearAllCachedObservables,
1574
+ clearCachedObservable,
1575
+ createKheopskitStore,
1576
+ getCachedIcon,
1577
+ getDefaultStore,
873
1578
  getKheopskit$,
1579
+ getSafeLocalStorage,
1580
+ hydrateAccount,
1581
+ hydrateWallet,
1582
+ resetAppKitCache,
874
1583
  resolveConfig
875
1584
  };
876
1585
  //# sourceMappingURL=index.mjs.map