@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.
- package/CHANGELOG.md +432 -0
- package/MIGRATING_TO_V6.md +840 -0
- package/README.md +629 -12
- package/dist/ethereum.d.mts +12 -6
- package/dist/ethereum.d.ts +12 -6
- package/dist/ethereum.js +13 -10
- package/dist/ethereum.js.map +1 -1
- package/dist/ethereum.mjs +7 -4
- package/dist/ethereum.mjs.map +1 -1
- package/dist/{iconCache-pP2ES4pJ.mjs → iconCache-C-U3IEbP.mjs} +21 -40
- package/dist/iconCache-C-U3IEbP.mjs.map +1 -0
- package/dist/{iconCache-DUtkJlaX.js → iconCache-FR4iy6go.js} +21 -40
- package/dist/iconCache-FR4iy6go.js.map +1 -0
- package/dist/index.d.mts +17 -63
- package/dist/index.d.ts +17 -63
- package/dist/index.js +387 -373
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +384 -369
- package/dist/index.mjs.map +1 -1
- package/dist/injectedWallets-48L-AL1I.mjs +173 -0
- package/dist/injectedWallets-48L-AL1I.mjs.map +1 -0
- package/dist/injectedWallets-Dy8YGKL-.js +178 -0
- package/dist/injectedWallets-Dy8YGKL-.js.map +1 -0
- package/dist/internal.d.mts +3 -27
- package/dist/internal.d.ts +3 -27
- package/dist/internal.js +2 -2
- package/dist/internal.mjs +2 -2
- package/dist/pageLoad-BZ7o8p5R.mjs +24 -0
- package/dist/pageLoad-BZ7o8p5R.mjs.map +1 -0
- package/dist/pageLoad-D1wLeuFG.js +28 -0
- package/dist/pageLoad-D1wLeuFG.js.map +1 -0
- package/dist/platformAccounts-BjIeRcFN.js +321 -0
- package/dist/platformAccounts-BjIeRcFN.js.map +1 -0
- package/dist/platformAccounts-yyRUrnel.mjs +256 -0
- package/dist/platformAccounts-yyRUrnel.mjs.map +1 -0
- package/dist/polkadot.d.mts +127 -11
- package/dist/polkadot.d.ts +127 -11
- package/dist/polkadot.js +187 -106
- package/dist/polkadot.js.map +1 -1
- package/dist/polkadot.mjs +180 -99
- package/dist/polkadot.mjs.map +1 -1
- package/dist/solana.d.mts +11 -5
- package/dist/solana.d.ts +11 -5
- package/dist/solana.js +18 -15
- package/dist/solana.js.map +1 -1
- package/dist/solana.mjs +7 -4
- package/dist/solana.mjs.map +1 -1
- package/dist/storage-D3AwNgqc.d.mts +27 -0
- package/dist/storage-D3AwNgqc.d.ts +27 -0
- package/dist/testing.d.mts +71 -0
- package/dist/testing.d.ts +71 -0
- package/dist/testing.js +136 -0
- package/dist/testing.js.map +1 -0
- package/dist/testing.mjs +131 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/{types-DKU-SNio.js → types-BWHvNFlN.js} +149 -2
- package/dist/types-BWHvNFlN.js.map +1 -0
- package/dist/types-Yor672md.mjs +215 -0
- package/dist/types-Yor672md.mjs.map +1 -0
- package/dist/types-lkMXVJNG.d.mts +685 -0
- package/dist/types-lkMXVJNG.d.ts +685 -0
- package/dist/walletconnect.d.mts +41 -0
- package/dist/walletconnect.d.ts +41 -0
- package/dist/walletconnect.js +219 -0
- package/dist/walletconnect.js.map +1 -0
- package/dist/walletconnect.mjs +216 -0
- package/dist/walletconnect.mjs.map +1 -0
- package/package.json +30 -6
- package/dist/errors-BLFP1dQI.mjs +0 -181
- package/dist/errors-BLFP1dQI.mjs.map +0 -1
- package/dist/errors-DYWVPHrR.js +0 -222
- package/dist/errors-DYWVPHrR.js.map +0 -1
- package/dist/iconCache-DUtkJlaX.js.map +0 -1
- package/dist/iconCache-pP2ES4pJ.mjs.map +0 -1
- package/dist/injectedWallets-BqR-_aAy.js +0 -148
- package/dist/injectedWallets-BqR-_aAy.js.map +0 -1
- package/dist/injectedWallets-Uz4hPuoW.mjs +0 -119
- package/dist/injectedWallets-Uz4hPuoW.mjs.map +0 -1
- package/dist/types-AxUDtkR-.d.mts +0 -338
- package/dist/types-AxUDtkR-.d.ts +0 -338
- package/dist/types-DKU-SNio.js.map +0 -1
- package/dist/types-jnifAAA0.mjs +0 -104
- 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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"}
|