@kheopskit/core 1.0.1 → 5.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.
Files changed (53) hide show
  1. package/MIGRATING_TO_V4.md +259 -0
  2. package/README.md +67 -0
  3. package/dist/chunk-4ENHC7G4.js +210 -0
  4. package/dist/chunk-4ENHC7G4.js.map +1 -0
  5. package/dist/chunk-6XAZANB5.mjs +450 -0
  6. package/dist/chunk-6XAZANB5.mjs.map +1 -0
  7. package/dist/chunk-7QSGAJ4A.mjs +210 -0
  8. package/dist/chunk-7QSGAJ4A.mjs.map +1 -0
  9. package/dist/chunk-B4L6GAYD.js +179 -0
  10. package/dist/chunk-B4L6GAYD.js.map +1 -0
  11. package/dist/chunk-BWUUHUDK.mjs +24 -0
  12. package/dist/chunk-BWUUHUDK.mjs.map +1 -0
  13. package/dist/chunk-D3EQMFZ2.js +24 -0
  14. package/dist/chunk-D3EQMFZ2.js.map +1 -0
  15. package/dist/chunk-XQWJM3KC.js +450 -0
  16. package/dist/chunk-XQWJM3KC.js.map +1 -0
  17. package/dist/chunk-YDLCHYHH.mjs +179 -0
  18. package/dist/chunk-YDLCHYHH.mjs.map +1 -0
  19. package/dist/ethereum.d.mts +61 -0
  20. package/dist/ethereum.d.ts +61 -0
  21. package/dist/ethereum.js +351 -0
  22. package/dist/ethereum.js.map +1 -0
  23. package/dist/ethereum.mjs +351 -0
  24. package/dist/ethereum.mjs.map +1 -0
  25. package/dist/getCachedObservable-C4E8dfMp.d.mts +20 -0
  26. package/dist/getCachedObservable-C4E8dfMp.d.ts +20 -0
  27. package/dist/index.d.mts +55 -267
  28. package/dist/index.d.ts +55 -267
  29. package/dist/index.js +327 -1355
  30. package/dist/index.js.map +1 -1
  31. package/dist/index.mjs +263 -1325
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/internal.d.mts +86 -0
  34. package/dist/internal.d.ts +86 -0
  35. package/dist/internal.js +32 -0
  36. package/dist/internal.js.map +1 -0
  37. package/dist/internal.mjs +32 -0
  38. package/dist/internal.mjs.map +1 -0
  39. package/dist/polkadot.d.mts +70 -0
  40. package/dist/polkadot.d.ts +70 -0
  41. package/dist/polkadot.js +303 -0
  42. package/dist/polkadot.js.map +1 -0
  43. package/dist/polkadot.mjs +303 -0
  44. package/dist/polkadot.mjs.map +1 -0
  45. package/dist/solana.d.mts +98 -0
  46. package/dist/solana.d.ts +98 -0
  47. package/dist/solana.js +461 -0
  48. package/dist/solana.js.map +1 -0
  49. package/dist/solana.mjs +461 -0
  50. package/dist/solana.mjs.map +1 -0
  51. package/dist/types-C7V7DGlg.d.mts +349 -0
  52. package/dist/types-C7V7DGlg.d.ts +349 -0
  53. package/package.json +104 -18
@@ -0,0 +1,303 @@
1
+ import {
2
+ POLKADOT_EXTENSIONS
3
+ } from "./chunk-BWUUHUDK.mjs";
4
+ import {
5
+ KheopskitError,
6
+ getWalletAccountId,
7
+ isSs58Address,
8
+ store
9
+ } from "./chunk-6XAZANB5.mjs";
10
+ import {
11
+ getCachedObservable$,
12
+ getWalletId,
13
+ isInjectedWallet,
14
+ isWalletConnectWallet,
15
+ parseWalletId
16
+ } from "./chunk-7QSGAJ4A.mjs";
17
+
18
+ // src/api/polkadot/accounts.ts
19
+ import {
20
+ getPolkadotSignerFromPjs
21
+ } from "polkadot-api/pjs-signer";
22
+ import {
23
+ combineLatest,
24
+ distinctUntilChanged,
25
+ map,
26
+ Observable,
27
+ of,
28
+ shareReplay,
29
+ switchMap
30
+ } from "rxjs";
31
+ var getInjectedWalletAccounts$ = (wallet) => {
32
+ if (!wallet.isConnected) return of([]);
33
+ return new Observable((subscriber) => {
34
+ const getAccount = (account) => ({
35
+ id: getWalletAccountId(wallet.id, account.address),
36
+ ...account,
37
+ type: account.type ?? "sr25519",
38
+ platform: "polkadot",
39
+ walletName: wallet.name,
40
+ walletId: wallet.id
41
+ });
42
+ const extension = wallet.extension;
43
+ const unsubscribe = extension.subscribe((accounts) => {
44
+ subscriber.next(accounts.map(getAccount));
45
+ });
46
+ subscriber.next(extension.getAccounts().map(getAccount));
47
+ return () => {
48
+ return unsubscribe();
49
+ };
50
+ });
51
+ };
52
+ var getAppKitPolkadotSigner = (appKit, address) => {
53
+ const provider = appKit.getProvider("polkadot");
54
+ if (!provider) throw new KheopskitError("NO_PROVIDER", "No provider found");
55
+ if (!provider.session)
56
+ throw new KheopskitError("NO_SESSION", "No session found");
57
+ return getPolkadotSignerFromPjs(
58
+ address,
59
+ (transactionPayload) => {
60
+ if (!provider.session)
61
+ throw new KheopskitError("NO_SESSION", "No session found");
62
+ return provider.client.request({
63
+ topic: provider.session.topic,
64
+ chainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,
65
+ request: {
66
+ method: "polkadot_signTransaction",
67
+ params: {
68
+ address,
69
+ transactionPayload
70
+ }
71
+ }
72
+ });
73
+ },
74
+ async ({ address: address2, data }) => {
75
+ if (!provider.session)
76
+ throw new KheopskitError("NO_SESSION", "No session found");
77
+ const networks = appKit.getCaipNetworks("polkadot");
78
+ const chainId = networks[0]?.caipNetworkId;
79
+ if (!chainId)
80
+ throw new KheopskitError(
81
+ "NO_SESSION",
82
+ "No CAIP network available for polkadot"
83
+ );
84
+ return provider.client.request({
85
+ topic: provider.session.topic,
86
+ chainId,
87
+ request: {
88
+ method: "polkadot_signMessage",
89
+ params: {
90
+ address: address2,
91
+ message: data
92
+ }
93
+ }
94
+ });
95
+ }
96
+ );
97
+ };
98
+ var getWalletConnectAccounts$ = (wallet) => {
99
+ const provider = wallet.appKit.getProvider("polkadot");
100
+ if (!wallet.platforms.includes("polkadot") || !provider?.session)
101
+ return of([]);
102
+ return getCachedObservable$(
103
+ `accounts:${wallet.id}:polkadot:`,
104
+ () => new Observable((subscriber) => {
105
+ const buildAccounts = () => {
106
+ const session = provider.session;
107
+ if (!session) return [];
108
+ const addresses = [
109
+ ...new Set(
110
+ Object.values(session.namespaces).flatMap((namespace) => namespace.accounts ?? []).filter((account) => account.startsWith("polkadot:")).map((account) => account.split(":")[2]).filter((address) => !!address)
111
+ )
112
+ ];
113
+ return addresses.map(
114
+ (address) => ({
115
+ id: getWalletAccountId(wallet.id, address),
116
+ platform: "polkadot",
117
+ walletName: wallet.name,
118
+ walletId: wallet.id,
119
+ address,
120
+ polkadotSigner: getAppKitPolkadotSigner(wallet.appKit, address),
121
+ genesisHash: null,
122
+ name: `${wallet.name} Polkadot`,
123
+ // WalletConnect (Reown AppKit) doesn't expose account key type;
124
+ // default to sr25519, which is the most common Polkadot key type.
125
+ type: "sr25519"
126
+ })
127
+ );
128
+ };
129
+ subscriber.next(buildAccounts());
130
+ const reemit = () => subscriber.next(buildAccounts());
131
+ provider.on("session_update", reemit);
132
+ provider.on("accountsChanged", reemit);
133
+ return () => {
134
+ provider.off("session_update", reemit);
135
+ provider.off("accountsChanged", reemit);
136
+ };
137
+ }).pipe(shareReplay({ refCount: true, bufferSize: 1 }))
138
+ );
139
+ };
140
+ var getPolkadotAccounts$ = (polkadotWallets$, polkadotAccountTypes) => new Observable((subscriber) => {
141
+ if (polkadotAccountTypes.length === 0) {
142
+ console.warn(
143
+ "[kheopskit] config.polkadotAccountTypes is empty; all Polkadot accounts will be filtered out."
144
+ );
145
+ }
146
+ const sub = polkadotWallets$.pipe(
147
+ map((wallets) => wallets.filter((w) => w.isConnected)),
148
+ switchMap(
149
+ (wallets) => wallets.length ? combineLatest([
150
+ ...wallets.filter((w) => w.type === "injected").map(getInjectedWalletAccounts$),
151
+ ...wallets.filter(isWalletConnectWallet).map(getWalletConnectAccounts$)
152
+ ]) : of([])
153
+ ),
154
+ map(
155
+ (accounts) => accounts.flat().filter((account) => polkadotAccountTypes.includes(account.type))
156
+ ),
157
+ distinctUntilChanged(isSameAccountsList)
158
+ ).subscribe(subscriber);
159
+ return () => {
160
+ sub.unsubscribe();
161
+ };
162
+ }).pipe(shareReplay({ refCount: true, bufferSize: 1 }));
163
+ var isSameAccountsList = (a, b) => {
164
+ if (a.length !== b.length) return false;
165
+ return a.every((account, i) => account.id === b[i]?.id);
166
+ };
167
+
168
+ // src/api/polkadot/wallets.ts
169
+ import { isEqual } from "lodash-es";
170
+ import {
171
+ connectInjectedExtension,
172
+ getInjectedExtensions
173
+ } from "polkadot-api/pjs-signer";
174
+ import {
175
+ BehaviorSubject,
176
+ combineLatest as combineLatest2,
177
+ distinctUntilChanged as distinctUntilChanged2,
178
+ map as map2,
179
+ Observable as Observable2,
180
+ shareReplay as shareReplay2
181
+ } from "rxjs";
182
+ var getInjectedWalletsIds = () => typeof window === "undefined" ? [] : getInjectedExtensions().map((name) => getWalletId("polkadot", name));
183
+ var createWalletIdsPoller$ = () => {
184
+ return new Observable2((subscriber) => {
185
+ subscriber.next(getInjectedWalletsIds());
186
+ const intervals = [100, 200, 300, 500];
187
+ let index = 0;
188
+ let timer;
189
+ const poll = () => {
190
+ subscriber.next(getInjectedWalletsIds());
191
+ if (index < intervals.length) {
192
+ const delay = intervals[index++];
193
+ timer = setTimeout(poll, delay);
194
+ }
195
+ };
196
+ if (intervals.length > 0) {
197
+ timer = setTimeout(poll, intervals[index++] ?? 100);
198
+ }
199
+ return () => {
200
+ if (timer !== void 0) clearTimeout(timer);
201
+ };
202
+ }).pipe(
203
+ distinctUntilChanged2(isEqual),
204
+ shareReplay2({ refCount: true, bufferSize: 1 })
205
+ );
206
+ };
207
+ var createPolkadotInjectedWallets$ = (store2) => new Observable2((subscriber) => {
208
+ const enabledExtensions$ = new BehaviorSubject(/* @__PURE__ */ new Map());
209
+ const connect = async (walletId) => {
210
+ if (enabledExtensions$.value.has(walletId))
211
+ throw new KheopskitError(
212
+ "WALLET_ALREADY_CONNECTED",
213
+ `wallet ${walletId} is already connected`,
214
+ { walletId }
215
+ );
216
+ const { identifier } = parseWalletId(walletId);
217
+ const extension = await connectInjectedExtension(identifier);
218
+ const newMap = new Map(enabledExtensions$.value);
219
+ newMap.set(walletId, extension);
220
+ enabledExtensions$.next(newMap);
221
+ store2.addEnabledWalletId(walletId);
222
+ };
223
+ const disconnect = async (walletId) => {
224
+ if (!enabledExtensions$.value.has(walletId))
225
+ throw new KheopskitError(
226
+ "WALLET_NOT_CONNECTED",
227
+ `wallet ${walletId} is not connected`,
228
+ { walletId }
229
+ );
230
+ const newMap = new Map(enabledExtensions$.value);
231
+ newMap.delete(walletId);
232
+ enabledExtensions$.next(newMap);
233
+ store2.removeEnabledWalletId(walletId);
234
+ };
235
+ const walletIds$ = createWalletIdsPoller$();
236
+ const subscription = combineLatest2([walletIds$, enabledExtensions$]).pipe(
237
+ map2(([walletIds, enabledExtensions]) => {
238
+ return walletIds.map((id) => {
239
+ const { identifier } = parseWalletId(id);
240
+ const extension = enabledExtensions.get(id);
241
+ const extInfo = POLKADOT_EXTENSIONS[identifier];
242
+ return {
243
+ id,
244
+ type: "injected",
245
+ platform: "polkadot",
246
+ name: extInfo?.name ?? identifier,
247
+ icon: extInfo?.icon ?? "",
248
+ sourceId: identifier,
249
+ extension,
250
+ isConnected: !!extension,
251
+ connect: () => connect(id),
252
+ disconnect: () => disconnect(id)
253
+ };
254
+ });
255
+ }),
256
+ distinctUntilChanged2(walletsEqual)
257
+ ).subscribe(subscriber);
258
+ return () => {
259
+ subscription.unsubscribe();
260
+ };
261
+ }).pipe(shareReplay2({ refCount: true, bufferSize: 1 }));
262
+ var getPolkadotWallets$ = (store2 = store) => createPolkadotInjectedWallets$(store2);
263
+ var walletsEqual = (a, b) => {
264
+ if (a.length !== b.length) return false;
265
+ return a.every(
266
+ (w, i) => w.id === b[i]?.id && w.isConnected === b[i]?.isConnected && w.name === b[i]?.name
267
+ );
268
+ };
269
+
270
+ // src/api/polkadot/plugin.ts
271
+ var DEFAULT_ACCOUNT_TYPES = [
272
+ "sr25519",
273
+ "ed25519",
274
+ "ecdsa"
275
+ ];
276
+ var VALID_ACCOUNT_TYPES = /* @__PURE__ */ new Set([
277
+ "sr25519",
278
+ "ed25519",
279
+ "ecdsa",
280
+ "ethereum"
281
+ ]);
282
+ var polkadot = (options = {}) => {
283
+ const accountTypes = options.accountTypes ?? DEFAULT_ACCOUNT_TYPES;
284
+ const invalid = accountTypes.filter((t) => !VALID_ACCOUNT_TYPES.has(t));
285
+ if (invalid.length > 0) {
286
+ console.warn(
287
+ `[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: "sr25519", "ed25519", "ecdsa", "ethereum".`
288
+ );
289
+ }
290
+ return {
291
+ platform: "polkadot",
292
+ getWallets$: (ctx) => getPolkadotWallets$(ctx.store),
293
+ getAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),
294
+ acceptsCachedAccount: (cached) => accountTypes.includes(cached.polkadotAccountType ?? "sr25519")
295
+ };
296
+ };
297
+ export {
298
+ isInjectedWallet,
299
+ isSs58Address,
300
+ isWalletConnectWallet,
301
+ polkadot
302
+ };
303
+ //# sourceMappingURL=polkadot.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/polkadot/accounts.ts","../src/api/polkadot/wallets.ts","../src/api/polkadot/plugin.ts"],"sourcesContent":["import {\n\tgetPolkadotSignerFromPjs,\n\ttype InjectedExtension,\n\ttype InjectedPolkadotAccount,\n} from \"polkadot-api/pjs-signer\";\nimport {\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tof,\n\tshareReplay,\n\tswitchMap,\n} from \"rxjs\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { getCachedObservable$ } from \"../../utils/getCachedObservable\";\nimport { KheopskitError } from \"../errors\";\nimport type {\n\tAppKitInstance,\n\tPolkadotAccountType,\n\tWalletConnectWallet,\n} from \"../types\";\nimport { isWalletConnectWallet } from \"../types\";\nimport type {\n\tPolkadotAccount,\n\tPolkadotInjectedWallet,\n\tPolkadotWallet,\n} from \"./types\";\n\nconst getInjectedWalletAccounts$ = (\n\twallet: PolkadotInjectedWallet,\n): Observable<PolkadotAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn new Observable<PolkadotAccount[]>((subscriber) => {\n\t\tconst getAccount = (account: InjectedPolkadotAccount): PolkadotAccount => ({\n\t\t\tid: getWalletAccountId(wallet.id, account.address),\n\t\t\t...account,\n\t\t\ttype: account.type ?? \"sr25519\",\n\t\t\tplatform: \"polkadot\",\n\t\t\twalletName: wallet.name,\n\t\t\twalletId: wallet.id,\n\t\t});\n\n\t\tconst extension = wallet.extension as InjectedExtension;\n\n\t\t// subscribe to changes\n\t\tconst unsubscribe = extension.subscribe((accounts) => {\n\t\t\tsubscriber.next(accounts.map(getAccount));\n\t\t});\n\n\t\t// initial value\n\t\tsubscriber.next(extension.getAccounts().map(getAccount));\n\n\t\treturn () => {\n\t\t\treturn unsubscribe();\n\t\t};\n\t});\n};\n\nconst getAppKitPolkadotSigner = (appKit: AppKitInstance, address: string) => {\n\tconst provider = appKit.getProvider(\"polkadot\");\n\tif (!provider) throw new KheopskitError(\"NO_PROVIDER\", \"No provider found\");\n\tif (!provider.session)\n\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\treturn getPolkadotSignerFromPjs(\n\t\taddress,\n\t\t(transactionPayload) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId: `polkadot:${transactionPayload.genesisHash.substring(2, 34)}`,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signTransaction\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\ttransactionPayload,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t\tasync ({ address, data }) => {\n\t\t\tif (!provider.session)\n\t\t\t\tthrow new KheopskitError(\"NO_SESSION\", \"No session found\");\n\t\t\tconst networks = appKit.getCaipNetworks(\"polkadot\");\n\t\t\tconst chainId = networks[0]?.caipNetworkId;\n\t\t\tif (!chainId)\n\t\t\t\tthrow new KheopskitError(\n\t\t\t\t\t\"NO_SESSION\",\n\t\t\t\t\t\"No CAIP network available for polkadot\",\n\t\t\t\t);\n\n\t\t\treturn provider.client.request({\n\t\t\t\ttopic: provider.session.topic,\n\t\t\t\tchainId,\n\t\t\t\trequest: {\n\t\t\t\t\tmethod: \"polkadot_signMessage\",\n\t\t\t\t\tparams: {\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tmessage: data,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t});\n\t\t},\n\t);\n};\n\nconst getWalletConnectAccounts$ = (\n\twallet: WalletConnectWallet,\n): Observable<PolkadotAccount[]> => {\n\tconst provider = wallet.appKit.getProvider(\"polkadot\");\n\n\tif (!wallet.platforms.includes(\"polkadot\") || !provider?.session)\n\t\treturn of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}:polkadot:`, () =>\n\t\tnew Observable<PolkadotAccount[]>((subscriber) => {\n\t\t\t// AppKit's getAccount(\"polkadot\").allAccounts is always empty because\n\t\t\t// AppKit has no native polkadot adapter; the WalletConnect session is the\n\t\t\t// source of truth. Accounts are CAIP-10 strings\n\t\t\t// (\"polkadot:<chainRef>:<address>\"), one entry per chain, so dedupe to\n\t\t\t// unique addresses.\n\t\t\tconst buildAccounts = (): PolkadotAccount[] => {\n\t\t\t\tconst session = provider.session;\n\t\t\t\tif (!session) return [];\n\n\t\t\t\tconst addresses = [\n\t\t\t\t\t...new Set(\n\t\t\t\t\t\tObject.values(session.namespaces)\n\t\t\t\t\t\t\t.flatMap((namespace) => namespace.accounts ?? [])\n\t\t\t\t\t\t\t.filter((account) => account.startsWith(\"polkadot:\"))\n\t\t\t\t\t\t\t.map((account) => account.split(\":\")[2])\n\t\t\t\t\t\t\t.filter((address): address is string => !!address),\n\t\t\t\t\t),\n\t\t\t\t];\n\n\t\t\t\treturn addresses.map(\n\t\t\t\t\t(address): PolkadotAccount => ({\n\t\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\taddress,\n\t\t\t\t\t\tpolkadotSigner: getAppKitPolkadotSigner(wallet.appKit, address),\n\t\t\t\t\t\tgenesisHash: null,\n\t\t\t\t\t\tname: `${wallet.name} Polkadot`,\n\t\t\t\t\t\t// WalletConnect (Reown AppKit) doesn't expose account key type;\n\t\t\t\t\t\t// default to sr25519, which is the most common Polkadot key type.\n\t\t\t\t\t\ttype: \"sr25519\",\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tsubscriber.next(buildAccounts());\n\n\t\t\t// Re-derive when the WalletConnect session's accounts change, mirroring\n\t\t\t// the injected extension's subscribe and the Solana AppKit path.\n\t\t\tconst reemit = () => subscriber.next(buildAccounts());\n\t\t\tprovider.on(\"session_update\", reemit);\n\t\t\tprovider.on(\"accountsChanged\", reemit);\n\n\t\t\treturn () => {\n\t\t\t\tprovider.off(\"session_update\", reemit);\n\t\t\t\tprovider.off(\"accountsChanged\", reemit);\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nexport const getPolkadotAccounts$ = (\n\tpolkadotWallets$: Observable<(PolkadotWallet | WalletConnectWallet)[]>,\n\tpolkadotAccountTypes: PolkadotAccountType[],\n) =>\n\tnew Observable<PolkadotAccount[]>((subscriber) => {\n\t\tif (polkadotAccountTypes.length === 0) {\n\t\t\tconsole.warn(\n\t\t\t\t\"[kheopskit] config.polkadotAccountTypes is empty; all Polkadot accounts will be filtered out.\",\n\t\t\t);\n\t\t}\n\n\t\tconst sub = polkadotWallets$\n\t\t\t.pipe(\n\t\t\t\tmap((wallets) => wallets.filter((w) => w.isConnected)),\n\t\t\t\tswitchMap((wallets) =>\n\t\t\t\t\twallets.length\n\t\t\t\t\t\t? combineLatest([\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter((w) => w.type === \"injected\")\n\t\t\t\t\t\t\t\t\t.map(getInjectedWalletAccounts$),\n\t\t\t\t\t\t\t\t...wallets\n\t\t\t\t\t\t\t\t\t.filter(isWalletConnectWallet)\n\t\t\t\t\t\t\t\t\t.map(getWalletConnectAccounts$),\n\t\t\t\t\t\t\t])\n\t\t\t\t\t\t: of([]),\n\t\t\t\t),\n\t\t\t\tmap((accounts) =>\n\t\t\t\t\taccounts\n\t\t\t\t\t\t.flat()\n\t\t\t\t\t\t.filter((account) => polkadotAccountTypes.includes(account.type)),\n\t\t\t\t),\n\t\t\t\tdistinctUntilChanged(isSameAccountsList),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\nconst isSameAccountsList = (a: PolkadotAccount[], b: PolkadotAccount[]) => {\n\tif (a.length !== b.length) return false;\n\treturn a.every((account, i) => account.id === b[i]?.id);\n};\n","import { isEqual } from \"lodash-es\";\nimport {\n\tconnectInjectedExtension,\n\tgetInjectedExtensions,\n\ttype InjectedExtension,\n} from \"polkadot-api/pjs-signer\";\nimport {\n\tBehaviorSubject,\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tshareReplay,\n} from \"rxjs\";\nimport { POLKADOT_EXTENSIONS } from \"../../utils/polkadotExtensions\";\nimport {\n\tgetWalletId,\n\tparseWalletId,\n\ttype WalletId,\n} from \"../../utils/WalletId\";\nimport { KheopskitError } from \"../errors\";\nimport { store as defaultStore, type KheopskitStore } from \"../store\";\nimport type { PolkadotInjectedWallet } from \"./types\";\n\nconst getInjectedWalletsIds = () =>\n\ttypeof window === \"undefined\"\n\t\t? []\n\t\t: getInjectedExtensions().map((name) => getWalletId(\"polkadot\", name));\n\n// Create a polling observable that starts immediately and polls at intervals\nconst createWalletIdsPoller$ = () => {\n\treturn new Observable<WalletId[]>((subscriber) => {\n\t\t// Emit immediately on subscribe\n\t\tsubscriber.next(getInjectedWalletsIds());\n\n\t\t// Poll at shorter intervals initially, then slow down\n\t\tconst intervals = [100, 200, 300, 500];\n\t\tlet index = 0;\n\t\tlet timer: ReturnType<typeof setTimeout> | undefined;\n\n\t\tconst poll = () => {\n\t\t\tsubscriber.next(getInjectedWalletsIds());\n\t\t\tif (index < intervals.length) {\n\t\t\t\tconst delay = intervals[index++];\n\t\t\t\ttimer = setTimeout(poll, delay);\n\t\t\t}\n\t\t};\n\n\t\t// Start polling after first immediate emission\n\t\tif (intervals.length > 0) {\n\t\t\ttimer = setTimeout(poll, intervals[index++] ?? 100);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Cancel any pending poll so it can't fire after unsubscribe.\n\t\t\tif (timer !== undefined) clearTimeout(timer);\n\t\t};\n\t}).pipe(\n\t\tdistinctUntilChanged<WalletId[]>(isEqual),\n\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t);\n};\n\nconst createPolkadotInjectedWallets$ = (store: KheopskitStore) =>\n\tnew Observable<PolkadotInjectedWallet[]>((subscriber) => {\n\t\tconst enabledExtensions$ = new BehaviorSubject<\n\t\t\tMap<WalletId, InjectedExtension>\n\t\t>(new Map());\n\n\t\tconst connect = async (walletId: WalletId) => {\n\t\t\tif (enabledExtensions$.value.has(walletId))\n\t\t\t\tthrow new KheopskitError(\n\t\t\t\t\t\"WALLET_ALREADY_CONNECTED\",\n\t\t\t\t\t`wallet ${walletId} is already connected`,\n\t\t\t\t\t{ walletId },\n\t\t\t\t);\n\t\t\tconst { identifier } = parseWalletId(walletId);\n\t\t\tconst extension = await connectInjectedExtension(identifier);\n\n\t\t\tconst newMap = new Map(enabledExtensions$.value);\n\t\t\tnewMap.set(walletId, extension);\n\t\t\tenabledExtensions$.next(newMap);\n\n\t\t\tstore.addEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst disconnect = async (walletId: WalletId) => {\n\t\t\tif (!enabledExtensions$.value.has(walletId))\n\t\t\t\tthrow new KheopskitError(\n\t\t\t\t\t\"WALLET_NOT_CONNECTED\",\n\t\t\t\t\t`wallet ${walletId} is not connected`,\n\t\t\t\t\t{ walletId },\n\t\t\t\t);\n\n\t\t\tconst newMap = new Map(enabledExtensions$.value);\n\t\t\tnewMap.delete(walletId);\n\t\t\tenabledExtensions$.next(newMap);\n\n\t\t\tstore.removeEnabledWalletId(walletId);\n\t\t};\n\n\t\tconst walletIds$ = createWalletIdsPoller$();\n\n\t\tconst subscription = combineLatest([walletIds$, enabledExtensions$])\n\t\t\t.pipe(\n\t\t\t\tmap(([walletIds, enabledExtensions]) => {\n\t\t\t\t\treturn walletIds.map((id): PolkadotInjectedWallet => {\n\t\t\t\t\t\tconst { identifier } = parseWalletId(id);\n\t\t\t\t\t\tconst extension = enabledExtensions.get(id);\n\t\t\t\t\t\tconst extInfo = POLKADOT_EXTENSIONS[identifier];\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\ttype: \"injected\",\n\t\t\t\t\t\t\tplatform: \"polkadot\",\n\t\t\t\t\t\t\tname: extInfo?.name ?? identifier,\n\t\t\t\t\t\t\ticon: extInfo?.icon ?? \"\",\n\t\t\t\t\t\t\tsourceId: identifier,\n\t\t\t\t\t\t\textension,\n\t\t\t\t\t\t\tisConnected: !!extension,\n\t\t\t\t\t\t\tconnect: () => connect(id),\n\t\t\t\t\t\t\tdisconnect: () => disconnect(id),\n\t\t\t\t\t\t};\n\t\t\t\t\t});\n\t\t\t\t}),\n\t\t\t\tdistinctUntilChanged(walletsEqual),\n\t\t\t)\n\t\t\t.subscribe(subscriber);\n\n\t\treturn () => {\n\t\t\tsubscription.unsubscribe();\n\t\t};\n\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getPolkadotWallets$ = (store: KheopskitStore = defaultStore) =>\n\tcreatePolkadotInjectedWallets$(store);\n\n/**\n * Compare two wallet arrays by their relevant properties (not functions).\n */\nconst walletsEqual = (\n\ta: PolkadotInjectedWallet[],\n\tb: PolkadotInjectedWallet[],\n): boolean => {\n\tif (a.length !== b.length) return false;\n\treturn a.every(\n\t\t(w, i) =>\n\t\t\tw.id === b[i]?.id &&\n\t\t\tw.isConnected === b[i]?.isConnected &&\n\t\t\tw.name === b[i]?.name,\n\t);\n};\n","import type {\n\tKheopskitPlatform,\n\tPlatformContext,\n\tPolkadotAccountType,\n} from \"../types\";\nimport { getPolkadotAccounts$ } from \"./accounts\";\nimport type { PolkadotAccount, PolkadotWallet } from \"./types\";\nimport { getPolkadotWallets$ } from \"./wallets\";\n\nconst DEFAULT_ACCOUNT_TYPES: PolkadotAccountType[] = [\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n];\n\nconst VALID_ACCOUNT_TYPES = new Set<string>([\n\t\"sr25519\",\n\t\"ed25519\",\n\t\"ecdsa\",\n\t\"ethereum\",\n]);\n\nexport type PolkadotPluginOptions = {\n\t/**\n\t * Allowed Polkadot account key types. Accounts with other key types are\n\t * filtered out from kheopskit state.\n\t *\n\t * @default [\"sr25519\", \"ed25519\", \"ecdsa\"]\n\t */\n\taccountTypes?: PolkadotAccountType[];\n};\n\n/**\n * Polkadot platform plugin. Pass to `getKheopskit$({ platforms: [polkadot()] })`.\n *\n * @example\n * ```ts\n * import { polkadot } from \"@kheopskit/core/polkadot\";\n * polkadot({ accountTypes: [\"sr25519\", \"ed25519\", \"ecdsa\"] });\n * ```\n */\nexport const polkadot = (\n\toptions: PolkadotPluginOptions = {},\n): KheopskitPlatform<\"polkadot\", PolkadotWallet, PolkadotAccount> => {\n\tconst accountTypes = options.accountTypes ?? DEFAULT_ACCOUNT_TYPES;\n\n\tconst invalid = accountTypes.filter((t) => !VALID_ACCOUNT_TYPES.has(t));\n\tif (invalid.length > 0) {\n\t\tconsole.warn(\n\t\t\t`[kheopskit] Unknown polkadot accountTypes: ${JSON.stringify(invalid)}. Valid values: \"sr25519\", \"ed25519\", \"ecdsa\", \"ethereum\".`,\n\t\t);\n\t}\n\n\treturn {\n\t\tplatform: \"polkadot\",\n\t\tgetWallets$: (ctx: PlatformContext) => getPolkadotWallets$(ctx.store),\n\t\tgetAccounts$: (wallets$) => getPolkadotAccounts$(wallets$, accountTypes),\n\t\tacceptsCachedAccount: (cached) =>\n\t\t\taccountTypes.includes(cached.polkadotAccountType ?? \"sr25519\"),\n\t};\n};\n"],"mappings":"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","names":["address","combineLatest","distinctUntilChanged","map","Observable","shareReplay","Observable","distinctUntilChanged","shareReplay","store","combineLatest","map"]}
@@ -0,0 +1,98 @@
1
+ import { W as WalletAccountId, a as WalletId, K as KheopskitPlatform } from './types-C7V7DGlg.mjs';
2
+ export { b as WalletConnectWallet, i as isInjectedWallet, c as isWalletConnectWallet } from './types-C7V7DGlg.mjs';
3
+ import { MessageModifyingSigner, TransactionModifyingSigner, TransactionSendingSigner } from '@solana/kit';
4
+ import { Wallet } from '@wallet-standard/base';
5
+ import 'rxjs';
6
+
7
+ /**
8
+ * Returns true if the value is a valid Solana address: a base58-encoded
9
+ * 32-byte ed25519 public key.
10
+ *
11
+ * Solana addresses carry no checksum, so this is a pure base58 + length check.
12
+ * Dependency-free (base58 via @scure/base) so core stays decoupled from
13
+ * @solana/kit.
14
+ */
15
+ declare const isSolanaAddress: (address: string) => boolean;
16
+
17
+ /**
18
+ * Wallet Standard chain identifiers for Solana clusters.
19
+ *
20
+ * These are the values wallets advertise in their `chains` arrays and the
21
+ * values kheopskit accepts in `solana({ chain })`.
22
+ *
23
+ * @see https://github.com/anza-xyz/wallet-standard
24
+ */
25
+ type SolanaChainId = "solana:mainnet" | "solana:devnet" | "solana:testnet" | "solana:localnet";
26
+ declare const DEFAULT_SOLANA_CHAIN: SolanaChainId;
27
+ declare const isSolanaChainId: (value: unknown) => value is SolanaChainId;
28
+ /**
29
+ * Returns the CAIP-2 chain id for a Solana chain, for use in WalletConnect
30
+ * requests and when reading WalletConnect session namespaces.
31
+ *
32
+ * @throws if the chain has no canonical CAIP-2 id (e.g. localnet)
33
+ */
34
+ declare const getSolanaCaip2: (chain: SolanaChainId) => string;
35
+
36
+ /**
37
+ * Unified signing interface for Solana accounts, expressed with @solana/kit
38
+ * signer interfaces so it plugs directly into kit's transaction pipeline
39
+ * (e.g. `signAndSendTransactionMessageWithSigners`).
40
+ */
41
+ type SolanaSigner = MessageModifyingSigner & TransactionModifyingSigner & TransactionSendingSigner;
42
+ type SolanaInjectedWallet = {
43
+ platform: "solana";
44
+ type: "injected";
45
+ id: WalletId;
46
+ /**
47
+ * Stable identifier of the underlying wallet source. For Solana this is the
48
+ * Wallet Standard wallet name. Named consistently across platforms (Ethereum:
49
+ * EIP-6963 rdns; Polkadot: extension identifier).
50
+ */
51
+ sourceId: string;
52
+ /** Raw Wallet Standard wallet, exposed as an escape hatch. */
53
+ wallet: Wallet;
54
+ /** Solana clusters advertised by the wallet. */
55
+ chains: SolanaChainId[];
56
+ name: string;
57
+ icon: string;
58
+ isConnected: boolean;
59
+ connect: () => Promise<void>;
60
+ disconnect: () => Promise<void>;
61
+ };
62
+ type SolanaWallet = SolanaInjectedWallet;
63
+ type SolanaAccount = {
64
+ id: WalletAccountId;
65
+ platform: "solana";
66
+ /** Base58-encoded address. */
67
+ address: string;
68
+ /** Solana clusters advertised by the wallet for this account. */
69
+ chains: SolanaChainId[];
70
+ /** Signer bound to the configured cluster. */
71
+ signer: SolanaSigner;
72
+ /** Returns a signer bound to an arbitrary cluster. */
73
+ getSigner: (chain: SolanaChainId) => SolanaSigner;
74
+ walletName: string;
75
+ walletId: WalletId;
76
+ };
77
+
78
+ type SolanaPluginOptions = {
79
+ /**
80
+ * Solana cluster that account signers target. Each account also exposes a
81
+ * `getSigner(chain)` factory for targeting another cluster.
82
+ *
83
+ * @default "solana:mainnet"
84
+ */
85
+ chain?: SolanaChainId;
86
+ };
87
+ /**
88
+ * Solana platform plugin. Pass to `getKheopskit$({ platforms: [solana()] })`.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * import { solana } from "@kheopskit/core/solana";
93
+ * solana({ chain: "solana:mainnet" });
94
+ * ```
95
+ */
96
+ declare const solana: (options?: SolanaPluginOptions) => KheopskitPlatform<"solana", SolanaWallet, SolanaAccount>;
97
+
98
+ export { DEFAULT_SOLANA_CHAIN, type SolanaAccount, type SolanaChainId, type SolanaInjectedWallet, type SolanaPluginOptions, type SolanaSigner, type SolanaWallet, getSolanaCaip2, isSolanaAddress, isSolanaChainId, solana };
@@ -0,0 +1,98 @@
1
+ import { W as WalletAccountId, a as WalletId, K as KheopskitPlatform } from './types-C7V7DGlg.js';
2
+ export { b as WalletConnectWallet, i as isInjectedWallet, c as isWalletConnectWallet } from './types-C7V7DGlg.js';
3
+ import { MessageModifyingSigner, TransactionModifyingSigner, TransactionSendingSigner } from '@solana/kit';
4
+ import { Wallet } from '@wallet-standard/base';
5
+ import 'rxjs';
6
+
7
+ /**
8
+ * Returns true if the value is a valid Solana address: a base58-encoded
9
+ * 32-byte ed25519 public key.
10
+ *
11
+ * Solana addresses carry no checksum, so this is a pure base58 + length check.
12
+ * Dependency-free (base58 via @scure/base) so core stays decoupled from
13
+ * @solana/kit.
14
+ */
15
+ declare const isSolanaAddress: (address: string) => boolean;
16
+
17
+ /**
18
+ * Wallet Standard chain identifiers for Solana clusters.
19
+ *
20
+ * These are the values wallets advertise in their `chains` arrays and the
21
+ * values kheopskit accepts in `solana({ chain })`.
22
+ *
23
+ * @see https://github.com/anza-xyz/wallet-standard
24
+ */
25
+ type SolanaChainId = "solana:mainnet" | "solana:devnet" | "solana:testnet" | "solana:localnet";
26
+ declare const DEFAULT_SOLANA_CHAIN: SolanaChainId;
27
+ declare const isSolanaChainId: (value: unknown) => value is SolanaChainId;
28
+ /**
29
+ * Returns the CAIP-2 chain id for a Solana chain, for use in WalletConnect
30
+ * requests and when reading WalletConnect session namespaces.
31
+ *
32
+ * @throws if the chain has no canonical CAIP-2 id (e.g. localnet)
33
+ */
34
+ declare const getSolanaCaip2: (chain: SolanaChainId) => string;
35
+
36
+ /**
37
+ * Unified signing interface for Solana accounts, expressed with @solana/kit
38
+ * signer interfaces so it plugs directly into kit's transaction pipeline
39
+ * (e.g. `signAndSendTransactionMessageWithSigners`).
40
+ */
41
+ type SolanaSigner = MessageModifyingSigner & TransactionModifyingSigner & TransactionSendingSigner;
42
+ type SolanaInjectedWallet = {
43
+ platform: "solana";
44
+ type: "injected";
45
+ id: WalletId;
46
+ /**
47
+ * Stable identifier of the underlying wallet source. For Solana this is the
48
+ * Wallet Standard wallet name. Named consistently across platforms (Ethereum:
49
+ * EIP-6963 rdns; Polkadot: extension identifier).
50
+ */
51
+ sourceId: string;
52
+ /** Raw Wallet Standard wallet, exposed as an escape hatch. */
53
+ wallet: Wallet;
54
+ /** Solana clusters advertised by the wallet. */
55
+ chains: SolanaChainId[];
56
+ name: string;
57
+ icon: string;
58
+ isConnected: boolean;
59
+ connect: () => Promise<void>;
60
+ disconnect: () => Promise<void>;
61
+ };
62
+ type SolanaWallet = SolanaInjectedWallet;
63
+ type SolanaAccount = {
64
+ id: WalletAccountId;
65
+ platform: "solana";
66
+ /** Base58-encoded address. */
67
+ address: string;
68
+ /** Solana clusters advertised by the wallet for this account. */
69
+ chains: SolanaChainId[];
70
+ /** Signer bound to the configured cluster. */
71
+ signer: SolanaSigner;
72
+ /** Returns a signer bound to an arbitrary cluster. */
73
+ getSigner: (chain: SolanaChainId) => SolanaSigner;
74
+ walletName: string;
75
+ walletId: WalletId;
76
+ };
77
+
78
+ type SolanaPluginOptions = {
79
+ /**
80
+ * Solana cluster that account signers target. Each account also exposes a
81
+ * `getSigner(chain)` factory for targeting another cluster.
82
+ *
83
+ * @default "solana:mainnet"
84
+ */
85
+ chain?: SolanaChainId;
86
+ };
87
+ /**
88
+ * Solana platform plugin. Pass to `getKheopskit$({ platforms: [solana()] })`.
89
+ *
90
+ * @example
91
+ * ```ts
92
+ * import { solana } from "@kheopskit/core/solana";
93
+ * solana({ chain: "solana:mainnet" });
94
+ * ```
95
+ */
96
+ declare const solana: (options?: SolanaPluginOptions) => KheopskitPlatform<"solana", SolanaWallet, SolanaAccount>;
97
+
98
+ export { DEFAULT_SOLANA_CHAIN, type SolanaAccount, type SolanaChainId, type SolanaInjectedWallet, type SolanaPluginOptions, type SolanaSigner, type SolanaWallet, getSolanaCaip2, isSolanaAddress, isSolanaChainId, solana };