@kheopskit/core 1.0.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATING_TO_V4.md +259 -0
- package/README.md +67 -0
- package/dist/chunk-4RBYRNY3.mjs +164 -0
- package/dist/chunk-4RBYRNY3.mjs.map +1 -0
- package/dist/chunk-BWUUHUDK.mjs +24 -0
- package/dist/chunk-BWUUHUDK.mjs.map +1 -0
- package/dist/chunk-D3EQMFZ2.js +24 -0
- package/dist/chunk-D3EQMFZ2.js.map +1 -0
- package/dist/chunk-FIAL4HTE.js +1 -0
- package/dist/chunk-FIAL4HTE.js.map +1 -0
- package/dist/chunk-KWFQDD7E.mjs +578 -0
- package/dist/chunk-KWFQDD7E.mjs.map +1 -0
- package/dist/chunk-NU46D4MZ.js +578 -0
- package/dist/chunk-NU46D4MZ.js.map +1 -0
- package/dist/chunk-PNPPI5CH.mjs +201 -0
- package/dist/chunk-PNPPI5CH.mjs.map +1 -0
- package/dist/chunk-SIUWQBT4.js +201 -0
- package/dist/chunk-SIUWQBT4.js.map +1 -0
- package/dist/chunk-TMAPQWW2.js +164 -0
- package/dist/chunk-TMAPQWW2.js.map +1 -0
- package/dist/chunk-YFD3IKK5.mjs +1 -0
- package/dist/chunk-YFD3IKK5.mjs.map +1 -0
- package/dist/ethereum.d.mts +60 -0
- package/dist/ethereum.d.ts +60 -0
- package/dist/ethereum.js +332 -0
- package/dist/ethereum.js.map +1 -0
- package/dist/ethereum.mjs +332 -0
- package/dist/ethereum.mjs.map +1 -0
- package/dist/getCachedObservable-C4E8dfMp.d.mts +20 -0
- package/dist/getCachedObservable-C4E8dfMp.d.ts +20 -0
- package/dist/index.d.mts +44 -270
- package/dist/index.d.ts +44 -270
- package/dist/index.js +160 -1394
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +119 -1387
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.mts +86 -0
- package/dist/internal.d.ts +86 -0
- package/dist/internal.js +32 -0
- package/dist/internal.js.map +1 -0
- package/dist/internal.mjs +32 -0
- package/dist/internal.mjs.map +1 -0
- package/dist/polkadot.d.mts +69 -0
- package/dist/polkadot.d.ts +69 -0
- package/dist/polkadot.js +314 -0
- package/dist/polkadot.js.map +1 -0
- package/dist/polkadot.mjs +314 -0
- package/dist/polkadot.mjs.map +1 -0
- package/dist/solana.d.mts +97 -0
- package/dist/solana.d.ts +97 -0
- package/dist/solana.js +466 -0
- package/dist/solana.js.map +1 -0
- package/dist/solana.mjs +466 -0
- package/dist/solana.mjs.map +1 -0
- package/dist/types-BNzRUNw-.d.mts +319 -0
- package/dist/types-BNzRUNw-.d.ts +319 -0
- package/package.json +76 -16
|
@@ -0,0 +1,578 @@
|
|
|
1
|
+
import {
|
|
2
|
+
__publicField,
|
|
3
|
+
clearCachedObservablesByPrefix,
|
|
4
|
+
cookieStorage,
|
|
5
|
+
getWalletId,
|
|
6
|
+
isValidWalletId,
|
|
7
|
+
isWalletPlatform,
|
|
8
|
+
parseWalletId,
|
|
9
|
+
safeLocalStorage
|
|
10
|
+
} from "./chunk-PNPPI5CH.mjs";
|
|
11
|
+
|
|
12
|
+
// src/utils/isEthereumAddress.ts
|
|
13
|
+
import { keccak_256 } from "@noble/hashes/sha3";
|
|
14
|
+
var HEX_ADDRESS = /^0x[0-9a-fA-F]{40}$/;
|
|
15
|
+
var encoder = new TextEncoder();
|
|
16
|
+
var isChecksumValid = (address) => {
|
|
17
|
+
const hex = address.slice(2);
|
|
18
|
+
const hash = keccak_256(encoder.encode(hex.toLowerCase()));
|
|
19
|
+
for (let i = 0; i < 40; i++) {
|
|
20
|
+
const char = hex.charAt(i);
|
|
21
|
+
const isLetter = char >= "a" && char <= "f" || char >= "A" && char <= "F";
|
|
22
|
+
if (!isLetter) continue;
|
|
23
|
+
const byte = hash[i >> 1] ?? 0;
|
|
24
|
+
const nibble = i % 2 === 0 ? byte >> 4 : byte & 15;
|
|
25
|
+
const isUpper = char <= "F";
|
|
26
|
+
if (isUpper !== nibble >= 8) return false;
|
|
27
|
+
}
|
|
28
|
+
return true;
|
|
29
|
+
};
|
|
30
|
+
var isEthereumAddress = (address) => {
|
|
31
|
+
if (!HEX_ADDRESS.test(address)) return false;
|
|
32
|
+
if (address === address.toLowerCase()) return true;
|
|
33
|
+
return isChecksumValid(address);
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// src/utils/isSs58Address.ts
|
|
37
|
+
import { blake2b } from "@noble/hashes/blake2b";
|
|
38
|
+
import { base58 } from "@scure/base";
|
|
39
|
+
var SS58PRE = new Uint8Array([83, 83, 53, 56, 80, 82, 69]);
|
|
40
|
+
var isSs58Address = (address) => {
|
|
41
|
+
if (!address) return false;
|
|
42
|
+
let decoded;
|
|
43
|
+
try {
|
|
44
|
+
decoded = base58.decode(address);
|
|
45
|
+
} catch {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
const firstByte = decoded[0];
|
|
49
|
+
if (firstByte === void 0 || firstByte & 128) return false;
|
|
50
|
+
const prefixLength = firstByte & 64 ? 2 : 1;
|
|
51
|
+
if (decoded.length !== prefixLength + 32 + 2) return false;
|
|
52
|
+
const body = decoded.subarray(0, decoded.length - 2);
|
|
53
|
+
const preimage = new Uint8Array(SS58PRE.length + body.length);
|
|
54
|
+
preimage.set(SS58PRE);
|
|
55
|
+
preimage.set(body, SS58PRE.length);
|
|
56
|
+
const hash = blake2b(preimage, { dkLen: 64 });
|
|
57
|
+
return decoded[decoded.length - 2] === hash[0] && decoded[decoded.length - 1] === hash[1];
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// src/utils/isSolanaAddress.ts
|
|
61
|
+
import { base58 as base582 } from "@scure/base";
|
|
62
|
+
var isSolanaAddress = (address) => {
|
|
63
|
+
if (!address) return false;
|
|
64
|
+
try {
|
|
65
|
+
return base582.decode(address).length === 32;
|
|
66
|
+
} catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
// src/utils/isValidAddress.ts
|
|
72
|
+
var isValidAddress = (address) => {
|
|
73
|
+
if (address.startsWith("0x")) return isEthereumAddress(address);
|
|
74
|
+
return isSs58Address(address) || isSolanaAddress(address);
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// src/utils/WalletAccountId.ts
|
|
78
|
+
var getWalletAccountId = (walletId, address) => {
|
|
79
|
+
if (!walletId) throw new Error("Missing walletId");
|
|
80
|
+
if (!isValidAddress(address)) throw new Error("Invalid address");
|
|
81
|
+
return `${walletId}::${address}`;
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
// src/api/appKit.ts
|
|
85
|
+
import {
|
|
86
|
+
BehaviorSubject,
|
|
87
|
+
combineLatest,
|
|
88
|
+
distinctUntilChanged,
|
|
89
|
+
from,
|
|
90
|
+
map,
|
|
91
|
+
Observable,
|
|
92
|
+
of,
|
|
93
|
+
shareReplay,
|
|
94
|
+
switchMap,
|
|
95
|
+
tap
|
|
96
|
+
} from "rxjs";
|
|
97
|
+
var loadAppKit = async () => {
|
|
98
|
+
try {
|
|
99
|
+
const { createAppKit } = await import("@reown/appkit/core");
|
|
100
|
+
return createAppKit;
|
|
101
|
+
} catch (cause) {
|
|
102
|
+
console.error(
|
|
103
|
+
"[kheopskit] WalletConnect is configured but @reown/appkit could not be loaded. Install it with `pnpm add @reown/appkit` (or remove config.walletConnect). WalletConnect wallets are disabled; injected wallets still work.",
|
|
104
|
+
cause
|
|
105
|
+
);
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
var WALLET_CONNECT_ICON = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+";
|
|
110
|
+
var APPKIT_SYMBOL = /* @__PURE__ */ Symbol.for("kheopskit.cachedAppKit");
|
|
111
|
+
var getCachedAppKit = () => globalThis[APPKIT_SYMBOL];
|
|
112
|
+
var setCachedAppKit = (value) => {
|
|
113
|
+
globalThis[APPKIT_SYMBOL] = value;
|
|
114
|
+
};
|
|
115
|
+
var resetAppKitCache = () => {
|
|
116
|
+
setCachedAppKit(void 0);
|
|
117
|
+
};
|
|
118
|
+
var clearAccountsCacheOnDisconnect = (platform) => (isConnected) => {
|
|
119
|
+
if (!isConnected)
|
|
120
|
+
clearCachedObservablesByPrefix(
|
|
121
|
+
`accounts:${getWalletId(platform, "walletconnect")}:`
|
|
122
|
+
);
|
|
123
|
+
};
|
|
124
|
+
var getAppKitWallets$ = (config) => {
|
|
125
|
+
if (!config.walletConnect) return of({});
|
|
126
|
+
if (typeof window === "undefined") return of({});
|
|
127
|
+
const walletConnect = config.walletConnect;
|
|
128
|
+
let cachedAppKit = getCachedAppKit();
|
|
129
|
+
if (!cachedAppKit) {
|
|
130
|
+
cachedAppKit = from(loadAppKit()).pipe(
|
|
131
|
+
switchMap((createAppKit) => {
|
|
132
|
+
if (!createAppKit) return of({});
|
|
133
|
+
return new Observable((subscriber) => {
|
|
134
|
+
const appKit = createAppKit({
|
|
135
|
+
projectId: walletConnect.projectId,
|
|
136
|
+
metadata: walletConnect.metadata,
|
|
137
|
+
// Loosely typed in WalletConnectConfig to keep @reown/appkit's
|
|
138
|
+
// types out of core; forwarded to AppKit verbatim.
|
|
139
|
+
networks: walletConnect.networks,
|
|
140
|
+
themeMode: walletConnect.themeMode,
|
|
141
|
+
themeVariables: walletConnect.themeVariables,
|
|
142
|
+
universalProviderConfigOverride: {
|
|
143
|
+
methods: {
|
|
144
|
+
polkadot: ["polkadot_signTransaction", "polkadot_signMessage"],
|
|
145
|
+
solana: [
|
|
146
|
+
"solana_signTransaction",
|
|
147
|
+
"solana_signMessage",
|
|
148
|
+
"solana_signAndSendTransaction"
|
|
149
|
+
]
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
allWallets: "HIDE",
|
|
153
|
+
debug: config.debug,
|
|
154
|
+
allowUnsupportedChain: true
|
|
155
|
+
});
|
|
156
|
+
const appKitInstance = appKit;
|
|
157
|
+
const status$ = new BehaviorSubject({
|
|
158
|
+
isPolkadotConnected: false,
|
|
159
|
+
isEthereumConnected: false,
|
|
160
|
+
isSolanaConnected: false
|
|
161
|
+
});
|
|
162
|
+
const unsubProviders = appKit.subscribeProviders((providers) => {
|
|
163
|
+
status$.next({
|
|
164
|
+
isPolkadotConnected: !!providers.polkadot,
|
|
165
|
+
isEthereumConnected: !!providers.eip155,
|
|
166
|
+
isSolanaConnected: !!providers.solana
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
const polkadotWallet$ = appKit.chainNamespaces.includes("polkadot") ? status$.pipe(
|
|
170
|
+
map((s) => s.isPolkadotConnected),
|
|
171
|
+
distinctUntilChanged(),
|
|
172
|
+
tap(clearAccountsCacheOnDisconnect("polkadot")),
|
|
173
|
+
map((isConnected) => {
|
|
174
|
+
const walletInfo = appKit.getWalletInfo();
|
|
175
|
+
const walletId = getWalletId("polkadot", "walletconnect");
|
|
176
|
+
return {
|
|
177
|
+
id: walletId,
|
|
178
|
+
platform: "polkadot",
|
|
179
|
+
type: "appKit",
|
|
180
|
+
appKit: appKitInstance,
|
|
181
|
+
name: walletInfo?.name ?? "WalletConnect",
|
|
182
|
+
icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
|
|
183
|
+
connect: async () => {
|
|
184
|
+
if (!isConnected) await appKit.open();
|
|
185
|
+
},
|
|
186
|
+
disconnect: async () => {
|
|
187
|
+
if (isConnected) await appKit.disconnect();
|
|
188
|
+
},
|
|
189
|
+
isConnected
|
|
190
|
+
};
|
|
191
|
+
})
|
|
192
|
+
) : of(void 0);
|
|
193
|
+
const ethereumWallet$ = appKit.chainNamespaces.includes("eip155") ? status$.pipe(
|
|
194
|
+
map((s) => s.isEthereumConnected),
|
|
195
|
+
distinctUntilChanged(),
|
|
196
|
+
tap(clearAccountsCacheOnDisconnect("ethereum")),
|
|
197
|
+
map((isConnected) => {
|
|
198
|
+
const walletInfo = appKit.getWalletInfo();
|
|
199
|
+
const walletId = getWalletId("ethereum", "walletconnect");
|
|
200
|
+
return {
|
|
201
|
+
id: walletId,
|
|
202
|
+
platform: "ethereum",
|
|
203
|
+
type: "appKit",
|
|
204
|
+
appKit: appKitInstance,
|
|
205
|
+
name: walletInfo?.name ?? "WalletConnect",
|
|
206
|
+
icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
|
|
207
|
+
connect: () => appKit.open(),
|
|
208
|
+
disconnect: async () => {
|
|
209
|
+
await appKit.disconnect();
|
|
210
|
+
},
|
|
211
|
+
isConnected
|
|
212
|
+
};
|
|
213
|
+
})
|
|
214
|
+
) : of(void 0);
|
|
215
|
+
const solanaWallet$ = appKit.chainNamespaces.includes("solana") ? status$.pipe(
|
|
216
|
+
map((s) => s.isSolanaConnected),
|
|
217
|
+
distinctUntilChanged(),
|
|
218
|
+
tap(clearAccountsCacheOnDisconnect("solana")),
|
|
219
|
+
map((isConnected) => {
|
|
220
|
+
const walletInfo = appKit.getWalletInfo();
|
|
221
|
+
const walletId = getWalletId("solana", "walletconnect");
|
|
222
|
+
return {
|
|
223
|
+
id: walletId,
|
|
224
|
+
platform: "solana",
|
|
225
|
+
type: "appKit",
|
|
226
|
+
appKit: appKitInstance,
|
|
227
|
+
name: walletInfo?.name ?? "WalletConnect",
|
|
228
|
+
icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
|
|
229
|
+
connect: () => appKit.open(),
|
|
230
|
+
disconnect: async () => {
|
|
231
|
+
await appKit.disconnect();
|
|
232
|
+
},
|
|
233
|
+
isConnected
|
|
234
|
+
};
|
|
235
|
+
})
|
|
236
|
+
) : of(void 0);
|
|
237
|
+
const sub = combineLatest({
|
|
238
|
+
polkadot: polkadotWallet$,
|
|
239
|
+
ethereum: ethereumWallet$,
|
|
240
|
+
solana: solanaWallet$
|
|
241
|
+
}).subscribe(subscriber);
|
|
242
|
+
return () => {
|
|
243
|
+
sub.unsubscribe();
|
|
244
|
+
unsubProviders();
|
|
245
|
+
};
|
|
246
|
+
});
|
|
247
|
+
}),
|
|
248
|
+
shareReplay({ refCount: true, bufferSize: 1 })
|
|
249
|
+
);
|
|
250
|
+
setCachedAppKit(cachedAppKit);
|
|
251
|
+
}
|
|
252
|
+
return cachedAppKit;
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
// src/api/errors.ts
|
|
256
|
+
var KheopskitError = class extends Error {
|
|
257
|
+
constructor(code, message, options) {
|
|
258
|
+
super(`[kheopskit] ${message}`, { cause: options?.cause });
|
|
259
|
+
__publicField(this, "code");
|
|
260
|
+
/** The wallet id this error relates to, when applicable. */
|
|
261
|
+
__publicField(this, "walletId");
|
|
262
|
+
this.name = "KheopskitError";
|
|
263
|
+
this.code = code;
|
|
264
|
+
this.walletId = options?.walletId;
|
|
265
|
+
}
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
// src/api/config.ts
|
|
269
|
+
var DEFAULT_STORAGE_KEY = "kheopskit";
|
|
270
|
+
var DEFAULTS = {
|
|
271
|
+
autoReconnect: true,
|
|
272
|
+
debug: false,
|
|
273
|
+
storageKey: DEFAULT_STORAGE_KEY,
|
|
274
|
+
hydrationGracePeriod: 500
|
|
275
|
+
};
|
|
276
|
+
var resolveConfig = (config) => {
|
|
277
|
+
const platforms = config?.platforms ?? [];
|
|
278
|
+
const invalidPlatforms = platforms.filter(
|
|
279
|
+
(p) => typeof p !== "object" || p === null || typeof p.getWallets$ !== "function"
|
|
280
|
+
);
|
|
281
|
+
if (invalidPlatforms.length > 0) {
|
|
282
|
+
throw new Error(
|
|
283
|
+
`[kheopskit] config.platforms must contain plugin instances created by the per-platform factories (e.g. platforms: [polkadot(), ethereum(), solana()] imported from "@kheopskit/core/<platform>"). Invalid entries: ${JSON.stringify(invalidPlatforms)}. String platform names like "polkadot" were removed in v4 \u2014 see MIGRATING_TO_V4.md.`
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
if (platforms.length === 0) {
|
|
287
|
+
console.warn(
|
|
288
|
+
'[kheopskit] No platforms configured; wallets and accounts will be empty. Pass e.g. platforms: [polkadot()] from "@kheopskit/core/polkadot".'
|
|
289
|
+
);
|
|
290
|
+
}
|
|
291
|
+
return Object.assign({}, DEFAULTS, config, { platforms });
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
// src/api/store.ts
|
|
295
|
+
import { uniq } from "lodash-es";
|
|
296
|
+
|
|
297
|
+
// src/utils/createStore.ts
|
|
298
|
+
import { BehaviorSubject as BehaviorSubject2 } from "rxjs";
|
|
299
|
+
var createStore = (key, defaultValue, storage = safeLocalStorage) => {
|
|
300
|
+
const subject = new BehaviorSubject2(
|
|
301
|
+
getStoredData(key, defaultValue, storage)
|
|
302
|
+
);
|
|
303
|
+
let unsubscribeStorage;
|
|
304
|
+
if (typeof window !== "undefined" && storage.subscribe) {
|
|
305
|
+
unsubscribeStorage = storage.subscribe(key, (newValue) => {
|
|
306
|
+
subject.next(parseData(newValue, defaultValue));
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
const update = (val) => {
|
|
310
|
+
setStoredData(key, val, storage);
|
|
311
|
+
subject.next(val);
|
|
312
|
+
};
|
|
313
|
+
return {
|
|
314
|
+
observable: subject.asObservable(),
|
|
315
|
+
set: (val) => update(val),
|
|
316
|
+
mutate: (transform) => update(transform(subject.getValue())),
|
|
317
|
+
get: () => structuredClone(subject.getValue()),
|
|
318
|
+
/**
|
|
319
|
+
* Cleanup subscriptions. Call this when the store is no longer needed.
|
|
320
|
+
*/
|
|
321
|
+
destroy: () => {
|
|
322
|
+
unsubscribeStorage?.();
|
|
323
|
+
subject.complete();
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
};
|
|
327
|
+
var parseData = (str, defaultValue) => {
|
|
328
|
+
try {
|
|
329
|
+
if (str) return JSON.parse(str);
|
|
330
|
+
} catch {
|
|
331
|
+
}
|
|
332
|
+
return defaultValue;
|
|
333
|
+
};
|
|
334
|
+
var getStoredData = (key, defaultValue, storage) => {
|
|
335
|
+
const str = storage.getItem(key);
|
|
336
|
+
return parseData(str, defaultValue);
|
|
337
|
+
};
|
|
338
|
+
var setStoredData = (key, val, storage) => {
|
|
339
|
+
const str = JSON.stringify(val);
|
|
340
|
+
storage.setItem(key, str);
|
|
341
|
+
};
|
|
342
|
+
|
|
343
|
+
// src/api/store.ts
|
|
344
|
+
var DEFAULT_SETTINGS = {};
|
|
345
|
+
var isValidCachedWallet = (value) => {
|
|
346
|
+
if (!value || typeof value !== "object") return false;
|
|
347
|
+
const w = value;
|
|
348
|
+
return isValidWalletId(w.id) && isWalletPlatform(w.platform) && typeof w.name === "string" && (w.type === "injected" || w.type === "appKit") && typeof w.isConnected === "boolean";
|
|
349
|
+
};
|
|
350
|
+
var isValidCachedAccount = (value) => {
|
|
351
|
+
if (!value || typeof value !== "object") return false;
|
|
352
|
+
const a = value;
|
|
353
|
+
return typeof a.id === "string" && !!a.id && isWalletPlatform(a.platform) && typeof a.address === "string" && !!a.address && isValidWalletId(a.walletId) && typeof a.walletName === "string";
|
|
354
|
+
};
|
|
355
|
+
var toCompactPolkadotAccountType = (type) => {
|
|
356
|
+
switch (type) {
|
|
357
|
+
case "sr25519":
|
|
358
|
+
return 0;
|
|
359
|
+
case "ed25519":
|
|
360
|
+
return 1;
|
|
361
|
+
case "ecdsa":
|
|
362
|
+
return 2;
|
|
363
|
+
case "ethereum":
|
|
364
|
+
return 3;
|
|
365
|
+
default:
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
var fromCompactPolkadotAccountType = (type) => {
|
|
370
|
+
switch (type) {
|
|
371
|
+
case 0:
|
|
372
|
+
return "sr25519";
|
|
373
|
+
case 1:
|
|
374
|
+
return "ed25519";
|
|
375
|
+
case 2:
|
|
376
|
+
return "ecdsa";
|
|
377
|
+
case 3:
|
|
378
|
+
return "ethereum";
|
|
379
|
+
default:
|
|
380
|
+
return void 0;
|
|
381
|
+
}
|
|
382
|
+
};
|
|
383
|
+
var createKheopskitStore = (options = {}) => {
|
|
384
|
+
const { ssrCookies, storageKey = DEFAULT_STORAGE_KEY } = options;
|
|
385
|
+
const storage = ssrCookies !== void 0 ? createCompactCookieStorage(ssrCookies) : safeLocalStorage;
|
|
386
|
+
const store2 = createStore(storageKey, DEFAULT_SETTINGS, storage);
|
|
387
|
+
const addEnabledWalletId = (walletId) => {
|
|
388
|
+
parseWalletId(walletId);
|
|
389
|
+
store2.mutate((prev) => ({
|
|
390
|
+
...prev,
|
|
391
|
+
autoReconnect: uniq((prev.autoReconnect ?? []).concat(walletId))
|
|
392
|
+
}));
|
|
393
|
+
};
|
|
394
|
+
const removeEnabledWalletId = (walletId) => {
|
|
395
|
+
store2.mutate((prev) => ({
|
|
396
|
+
...prev,
|
|
397
|
+
autoReconnect: uniq(
|
|
398
|
+
(prev.autoReconnect ?? []).filter((id) => id !== walletId)
|
|
399
|
+
)
|
|
400
|
+
}));
|
|
401
|
+
};
|
|
402
|
+
const getCachedState = () => {
|
|
403
|
+
const data = store2.get();
|
|
404
|
+
const cachedWallets = Array.isArray(data?.cachedWallets) ? data.cachedWallets : [];
|
|
405
|
+
const cachedAccounts = Array.isArray(data?.cachedAccounts) ? data.cachedAccounts : [];
|
|
406
|
+
return {
|
|
407
|
+
wallets: cachedWallets.filter(isValidCachedWallet),
|
|
408
|
+
accounts: cachedAccounts.filter(isValidCachedAccount)
|
|
409
|
+
};
|
|
410
|
+
};
|
|
411
|
+
const setCachedState = (wallets, accounts) => {
|
|
412
|
+
store2.mutate((prev) => ({
|
|
413
|
+
...prev,
|
|
414
|
+
cachedWallets: wallets,
|
|
415
|
+
cachedAccounts: accounts
|
|
416
|
+
}));
|
|
417
|
+
};
|
|
418
|
+
return {
|
|
419
|
+
observable: store2.observable,
|
|
420
|
+
addEnabledWalletId,
|
|
421
|
+
removeEnabledWalletId,
|
|
422
|
+
getCachedState,
|
|
423
|
+
setCachedState
|
|
424
|
+
};
|
|
425
|
+
};
|
|
426
|
+
var DEFAULT_STORE_SYMBOL = /* @__PURE__ */ Symbol.for("kheopskit.defaultStore");
|
|
427
|
+
var getDefaultStore = () => {
|
|
428
|
+
const g = globalThis;
|
|
429
|
+
if (!g[DEFAULT_STORE_SYMBOL]) {
|
|
430
|
+
g[DEFAULT_STORE_SYMBOL] = createKheopskitStore();
|
|
431
|
+
}
|
|
432
|
+
return g[DEFAULT_STORE_SYMBOL];
|
|
433
|
+
};
|
|
434
|
+
var store = {
|
|
435
|
+
get observable() {
|
|
436
|
+
return getDefaultStore().observable;
|
|
437
|
+
},
|
|
438
|
+
addEnabledWalletId: (walletId) => getDefaultStore().addEnabledWalletId(walletId),
|
|
439
|
+
removeEnabledWalletId: (walletId) => getDefaultStore().removeEnabledWalletId(walletId),
|
|
440
|
+
getCachedState: () => getDefaultStore().getCachedState(),
|
|
441
|
+
setCachedState: (wallets, accounts) => getDefaultStore().setCachedState(wallets, accounts)
|
|
442
|
+
};
|
|
443
|
+
var isCompactStore = (value) => {
|
|
444
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
445
|
+
if ("cachedWallets" in value || "cachedAccounts" in value) return false;
|
|
446
|
+
return "v" in value || "w" in value || "a" in value || "r" in value;
|
|
447
|
+
};
|
|
448
|
+
var toCompactStore = (data) => {
|
|
449
|
+
const wallets = data.cachedWallets?.map(
|
|
450
|
+
(wallet) => [
|
|
451
|
+
wallet.id,
|
|
452
|
+
wallet.name,
|
|
453
|
+
wallet.isConnected ? 1 : 0,
|
|
454
|
+
wallet.type === "appKit" ? 1 : 0
|
|
455
|
+
]
|
|
456
|
+
);
|
|
457
|
+
const accounts = data.cachedAccounts?.map(
|
|
458
|
+
(account) => [
|
|
459
|
+
account.walletId,
|
|
460
|
+
account.address,
|
|
461
|
+
account.name ?? null,
|
|
462
|
+
account.chainId ?? null,
|
|
463
|
+
toCompactPolkadotAccountType(account.polkadotAccountType)
|
|
464
|
+
]
|
|
465
|
+
);
|
|
466
|
+
return {
|
|
467
|
+
v: 1,
|
|
468
|
+
r: data.autoReconnect,
|
|
469
|
+
w: wallets?.length ? wallets : void 0,
|
|
470
|
+
a: accounts?.length ? accounts : void 0
|
|
471
|
+
};
|
|
472
|
+
};
|
|
473
|
+
var fromCompactStore = (data) => {
|
|
474
|
+
const walletNameMap = /* @__PURE__ */ new Map();
|
|
475
|
+
const wallets = [];
|
|
476
|
+
for (const item of Array.isArray(data.w) ? data.w : []) {
|
|
477
|
+
if (!Array.isArray(item)) continue;
|
|
478
|
+
const [id, name, isConnected, type] = item;
|
|
479
|
+
if (!isValidWalletId(id)) continue;
|
|
480
|
+
const { platform } = parseWalletId(id);
|
|
481
|
+
walletNameMap.set(id, name);
|
|
482
|
+
wallets.push({
|
|
483
|
+
id,
|
|
484
|
+
platform,
|
|
485
|
+
type: type === 1 ? "appKit" : "injected",
|
|
486
|
+
name,
|
|
487
|
+
isConnected: isConnected === 1
|
|
488
|
+
});
|
|
489
|
+
}
|
|
490
|
+
const accounts = [];
|
|
491
|
+
for (const item of Array.isArray(data.a) ? data.a : []) {
|
|
492
|
+
if (!Array.isArray(item)) continue;
|
|
493
|
+
const [walletId, address, name, chainId, polkadotAccountType] = item;
|
|
494
|
+
if (!isValidWalletId(walletId) || typeof address !== "string" || !address)
|
|
495
|
+
continue;
|
|
496
|
+
const { platform } = parseWalletId(walletId);
|
|
497
|
+
accounts.push({
|
|
498
|
+
id: getWalletAccountId(walletId, address),
|
|
499
|
+
platform,
|
|
500
|
+
address,
|
|
501
|
+
name: name ?? void 0,
|
|
502
|
+
chainId: chainId ?? void 0,
|
|
503
|
+
polkadotAccountType: platform === "polkadot" ? fromCompactPolkadotAccountType(polkadotAccountType) : void 0,
|
|
504
|
+
walletId,
|
|
505
|
+
walletName: walletNameMap.get(walletId) ?? walletId
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
return {
|
|
509
|
+
autoReconnect: data.r,
|
|
510
|
+
cachedWallets: wallets,
|
|
511
|
+
cachedAccounts: accounts
|
|
512
|
+
};
|
|
513
|
+
};
|
|
514
|
+
var decodeStore = (raw, fallback) => {
|
|
515
|
+
try {
|
|
516
|
+
const parsed = JSON.parse(raw);
|
|
517
|
+
if (isCompactStore(parsed)) return fromCompactStore(parsed);
|
|
518
|
+
return parsed;
|
|
519
|
+
} catch {
|
|
520
|
+
return fallback;
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
var encodeStore = (data) => JSON.stringify(toCompactStore(data));
|
|
524
|
+
var createCompactCookieStorage = (initialCookies) => {
|
|
525
|
+
const base = cookieStorage(initialCookies);
|
|
526
|
+
return {
|
|
527
|
+
getItem: (key) => {
|
|
528
|
+
const raw = base.getItem(key);
|
|
529
|
+
if (!raw) return null;
|
|
530
|
+
const expanded = decodeStore(raw, DEFAULT_SETTINGS);
|
|
531
|
+
if (typeof document !== "undefined") {
|
|
532
|
+
try {
|
|
533
|
+
const parsed = JSON.parse(raw);
|
|
534
|
+
if (!isCompactStore(parsed)) {
|
|
535
|
+
base.setItem(key, encodeStore(expanded));
|
|
536
|
+
}
|
|
537
|
+
} catch {
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
return JSON.stringify(expanded);
|
|
541
|
+
},
|
|
542
|
+
setItem: (key, value) => {
|
|
543
|
+
const expanded = decodeStore(value, DEFAULT_SETTINGS);
|
|
544
|
+
base.setItem(key, encodeStore(expanded));
|
|
545
|
+
},
|
|
546
|
+
removeItem: base.removeItem,
|
|
547
|
+
subscribe: (key, callback) => {
|
|
548
|
+
const unsubscribe = base.subscribe?.(key, (value) => {
|
|
549
|
+
if (!value) {
|
|
550
|
+
callback(null);
|
|
551
|
+
return;
|
|
552
|
+
}
|
|
553
|
+
const expanded = decodeStore(value, DEFAULT_SETTINGS);
|
|
554
|
+
callback(JSON.stringify(expanded));
|
|
555
|
+
});
|
|
556
|
+
return () => {
|
|
557
|
+
unsubscribe?.();
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
};
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
export {
|
|
564
|
+
isEthereumAddress,
|
|
565
|
+
isSs58Address,
|
|
566
|
+
isSolanaAddress,
|
|
567
|
+
isValidAddress,
|
|
568
|
+
getWalletAccountId,
|
|
569
|
+
resetAppKitCache,
|
|
570
|
+
getAppKitWallets$,
|
|
571
|
+
KheopskitError,
|
|
572
|
+
DEFAULT_STORAGE_KEY,
|
|
573
|
+
resolveConfig,
|
|
574
|
+
createKheopskitStore,
|
|
575
|
+
getDefaultStore,
|
|
576
|
+
store
|
|
577
|
+
};
|
|
578
|
+
//# sourceMappingURL=chunk-KWFQDD7E.mjs.map
|