@kheopskit/core 5.1.0 → 5.1.2

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 (76) hide show
  1. package/dist/errors-Caq2csKx.mjs +181 -0
  2. package/dist/errors-Caq2csKx.mjs.map +1 -0
  3. package/dist/errors-DPw6pc2H.js +222 -0
  4. package/dist/errors-DPw6pc2H.js.map +1 -0
  5. package/dist/ethereum.d.mts +39 -38
  6. package/dist/ethereum.d.ts +39 -38
  7. package/dist/ethereum.js +214 -281
  8. package/dist/ethereum.js.map +1 -1
  9. package/dist/ethereum.mjs +211 -282
  10. package/dist/ethereum.mjs.map +1 -1
  11. package/dist/{getCachedObservable-C4E8dfMp.d.ts → getCachedObservable-LUq9IfEx.d.mts} +5 -2
  12. package/dist/{getCachedObservable-C4E8dfMp.d.mts → getCachedObservable-LUq9IfEx.d.ts} +5 -2
  13. package/dist/iconCache-BSa42Sui.mjs +343 -0
  14. package/dist/iconCache-BSa42Sui.mjs.map +1 -0
  15. package/dist/iconCache-DS4zNiP1.js +396 -0
  16. package/dist/iconCache-DS4zNiP1.js.map +1 -0
  17. package/dist/index.d.mts +65 -59
  18. package/dist/index.d.ts +65 -59
  19. package/dist/index.js +901 -1015
  20. package/dist/index.js.map +1 -1
  21. package/dist/index.mjs +885 -1016
  22. package/dist/index.mjs.map +1 -1
  23. package/dist/injectedWallets-B1MCxAE9.js +148 -0
  24. package/dist/injectedWallets-B1MCxAE9.js.map +1 -0
  25. package/dist/injectedWallets-B3Vysfvr.mjs +119 -0
  26. package/dist/injectedWallets-B3Vysfvr.mjs.map +1 -0
  27. package/dist/internal.d.mts +18 -16
  28. package/dist/internal.d.ts +18 -16
  29. package/dist/internal.js +9 -20
  30. package/dist/internal.mjs +3 -20
  31. package/dist/polkadot.d.mts +37 -36
  32. package/dist/polkadot.d.ts +37 -36
  33. package/dist/polkadot.js +178 -220
  34. package/dist/polkadot.js.map +1 -1
  35. package/dist/polkadot.mjs +175 -221
  36. package/dist/polkadot.mjs.map +1 -1
  37. package/dist/polkadotExtensions-BoVKhNU_.mjs +23 -0
  38. package/dist/polkadotExtensions-BoVKhNU_.mjs.map +1 -0
  39. package/dist/polkadotExtensions-y4J9UzYl.js +28 -0
  40. package/dist/polkadotExtensions-y4J9UzYl.js.map +1 -0
  41. package/dist/solana.d.mts +50 -48
  42. package/dist/solana.d.ts +50 -48
  43. package/dist/solana.js +320 -378
  44. package/dist/solana.js.map +1 -1
  45. package/dist/solana.mjs +314 -379
  46. package/dist/solana.mjs.map +1 -1
  47. package/dist/types-Cb-vuEru.d.mts +330 -0
  48. package/dist/types-Cb-vuEru.d.ts +330 -0
  49. package/dist/types-DKU-SNio.js +169 -0
  50. package/dist/{chunk-P7BPHHVV.js.map → types-DKU-SNio.js.map} +1 -1
  51. package/dist/types-jnifAAA0.mjs +104 -0
  52. package/dist/types-jnifAAA0.mjs.map +1 -0
  53. package/package.json +12 -12
  54. package/dist/chunk-3Y5N4N3Q.mjs +0 -267
  55. package/dist/chunk-3Y5N4N3Q.mjs.map +0 -1
  56. package/dist/chunk-BWUUHUDK.mjs +0 -24
  57. package/dist/chunk-BWUUHUDK.mjs.map +0 -1
  58. package/dist/chunk-D3EQMFZ2.js +0 -24
  59. package/dist/chunk-D3EQMFZ2.js.map +0 -1
  60. package/dist/chunk-DF7EKK4G.mjs +0 -106
  61. package/dist/chunk-DF7EKK4G.mjs.map +0 -1
  62. package/dist/chunk-EH73P476.js +0 -106
  63. package/dist/chunk-EH73P476.js.map +0 -1
  64. package/dist/chunk-JVSCMJY5.mjs +0 -147
  65. package/dist/chunk-JVSCMJY5.mjs.map +0 -1
  66. package/dist/chunk-P7BPHHVV.js +0 -76
  67. package/dist/chunk-SO64R7Z6.js +0 -267
  68. package/dist/chunk-SO64R7Z6.js.map +0 -1
  69. package/dist/chunk-WOPCW2OX.mjs +0 -76
  70. package/dist/chunk-WOPCW2OX.mjs.map +0 -1
  71. package/dist/chunk-XOGQMEV2.js +0 -147
  72. package/dist/chunk-XOGQMEV2.js.map +0 -1
  73. package/dist/internal.js.map +0 -1
  74. package/dist/internal.mjs.map +0 -1
  75. package/dist/types-0iDBydsK.d.mts +0 -327
  76. package/dist/types-0iDBydsK.d.ts +0 -327
package/dist/ethereum.mjs CHANGED
@@ -1,291 +1,220 @@
1
- import {
2
- createInjectedWallets$,
3
- createPlatformAccounts$,
4
- getCaip10Addresses,
5
- getSessionCaip10s
6
- } from "./chunk-JVSCMJY5.mjs";
7
- import {
8
- getWalletAccountId,
9
- isEthereumAddress
10
- } from "./chunk-DF7EKK4G.mjs";
11
- import {
12
- clearCachedObservable,
13
- getCachedObservable$,
14
- getWalletId,
15
- isInjectedWallet,
16
- isWalletConnectWallet
17
- } from "./chunk-WOPCW2OX.mjs";
18
-
19
- // src/api/ethereum/accounts.ts
20
- import {
21
- combineLatest,
22
- distinctUntilChanged,
23
- map,
24
- Observable,
25
- of,
26
- ReplaySubject,
27
- shareReplay
28
- } from "rxjs";
29
- import {
30
- createWalletClient,
31
- custom,
32
- getAddress
33
- } from "viem";
34
- var normalizeEvmChainId = (value) => {
35
- let raw = value;
36
- if (typeof raw === "string" && raw.startsWith("eip155:")) {
37
- raw = raw.slice("eip155:".length);
38
- }
39
- if (typeof raw === "bigint") {
40
- return raw >= 0n ? Number(raw) : void 0;
41
- }
42
- if (typeof raw === "number") {
43
- return Number.isInteger(raw) && raw >= 0 ? raw : void 0;
44
- }
45
- if (typeof raw === "string") {
46
- const normalized = raw.trim().toLowerCase();
47
- if (!normalized) return void 0;
48
- const parsed = normalized.startsWith("0x") ? Number.parseInt(normalized, 16) : Number.parseInt(normalized, 10);
49
- return Number.isNaN(parsed) ? void 0 : parsed;
50
- }
51
- return void 0;
1
+ import { d as getCachedObservable$, i as getWalletId, l as clearCachedObservable, n as isWalletConnectWallet, t as isInjectedWallet } from "./types-jnifAAA0.mjs";
2
+ import { n as getWalletAccountId, s as isEthereumAddress } from "./errors-Caq2csKx.mjs";
3
+ import { i as getSessionCaip10s, n as createPlatformAccounts$, r as getCaip10Addresses, t as createInjectedWallets$ } from "./injectedWallets-B3Vysfvr.mjs";
4
+ import { Observable, ReplaySubject, combineLatest, distinctUntilChanged, map, of, shareReplay } from "rxjs";
5
+ import { createWalletClient, custom, getAddress } from "viem";
6
+ import { createStore } from "mipd";
7
+ //#region src/api/ethereum/accounts.ts
8
+ const normalizeEvmChainId = (value) => {
9
+ let raw = value;
10
+ if (typeof raw === "string" && raw.startsWith("eip155:")) raw = raw.slice(7);
11
+ if (typeof raw === "bigint") return raw >= 0n ? Number(raw) : void 0;
12
+ if (typeof raw === "number") return Number.isInteger(raw) && raw >= 0 ? raw : void 0;
13
+ if (typeof raw === "string") {
14
+ const normalized = raw.trim().toLowerCase();
15
+ if (!normalized) return void 0;
16
+ const parsed = normalized.startsWith("0x") ? Number.parseInt(normalized, 16) : Number.parseInt(normalized, 10);
17
+ return Number.isNaN(parsed) ? void 0 : parsed;
18
+ }
52
19
  };
53
- var toCaipNetworkId = (value) => {
54
- const chainId = normalizeEvmChainId(value);
55
- return chainId === void 0 ? void 0 : `eip155:${chainId}`;
20
+ const toCaipNetworkId = (value) => {
21
+ const chainId = normalizeEvmChainId(value);
22
+ return chainId === void 0 ? void 0 : `eip155:${chainId}`;
56
23
  };
57
- var getInjectedWalletAccounts$ = (wallet) => {
58
- if (!wallet.isConnected) return of([]);
59
- return getCachedObservable$(
60
- `accounts:${wallet.id}`,
61
- () => new Observable((subscriber) => {
62
- const addresses$ = new ReplaySubject(1);
63
- const chainId$ = new ReplaySubject(1);
64
- const getAccount = (address, chainId) => {
65
- const client = createWalletClient({
66
- account: address,
67
- transport: custom(wallet.provider)
68
- });
69
- return {
70
- id: getWalletAccountId(wallet.id, address),
71
- platform: "ethereum",
72
- client,
73
- address: getAddress(address),
74
- chainId,
75
- walletName: wallet.name,
76
- walletId: wallet.id
77
- };
78
- };
79
- const handleAccountsChanged = (addrs) => {
80
- addresses$.next(addrs);
81
- };
82
- const handleChainChanged = (chainIdHex) => {
83
- chainId$.next(normalizeEvmChainId(chainIdHex));
84
- };
85
- const handleDisconnect = () => {
86
- chainId$.next(void 0);
87
- };
88
- wallet.provider.on("accountsChanged", handleAccountsChanged);
89
- wallet.provider.on("chainChanged", handleChainChanged);
90
- wallet.provider.on("disconnect", handleDisconnect);
91
- wallet.provider.request({ method: "eth_accounts" }).then((addrs) => addresses$.next(addrs)).catch((err) => {
92
- console.error("Failed to get accounts", err);
93
- addresses$.next([]);
94
- });
95
- wallet.provider.request({ method: "eth_chainId" }).then(handleChainChanged).catch(() => chainId$.next(void 0));
96
- const sub = combineLatest([addresses$, chainId$]).pipe(
97
- map(
98
- ([addresses, chainId]) => addresses.map((addr) => getAccount(addr, chainId))
99
- )
100
- ).subscribe(subscriber);
101
- return () => {
102
- wallet.provider.removeListener(
103
- "accountsChanged",
104
- handleAccountsChanged
105
- );
106
- wallet.provider.removeListener("chainChanged", handleChainChanged);
107
- wallet.provider.removeListener("disconnect", handleDisconnect);
108
- sub.unsubscribe();
109
- };
110
- }).pipe(shareReplay({ refCount: true, bufferSize: 1 }))
111
- );
24
+ const getInjectedWalletAccounts$ = (wallet) => {
25
+ if (!wallet.isConnected) return of([]);
26
+ return getCachedObservable$(`accounts:${wallet.id}`, () => new Observable((subscriber) => {
27
+ const addresses$ = new ReplaySubject(1);
28
+ const chainId$ = new ReplaySubject(1);
29
+ const getAccount = (address, chainId) => {
30
+ const client = createWalletClient({
31
+ account: address,
32
+ transport: custom(wallet.provider)
33
+ });
34
+ return {
35
+ id: getWalletAccountId(wallet.id, address),
36
+ platform: "ethereum",
37
+ client,
38
+ address: getAddress(address),
39
+ chainId,
40
+ walletName: wallet.name,
41
+ walletId: wallet.id
42
+ };
43
+ };
44
+ const handleAccountsChanged = (addrs) => {
45
+ addresses$.next(addrs);
46
+ };
47
+ const handleChainChanged = (chainIdHex) => {
48
+ chainId$.next(normalizeEvmChainId(chainIdHex));
49
+ };
50
+ const handleDisconnect = () => {
51
+ chainId$.next(void 0);
52
+ };
53
+ wallet.provider.on("accountsChanged", handleAccountsChanged);
54
+ wallet.provider.on("chainChanged", handleChainChanged);
55
+ wallet.provider.on("disconnect", handleDisconnect);
56
+ wallet.provider.request({ method: "eth_accounts" }).then((addrs) => addresses$.next(addrs)).catch((err) => {
57
+ console.error("Failed to get accounts", err);
58
+ addresses$.next([]);
59
+ });
60
+ wallet.provider.request({ method: "eth_chainId" }).then(handleChainChanged).catch(() => chainId$.next(void 0));
61
+ const sub = combineLatest([addresses$, chainId$]).pipe(map(([addresses, chainId]) => addresses.map((addr) => getAccount(addr, chainId)))).subscribe(subscriber);
62
+ return () => {
63
+ wallet.provider.removeListener("accountsChanged", handleAccountsChanged);
64
+ wallet.provider.removeListener("chainChanged", handleChainChanged);
65
+ wallet.provider.removeListener("disconnect", handleDisconnect);
66
+ sub.unsubscribe();
67
+ };
68
+ }).pipe(shareReplay({
69
+ refCount: true,
70
+ bufferSize: 1
71
+ })));
112
72
  };
113
- var wrapWalletConnectProvider = (provider, sessionTopic, caipNetworkId) => {
114
- return new Proxy(provider, {
115
- get(target, prop, receiver) {
116
- if (prop !== "request") return Reflect.get(target, prop, receiver);
117
- return (args) => {
118
- if (!args || typeof args !== "object" || !args.method)
119
- return target.request(args);
120
- const next = { ...args };
121
- if (next.topic === void 0) next.topic = sessionTopic;
122
- if (next.chainId === void 0 && caipNetworkId !== void 0)
123
- next.chainId = caipNetworkId;
124
- return target.request(next, caipNetworkId);
125
- };
126
- }
127
- });
73
+ const wrapWalletConnectProvider = (provider, sessionTopic, caipNetworkId) => {
74
+ return new Proxy(provider, { get(target, prop, receiver) {
75
+ if (prop !== "request") return Reflect.get(target, prop, receiver);
76
+ return (args) => {
77
+ if (!args || typeof args !== "object" || !args.method) return target.request(args);
78
+ const next = { ...args };
79
+ if (next.topic === void 0) next.topic = sessionTopic;
80
+ if (next.chainId === void 0 && caipNetworkId !== void 0) next.chainId = caipNetworkId;
81
+ return target.request(next, caipNetworkId);
82
+ };
83
+ } });
128
84
  };
129
- var sameAddresses = (a, b) => a.length === b.length && a.every((addr, i) => addr === b[i]);
130
- var getWalletConnectAccounts$ = (wallet) => {
131
- const provider = wallet.appKit.getProvider("eip155");
132
- if (!wallet.platforms.includes("ethereum") || !provider?.session)
133
- return of([]);
134
- return getCachedObservable$(
135
- `accounts:${wallet.id}:ethereum:`,
136
- () => new Observable((subscriber) => {
137
- const caipNetworkId$ = new ReplaySubject(1);
138
- const addresses$ = new ReplaySubject(1);
139
- const readAddresses = () => {
140
- const session = provider.session;
141
- if (!session) return [];
142
- const addresses = /* @__PURE__ */ new Set();
143
- for (const raw of getCaip10Addresses(
144
- getSessionCaip10s(session, "eip155")
145
- )) {
146
- try {
147
- addresses.add(getAddress(raw));
148
- } catch {
149
- }
150
- }
151
- return [...addresses];
152
- };
153
- const readCaipNetworkId = () => {
154
- const session = provider.session;
155
- if (!session) return void 0;
156
- for (const account of getSessionCaip10s(session, "eip155")) {
157
- const ref = account.split(":")[1];
158
- if (ref) return `eip155:${ref}`;
159
- }
160
- return void 0;
161
- };
162
- const handleChainChanged = (chainId) => {
163
- const caipNetworkId = toCaipNetworkId(chainId);
164
- if (caipNetworkId) {
165
- caipNetworkId$.next(caipNetworkId);
166
- }
167
- };
168
- const handleAccountsChanged = () => addresses$.next(readAddresses());
169
- provider.on("chainChanged", handleChainChanged);
170
- provider.on("accountsChanged", handleAccountsChanged);
171
- provider.on("session_update", handleAccountsChanged);
172
- caipNetworkId$.next(readCaipNetworkId());
173
- provider.request({ method: "eth_chainId" }).then(handleChainChanged).catch(() => {
174
- });
175
- addresses$.next(readAddresses());
176
- const sub = combineLatest([
177
- caipNetworkId$.pipe(distinctUntilChanged()),
178
- addresses$.pipe(distinctUntilChanged(sameAddresses))
179
- ]).pipe(
180
- map(([caipNetworkId, addresses]) => {
181
- const chainId = normalizeEvmChainId(caipNetworkId);
182
- const transport = custom(
183
- wrapWalletConnectProvider(
184
- provider,
185
- // biome-ignore lint/style/noNonNullAssertion: legacy
186
- provider.session.topic,
187
- caipNetworkId
188
- )
189
- );
190
- return addresses.map((addr) => {
191
- const client = createWalletClient({
192
- account: addr,
193
- transport
194
- });
195
- return {
196
- id: getWalletAccountId(wallet.id, addr),
197
- platform: "ethereum",
198
- walletName: wallet.name,
199
- walletId: wallet.id,
200
- address: addr,
201
- client,
202
- chainId
203
- };
204
- });
205
- })
206
- ).subscribe(subscriber);
207
- return () => {
208
- provider.off("chainChanged", handleChainChanged);
209
- provider.off("accountsChanged", handleAccountsChanged);
210
- provider.off("session_update", handleAccountsChanged);
211
- sub.unsubscribe();
212
- };
213
- }).pipe(shareReplay({ refCount: true, bufferSize: 1 }))
214
- );
85
+ const sameAddresses = (a, b) => a.length === b.length && a.every((addr, i) => addr === b[i]);
86
+ const getWalletConnectAccounts$ = (wallet) => {
87
+ const provider = wallet.appKit.getProvider("eip155");
88
+ if (!wallet.platforms.includes("ethereum") || !provider?.session) return of([]);
89
+ return getCachedObservable$(`accounts:${wallet.id}:ethereum:`, () => new Observable((subscriber) => {
90
+ const caipNetworkId$ = new ReplaySubject(1);
91
+ const addresses$ = new ReplaySubject(1);
92
+ const readAddresses = () => {
93
+ const session = provider.session;
94
+ if (!session) return [];
95
+ const addresses = /* @__PURE__ */ new Set();
96
+ for (const raw of getCaip10Addresses(getSessionCaip10s(session, "eip155"))) try {
97
+ addresses.add(getAddress(raw));
98
+ } catch {}
99
+ return [...addresses];
100
+ };
101
+ const readCaipNetworkId = () => {
102
+ const session = provider.session;
103
+ if (!session) return void 0;
104
+ for (const account of getSessionCaip10s(session, "eip155")) {
105
+ const ref = account.split(":")[1];
106
+ if (ref) return `eip155:${ref}`;
107
+ }
108
+ };
109
+ const handleChainChanged = (chainId) => {
110
+ const caipNetworkId = toCaipNetworkId(chainId);
111
+ if (caipNetworkId) caipNetworkId$.next(caipNetworkId);
112
+ };
113
+ const handleAccountsChanged = () => addresses$.next(readAddresses());
114
+ provider.on("chainChanged", handleChainChanged);
115
+ provider.on("accountsChanged", handleAccountsChanged);
116
+ provider.on("session_update", handleAccountsChanged);
117
+ caipNetworkId$.next(readCaipNetworkId());
118
+ provider.request({ method: "eth_chainId" }).then(handleChainChanged).catch(() => {});
119
+ addresses$.next(readAddresses());
120
+ const sub = combineLatest([caipNetworkId$.pipe(distinctUntilChanged()), addresses$.pipe(distinctUntilChanged(sameAddresses))]).pipe(map(([caipNetworkId, addresses]) => {
121
+ const chainId = normalizeEvmChainId(caipNetworkId);
122
+ const transport = custom(wrapWalletConnectProvider(provider, provider.session.topic, caipNetworkId));
123
+ return addresses.map((addr) => {
124
+ const client = createWalletClient({
125
+ account: addr,
126
+ transport
127
+ });
128
+ return {
129
+ id: getWalletAccountId(wallet.id, addr),
130
+ platform: "ethereum",
131
+ walletName: wallet.name,
132
+ walletId: wallet.id,
133
+ address: addr,
134
+ client,
135
+ chainId
136
+ };
137
+ });
138
+ })).subscribe(subscriber);
139
+ return () => {
140
+ provider.off("chainChanged", handleChainChanged);
141
+ provider.off("accountsChanged", handleAccountsChanged);
142
+ provider.off("session_update", handleAccountsChanged);
143
+ sub.unsubscribe();
144
+ };
145
+ }).pipe(shareReplay({
146
+ refCount: true,
147
+ bufferSize: 1
148
+ })));
215
149
  };
216
- var getEthereumAccounts$ = (ethereumWallets) => createPlatformAccounts$({
217
- wallets$: ethereumWallets,
218
- getInjectedAccounts$: getInjectedWalletAccounts$,
219
- getWalletConnectAccounts$,
220
- // Re-emit on chain switches, not just account id changes.
221
- accountChangeKey: (account) => `${account.id}|${account.chainId ?? ""}`
150
+ const getEthereumAccounts$ = (ethereumWallets) => createPlatformAccounts$({
151
+ wallets$: ethereumWallets,
152
+ getInjectedAccounts$: getInjectedWalletAccounts$,
153
+ getWalletConnectAccounts$,
154
+ accountChangeKey: (account) => `${account.id}|${account.chainId ?? ""}`
222
155
  });
223
-
224
- // src/api/ethereum/wallets.ts
225
- import {
226
- createStore as createMipdStore
227
- } from "mipd";
228
- import { Observable as Observable2, shareReplay as shareReplay2 } from "rxjs";
229
- var providersDetails$ = new Observable2(
230
- (subscriber) => {
231
- if (typeof window === "undefined") {
232
- subscriber.next([]);
233
- return () => {
234
- };
235
- }
236
- const mipdStore = createMipdStore();
237
- const unsubscribe = mipdStore.subscribe((providerDetails2) => {
238
- subscriber.next(providerDetails2);
239
- });
240
- const providerDetails = mipdStore.getProviders();
241
- subscriber.next(providerDetails);
242
- return () => {
243
- unsubscribe();
244
- mipdStore.destroy();
245
- };
246
- }
247
- ).pipe(shareReplay2({ refCount: true, bufferSize: 1 }));
248
- var getEthereumWallets$ = (store) => createInjectedWallets$(store, {
249
- sources$: providersDetails$,
250
- getWalletId: (pd) => getWalletId("ethereum", pd.info.rdns),
251
- connect: async (pd) => {
252
- await pd.provider.request({
253
- method: "eth_requestAccounts"
254
- });
255
- },
256
- // Drop the cached account observable so a later reconnect rebuilds it
257
- // against the current provider, not a stale closure.
258
- onDisconnected: (walletId) => clearCachedObservable(`accounts:${walletId}`),
259
- buildWallet: ({
260
- source: pd,
261
- walletId,
262
- isConnected,
263
- connect,
264
- disconnect
265
- }) => ({
266
- platform: "ethereum",
267
- type: "injected",
268
- id: walletId,
269
- name: pd.info.name,
270
- icon: pd.info.icon,
271
- provider: pd.provider,
272
- isConnected,
273
- sourceId: pd.info.rdns,
274
- connect,
275
- disconnect
276
- })
156
+ //#endregion
157
+ //#region src/api/ethereum/wallets.ts
158
+ /**
159
+ * Observable that emits EIP-6963 provider details from injected wallets.
160
+ * Returns empty array during SSR since browser wallet APIs are not available.
161
+ */
162
+ const providersDetails$ = new Observable((subscriber) => {
163
+ if (typeof window === "undefined") {
164
+ subscriber.next([]);
165
+ return () => {};
166
+ }
167
+ const mipdStore = createStore();
168
+ const unsubscribe = mipdStore.subscribe((providerDetails) => {
169
+ subscriber.next(providerDetails);
170
+ });
171
+ const providerDetails = mipdStore.getProviders();
172
+ subscriber.next(providerDetails);
173
+ return () => {
174
+ unsubscribe();
175
+ mipdStore.destroy();
176
+ };
177
+ }).pipe(shareReplay({
178
+ refCount: true,
179
+ bufferSize: 1
180
+ }));
181
+ const getEthereumWallets$ = (store) => createInjectedWallets$(store, {
182
+ sources$: providersDetails$,
183
+ getWalletId: (pd) => getWalletId("ethereum", pd.info.rdns),
184
+ connect: async (pd) => {
185
+ await pd.provider.request({ method: "eth_requestAccounts" });
186
+ },
187
+ onDisconnected: (walletId) => clearCachedObservable(`accounts:${walletId}`),
188
+ buildWallet: ({ source: pd, walletId, isConnected, connect, disconnect }) => ({
189
+ platform: "ethereum",
190
+ type: "injected",
191
+ id: walletId,
192
+ name: pd.info.name,
193
+ icon: pd.info.icon,
194
+ provider: pd.provider,
195
+ isConnected,
196
+ sourceId: pd.info.rdns,
197
+ connect,
198
+ disconnect
199
+ })
277
200
  });
278
-
279
- // src/api/ethereum/plugin.ts
280
- var ethereum = () => ({
281
- platform: "ethereum",
282
- getWallets$: (ctx) => getEthereumWallets$(ctx.store),
283
- getAccounts$: (wallets$) => getEthereumAccounts$(wallets$)
201
+ //#endregion
202
+ //#region src/api/ethereum/plugin.ts
203
+ /**
204
+ * Ethereum platform plugin. Pass to `getKheopskit$({ platforms: [ethereum()] })`.
205
+ *
206
+ * @example
207
+ * ```ts
208
+ * import { ethereum } from "@kheopskit/core/ethereum";
209
+ * ethereum();
210
+ * ```
211
+ */
212
+ const ethereum = () => ({
213
+ platform: "ethereum",
214
+ getWallets$: (ctx) => getEthereumWallets$(ctx.store),
215
+ getAccounts$: (wallets$) => getEthereumAccounts$(wallets$)
284
216
  });
285
- export {
286
- ethereum,
287
- isEthereumAddress,
288
- isInjectedWallet,
289
- isWalletConnectWallet
290
- };
217
+ //#endregion
218
+ export { ethereum, isEthereumAddress, isInjectedWallet, isWalletConnectWallet };
219
+
291
220
  //# sourceMappingURL=ethereum.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/ethereum/accounts.ts","../src/api/ethereum/wallets.ts","../src/api/ethereum/plugin.ts"],"sourcesContent":["import {\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tof,\n\tReplaySubject,\n\tshareReplay,\n} from \"rxjs\";\nimport {\n\tcreateWalletClient,\n\tcustom,\n\ttype EIP1193Provider,\n\tgetAddress,\n} from \"viem\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { getCachedObservable$ } from \"../../utils/getCachedObservable\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n} from \"../platformAccounts\";\nimport type { WalletConnectWallet } from \"../types\";\nimport type {\n\tEthereumAccount,\n\tEthereumInjectedWallet,\n\tEthereumWallet,\n} from \"./types\";\n\nconst normalizeEvmChainId = (value: unknown): number | undefined => {\n\tlet raw = value;\n\n\tif (typeof raw === \"string\" && raw.startsWith(\"eip155:\")) {\n\t\traw = raw.slice(\"eip155:\".length);\n\t}\n\n\tif (typeof raw === \"bigint\") {\n\t\treturn raw >= 0n ? Number(raw) : undefined;\n\t}\n\n\tif (typeof raw === \"number\") {\n\t\treturn Number.isInteger(raw) && raw >= 0 ? raw : undefined;\n\t}\n\n\tif (typeof raw === \"string\") {\n\t\tconst normalized = raw.trim().toLowerCase();\n\t\tif (!normalized) return undefined;\n\t\tconst parsed = normalized.startsWith(\"0x\")\n\t\t\t? Number.parseInt(normalized, 16)\n\t\t\t: Number.parseInt(normalized, 10);\n\t\treturn Number.isNaN(parsed) ? undefined : parsed;\n\t}\n\n\treturn undefined;\n};\n\nconst toCaipNetworkId = (value: unknown): string | undefined => {\n\tconst chainId = normalizeEvmChainId(value);\n\treturn chainId === undefined ? undefined : `eip155:${chainId}`;\n};\n\nconst getInjectedWalletAccounts$ = (\n\twallet: EthereumInjectedWallet,\n): Observable<EthereumAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}`, () =>\n\t\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\t\tconst addresses$ = new ReplaySubject<string[]>(1);\n\t\t\tconst chainId$ = new ReplaySubject<number | undefined>(1);\n\n\t\t\tconst getAccount = (\n\t\t\t\taddress: string,\n\t\t\t\tchainId: number | undefined,\n\t\t\t): EthereumAccount => {\n\t\t\t\tconst client = createWalletClient({\n\t\t\t\t\taccount: address as `0x${string}`,\n\t\t\t\t\ttransport: custom(wallet.provider as EIP1193Provider),\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\tclient,\n\t\t\t\t\taddress: getAddress(address),\n\t\t\t\t\tchainId,\n\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst handleAccountsChanged = (addrs: string[]) => {\n\t\t\t\taddresses$.next(addrs);\n\t\t\t};\n\n\t\t\tconst handleChainChanged = (chainIdHex: unknown) => {\n\t\t\t\tchainId$.next(normalizeEvmChainId(chainIdHex));\n\t\t\t};\n\n\t\t\tconst handleDisconnect = () => {\n\t\t\t\tchainId$.next(undefined);\n\t\t\t};\n\n\t\t\t// Subscribe to provider events\n\t\t\twallet.provider.on(\"accountsChanged\", handleAccountsChanged);\n\t\t\twallet.provider.on(\"chainChanged\", handleChainChanged);\n\t\t\twallet.provider.on(\"disconnect\", handleDisconnect);\n\n\t\t\t// Fetch initial values\n\t\t\twallet.provider\n\t\t\t\t.request({ method: \"eth_accounts\" })\n\t\t\t\t.then((addrs: string[]) => addresses$.next(addrs))\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tconsole.error(\"Failed to get accounts\", err);\n\t\t\t\t\taddresses$.next([]);\n\t\t\t\t});\n\n\t\t\twallet.provider\n\t\t\t\t.request({ method: \"eth_chainId\" })\n\t\t\t\t.then(handleChainChanged)\n\t\t\t\t.catch(() => chainId$.next(undefined));\n\n\t\t\t// Combine addresses + chainId into account list\n\t\t\tconst sub = combineLatest([addresses$, chainId$])\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(([addresses, chainId]) =>\n\t\t\t\t\t\taddresses.map((addr) => getAccount(addr, chainId)),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber);\n\n\t\t\treturn () => {\n\t\t\t\twallet.provider.removeListener(\n\t\t\t\t\t\"accountsChanged\",\n\t\t\t\t\thandleAccountsChanged,\n\t\t\t\t);\n\t\t\t\twallet.provider.removeListener(\"chainChanged\", handleChainChanged);\n\t\t\t\twallet.provider.removeListener(\"disconnect\", handleDisconnect);\n\t\t\t\tsub.unsubscribe();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nconst wrapWalletConnectProvider = (\n\tprovider: EIP1193Provider,\n\tsessionTopic: string,\n\tcaipNetworkId: string | undefined,\n): EIP1193Provider => {\n\treturn new Proxy(provider, {\n\t\tget(target, prop, receiver) {\n\t\t\tif (prop !== \"request\") return Reflect.get(target, prop, receiver);\n\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: EIP-1193 request args\n\t\t\treturn (args: any) => {\n\t\t\t\tif (!args || typeof args !== \"object\" || !args.method)\n\t\t\t\t\treturn target.request(args);\n\t\t\t\t// Build a new object rather than mutating the caller's args: the\n\t\t\t\t// EIP-1193 request object is owned by viem and may be frozen or reused.\n\t\t\t\tconst next = { ...args };\n\t\t\t\tif (next.topic === undefined) next.topic = sessionTopic;\n\t\t\t\tif (next.chainId === undefined && caipNetworkId !== undefined)\n\t\t\t\t\tnext.chainId = caipNetworkId;\n\t\t\t\t// WalletConnect's UniversalProvider reads the target CAIP chain id from\n\t\t\t\t// the SECOND positional argument of `request(args, chainId)`, not from a\n\t\t\t\t// field on the args object. This AppKit instance has no native eip155\n\t\t\t\t// adapter, so the provider has no default chain — without the positional\n\t\t\t\t// chain id every call is rejected (\"Unsupported chains\" / \"Method not\n\t\t\t\t// found\"). Pass it positionally so the request routes to the session's\n\t\t\t\t// chain.\n\t\t\t\treturn (\n\t\t\t\t\ttarget.request as (a: unknown, chainId?: string) => Promise<unknown>\n\t\t\t\t)(next, caipNetworkId);\n\t\t\t};\n\t\t},\n\t});\n};\n\nconst sameAddresses = (a: string[], b: string[]) =>\n\ta.length === b.length && a.every((addr, i) => addr === b[i]);\n\nconst getWalletConnectAccounts$ = (\n\twallet: WalletConnectWallet,\n): Observable<EthereumAccount[]> => {\n\tconst provider = wallet.appKit.getProvider(\"eip155\");\n\n\tif (!wallet.platforms.includes(\"ethereum\") || !provider?.session)\n\t\treturn of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}:ethereum:`, () =>\n\t\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\t\tconst caipNetworkId$ = new ReplaySubject<string | undefined>(1);\n\t\t\tconst addresses$ = new ReplaySubject<string[]>(1);\n\n\t\t\t// AppKit's getAccount(\"eip155\").allAccounts is empty because this AppKit\n\t\t\t// instance has no native eip155 adapter — eip155 runs through the\n\t\t\t// WalletConnect UniversalProvider, so the session is the source of truth\n\t\t\t// (mirrors the polkadot/solana AppKit paths). Accounts are CAIP-10 strings\n\t\t\t// (\"eip155:<chainRef>:<address>\"), one entry per chain, so dedupe to unique\n\t\t\t// addresses. Read live on each change so switching/adding accounts is\n\t\t\t// reflected.\n\t\t\tconst readAddresses = (): string[] => {\n\t\t\t\tconst session = provider.session;\n\t\t\t\tif (!session) return [];\n\t\t\t\tconst addresses = new Set<string>();\n\t\t\t\tfor (const raw of getCaip10Addresses(\n\t\t\t\t\tgetSessionCaip10s(session, \"eip155\"),\n\t\t\t\t)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\taddresses.add(getAddress(raw));\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// skip malformed CAIP-10 address\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn [...addresses];\n\t\t\t};\n\n\t\t\t// Derive the CAIP network id from the session's eip155 CAIP-10 accounts\n\t\t\t// (\"eip155:<ref>:<addr>\") as a synchronous fallback for eth_chainId.\n\t\t\tconst readCaipNetworkId = (): string | undefined => {\n\t\t\t\tconst session = provider.session;\n\t\t\t\tif (!session) return undefined;\n\t\t\t\tfor (const account of getSessionCaip10s(session, \"eip155\")) {\n\t\t\t\t\tconst ref = account.split(\":\")[1];\n\t\t\t\t\tif (ref) return `eip155:${ref}`;\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\tconst handleChainChanged = (chainId: unknown) => {\n\t\t\t\tconst caipNetworkId = toCaipNetworkId(chainId);\n\t\t\t\tif (caipNetworkId) {\n\t\t\t\t\tcaipNetworkId$.next(caipNetworkId);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleAccountsChanged = () => addresses$.next(readAddresses());\n\n\t\t\tprovider.on(\"chainChanged\", handleChainChanged);\n\t\t\tprovider.on(\"accountsChanged\", handleAccountsChanged);\n\t\t\tprovider.on(\"session_update\", handleAccountsChanged);\n\t\t\t// Seed the chain id from the session synchronously so the account list can\n\t\t\t// surface even if eth_chainId never resolves; eth_chainId then refines it.\n\t\t\t// Without this seed, combineLatest below never fires when eth_chainId\n\t\t\t// rejects or returns an unparseable value, and the accounts silently never\n\t\t\t// appear (the injected path seeds undefined on failure for the same reason).\n\t\t\tcaipNetworkId$.next(readCaipNetworkId());\n\t\t\tprovider\n\t\t\t\t.request({ method: \"eth_chainId\" })\n\t\t\t\t.then(handleChainChanged)\n\t\t\t\t.catch(() => {});\n\t\t\taddresses$.next(readAddresses());\n\n\t\t\tconst sub = combineLatest([\n\t\t\t\tcaipNetworkId$.pipe(distinctUntilChanged()),\n\t\t\t\taddresses$.pipe(distinctUntilChanged(sameAddresses)),\n\t\t\t])\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(([caipNetworkId, addresses]) => {\n\t\t\t\t\t\tconst chainId = normalizeEvmChainId(caipNetworkId);\n\t\t\t\t\t\tconst transport = custom(\n\t\t\t\t\t\t\twrapWalletConnectProvider(\n\t\t\t\t\t\t\t\tprovider as unknown as EIP1193Provider,\n\t\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: legacy\n\t\t\t\t\t\t\t\tprovider.session!.topic,\n\t\t\t\t\t\t\t\tcaipNetworkId,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn addresses.map((addr): EthereumAccount => {\n\t\t\t\t\t\t\tconst client = createWalletClient({\n\t\t\t\t\t\t\t\taccount: addr as `0x${string}`,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid: getWalletAccountId(wallet.id, addr),\n\t\t\t\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\t\t\taddress: addr as `0x${string}`,\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\tchainId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber);\n\n\t\t\treturn () => {\n\t\t\t\tprovider.off(\"chainChanged\", handleChainChanged);\n\t\t\t\tprovider.off(\"accountsChanged\", handleAccountsChanged);\n\t\t\t\tprovider.off(\"session_update\", handleAccountsChanged);\n\t\t\t\tsub.unsubscribe();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nexport const getEthereumAccounts$ = (\n\tethereumWallets: Observable<(EthereumWallet | WalletConnectWallet)[]>,\n) =>\n\tcreatePlatformAccounts$({\n\t\twallets$: ethereumWallets,\n\t\tgetInjectedAccounts$: getInjectedWalletAccounts$,\n\t\tgetWalletConnectAccounts$,\n\t\t// Re-emit on chain switches, not just account id changes.\n\t\taccountChangeKey: (account) => `${account.id}|${account.chainId ?? \"\"}`,\n\t});\n","import {\n\tcreateStore as createMipdStore,\n\ttype EIP6963ProviderDetail,\n} from \"mipd\";\nimport { Observable, shareReplay } from \"rxjs\";\nimport type { EIP1193Provider } from \"viem\";\nimport { clearCachedObservable } from \"../../utils/getCachedObservable\";\nimport { getWalletId } from \"../../utils/WalletId\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport type { EthereumInjectedWallet } from \"./types\";\n\n/**\n * Observable that emits EIP-6963 provider details from injected wallets.\n * Returns empty array during SSR since browser wallet APIs are not available.\n */\nconst providersDetails$ = new Observable<EIP6963ProviderDetail[]>(\n\t(subscriber) => {\n\t\t// Guard against SSR - mipd requires browser APIs\n\t\tif (typeof window === \"undefined\") {\n\t\t\tsubscriber.next([]);\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst mipdStore = createMipdStore();\n\n\t\tconst unsubscribe = mipdStore.subscribe((providerDetails) => {\n\t\t\tsubscriber.next(providerDetails as EIP6963ProviderDetail[]);\n\t\t});\n\n\t\tconst providerDetails = mipdStore.getProviders();\n\n\t\tsubscriber.next(providerDetails as EIP6963ProviderDetail[]);\n\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\tmipdStore.destroy();\n\t\t};\n\t},\n).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getEthereumWallets$ = (store: KheopskitStore) =>\n\tcreateInjectedWallets$<EIP6963ProviderDetail, EthereumInjectedWallet>(store, {\n\t\tsources$: providersDetails$,\n\t\tgetWalletId: (pd) => getWalletId(\"ethereum\", pd.info.rdns),\n\t\tconnect: async (pd) => {\n\t\t\tawait (pd.provider as EIP1193Provider).request({\n\t\t\t\tmethod: \"eth_requestAccounts\",\n\t\t\t});\n\t\t},\n\t\t// Drop the cached account observable so a later reconnect rebuilds it\n\t\t// against the current provider, not a stale closure.\n\t\tonDisconnected: (walletId) => clearCachedObservable(`accounts:${walletId}`),\n\t\tbuildWallet: ({\n\t\t\tsource: pd,\n\t\t\twalletId,\n\t\t\tisConnected,\n\t\t\tconnect,\n\t\t\tdisconnect,\n\t\t}) => ({\n\t\t\tplatform: \"ethereum\",\n\t\t\ttype: \"injected\",\n\t\t\tid: walletId,\n\t\t\tname: pd.info.name,\n\t\t\ticon: pd.info.icon,\n\t\t\tprovider: pd.provider as EIP1193Provider,\n\t\t\tisConnected,\n\t\t\tsourceId: pd.info.rdns,\n\t\t\tconnect,\n\t\t\tdisconnect,\n\t\t}),\n\t});\n","import type { KheopskitPlatform, PlatformContext } from \"../types\";\nimport { getEthereumAccounts$ } from \"./accounts\";\nimport type { EthereumAccount, EthereumWallet } from \"./types\";\nimport { getEthereumWallets$ } from \"./wallets\";\n\n/**\n * Ethereum platform plugin. Pass to `getKheopskit$({ platforms: [ethereum()] })`.\n *\n * @example\n * ```ts\n * import { ethereum } from \"@kheopskit/core/ethereum\";\n * ethereum();\n * ```\n */\nexport const ethereum = (): KheopskitPlatform<\n\t\"ethereum\",\n\tEthereumWallet,\n\tEthereumAccount\n> => ({\n\tplatform: \"ethereum\",\n\tgetWallets$: (ctx: PlatformContext) => getEthereumWallets$(ctx.store),\n\tgetAccounts$: (wallets$) => getEthereumAccounts$(wallets$),\n});\n"],"mappings":"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","names":["Observable","shareReplay","Observable","providerDetails","shareReplay"]}
1
+ {"version":3,"file":"ethereum.mjs","names":["createMipdStore"],"sources":["../src/api/ethereum/accounts.ts","../src/api/ethereum/wallets.ts","../src/api/ethereum/plugin.ts"],"sourcesContent":["import {\n\tcombineLatest,\n\tdistinctUntilChanged,\n\tmap,\n\tObservable,\n\tof,\n\tReplaySubject,\n\tshareReplay,\n} from \"rxjs\";\nimport {\n\tcreateWalletClient,\n\tcustom,\n\ttype EIP1193Provider,\n\tgetAddress,\n} from \"viem\";\nimport { getWalletAccountId } from \"../../utils\";\nimport { getCachedObservable$ } from \"../../utils/getCachedObservable\";\nimport {\n\tcreatePlatformAccounts$,\n\tgetCaip10Addresses,\n\tgetSessionCaip10s,\n} from \"../platformAccounts\";\nimport type { WalletConnectWallet } from \"../types\";\nimport type {\n\tEthereumAccount,\n\tEthereumInjectedWallet,\n\tEthereumWallet,\n} from \"./types\";\n\nconst normalizeEvmChainId = (value: unknown): number | undefined => {\n\tlet raw = value;\n\n\tif (typeof raw === \"string\" && raw.startsWith(\"eip155:\")) {\n\t\traw = raw.slice(\"eip155:\".length);\n\t}\n\n\tif (typeof raw === \"bigint\") {\n\t\treturn raw >= 0n ? Number(raw) : undefined;\n\t}\n\n\tif (typeof raw === \"number\") {\n\t\treturn Number.isInteger(raw) && raw >= 0 ? raw : undefined;\n\t}\n\n\tif (typeof raw === \"string\") {\n\t\tconst normalized = raw.trim().toLowerCase();\n\t\tif (!normalized) return undefined;\n\t\tconst parsed = normalized.startsWith(\"0x\")\n\t\t\t? Number.parseInt(normalized, 16)\n\t\t\t: Number.parseInt(normalized, 10);\n\t\treturn Number.isNaN(parsed) ? undefined : parsed;\n\t}\n\n\treturn undefined;\n};\n\nconst toCaipNetworkId = (value: unknown): string | undefined => {\n\tconst chainId = normalizeEvmChainId(value);\n\treturn chainId === undefined ? undefined : `eip155:${chainId}`;\n};\n\nconst getInjectedWalletAccounts$ = (\n\twallet: EthereumInjectedWallet,\n): Observable<EthereumAccount[]> => {\n\tif (!wallet.isConnected) return of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}`, () =>\n\t\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\t\tconst addresses$ = new ReplaySubject<string[]>(1);\n\t\t\tconst chainId$ = new ReplaySubject<number | undefined>(1);\n\n\t\t\tconst getAccount = (\n\t\t\t\taddress: string,\n\t\t\t\tchainId: number | undefined,\n\t\t\t): EthereumAccount => {\n\t\t\t\tconst client = createWalletClient({\n\t\t\t\t\taccount: address as `0x${string}`,\n\t\t\t\t\ttransport: custom(wallet.provider as EIP1193Provider),\n\t\t\t\t});\n\n\t\t\t\treturn {\n\t\t\t\t\tid: getWalletAccountId(wallet.id, address),\n\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\tclient,\n\t\t\t\t\taddress: getAddress(address),\n\t\t\t\t\tchainId,\n\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tconst handleAccountsChanged = (addrs: string[]) => {\n\t\t\t\taddresses$.next(addrs);\n\t\t\t};\n\n\t\t\tconst handleChainChanged = (chainIdHex: unknown) => {\n\t\t\t\tchainId$.next(normalizeEvmChainId(chainIdHex));\n\t\t\t};\n\n\t\t\tconst handleDisconnect = () => {\n\t\t\t\tchainId$.next(undefined);\n\t\t\t};\n\n\t\t\t// Subscribe to provider events\n\t\t\twallet.provider.on(\"accountsChanged\", handleAccountsChanged);\n\t\t\twallet.provider.on(\"chainChanged\", handleChainChanged);\n\t\t\twallet.provider.on(\"disconnect\", handleDisconnect);\n\n\t\t\t// Fetch initial values\n\t\t\twallet.provider\n\t\t\t\t.request({ method: \"eth_accounts\" })\n\t\t\t\t.then((addrs: string[]) => addresses$.next(addrs))\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tconsole.error(\"Failed to get accounts\", err);\n\t\t\t\t\taddresses$.next([]);\n\t\t\t\t});\n\n\t\t\twallet.provider\n\t\t\t\t.request({ method: \"eth_chainId\" })\n\t\t\t\t.then(handleChainChanged)\n\t\t\t\t.catch(() => chainId$.next(undefined));\n\n\t\t\t// Combine addresses + chainId into account list\n\t\t\tconst sub = combineLatest([addresses$, chainId$])\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(([addresses, chainId]) =>\n\t\t\t\t\t\taddresses.map((addr) => getAccount(addr, chainId)),\n\t\t\t\t\t),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber);\n\n\t\t\treturn () => {\n\t\t\t\twallet.provider.removeListener(\n\t\t\t\t\t\"accountsChanged\",\n\t\t\t\t\thandleAccountsChanged,\n\t\t\t\t);\n\t\t\t\twallet.provider.removeListener(\"chainChanged\", handleChainChanged);\n\t\t\t\twallet.provider.removeListener(\"disconnect\", handleDisconnect);\n\t\t\t\tsub.unsubscribe();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nconst wrapWalletConnectProvider = (\n\tprovider: EIP1193Provider,\n\tsessionTopic: string,\n\tcaipNetworkId: string | undefined,\n): EIP1193Provider => {\n\treturn new Proxy(provider, {\n\t\tget(target, prop, receiver) {\n\t\t\tif (prop !== \"request\") return Reflect.get(target, prop, receiver);\n\n\t\t\t// biome-ignore lint/suspicious/noExplicitAny: EIP-1193 request args\n\t\t\treturn (args: any) => {\n\t\t\t\tif (!args || typeof args !== \"object\" || !args.method)\n\t\t\t\t\treturn target.request(args);\n\t\t\t\t// Build a new object rather than mutating the caller's args: the\n\t\t\t\t// EIP-1193 request object is owned by viem and may be frozen or reused.\n\t\t\t\tconst next = { ...args };\n\t\t\t\tif (next.topic === undefined) next.topic = sessionTopic;\n\t\t\t\tif (next.chainId === undefined && caipNetworkId !== undefined)\n\t\t\t\t\tnext.chainId = caipNetworkId;\n\t\t\t\t// WalletConnect's UniversalProvider reads the target CAIP chain id from\n\t\t\t\t// the SECOND positional argument of `request(args, chainId)`, not from a\n\t\t\t\t// field on the args object. This AppKit instance has no native eip155\n\t\t\t\t// adapter, so the provider has no default chain — without the positional\n\t\t\t\t// chain id every call is rejected (\"Unsupported chains\" / \"Method not\n\t\t\t\t// found\"). Pass it positionally so the request routes to the session's\n\t\t\t\t// chain.\n\t\t\t\treturn (\n\t\t\t\t\ttarget.request as (a: unknown, chainId?: string) => Promise<unknown>\n\t\t\t\t)(next, caipNetworkId);\n\t\t\t};\n\t\t},\n\t});\n};\n\nconst sameAddresses = (a: string[], b: string[]) =>\n\ta.length === b.length && a.every((addr, i) => addr === b[i]);\n\nconst getWalletConnectAccounts$ = (\n\twallet: WalletConnectWallet,\n): Observable<EthereumAccount[]> => {\n\tconst provider = wallet.appKit.getProvider(\"eip155\");\n\n\tif (!wallet.platforms.includes(\"ethereum\") || !provider?.session)\n\t\treturn of([]);\n\n\treturn getCachedObservable$(`accounts:${wallet.id}:ethereum:`, () =>\n\t\tnew Observable<EthereumAccount[]>((subscriber) => {\n\t\t\tconst caipNetworkId$ = new ReplaySubject<string | undefined>(1);\n\t\t\tconst addresses$ = new ReplaySubject<string[]>(1);\n\n\t\t\t// AppKit's getAccount(\"eip155\").allAccounts is empty because this AppKit\n\t\t\t// instance has no native eip155 adapter — eip155 runs through the\n\t\t\t// WalletConnect UniversalProvider, so the session is the source of truth\n\t\t\t// (mirrors the polkadot/solana AppKit paths). Accounts are CAIP-10 strings\n\t\t\t// (\"eip155:<chainRef>:<address>\"), one entry per chain, so dedupe to unique\n\t\t\t// addresses. Read live on each change so switching/adding accounts is\n\t\t\t// reflected.\n\t\t\tconst readAddresses = (): string[] => {\n\t\t\t\tconst session = provider.session;\n\t\t\t\tif (!session) return [];\n\t\t\t\tconst addresses = new Set<string>();\n\t\t\t\tfor (const raw of getCaip10Addresses(\n\t\t\t\t\tgetSessionCaip10s(session, \"eip155\"),\n\t\t\t\t)) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\taddresses.add(getAddress(raw));\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// skip malformed CAIP-10 address\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn [...addresses];\n\t\t\t};\n\n\t\t\t// Derive the CAIP network id from the session's eip155 CAIP-10 accounts\n\t\t\t// (\"eip155:<ref>:<addr>\") as a synchronous fallback for eth_chainId.\n\t\t\tconst readCaipNetworkId = (): string | undefined => {\n\t\t\t\tconst session = provider.session;\n\t\t\t\tif (!session) return undefined;\n\t\t\t\tfor (const account of getSessionCaip10s(session, \"eip155\")) {\n\t\t\t\t\tconst ref = account.split(\":\")[1];\n\t\t\t\t\tif (ref) return `eip155:${ref}`;\n\t\t\t\t}\n\t\t\t\treturn undefined;\n\t\t\t};\n\n\t\t\tconst handleChainChanged = (chainId: unknown) => {\n\t\t\t\tconst caipNetworkId = toCaipNetworkId(chainId);\n\t\t\t\tif (caipNetworkId) {\n\t\t\t\t\tcaipNetworkId$.next(caipNetworkId);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst handleAccountsChanged = () => addresses$.next(readAddresses());\n\n\t\t\tprovider.on(\"chainChanged\", handleChainChanged);\n\t\t\tprovider.on(\"accountsChanged\", handleAccountsChanged);\n\t\t\tprovider.on(\"session_update\", handleAccountsChanged);\n\t\t\t// Seed the chain id from the session synchronously so the account list can\n\t\t\t// surface even if eth_chainId never resolves; eth_chainId then refines it.\n\t\t\t// Without this seed, combineLatest below never fires when eth_chainId\n\t\t\t// rejects or returns an unparseable value, and the accounts silently never\n\t\t\t// appear (the injected path seeds undefined on failure for the same reason).\n\t\t\tcaipNetworkId$.next(readCaipNetworkId());\n\t\t\tprovider\n\t\t\t\t.request({ method: \"eth_chainId\" })\n\t\t\t\t.then(handleChainChanged)\n\t\t\t\t.catch(() => {});\n\t\t\taddresses$.next(readAddresses());\n\n\t\t\tconst sub = combineLatest([\n\t\t\t\tcaipNetworkId$.pipe(distinctUntilChanged()),\n\t\t\t\taddresses$.pipe(distinctUntilChanged(sameAddresses)),\n\t\t\t])\n\t\t\t\t.pipe(\n\t\t\t\t\tmap(([caipNetworkId, addresses]) => {\n\t\t\t\t\t\tconst chainId = normalizeEvmChainId(caipNetworkId);\n\t\t\t\t\t\tconst transport = custom(\n\t\t\t\t\t\t\twrapWalletConnectProvider(\n\t\t\t\t\t\t\t\tprovider as unknown as EIP1193Provider,\n\t\t\t\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: legacy\n\t\t\t\t\t\t\t\tprovider.session!.topic,\n\t\t\t\t\t\t\t\tcaipNetworkId,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn addresses.map((addr): EthereumAccount => {\n\t\t\t\t\t\t\tconst client = createWalletClient({\n\t\t\t\t\t\t\t\taccount: addr as `0x${string}`,\n\t\t\t\t\t\t\t\ttransport,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tid: getWalletAccountId(wallet.id, addr),\n\t\t\t\t\t\t\t\tplatform: \"ethereum\",\n\t\t\t\t\t\t\t\twalletName: wallet.name,\n\t\t\t\t\t\t\t\twalletId: wallet.id,\n\t\t\t\t\t\t\t\taddress: addr as `0x${string}`,\n\t\t\t\t\t\t\t\tclient,\n\t\t\t\t\t\t\t\tchainId,\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t});\n\t\t\t\t\t}),\n\t\t\t\t)\n\t\t\t\t.subscribe(subscriber);\n\n\t\t\treturn () => {\n\t\t\t\tprovider.off(\"chainChanged\", handleChainChanged);\n\t\t\t\tprovider.off(\"accountsChanged\", handleAccountsChanged);\n\t\t\t\tprovider.off(\"session_update\", handleAccountsChanged);\n\t\t\t\tsub.unsubscribe();\n\t\t\t};\n\t\t}).pipe(shareReplay({ refCount: true, bufferSize: 1 })),\n\t);\n};\n\nexport const getEthereumAccounts$ = (\n\tethereumWallets: Observable<(EthereumWallet | WalletConnectWallet)[]>,\n) =>\n\tcreatePlatformAccounts$({\n\t\twallets$: ethereumWallets,\n\t\tgetInjectedAccounts$: getInjectedWalletAccounts$,\n\t\tgetWalletConnectAccounts$,\n\t\t// Re-emit on chain switches, not just account id changes.\n\t\taccountChangeKey: (account) => `${account.id}|${account.chainId ?? \"\"}`,\n\t});\n","import {\n\tcreateStore as createMipdStore,\n\ttype EIP6963ProviderDetail,\n} from \"mipd\";\nimport { Observable, shareReplay } from \"rxjs\";\nimport type { EIP1193Provider } from \"viem\";\nimport { clearCachedObservable } from \"../../utils/getCachedObservable\";\nimport { getWalletId } from \"../../utils/WalletId\";\nimport { createInjectedWallets$ } from \"../injectedWallets\";\nimport type { KheopskitStore } from \"../store\";\nimport type { EthereumInjectedWallet } from \"./types\";\n\n/**\n * Observable that emits EIP-6963 provider details from injected wallets.\n * Returns empty array during SSR since browser wallet APIs are not available.\n */\nconst providersDetails$ = new Observable<EIP6963ProviderDetail[]>(\n\t(subscriber) => {\n\t\t// Guard against SSR - mipd requires browser APIs\n\t\tif (typeof window === \"undefined\") {\n\t\t\tsubscriber.next([]);\n\t\t\treturn () => {};\n\t\t}\n\n\t\tconst mipdStore = createMipdStore();\n\n\t\tconst unsubscribe = mipdStore.subscribe((providerDetails) => {\n\t\t\tsubscriber.next(providerDetails as EIP6963ProviderDetail[]);\n\t\t});\n\n\t\tconst providerDetails = mipdStore.getProviders();\n\n\t\tsubscriber.next(providerDetails as EIP6963ProviderDetail[]);\n\n\t\treturn () => {\n\t\t\tunsubscribe();\n\t\t\tmipdStore.destroy();\n\t\t};\n\t},\n).pipe(shareReplay({ refCount: true, bufferSize: 1 }));\n\n// The shared WalletConnect connector is emitted once by core (see\n// `getWallets$`), not per platform — so this returns only injected wallets.\nexport const getEthereumWallets$ = (store: KheopskitStore) =>\n\tcreateInjectedWallets$<EIP6963ProviderDetail, EthereumInjectedWallet>(store, {\n\t\tsources$: providersDetails$,\n\t\tgetWalletId: (pd) => getWalletId(\"ethereum\", pd.info.rdns),\n\t\tconnect: async (pd) => {\n\t\t\tawait (pd.provider as EIP1193Provider).request({\n\t\t\t\tmethod: \"eth_requestAccounts\",\n\t\t\t});\n\t\t},\n\t\t// Drop the cached account observable so a later reconnect rebuilds it\n\t\t// against the current provider, not a stale closure.\n\t\tonDisconnected: (walletId) => clearCachedObservable(`accounts:${walletId}`),\n\t\tbuildWallet: ({\n\t\t\tsource: pd,\n\t\t\twalletId,\n\t\t\tisConnected,\n\t\t\tconnect,\n\t\t\tdisconnect,\n\t\t}) => ({\n\t\t\tplatform: \"ethereum\",\n\t\t\ttype: \"injected\",\n\t\t\tid: walletId,\n\t\t\tname: pd.info.name,\n\t\t\ticon: pd.info.icon,\n\t\t\tprovider: pd.provider as EIP1193Provider,\n\t\t\tisConnected,\n\t\t\tsourceId: pd.info.rdns,\n\t\t\tconnect,\n\t\t\tdisconnect,\n\t\t}),\n\t});\n","import type { KheopskitPlatform, PlatformContext } from \"../types\";\nimport { getEthereumAccounts$ } from \"./accounts\";\nimport type { EthereumAccount, EthereumWallet } from \"./types\";\nimport { getEthereumWallets$ } from \"./wallets\";\n\n/**\n * Ethereum platform plugin. Pass to `getKheopskit$({ platforms: [ethereum()] })`.\n *\n * @example\n * ```ts\n * import { ethereum } from \"@kheopskit/core/ethereum\";\n * ethereum();\n * ```\n */\nexport const ethereum = (): KheopskitPlatform<\n\t\"ethereum\",\n\tEthereumWallet,\n\tEthereumAccount\n> => ({\n\tplatform: \"ethereum\",\n\tgetWallets$: (ctx: PlatformContext) => getEthereumWallets$(ctx.store),\n\tgetAccounts$: (wallets$) => getEthereumAccounts$(wallets$),\n});\n"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { Observable } from "rxjs";
2
+ //#region src/utils/getCachedObservable.d.ts
1
3
  /**
2
4
  * Clears an observable from the cache.
3
5
  * Use when a wallet disconnects or configuration changes.
@@ -16,5 +18,6 @@ declare const clearCachedObservablesByPrefix: (prefix: string) => void;
16
18
  * Use when resetting the entire kheopskit state.
17
19
  */
18
20
  declare const clearAllCachedObservables: () => void;
19
-
20
- export { clearCachedObservable as a, clearCachedObservablesByPrefix as b, clearAllCachedObservables as c };
21
+ //#endregion
22
+ export { clearCachedObservable as n, clearCachedObservablesByPrefix as r, clearAllCachedObservables as t };
23
+ //# sourceMappingURL=getCachedObservable-LUq9IfEx.d.mts.map
@@ -1,3 +1,5 @@
1
+ import { Observable } from "rxjs";
2
+ //#region src/utils/getCachedObservable.d.ts
1
3
  /**
2
4
  * Clears an observable from the cache.
3
5
  * Use when a wallet disconnects or configuration changes.
@@ -16,5 +18,6 @@ declare const clearCachedObservablesByPrefix: (prefix: string) => void;
16
18
  * Use when resetting the entire kheopskit state.
17
19
  */
18
20
  declare const clearAllCachedObservables: () => void;
19
-
20
- export { clearCachedObservable as a, clearCachedObservablesByPrefix as b, clearAllCachedObservables as c };
21
+ //#endregion
22
+ export { clearCachedObservable as n, clearCachedObservablesByPrefix as r, clearAllCachedObservables as t };
23
+ //# sourceMappingURL=getCachedObservable-LUq9IfEx.d.ts.map