@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.d.mts +174 -2
- package/dist/index.d.ts +174 -2
- package/dist/index.js +1053 -342
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1068 -359
- package/dist/index.mjs.map +1 -1
- package/package.json +16 -15
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
|
|
443
|
+
combineLatest as combineLatest9,
|
|
444
|
+
debounceTime,
|
|
445
|
+
distinctUntilChanged as distinctUntilChanged6,
|
|
446
|
+
filter as filter3,
|
|
14
447
|
map as map9,
|
|
15
|
-
Observable as
|
|
16
|
-
shareReplay as
|
|
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
|
|
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
|
|
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
|
|
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
|
|
76
|
-
var createStore = (key, defaultValue) => {
|
|
77
|
-
const subject = new
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
697
|
+
if (!wallet.isConnected) return of2([]);
|
|
151
698
|
return getCachedObservable$(
|
|
152
699
|
`accounts:${wallet.id}`,
|
|
153
|
-
() => new
|
|
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(
|
|
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
|
|
753
|
+
return of2([]);
|
|
207
754
|
return getCachedObservable$(
|
|
208
755
|
"accounts:appKit",
|
|
209
|
-
() => new
|
|
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
|
-
|
|
218
|
-
|
|
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
|
-
|
|
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(
|
|
797
|
+
}).pipe(shareReplay3({ refCount: true, bufferSize: 1 }))
|
|
251
798
|
);
|
|
252
799
|
};
|
|
253
|
-
var getEthereumAccounts$ = (ethereumWallets) => new
|
|
800
|
+
var getEthereumAccounts$ = (ethereumWallets) => new Observable3((subscriber) => {
|
|
254
801
|
const sub = ethereumWallets.pipe(
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
return wallets.length ?
|
|
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
|
-
]) :
|
|
808
|
+
]) : of2([]);
|
|
262
809
|
}),
|
|
263
|
-
|
|
264
|
-
|
|
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
|
-
|
|
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
|
|
284
|
-
distinctUntilChanged as
|
|
285
|
-
map as
|
|
286
|
-
Observable as
|
|
287
|
-
of as
|
|
288
|
-
shareReplay as
|
|
289
|
-
switchMap as
|
|
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
|
|
293
|
-
return new
|
|
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
|
|
355
|
-
return
|
|
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
|
|
918
|
+
var getPolkadotAccounts$ = (polkadotWallets$) => new Observable4((subscriber) => {
|
|
372
919
|
const sub = polkadotWallets$.pipe(
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
(wallets) => wallets.length ?
|
|
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
|
-
]) :
|
|
925
|
+
]) : of3([])
|
|
379
926
|
),
|
|
380
|
-
|
|
381
|
-
|
|
927
|
+
map4((accounts) => accounts.flat()),
|
|
928
|
+
distinctUntilChanged3(isSameAccountsList2)
|
|
382
929
|
).subscribe(subscriber);
|
|
383
930
|
return () => {
|
|
384
931
|
sub.unsubscribe();
|
|
385
932
|
};
|
|
386
|
-
}).pipe(
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
954
|
+
map5((w) => w.filter((w2) => w2.platform === "ethereum"))
|
|
408
955
|
)
|
|
409
956
|
);
|
|
410
957
|
}
|
|
411
958
|
}
|
|
412
959
|
);
|
|
413
|
-
const accounts$ = sources.length ?
|
|
414
|
-
|
|
415
|
-
) :
|
|
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(
|
|
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
|
|
1141
|
+
combineLatest as combineLatest8,
|
|
426
1142
|
distinct,
|
|
427
1143
|
filter as filter2,
|
|
428
1144
|
map as map8,
|
|
429
1145
|
mergeMap,
|
|
430
|
-
Observable as
|
|
1146
|
+
Observable as Observable8,
|
|
431
1147
|
of as of5,
|
|
432
|
-
shareReplay as
|
|
433
|
-
|
|
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
|
-
|
|
451
|
-
|
|
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
|
|
503
|
-
combineLatest as
|
|
504
|
-
distinctUntilChanged as
|
|
505
|
-
map as
|
|
506
|
-
Observable as
|
|
507
|
-
|
|
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
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
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
|
-
}
|
|
592
|
-
|
|
593
|
-
|
|
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 =
|
|
1185
|
+
const providerDetails = mipdStore.getProviders();
|
|
604
1186
|
subscriber.next(providerDetails);
|
|
605
1187
|
return () => {
|
|
606
1188
|
unsubscribe();
|
|
607
|
-
|
|
1189
|
+
mipdStore.destroy();
|
|
608
1190
|
};
|
|
609
1191
|
}
|
|
610
|
-
).pipe(
|
|
611
|
-
var
|
|
612
|
-
(
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
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
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
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(
|
|
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
|
|
682
|
-
combineLatest as
|
|
683
|
-
distinctUntilChanged as
|
|
1268
|
+
BehaviorSubject as BehaviorSubject5,
|
|
1269
|
+
combineLatest as combineLatest7,
|
|
1270
|
+
distinctUntilChanged as distinctUntilChanged5,
|
|
684
1271
|
map as map7,
|
|
685
|
-
Observable as
|
|
686
|
-
shareReplay as
|
|
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
|
|
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
|
-
|
|
730
|
-
|
|
1294
|
+
distinctUntilChanged5(isEqual),
|
|
1295
|
+
shareReplay7({ refCount: true, bufferSize: 1 })
|
|
731
1296
|
);
|
|
732
1297
|
};
|
|
733
|
-
var
|
|
734
|
-
const enabledExtensions$ = new
|
|
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
|
-
|
|
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
|
-
|
|
1316
|
+
store2.removeEnabledWalletId(walletId);
|
|
752
1317
|
};
|
|
753
1318
|
const walletIds$ = createWalletIdsPoller$();
|
|
754
|
-
const subscription =
|
|
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
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
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
|
-
|
|
797
|
-
|
|
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
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
)
|
|
807
|
-
|
|
808
|
-
return new
|
|
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 ?
|
|
820
|
-
map8((wallets) => wallets.flat().sort(sortWallets))
|
|
821
|
-
//
|
|
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 =
|
|
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(
|
|
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
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
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
|
-
|
|
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
|