@kheopskit/core 5.3.0 → 6.0.0-rc.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.
Files changed (83) hide show
  1. package/CHANGELOG.md +432 -0
  2. package/MIGRATING_TO_V6.md +840 -0
  3. package/README.md +629 -12
  4. package/dist/ethereum.d.mts +12 -6
  5. package/dist/ethereum.d.ts +12 -6
  6. package/dist/ethereum.js +13 -10
  7. package/dist/ethereum.js.map +1 -1
  8. package/dist/ethereum.mjs +7 -4
  9. package/dist/ethereum.mjs.map +1 -1
  10. package/dist/{iconCache-pP2ES4pJ.mjs → iconCache-C-U3IEbP.mjs} +21 -40
  11. package/dist/iconCache-C-U3IEbP.mjs.map +1 -0
  12. package/dist/{iconCache-DUtkJlaX.js → iconCache-FR4iy6go.js} +21 -40
  13. package/dist/iconCache-FR4iy6go.js.map +1 -0
  14. package/dist/index.d.mts +17 -63
  15. package/dist/index.d.ts +17 -63
  16. package/dist/index.js +387 -373
  17. package/dist/index.js.map +1 -1
  18. package/dist/index.mjs +384 -369
  19. package/dist/index.mjs.map +1 -1
  20. package/dist/injectedWallets-48L-AL1I.mjs +173 -0
  21. package/dist/injectedWallets-48L-AL1I.mjs.map +1 -0
  22. package/dist/injectedWallets-Dy8YGKL-.js +178 -0
  23. package/dist/injectedWallets-Dy8YGKL-.js.map +1 -0
  24. package/dist/internal.d.mts +3 -27
  25. package/dist/internal.d.ts +3 -27
  26. package/dist/internal.js +2 -2
  27. package/dist/internal.mjs +2 -2
  28. package/dist/pageLoad-BZ7o8p5R.mjs +24 -0
  29. package/dist/pageLoad-BZ7o8p5R.mjs.map +1 -0
  30. package/dist/pageLoad-D1wLeuFG.js +28 -0
  31. package/dist/pageLoad-D1wLeuFG.js.map +1 -0
  32. package/dist/platformAccounts-BjIeRcFN.js +321 -0
  33. package/dist/platformAccounts-BjIeRcFN.js.map +1 -0
  34. package/dist/platformAccounts-yyRUrnel.mjs +256 -0
  35. package/dist/platformAccounts-yyRUrnel.mjs.map +1 -0
  36. package/dist/polkadot.d.mts +127 -11
  37. package/dist/polkadot.d.ts +127 -11
  38. package/dist/polkadot.js +187 -106
  39. package/dist/polkadot.js.map +1 -1
  40. package/dist/polkadot.mjs +180 -99
  41. package/dist/polkadot.mjs.map +1 -1
  42. package/dist/solana.d.mts +11 -5
  43. package/dist/solana.d.ts +11 -5
  44. package/dist/solana.js +18 -15
  45. package/dist/solana.js.map +1 -1
  46. package/dist/solana.mjs +7 -4
  47. package/dist/solana.mjs.map +1 -1
  48. package/dist/storage-D3AwNgqc.d.mts +27 -0
  49. package/dist/storage-D3AwNgqc.d.ts +27 -0
  50. package/dist/testing.d.mts +71 -0
  51. package/dist/testing.d.ts +71 -0
  52. package/dist/testing.js +136 -0
  53. package/dist/testing.js.map +1 -0
  54. package/dist/testing.mjs +131 -0
  55. package/dist/testing.mjs.map +1 -0
  56. package/dist/{types-DKU-SNio.js → types-BWHvNFlN.js} +149 -2
  57. package/dist/types-BWHvNFlN.js.map +1 -0
  58. package/dist/types-Yor672md.mjs +215 -0
  59. package/dist/types-Yor672md.mjs.map +1 -0
  60. package/dist/types-lkMXVJNG.d.mts +685 -0
  61. package/dist/types-lkMXVJNG.d.ts +685 -0
  62. package/dist/walletconnect.d.mts +41 -0
  63. package/dist/walletconnect.d.ts +41 -0
  64. package/dist/walletconnect.js +219 -0
  65. package/dist/walletconnect.js.map +1 -0
  66. package/dist/walletconnect.mjs +216 -0
  67. package/dist/walletconnect.mjs.map +1 -0
  68. package/package.json +30 -6
  69. package/dist/errors-BLFP1dQI.mjs +0 -181
  70. package/dist/errors-BLFP1dQI.mjs.map +0 -1
  71. package/dist/errors-DYWVPHrR.js +0 -222
  72. package/dist/errors-DYWVPHrR.js.map +0 -1
  73. package/dist/iconCache-DUtkJlaX.js.map +0 -1
  74. package/dist/iconCache-pP2ES4pJ.mjs.map +0 -1
  75. package/dist/injectedWallets-BqR-_aAy.js +0 -148
  76. package/dist/injectedWallets-BqR-_aAy.js.map +0 -1
  77. package/dist/injectedWallets-Uz4hPuoW.mjs +0 -119
  78. package/dist/injectedWallets-Uz4hPuoW.mjs.map +0 -1
  79. package/dist/types-AxUDtkR-.d.mts +0 -338
  80. package/dist/types-AxUDtkR-.d.ts +0 -338
  81. package/dist/types-DKU-SNio.js.map +0 -1
  82. package/dist/types-jnifAAA0.mjs +0 -104
  83. package/dist/types-jnifAAA0.mjs.map +0 -1
@@ -0,0 +1,41 @@
1
+ import { E as isWalletConnectWallet, _ as WalletConnectMetadata, b as WalletConnectWallet, v as WalletConnectPlugin } from "./types-lkMXVJNG.mjs";
2
+ //#region src/api/walletconnect/plugin.d.ts
3
+ type WalletConnectOptions = {
4
+ projectId: string;
5
+ metadata: WalletConnectMetadata;
6
+ /**
7
+ * Networks AppKit should enable. Pass `AppKitNetwork[]` from
8
+ * `@reown/appkit/networks` (see
9
+ * https://docs.reown.com/advanced/multichain/polkadot/dapp-integration-guide#walletconnect-code%2Fcomponent-setup).
10
+ * Loosely typed (`unknown`) so the declarations don't depend on
11
+ * `@reown/appkit`'s types; the value is forwarded to AppKit as-is.
12
+ */
13
+ networks: [unknown, ...unknown[]];
14
+ themeMode?: "light" | "dark";
15
+ themeVariables?: Record<string, string | number>;
16
+ };
17
+ /**
18
+ * Clears the cached AppKit observable.
19
+ * Use when configuration changes or for testing purposes.
20
+ * Note: This does NOT destroy the appKit instance created by Reown.
21
+ */
22
+ export declare const resetAppKitCache: () => void;
23
+ /**
24
+ * The WalletConnect plugin for `config.walletConnect`. Importing this entry is
25
+ * what brings Reown AppKit into a dapp's bundle; a dapp that never imports it
26
+ * ships none of it.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { walletConnect } from "@kheopskit/core/walletconnect";
31
+ *
32
+ * getKheopskit$({
33
+ * platforms: [polkadot()],
34
+ * walletConnect: walletConnect({ projectId, metadata, networks }),
35
+ * });
36
+ * ```
37
+ */
38
+ export declare const walletConnect: (options: WalletConnectOptions) => WalletConnectPlugin;
39
+ //#endregion
40
+ export { type WalletConnectMetadata, type WalletConnectOptions, type WalletConnectPlugin, type WalletConnectWallet, isWalletConnectWallet };
41
+ //# sourceMappingURL=walletconnect.d.mts.map
@@ -0,0 +1,41 @@
1
+ import { E as isWalletConnectWallet, _ as WalletConnectMetadata, b as WalletConnectWallet, v as WalletConnectPlugin } from "./types-lkMXVJNG.js";
2
+ //#region src/api/walletconnect/plugin.d.ts
3
+ type WalletConnectOptions = {
4
+ projectId: string;
5
+ metadata: WalletConnectMetadata;
6
+ /**
7
+ * Networks AppKit should enable. Pass `AppKitNetwork[]` from
8
+ * `@reown/appkit/networks` (see
9
+ * https://docs.reown.com/advanced/multichain/polkadot/dapp-integration-guide#walletconnect-code%2Fcomponent-setup).
10
+ * Loosely typed (`unknown`) so the declarations don't depend on
11
+ * `@reown/appkit`'s types; the value is forwarded to AppKit as-is.
12
+ */
13
+ networks: [unknown, ...unknown[]];
14
+ themeMode?: "light" | "dark";
15
+ themeVariables?: Record<string, string | number>;
16
+ };
17
+ /**
18
+ * Clears the cached AppKit observable.
19
+ * Use when configuration changes or for testing purposes.
20
+ * Note: This does NOT destroy the appKit instance created by Reown.
21
+ */
22
+ export declare const resetAppKitCache: () => void;
23
+ /**
24
+ * The WalletConnect plugin for `config.walletConnect`. Importing this entry is
25
+ * what brings Reown AppKit into a dapp's bundle; a dapp that never imports it
26
+ * ships none of it.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * import { walletConnect } from "@kheopskit/core/walletconnect";
31
+ *
32
+ * getKheopskit$({
33
+ * platforms: [polkadot()],
34
+ * walletConnect: walletConnect({ projectId, metadata, networks }),
35
+ * });
36
+ * ```
37
+ */
38
+ export declare const walletConnect: (options: WalletConnectOptions) => WalletConnectPlugin;
39
+ //#endregion
40
+ export { type WalletConnectMetadata, type WalletConnectOptions, type WalletConnectPlugin, type WalletConnectWallet, isWalletConnectWallet };
41
+ //# sourceMappingURL=walletconnect.d.ts.map
@@ -0,0 +1,219 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_types = require("./types-BWHvNFlN.js");
3
+ let rxjs = require("rxjs");
4
+ //#region src/api/walletconnect/plugin.ts
5
+ /**
6
+ * Dynamically import @reown/appkit/core to avoid loading browser-only code
7
+ * during SSR or in edge runtimes like Cloudflare Workers.
8
+ * The AppKit library uses Lit for web components which requires document.
9
+ */
10
+ const loadAppKit = async () => {
11
+ try {
12
+ const { createAppKit } = await import("@reown/appkit/core");
13
+ return createAppKit;
14
+ } catch (cause) {
15
+ console.error("[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.", cause);
16
+ return null;
17
+ }
18
+ };
19
+ const WALLET_CONNECT_ICON = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+";
20
+ const APPKIT_SYMBOL = Symbol.for("kheopskit.cachedAppKit");
21
+ const APPKIT_PROJECT_ID_SYMBOL = Symbol.for("kheopskit.cachedAppKitProjectId");
22
+ const getCachedAppKit = () => globalThis[APPKIT_SYMBOL];
23
+ const getCachedAppKitProjectId = () => globalThis[APPKIT_PROJECT_ID_SYMBOL];
24
+ const setCachedAppKit = (value, projectId) => {
25
+ globalThis[APPKIT_SYMBOL] = value;
26
+ globalThis[APPKIT_PROJECT_ID_SYMBOL] = projectId;
27
+ };
28
+ /**
29
+ * Clears the cached AppKit observable.
30
+ * Use when configuration changes or for testing purposes.
31
+ * Note: This does NOT destroy the appKit instance created by Reown.
32
+ */
33
+ const resetAppKitCache = () => {
34
+ setCachedAppKit(void 0);
35
+ };
36
+ /**
37
+ * Keys are `accounts:<walletId>:...`; the trailing colon scopes the prefix to
38
+ * this wallet and avoids matching a sibling whose id is a string prefix.
39
+ */
40
+ const dropAccountsCache = (platform) => {
41
+ require_types.clearCachedObservablesByPrefix(`accounts:${require_types.WALLET_CONNECT_WALLET_ID}:${platform}:`);
42
+ };
43
+ const namespaceOf = {
44
+ polkadot: "polkadot",
45
+ ethereum: "eip155",
46
+ solana: "solana"
47
+ };
48
+ const allPlatforms = [
49
+ "polkadot",
50
+ "ethereum",
51
+ "solana"
52
+ ];
53
+ const createConnector$ = (appKit) => {
54
+ const appKitInstance = appKit;
55
+ const status$ = new rxjs.BehaviorSubject({
56
+ isPolkadotConnected: false,
57
+ isEthereumConnected: false,
58
+ isSolanaConnected: false,
59
+ opening: false,
60
+ error: void 0
61
+ });
62
+ const syncProviders = (providers) => {
63
+ status$.next({
64
+ ...status$.value,
65
+ isPolkadotConnected: !!providers.polkadot,
66
+ isEthereumConnected: !!providers.eip155,
67
+ isSolanaConnected: !!providers.solana
68
+ });
69
+ };
70
+ const openModal = async () => {
71
+ status$.next({
72
+ ...status$.value,
73
+ opening: true,
74
+ error: void 0
75
+ });
76
+ try {
77
+ await appKit.open();
78
+ } catch (cause) {
79
+ const error = require_types.toConnectError(cause, require_types.WALLET_CONNECT_WALLET_ID, () => false);
80
+ status$.next({
81
+ ...status$.value,
82
+ opening: false,
83
+ error
84
+ });
85
+ throw error;
86
+ }
87
+ status$.next({
88
+ ...status$.value,
89
+ opening: false
90
+ });
91
+ };
92
+ const enabledPlatforms = allPlatforms.filter((p) => appKit.chainNamespaces.includes(namespaceOf[p]));
93
+ let prevConnected = {
94
+ polkadot: false,
95
+ ethereum: false,
96
+ solana: false
97
+ };
98
+ const wallet$ = status$.pipe((0, rxjs.map)((s) => ({
99
+ polkadot: s.isPolkadotConnected,
100
+ ethereum: s.isEthereumConnected,
101
+ solana: s.isSolanaConnected,
102
+ opening: s.opening,
103
+ error: s.error
104
+ })), (0, rxjs.distinctUntilChanged)((a, b) => a.polkadot === b.polkadot && a.ethereum === b.ethereum && a.solana === b.solana && a.opening === b.opening && a.error === b.error), (0, rxjs.tap)((connected) => {
105
+ for (const platform of allPlatforms) if (prevConnected[platform] && !connected[platform]) dropAccountsCache(platform);
106
+ prevConnected = connected;
107
+ }), (0, rxjs.map)(({ opening, error, ...connected }) => {
108
+ const platforms = enabledPlatforms.filter((p) => connected[p]);
109
+ const isConnected = platforms.length > 0;
110
+ const walletInfo = appKit.getWalletInfo();
111
+ return {
112
+ id: require_types.WALLET_CONNECT_WALLET_ID,
113
+ type: "walletconnect",
114
+ platforms,
115
+ appKit: appKitInstance,
116
+ name: walletInfo?.name ?? "WalletConnect",
117
+ icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
118
+ connect: async () => {
119
+ if (!isConnected) await openModal();
120
+ },
121
+ disconnect: async () => {
122
+ if (isConnected) await appKit.disconnect();
123
+ },
124
+ status: isConnected ? "connected" : opening ? "connecting" : "disconnected",
125
+ error,
126
+ isConnected
127
+ };
128
+ }));
129
+ return new rxjs.Observable((subscriber) => {
130
+ for (const platform of allPlatforms) dropAccountsCache(platform);
131
+ syncProviders({
132
+ polkadot: appKit.getProvider("polkadot"),
133
+ eip155: appKit.getProvider("eip155"),
134
+ solana: appKit.getProvider("solana")
135
+ });
136
+ const unsubProviders = appKit.subscribeProviders(syncProviders);
137
+ const sub = wallet$.subscribe(subscriber);
138
+ return () => {
139
+ sub.unsubscribe();
140
+ unsubProviders();
141
+ };
142
+ });
143
+ };
144
+ /**
145
+ * @remarks
146
+ * The AppKit instance is a process-wide singleton: a second instance would
147
+ * share AppKit's module-level controller state with the first, so it is
148
+ * created once. The **first** call with a `walletConnect` config wins;
149
+ * later calls with a *different* `walletConnect` config reuse that first
150
+ * instance. Call {@link resetAppKitCache} before re-initialising if the
151
+ * WalletConnect config must change.
152
+ *
153
+ * One WalletConnect session is shared across every namespace, and a namespace
154
+ * can only be established during the initial pairing — it can't be added to a
155
+ * live session afterwards. So this exposes ONE connector (not one per platform):
156
+ * `connect()` opens the modal; the wallet approves whichever namespaces it
157
+ * supports in that single pairing, and `platforms` reflects what the live
158
+ * session carries. Per-namespace accounts are derived by each platform plugin.
159
+ */
160
+ const getWalletConnectWallet$ = (walletConnect, debug) => {
161
+ if (typeof window === "undefined") return (0, rxjs.of)(null);
162
+ const cachedProjectId = getCachedAppKitProjectId();
163
+ if (cachedProjectId !== void 0 && cachedProjectId !== walletConnect.projectId) console.warn("[kheopskit] WalletConnect is already initialised with projectId %s; AppKit is a process-wide singleton, so the first configuration wins and projectId %s is ignored. Call resetAppKitCache() before re-initialising if the WalletConnect config must change.", cachedProjectId, walletConnect.projectId);
164
+ let cachedAppKit = getCachedAppKit();
165
+ if (!cachedAppKit) {
166
+ cachedAppKit = (0, rxjs.from)(loadAppKit()).pipe((0, rxjs.map)((createAppKit) => createAppKit ? createConnector$(createAppKit({
167
+ projectId: walletConnect.projectId,
168
+ metadata: walletConnect.metadata,
169
+ networks: walletConnect.networks,
170
+ themeMode: walletConnect.themeMode,
171
+ themeVariables: walletConnect.themeVariables,
172
+ universalProviderConfigOverride: { methods: {
173
+ polkadot: ["polkadot_signTransaction", "polkadot_signMessage"],
174
+ solana: [
175
+ "solana_signTransaction",
176
+ "solana_signMessage",
177
+ "solana_signAndSendTransaction"
178
+ ]
179
+ } },
180
+ allWallets: "HIDE",
181
+ debug,
182
+ allowUnsupportedChain: true
183
+ })) : null), (0, rxjs.shareReplay)({
184
+ refCount: false,
185
+ bufferSize: 1
186
+ })).pipe((0, rxjs.switchMap)((wallet$) => wallet$ ?? (0, rxjs.of)(null)), (0, rxjs.shareReplay)({
187
+ refCount: true,
188
+ bufferSize: 1
189
+ }));
190
+ setCachedAppKit(cachedAppKit, walletConnect.projectId);
191
+ }
192
+ return cachedAppKit;
193
+ };
194
+ /**
195
+ * The WalletConnect plugin for `config.walletConnect`. Importing this entry is
196
+ * what brings Reown AppKit into a dapp's bundle; a dapp that never imports it
197
+ * ships none of it.
198
+ *
199
+ * @example
200
+ * ```ts
201
+ * import { walletConnect } from "@kheopskit/core/walletconnect";
202
+ *
203
+ * getKheopskit$({
204
+ * platforms: [polkadot()],
205
+ * walletConnect: walletConnect({ projectId, metadata, networks }),
206
+ * });
207
+ * ```
208
+ */
209
+ const walletConnect = (options) => ({
210
+ type: "walletconnect",
211
+ metadata: options.metadata,
212
+ getWallet$: ({ config }) => getWalletConnectWallet$(options, config.debug)
213
+ });
214
+ //#endregion
215
+ exports.isWalletConnectWallet = require_types.isWalletConnectWallet;
216
+ exports.resetAppKitCache = resetAppKitCache;
217
+ exports.walletConnect = walletConnect;
218
+
219
+ //# sourceMappingURL=walletconnect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletconnect.js","names":["WALLET_CONNECT_WALLET_ID","BehaviorSubject","toConnectError","map","distinctUntilChanged","tap","Observable","of","from","shareReplay","switchMap"],"sources":["../src/api/walletconnect/plugin.ts"],"sourcesContent":["import type { AppKit } from \"@reown/appkit/core\";\nimport {\n\tBehaviorSubject,\n\tdistinctUntilChanged,\n\tfrom,\n\tmap,\n\tObservable,\n\tof,\n\tshareReplay,\n\tswitchMap,\n\ttap,\n} from \"rxjs\";\nimport { clearCachedObservablesByPrefix } from \"../../utils/getCachedObservable\";\nimport { WALLET_CONNECT_WALLET_ID } from \"../../utils/WalletId\";\nimport { type KheopskitError, toConnectError } from \"../errors\";\nimport type {\n\tAppKitInstance,\n\tWalletConnectMetadata,\n\tWalletConnectPlugin,\n\tWalletConnectWallet,\n\tWalletPlatform,\n} from \"../types\";\n\nexport type WalletConnectOptions = {\n\tprojectId: string;\n\tmetadata: WalletConnectMetadata;\n\t/**\n\t * Networks AppKit should enable. Pass `AppKitNetwork[]` from\n\t * `@reown/appkit/networks` (see\n\t * https://docs.reown.com/advanced/multichain/polkadot/dapp-integration-guide#walletconnect-code%2Fcomponent-setup).\n\t * Loosely typed (`unknown`) so the declarations don't depend on\n\t * `@reown/appkit`'s types; the value is forwarded to AppKit as-is.\n\t */\n\tnetworks: [unknown, ...unknown[]];\n\tthemeMode?: \"light\" | \"dark\";\n\tthemeVariables?: Record<string, string | number>;\n};\n\n/**\n * Dynamically import @reown/appkit/core to avoid loading browser-only code\n * during SSR or in edge runtimes like Cloudflare Workers.\n * The AppKit library uses Lit for web components which requires document.\n */\nconst loadAppKit = async () => {\n\ttry {\n\t\tconst { createAppKit } = await import(\"@reown/appkit/core\");\n\t\treturn createAppKit;\n\t} catch (cause) {\n\t\tconsole.error(\n\t\t\t\"[kheopskit] WalletConnect is configured but @reown/appkit could not be loaded. \" +\n\t\t\t\t\"Install it with `pnpm add @reown/appkit` (or remove config.walletConnect). \" +\n\t\t\t\t\"WalletConnect wallets are disabled; injected wallets still work.\",\n\t\t\tcause,\n\t\t);\n\t\treturn null;\n\t}\n};\n\nconst WALLET_CONNECT_ICON =\n\t\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+\";\n\n// Once it exists, the appKit object should never be recreated. Anchored on\n// globalThis so it stays a single instance even if this module is duplicated\n// across bundle chunks (e.g. CJS subpath entries).\nconst APPKIT_SYMBOL = Symbol.for(\"kheopskit.cachedAppKit\");\n// The projectId AppKit was first initialised with. AppKit is a process-wide\n// singleton, so a later call with a different WalletConnect config is silently\n// ignored — we keep this to warn loudly instead of letting it pass unnoticed.\nconst APPKIT_PROJECT_ID_SYMBOL = Symbol.for(\"kheopskit.cachedAppKitProjectId\");\ntype AppKitGlobal = Record<\n\tsymbol,\n\tObservable<WalletConnectWallet | null> | string | undefined\n>;\nconst getCachedAppKit = ():\n\t| Observable<WalletConnectWallet | null>\n\t| undefined =>\n\t(globalThis as unknown as AppKitGlobal)[APPKIT_SYMBOL] as\n\t\t| Observable<WalletConnectWallet | null>\n\t\t| undefined;\nconst getCachedAppKitProjectId = (): string | undefined =>\n\t(globalThis as unknown as AppKitGlobal)[APPKIT_PROJECT_ID_SYMBOL] as\n\t\t| string\n\t\t| undefined;\nconst setCachedAppKit = (\n\tvalue: Observable<WalletConnectWallet | null> | undefined,\n\tprojectId?: string,\n): void => {\n\t(globalThis as unknown as AppKitGlobal)[APPKIT_SYMBOL] = value;\n\t(globalThis as unknown as AppKitGlobal)[APPKIT_PROJECT_ID_SYMBOL] = projectId;\n};\n\n/**\n * Clears the cached AppKit observable.\n * Use when configuration changes or for testing purposes.\n * Note: This does NOT destroy the appKit instance created by Reown.\n */\nexport const resetAppKitCache = (): void => {\n\tsetCachedAppKit(undefined);\n};\n\n/**\n * Keys are `accounts:<walletId>:...`; the trailing colon scopes the prefix to\n * this wallet and avoids matching a sibling whose id is a string prefix.\n */\nconst dropAccountsCache = (platform: WalletPlatform): void => {\n\tclearCachedObservablesByPrefix(\n\t\t`accounts:${WALLET_CONNECT_WALLET_ID}:${platform}:`,\n\t);\n};\n\nconst namespaceOf: Record<WalletPlatform, string> = {\n\tpolkadot: \"polkadot\",\n\tethereum: \"eip155\",\n\tsolana: \"solana\",\n};\nconst allPlatforms: WalletPlatform[] = [\"polkadot\", \"ethereum\", \"solana\"];\n\nconst createConnector$ = (appKit: AppKit): Observable<WalletConnectWallet> => {\n\t// Exposed on the wallet as the (decoupled) AppKitInstance escape hatch.\n\tconst appKitInstance = appKit as unknown as AppKitInstance;\n\n\tconst status$ = new BehaviorSubject<{\n\t\tisPolkadotConnected: boolean;\n\t\tisEthereumConnected: boolean;\n\t\tisSolanaConnected: boolean;\n\t\topening: boolean;\n\t\terror: KheopskitError | undefined;\n\t}>({\n\t\tisPolkadotConnected: false,\n\t\tisEthereumConnected: false,\n\t\tisSolanaConnected: false,\n\t\topening: false,\n\t\terror: undefined,\n\t});\n\n\tconst syncProviders = (providers: Partial<Record<string, unknown>>) => {\n\t\tstatus$.next({\n\t\t\t...status$.value,\n\t\t\tisPolkadotConnected: !!providers.polkadot,\n\t\t\tisEthereumConnected: !!providers.eip155,\n\t\t\tisSolanaConnected: !!providers.solana,\n\t\t});\n\t};\n\n\tconst openModal = async () => {\n\t\tstatus$.next({ ...status$.value, opening: true, error: undefined });\n\t\ttry {\n\t\t\tawait appKit.open();\n\t\t} catch (cause) {\n\t\t\tconst error = toConnectError(\n\t\t\t\tcause,\n\t\t\t\tWALLET_CONNECT_WALLET_ID,\n\t\t\t\t() => false,\n\t\t\t);\n\t\t\tstatus$.next({ ...status$.value, opening: false, error });\n\t\t\tthrow error;\n\t\t}\n\t\tstatus$.next({ ...status$.value, opening: false });\n\t};\n\n\tconst enabledPlatforms = allPlatforms.filter((p) =>\n\t\t(appKit.chainNamespaces as string[]).includes(namespaceOf[p]),\n\t);\n\n\tlet prevConnected = {\n\t\tpolkadot: false,\n\t\tethereum: false,\n\t\tsolana: false,\n\t};\n\n\tconst wallet$ = status$.pipe(\n\t\tmap((s) => ({\n\t\t\tpolkadot: s.isPolkadotConnected,\n\t\t\tethereum: s.isEthereumConnected,\n\t\t\tsolana: s.isSolanaConnected,\n\t\t\topening: s.opening,\n\t\t\terror: s.error,\n\t\t})),\n\t\tdistinctUntilChanged(\n\t\t\t(a, b) =>\n\t\t\t\ta.polkadot === b.polkadot &&\n\t\t\t\ta.ethereum === b.ethereum &&\n\t\t\t\ta.solana === b.solana &&\n\t\t\t\ta.opening === b.opening &&\n\t\t\t\ta.error === b.error,\n\t\t),\n\t\ttap((connected) => {\n\t\t\t// Drop caches for namespaces that just went disconnected.\n\t\t\tfor (const platform of allPlatforms)\n\t\t\t\tif (prevConnected[platform] && !connected[platform])\n\t\t\t\t\tdropAccountsCache(platform);\n\t\t\tprevConnected = connected;\n\t\t}),\n\t\tmap(({ opening, error, ...connected }): WalletConnectWallet => {\n\t\t\tconst platforms = enabledPlatforms.filter((p) => connected[p]);\n\t\t\tconst isConnected = platforms.length > 0;\n\t\t\tconst walletInfo = appKit.getWalletInfo();\n\t\t\treturn {\n\t\t\t\tid: WALLET_CONNECT_WALLET_ID,\n\t\t\t\ttype: \"walletconnect\",\n\t\t\t\tplatforms,\n\t\t\t\tappKit: appKitInstance,\n\t\t\t\tname: walletInfo?.name ?? \"WalletConnect\",\n\t\t\t\ticon: walletInfo?.icon ?? WALLET_CONNECT_ICON,\n\t\t\t\t// One shared session: connecting opens the modal; the wallet\n\t\t\t\t// approves namespaces in that single pairing. Disconnect is\n\t\t\t\t// session-wide; re-pair to change the approved set.\n\t\t\t\tconnect: async () => {\n\t\t\t\t\tif (!isConnected) await openModal();\n\t\t\t\t},\n\t\t\t\tdisconnect: async () => {\n\t\t\t\t\tif (isConnected) await appKit.disconnect();\n\t\t\t\t},\n\t\t\t\tstatus: isConnected\n\t\t\t\t\t? \"connected\"\n\t\t\t\t\t: opening\n\t\t\t\t\t\t? \"connecting\"\n\t\t\t\t\t\t: \"disconnected\",\n\t\t\t\terror,\n\t\t\t\tisConnected,\n\t\t\t};\n\t\t}),\n\t);\n\n\treturn new Observable<WalletConnectWallet>((subscriber) => {\n\t\tfor (const platform of allPlatforms) dropAccountsCache(platform);\n\t\t// AppKit's subscribeProviders only reports later changes, so read the\n\t\t// state that may have changed while nobody observed.\n\t\tsyncProviders({\n\t\t\tpolkadot: appKit.getProvider(\"polkadot\"),\n\t\t\teip155: appKit.getProvider(\"eip155\"),\n\t\t\tsolana: appKit.getProvider(\"solana\"),\n\t\t});\n\t\tconst unsubProviders = appKit.subscribeProviders(syncProviders);\n\t\tconst sub = wallet$.subscribe(subscriber);\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t\tunsubProviders();\n\t\t};\n\t});\n};\n\n/**\n * @remarks\n * The AppKit instance is a process-wide singleton: a second instance would\n * share AppKit's module-level controller state with the first, so it is\n * created once. The **first** call with a `walletConnect` config wins;\n * later calls with a *different* `walletConnect` config reuse that first\n * instance. Call {@link resetAppKitCache} before re-initialising if the\n * WalletConnect config must change.\n *\n * One WalletConnect session is shared across every namespace, and a namespace\n * can only be established during the initial pairing — it can't be added to a\n * live session afterwards. So this exposes ONE connector (not one per platform):\n * `connect()` opens the modal; the wallet approves whichever namespaces it\n * supports in that single pairing, and `platforms` reflects what the live\n * session carries. Per-namespace accounts are derived by each platform plugin.\n */\nconst getWalletConnectWallet$ = (\n\twalletConnect: WalletConnectOptions,\n\tdebug: boolean,\n): Observable<WalletConnectWallet | null> => {\n\t// SSR guard - don't try to load AppKit on the server\n\tif (typeof window === \"undefined\") return of(null);\n\n\tconst cachedProjectId = getCachedAppKitProjectId();\n\tif (\n\t\tcachedProjectId !== undefined &&\n\t\tcachedProjectId !== walletConnect.projectId\n\t) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] WalletConnect is already initialised with projectId %s; \" +\n\t\t\t\t\"AppKit is a process-wide singleton, so the first configuration wins and \" +\n\t\t\t\t\"projectId %s is ignored. Call resetAppKitCache() before re-initialising \" +\n\t\t\t\t\"if the WalletConnect config must change.\",\n\t\t\tcachedProjectId,\n\t\t\twalletConnect.projectId,\n\t\t);\n\t}\n\n\tlet cachedAppKit = getCachedAppKit();\n\tif (!cachedAppKit) {\n\t\t// Dynamic import avoids loading @reown/appkit at module-eval time (SSR /\n\t\t// edge runtimes like Cloudflare Workers).\n\t\tconst connectorOnce$ = from(loadAppKit()).pipe(\n\t\t\tmap((createAppKit) =>\n\t\t\t\t// @reown/appkit missing (optional peer dep) — degrade gracefully.\n\t\t\t\tcreateAppKit\n\t\t\t\t\t? createConnector$(\n\t\t\t\t\t\t\tcreateAppKit({\n\t\t\t\t\t\t\t\tprojectId: walletConnect.projectId,\n\t\t\t\t\t\t\t\tmetadata: walletConnect.metadata,\n\t\t\t\t\t\t\t\tnetworks: walletConnect.networks as never,\n\t\t\t\t\t\t\t\tthemeMode: walletConnect.themeMode,\n\t\t\t\t\t\t\t\tthemeVariables: walletConnect.themeVariables as never,\n\t\t\t\t\t\t\t\tuniversalProviderConfigOverride: {\n\t\t\t\t\t\t\t\t\tmethods: {\n\t\t\t\t\t\t\t\t\t\tpolkadot: [\n\t\t\t\t\t\t\t\t\t\t\t\"polkadot_signTransaction\",\n\t\t\t\t\t\t\t\t\t\t\t\"polkadot_signMessage\",\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tsolana: [\n\t\t\t\t\t\t\t\t\t\t\t\"solana_signTransaction\",\n\t\t\t\t\t\t\t\t\t\t\t\"solana_signMessage\",\n\t\t\t\t\t\t\t\t\t\t\t\"solana_signAndSendTransaction\",\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tallWallets: \"HIDE\",\n\t\t\t\t\t\t\t\tdebug,\n\t\t\t\t\t\t\t\tallowUnsupportedChain: true,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t),\n\t\t\tshareReplay({ refCount: false, bufferSize: 1 }),\n\t\t);\n\t\tcachedAppKit = connectorOnce$.pipe(\n\t\t\tswitchMap((wallet$) => wallet$ ?? of(null)),\n\t\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t\t);\n\t\tsetCachedAppKit(cachedAppKit, walletConnect.projectId);\n\t}\n\n\treturn cachedAppKit;\n};\n\n/**\n * The WalletConnect plugin for `config.walletConnect`. Importing this entry is\n * what brings Reown AppKit into a dapp's bundle; a dapp that never imports it\n * ships none of it.\n *\n * @example\n * ```ts\n * import { walletConnect } from \"@kheopskit/core/walletconnect\";\n *\n * getKheopskit$({\n * platforms: [polkadot()],\n * walletConnect: walletConnect({ projectId, metadata, networks }),\n * });\n * ```\n */\nexport const walletConnect = (\n\toptions: WalletConnectOptions,\n): WalletConnectPlugin => ({\n\ttype: \"walletconnect\",\n\tmetadata: options.metadata,\n\tgetWallet$: ({ config }) => getWalletConnectWallet$(options, config.debug),\n});\n"],"mappings":"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"}
@@ -0,0 +1,216 @@
1
+ import { g as clearCachedObservablesByPrefix, l as WALLET_CONNECT_WALLET_ID, n as isWalletConnectWallet, s as toConnectError } from "./types-Yor672md.mjs";
2
+ import { BehaviorSubject, Observable, distinctUntilChanged, from, map, of, shareReplay, switchMap, tap } from "rxjs";
3
+ //#region src/api/walletconnect/plugin.ts
4
+ /**
5
+ * Dynamically import @reown/appkit/core to avoid loading browser-only code
6
+ * during SSR or in edge runtimes like Cloudflare Workers.
7
+ * The AppKit library uses Lit for web components which requires document.
8
+ */
9
+ const loadAppKit = async () => {
10
+ try {
11
+ const { createAppKit } = await import("@reown/appkit/core");
12
+ return createAppKit;
13
+ } catch (cause) {
14
+ console.error("[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.", cause);
15
+ return null;
16
+ }
17
+ };
18
+ const WALLET_CONNECT_ICON = "data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+";
19
+ const APPKIT_SYMBOL = Symbol.for("kheopskit.cachedAppKit");
20
+ const APPKIT_PROJECT_ID_SYMBOL = Symbol.for("kheopskit.cachedAppKitProjectId");
21
+ const getCachedAppKit = () => globalThis[APPKIT_SYMBOL];
22
+ const getCachedAppKitProjectId = () => globalThis[APPKIT_PROJECT_ID_SYMBOL];
23
+ const setCachedAppKit = (value, projectId) => {
24
+ globalThis[APPKIT_SYMBOL] = value;
25
+ globalThis[APPKIT_PROJECT_ID_SYMBOL] = projectId;
26
+ };
27
+ /**
28
+ * Clears the cached AppKit observable.
29
+ * Use when configuration changes or for testing purposes.
30
+ * Note: This does NOT destroy the appKit instance created by Reown.
31
+ */
32
+ const resetAppKitCache = () => {
33
+ setCachedAppKit(void 0);
34
+ };
35
+ /**
36
+ * Keys are `accounts:<walletId>:...`; the trailing colon scopes the prefix to
37
+ * this wallet and avoids matching a sibling whose id is a string prefix.
38
+ */
39
+ const dropAccountsCache = (platform) => {
40
+ clearCachedObservablesByPrefix(`accounts:${WALLET_CONNECT_WALLET_ID}:${platform}:`);
41
+ };
42
+ const namespaceOf = {
43
+ polkadot: "polkadot",
44
+ ethereum: "eip155",
45
+ solana: "solana"
46
+ };
47
+ const allPlatforms = [
48
+ "polkadot",
49
+ "ethereum",
50
+ "solana"
51
+ ];
52
+ const createConnector$ = (appKit) => {
53
+ const appKitInstance = appKit;
54
+ const status$ = new BehaviorSubject({
55
+ isPolkadotConnected: false,
56
+ isEthereumConnected: false,
57
+ isSolanaConnected: false,
58
+ opening: false,
59
+ error: void 0
60
+ });
61
+ const syncProviders = (providers) => {
62
+ status$.next({
63
+ ...status$.value,
64
+ isPolkadotConnected: !!providers.polkadot,
65
+ isEthereumConnected: !!providers.eip155,
66
+ isSolanaConnected: !!providers.solana
67
+ });
68
+ };
69
+ const openModal = async () => {
70
+ status$.next({
71
+ ...status$.value,
72
+ opening: true,
73
+ error: void 0
74
+ });
75
+ try {
76
+ await appKit.open();
77
+ } catch (cause) {
78
+ const error = toConnectError(cause, WALLET_CONNECT_WALLET_ID, () => false);
79
+ status$.next({
80
+ ...status$.value,
81
+ opening: false,
82
+ error
83
+ });
84
+ throw error;
85
+ }
86
+ status$.next({
87
+ ...status$.value,
88
+ opening: false
89
+ });
90
+ };
91
+ const enabledPlatforms = allPlatforms.filter((p) => appKit.chainNamespaces.includes(namespaceOf[p]));
92
+ let prevConnected = {
93
+ polkadot: false,
94
+ ethereum: false,
95
+ solana: false
96
+ };
97
+ const wallet$ = status$.pipe(map((s) => ({
98
+ polkadot: s.isPolkadotConnected,
99
+ ethereum: s.isEthereumConnected,
100
+ solana: s.isSolanaConnected,
101
+ opening: s.opening,
102
+ error: s.error
103
+ })), distinctUntilChanged((a, b) => a.polkadot === b.polkadot && a.ethereum === b.ethereum && a.solana === b.solana && a.opening === b.opening && a.error === b.error), tap((connected) => {
104
+ for (const platform of allPlatforms) if (prevConnected[platform] && !connected[platform]) dropAccountsCache(platform);
105
+ prevConnected = connected;
106
+ }), map(({ opening, error, ...connected }) => {
107
+ const platforms = enabledPlatforms.filter((p) => connected[p]);
108
+ const isConnected = platforms.length > 0;
109
+ const walletInfo = appKit.getWalletInfo();
110
+ return {
111
+ id: WALLET_CONNECT_WALLET_ID,
112
+ type: "walletconnect",
113
+ platforms,
114
+ appKit: appKitInstance,
115
+ name: walletInfo?.name ?? "WalletConnect",
116
+ icon: walletInfo?.icon ?? WALLET_CONNECT_ICON,
117
+ connect: async () => {
118
+ if (!isConnected) await openModal();
119
+ },
120
+ disconnect: async () => {
121
+ if (isConnected) await appKit.disconnect();
122
+ },
123
+ status: isConnected ? "connected" : opening ? "connecting" : "disconnected",
124
+ error,
125
+ isConnected
126
+ };
127
+ }));
128
+ return new Observable((subscriber) => {
129
+ for (const platform of allPlatforms) dropAccountsCache(platform);
130
+ syncProviders({
131
+ polkadot: appKit.getProvider("polkadot"),
132
+ eip155: appKit.getProvider("eip155"),
133
+ solana: appKit.getProvider("solana")
134
+ });
135
+ const unsubProviders = appKit.subscribeProviders(syncProviders);
136
+ const sub = wallet$.subscribe(subscriber);
137
+ return () => {
138
+ sub.unsubscribe();
139
+ unsubProviders();
140
+ };
141
+ });
142
+ };
143
+ /**
144
+ * @remarks
145
+ * The AppKit instance is a process-wide singleton: a second instance would
146
+ * share AppKit's module-level controller state with the first, so it is
147
+ * created once. The **first** call with a `walletConnect` config wins;
148
+ * later calls with a *different* `walletConnect` config reuse that first
149
+ * instance. Call {@link resetAppKitCache} before re-initialising if the
150
+ * WalletConnect config must change.
151
+ *
152
+ * One WalletConnect session is shared across every namespace, and a namespace
153
+ * can only be established during the initial pairing — it can't be added to a
154
+ * live session afterwards. So this exposes ONE connector (not one per platform):
155
+ * `connect()` opens the modal; the wallet approves whichever namespaces it
156
+ * supports in that single pairing, and `platforms` reflects what the live
157
+ * session carries. Per-namespace accounts are derived by each platform plugin.
158
+ */
159
+ const getWalletConnectWallet$ = (walletConnect, debug) => {
160
+ if (typeof window === "undefined") return of(null);
161
+ const cachedProjectId = getCachedAppKitProjectId();
162
+ if (cachedProjectId !== void 0 && cachedProjectId !== walletConnect.projectId) console.warn("[kheopskit] WalletConnect is already initialised with projectId %s; AppKit is a process-wide singleton, so the first configuration wins and projectId %s is ignored. Call resetAppKitCache() before re-initialising if the WalletConnect config must change.", cachedProjectId, walletConnect.projectId);
163
+ let cachedAppKit = getCachedAppKit();
164
+ if (!cachedAppKit) {
165
+ cachedAppKit = from(loadAppKit()).pipe(map((createAppKit) => createAppKit ? createConnector$(createAppKit({
166
+ projectId: walletConnect.projectId,
167
+ metadata: walletConnect.metadata,
168
+ networks: walletConnect.networks,
169
+ themeMode: walletConnect.themeMode,
170
+ themeVariables: walletConnect.themeVariables,
171
+ universalProviderConfigOverride: { methods: {
172
+ polkadot: ["polkadot_signTransaction", "polkadot_signMessage"],
173
+ solana: [
174
+ "solana_signTransaction",
175
+ "solana_signMessage",
176
+ "solana_signAndSendTransaction"
177
+ ]
178
+ } },
179
+ allWallets: "HIDE",
180
+ debug,
181
+ allowUnsupportedChain: true
182
+ })) : null), shareReplay({
183
+ refCount: false,
184
+ bufferSize: 1
185
+ })).pipe(switchMap((wallet$) => wallet$ ?? of(null)), shareReplay({
186
+ refCount: true,
187
+ bufferSize: 1
188
+ }));
189
+ setCachedAppKit(cachedAppKit, walletConnect.projectId);
190
+ }
191
+ return cachedAppKit;
192
+ };
193
+ /**
194
+ * The WalletConnect plugin for `config.walletConnect`. Importing this entry is
195
+ * what brings Reown AppKit into a dapp's bundle; a dapp that never imports it
196
+ * ships none of it.
197
+ *
198
+ * @example
199
+ * ```ts
200
+ * import { walletConnect } from "@kheopskit/core/walletconnect";
201
+ *
202
+ * getKheopskit$({
203
+ * platforms: [polkadot()],
204
+ * walletConnect: walletConnect({ projectId, metadata, networks }),
205
+ * });
206
+ * ```
207
+ */
208
+ const walletConnect = (options) => ({
209
+ type: "walletconnect",
210
+ metadata: options.metadata,
211
+ getWallet$: ({ config }) => getWalletConnectWallet$(options, config.debug)
212
+ });
213
+ //#endregion
214
+ export { isWalletConnectWallet, resetAppKitCache, walletConnect };
215
+
216
+ //# sourceMappingURL=walletconnect.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletconnect.mjs","names":[],"sources":["../src/api/walletconnect/plugin.ts"],"sourcesContent":["import type { AppKit } from \"@reown/appkit/core\";\nimport {\n\tBehaviorSubject,\n\tdistinctUntilChanged,\n\tfrom,\n\tmap,\n\tObservable,\n\tof,\n\tshareReplay,\n\tswitchMap,\n\ttap,\n} from \"rxjs\";\nimport { clearCachedObservablesByPrefix } from \"../../utils/getCachedObservable\";\nimport { WALLET_CONNECT_WALLET_ID } from \"../../utils/WalletId\";\nimport { type KheopskitError, toConnectError } from \"../errors\";\nimport type {\n\tAppKitInstance,\n\tWalletConnectMetadata,\n\tWalletConnectPlugin,\n\tWalletConnectWallet,\n\tWalletPlatform,\n} from \"../types\";\n\nexport type WalletConnectOptions = {\n\tprojectId: string;\n\tmetadata: WalletConnectMetadata;\n\t/**\n\t * Networks AppKit should enable. Pass `AppKitNetwork[]` from\n\t * `@reown/appkit/networks` (see\n\t * https://docs.reown.com/advanced/multichain/polkadot/dapp-integration-guide#walletconnect-code%2Fcomponent-setup).\n\t * Loosely typed (`unknown`) so the declarations don't depend on\n\t * `@reown/appkit`'s types; the value is forwarded to AppKit as-is.\n\t */\n\tnetworks: [unknown, ...unknown[]];\n\tthemeMode?: \"light\" | \"dark\";\n\tthemeVariables?: Record<string, string | number>;\n};\n\n/**\n * Dynamically import @reown/appkit/core to avoid loading browser-only code\n * during SSR or in edge runtimes like Cloudflare Workers.\n * The AppKit library uses Lit for web components which requires document.\n */\nconst loadAppKit = async () => {\n\ttry {\n\t\tconst { createAppKit } = await import(\"@reown/appkit/core\");\n\t\treturn createAppKit;\n\t} catch (cause) {\n\t\tconsole.error(\n\t\t\t\"[kheopskit] WalletConnect is configured but @reown/appkit could not be loaded. \" +\n\t\t\t\t\"Install it with `pnpm add @reown/appkit` (or remove config.walletConnect). \" +\n\t\t\t\t\"WalletConnect wallets are disabled; injected wallets still work.\",\n\t\t\tcause,\n\t\t);\n\t\treturn null;\n\t}\n};\n\nconst WALLET_CONNECT_ICON =\n\t\"data:image/svg+xml;base64,PHN2ZyBmaWxsPSJub25lIiBoZWlnaHQ9IjQwMCIgdmlld0JveD0iMCAwIDQwMCA0MDAiIHdpZHRoPSI0MDAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxjbGlwUGF0aCBpZD0iYSI+PHBhdGggZD0ibTAgMGg0MDB2NDAwaC00MDB6Ii8+PC9jbGlwUGF0aD48ZyBjbGlwLXBhdGg9InVybCgjYSkiPjxjaXJjbGUgY3g9IjIwMCIgY3k9IjIwMCIgZmlsbD0iIzMzOTZmZiIgcj0iMTk5LjUiIHN0cm9rZT0iIzY2YjFmZiIvPjxwYXRoIGQ9Im0xMjIuNTE5IDE0OC45NjVjNDIuNzkxLTQxLjcyOSAxMTIuMTcxLTQxLjcyOSAxNTQuOTYyIDBsNS4xNSA1LjAyMmMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtMTcuNjE3IDE3LjE4Yy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTcuMDg3LTYuOTExYy0yOS44NTMtMjkuMTExLTc4LjI1My0yOS4xMTEtMTA4LjEwNiAwbC03LjU5IDcuNDAxYy0xLjA3IDEuMDQzLTIuODA0IDEuMDQzLTMuODc0IDBsLTE3LjYxNy0xNy4xOGMtMi4xNC0yLjA4Ni0yLjE0LTUuNDY5IDAtNy41NTV6bTE5MS4zOTcgMzUuNTI5IDE1LjY3OSAxNS4yOWMyLjE0IDIuMDg2IDIuMTQgNS40NjkgMCA3LjU1NWwtNzAuNyA2OC45NDRjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTUwLjE3OC00OC45MzFjLS41MzUtLjUyMi0xLjQwMi0uNTIyLTEuOTM3IDBsLTUwLjE3OCA0OC45MzFjLTIuMTM5IDIuMDg3LTUuNjA4IDIuMDg3LTcuNzQ4IDBsLTcwLjcwMTUtNjguOTQ1Yy0yLjEzOTYtMi4wODYtMi4xMzk2LTUuNDY5IDAtNy41NTVsMTUuNjc5NS0xNS4yOWMyLjEzOTYtMi4wODYgNS42MDg1LTIuMDg2IDcuNzQ4MSAwbDUwLjE3ODkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3Ny00OC45MzJjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMGw1MC4xNzkgNDguOTMyYy41MzUuNTIyIDEuNDAyLjUyMiAxLjkzNyAwbDUwLjE3OS00OC45MzFjMi4xMzktMi4wODcgNS42MDgtMi4wODcgNy43NDggMHoiIGZpbGw9IiNmZmYiLz48L2c+PC9zdmc+\";\n\n// Once it exists, the appKit object should never be recreated. Anchored on\n// globalThis so it stays a single instance even if this module is duplicated\n// across bundle chunks (e.g. CJS subpath entries).\nconst APPKIT_SYMBOL = Symbol.for(\"kheopskit.cachedAppKit\");\n// The projectId AppKit was first initialised with. AppKit is a process-wide\n// singleton, so a later call with a different WalletConnect config is silently\n// ignored — we keep this to warn loudly instead of letting it pass unnoticed.\nconst APPKIT_PROJECT_ID_SYMBOL = Symbol.for(\"kheopskit.cachedAppKitProjectId\");\ntype AppKitGlobal = Record<\n\tsymbol,\n\tObservable<WalletConnectWallet | null> | string | undefined\n>;\nconst getCachedAppKit = ():\n\t| Observable<WalletConnectWallet | null>\n\t| undefined =>\n\t(globalThis as unknown as AppKitGlobal)[APPKIT_SYMBOL] as\n\t\t| Observable<WalletConnectWallet | null>\n\t\t| undefined;\nconst getCachedAppKitProjectId = (): string | undefined =>\n\t(globalThis as unknown as AppKitGlobal)[APPKIT_PROJECT_ID_SYMBOL] as\n\t\t| string\n\t\t| undefined;\nconst setCachedAppKit = (\n\tvalue: Observable<WalletConnectWallet | null> | undefined,\n\tprojectId?: string,\n): void => {\n\t(globalThis as unknown as AppKitGlobal)[APPKIT_SYMBOL] = value;\n\t(globalThis as unknown as AppKitGlobal)[APPKIT_PROJECT_ID_SYMBOL] = projectId;\n};\n\n/**\n * Clears the cached AppKit observable.\n * Use when configuration changes or for testing purposes.\n * Note: This does NOT destroy the appKit instance created by Reown.\n */\nexport const resetAppKitCache = (): void => {\n\tsetCachedAppKit(undefined);\n};\n\n/**\n * Keys are `accounts:<walletId>:...`; the trailing colon scopes the prefix to\n * this wallet and avoids matching a sibling whose id is a string prefix.\n */\nconst dropAccountsCache = (platform: WalletPlatform): void => {\n\tclearCachedObservablesByPrefix(\n\t\t`accounts:${WALLET_CONNECT_WALLET_ID}:${platform}:`,\n\t);\n};\n\nconst namespaceOf: Record<WalletPlatform, string> = {\n\tpolkadot: \"polkadot\",\n\tethereum: \"eip155\",\n\tsolana: \"solana\",\n};\nconst allPlatforms: WalletPlatform[] = [\"polkadot\", \"ethereum\", \"solana\"];\n\nconst createConnector$ = (appKit: AppKit): Observable<WalletConnectWallet> => {\n\t// Exposed on the wallet as the (decoupled) AppKitInstance escape hatch.\n\tconst appKitInstance = appKit as unknown as AppKitInstance;\n\n\tconst status$ = new BehaviorSubject<{\n\t\tisPolkadotConnected: boolean;\n\t\tisEthereumConnected: boolean;\n\t\tisSolanaConnected: boolean;\n\t\topening: boolean;\n\t\terror: KheopskitError | undefined;\n\t}>({\n\t\tisPolkadotConnected: false,\n\t\tisEthereumConnected: false,\n\t\tisSolanaConnected: false,\n\t\topening: false,\n\t\terror: undefined,\n\t});\n\n\tconst syncProviders = (providers: Partial<Record<string, unknown>>) => {\n\t\tstatus$.next({\n\t\t\t...status$.value,\n\t\t\tisPolkadotConnected: !!providers.polkadot,\n\t\t\tisEthereumConnected: !!providers.eip155,\n\t\t\tisSolanaConnected: !!providers.solana,\n\t\t});\n\t};\n\n\tconst openModal = async () => {\n\t\tstatus$.next({ ...status$.value, opening: true, error: undefined });\n\t\ttry {\n\t\t\tawait appKit.open();\n\t\t} catch (cause) {\n\t\t\tconst error = toConnectError(\n\t\t\t\tcause,\n\t\t\t\tWALLET_CONNECT_WALLET_ID,\n\t\t\t\t() => false,\n\t\t\t);\n\t\t\tstatus$.next({ ...status$.value, opening: false, error });\n\t\t\tthrow error;\n\t\t}\n\t\tstatus$.next({ ...status$.value, opening: false });\n\t};\n\n\tconst enabledPlatforms = allPlatforms.filter((p) =>\n\t\t(appKit.chainNamespaces as string[]).includes(namespaceOf[p]),\n\t);\n\n\tlet prevConnected = {\n\t\tpolkadot: false,\n\t\tethereum: false,\n\t\tsolana: false,\n\t};\n\n\tconst wallet$ = status$.pipe(\n\t\tmap((s) => ({\n\t\t\tpolkadot: s.isPolkadotConnected,\n\t\t\tethereum: s.isEthereumConnected,\n\t\t\tsolana: s.isSolanaConnected,\n\t\t\topening: s.opening,\n\t\t\terror: s.error,\n\t\t})),\n\t\tdistinctUntilChanged(\n\t\t\t(a, b) =>\n\t\t\t\ta.polkadot === b.polkadot &&\n\t\t\t\ta.ethereum === b.ethereum &&\n\t\t\t\ta.solana === b.solana &&\n\t\t\t\ta.opening === b.opening &&\n\t\t\t\ta.error === b.error,\n\t\t),\n\t\ttap((connected) => {\n\t\t\t// Drop caches for namespaces that just went disconnected.\n\t\t\tfor (const platform of allPlatforms)\n\t\t\t\tif (prevConnected[platform] && !connected[platform])\n\t\t\t\t\tdropAccountsCache(platform);\n\t\t\tprevConnected = connected;\n\t\t}),\n\t\tmap(({ opening, error, ...connected }): WalletConnectWallet => {\n\t\t\tconst platforms = enabledPlatforms.filter((p) => connected[p]);\n\t\t\tconst isConnected = platforms.length > 0;\n\t\t\tconst walletInfo = appKit.getWalletInfo();\n\t\t\treturn {\n\t\t\t\tid: WALLET_CONNECT_WALLET_ID,\n\t\t\t\ttype: \"walletconnect\",\n\t\t\t\tplatforms,\n\t\t\t\tappKit: appKitInstance,\n\t\t\t\tname: walletInfo?.name ?? \"WalletConnect\",\n\t\t\t\ticon: walletInfo?.icon ?? WALLET_CONNECT_ICON,\n\t\t\t\t// One shared session: connecting opens the modal; the wallet\n\t\t\t\t// approves namespaces in that single pairing. Disconnect is\n\t\t\t\t// session-wide; re-pair to change the approved set.\n\t\t\t\tconnect: async () => {\n\t\t\t\t\tif (!isConnected) await openModal();\n\t\t\t\t},\n\t\t\t\tdisconnect: async () => {\n\t\t\t\t\tif (isConnected) await appKit.disconnect();\n\t\t\t\t},\n\t\t\t\tstatus: isConnected\n\t\t\t\t\t? \"connected\"\n\t\t\t\t\t: opening\n\t\t\t\t\t\t? \"connecting\"\n\t\t\t\t\t\t: \"disconnected\",\n\t\t\t\terror,\n\t\t\t\tisConnected,\n\t\t\t};\n\t\t}),\n\t);\n\n\treturn new Observable<WalletConnectWallet>((subscriber) => {\n\t\tfor (const platform of allPlatforms) dropAccountsCache(platform);\n\t\t// AppKit's subscribeProviders only reports later changes, so read the\n\t\t// state that may have changed while nobody observed.\n\t\tsyncProviders({\n\t\t\tpolkadot: appKit.getProvider(\"polkadot\"),\n\t\t\teip155: appKit.getProvider(\"eip155\"),\n\t\t\tsolana: appKit.getProvider(\"solana\"),\n\t\t});\n\t\tconst unsubProviders = appKit.subscribeProviders(syncProviders);\n\t\tconst sub = wallet$.subscribe(subscriber);\n\t\treturn () => {\n\t\t\tsub.unsubscribe();\n\t\t\tunsubProviders();\n\t\t};\n\t});\n};\n\n/**\n * @remarks\n * The AppKit instance is a process-wide singleton: a second instance would\n * share AppKit's module-level controller state with the first, so it is\n * created once. The **first** call with a `walletConnect` config wins;\n * later calls with a *different* `walletConnect` config reuse that first\n * instance. Call {@link resetAppKitCache} before re-initialising if the\n * WalletConnect config must change.\n *\n * One WalletConnect session is shared across every namespace, and a namespace\n * can only be established during the initial pairing — it can't be added to a\n * live session afterwards. So this exposes ONE connector (not one per platform):\n * `connect()` opens the modal; the wallet approves whichever namespaces it\n * supports in that single pairing, and `platforms` reflects what the live\n * session carries. Per-namespace accounts are derived by each platform plugin.\n */\nconst getWalletConnectWallet$ = (\n\twalletConnect: WalletConnectOptions,\n\tdebug: boolean,\n): Observable<WalletConnectWallet | null> => {\n\t// SSR guard - don't try to load AppKit on the server\n\tif (typeof window === \"undefined\") return of(null);\n\n\tconst cachedProjectId = getCachedAppKitProjectId();\n\tif (\n\t\tcachedProjectId !== undefined &&\n\t\tcachedProjectId !== walletConnect.projectId\n\t) {\n\t\tconsole.warn(\n\t\t\t\"[kheopskit] WalletConnect is already initialised with projectId %s; \" +\n\t\t\t\t\"AppKit is a process-wide singleton, so the first configuration wins and \" +\n\t\t\t\t\"projectId %s is ignored. Call resetAppKitCache() before re-initialising \" +\n\t\t\t\t\"if the WalletConnect config must change.\",\n\t\t\tcachedProjectId,\n\t\t\twalletConnect.projectId,\n\t\t);\n\t}\n\n\tlet cachedAppKit = getCachedAppKit();\n\tif (!cachedAppKit) {\n\t\t// Dynamic import avoids loading @reown/appkit at module-eval time (SSR /\n\t\t// edge runtimes like Cloudflare Workers).\n\t\tconst connectorOnce$ = from(loadAppKit()).pipe(\n\t\t\tmap((createAppKit) =>\n\t\t\t\t// @reown/appkit missing (optional peer dep) — degrade gracefully.\n\t\t\t\tcreateAppKit\n\t\t\t\t\t? createConnector$(\n\t\t\t\t\t\t\tcreateAppKit({\n\t\t\t\t\t\t\t\tprojectId: walletConnect.projectId,\n\t\t\t\t\t\t\t\tmetadata: walletConnect.metadata,\n\t\t\t\t\t\t\t\tnetworks: walletConnect.networks as never,\n\t\t\t\t\t\t\t\tthemeMode: walletConnect.themeMode,\n\t\t\t\t\t\t\t\tthemeVariables: walletConnect.themeVariables as never,\n\t\t\t\t\t\t\t\tuniversalProviderConfigOverride: {\n\t\t\t\t\t\t\t\t\tmethods: {\n\t\t\t\t\t\t\t\t\t\tpolkadot: [\n\t\t\t\t\t\t\t\t\t\t\t\"polkadot_signTransaction\",\n\t\t\t\t\t\t\t\t\t\t\t\"polkadot_signMessage\",\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\tsolana: [\n\t\t\t\t\t\t\t\t\t\t\t\"solana_signTransaction\",\n\t\t\t\t\t\t\t\t\t\t\t\"solana_signMessage\",\n\t\t\t\t\t\t\t\t\t\t\t\"solana_signAndSendTransaction\",\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tallWallets: \"HIDE\",\n\t\t\t\t\t\t\t\tdebug,\n\t\t\t\t\t\t\t\tallowUnsupportedChain: true,\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t)\n\t\t\t\t\t: null,\n\t\t\t),\n\t\t\tshareReplay({ refCount: false, bufferSize: 1 }),\n\t\t);\n\t\tcachedAppKit = connectorOnce$.pipe(\n\t\t\tswitchMap((wallet$) => wallet$ ?? of(null)),\n\t\t\tshareReplay({ refCount: true, bufferSize: 1 }),\n\t\t);\n\t\tsetCachedAppKit(cachedAppKit, walletConnect.projectId);\n\t}\n\n\treturn cachedAppKit;\n};\n\n/**\n * The WalletConnect plugin for `config.walletConnect`. Importing this entry is\n * what brings Reown AppKit into a dapp's bundle; a dapp that never imports it\n * ships none of it.\n *\n * @example\n * ```ts\n * import { walletConnect } from \"@kheopskit/core/walletconnect\";\n *\n * getKheopskit$({\n * platforms: [polkadot()],\n * walletConnect: walletConnect({ projectId, metadata, networks }),\n * });\n * ```\n */\nexport const walletConnect = (\n\toptions: WalletConnectOptions,\n): WalletConnectPlugin => ({\n\ttype: \"walletconnect\",\n\tmetadata: options.metadata,\n\tgetWallet$: ({ config }) => getWalletConnectWallet$(options, config.debug),\n});\n"],"mappings":"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"}