@flarenetwork/multichain-wallet-connector 0.0.1-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +690 -0
- package/dist/core/index.d.mts +2 -0
- package/dist/core/index.mjs +3 -0
- package/dist/index.d.mts +3 -0
- package/dist/index.mjs +5 -0
- package/dist/multichain-C5wKiJke.mjs +2863 -0
- package/dist/multichain-C5wKiJke.mjs.map +1 -0
- package/dist/react/index.d.mts +3 -0
- package/dist/react/index.mjs +5 -0
- package/dist/use-wallets-BfbbQmDw.d.mts +311 -0
- package/dist/use-wallets-BfbbQmDw.d.mts.map +1 -0
- package/dist/use-wallets-DXRPNM7H.mjs +885 -0
- package/dist/use-wallets-DXRPNM7H.mjs.map +1 -0
- package/dist/utils-C64Z4fWz.d.mts +974 -0
- package/dist/utils-C64Z4fWz.d.mts.map +1 -0
- package/package.json +131 -0
|
@@ -0,0 +1,885 @@
|
|
|
1
|
+
import { _ as objectFromEntries, g as objectEntries, h as ChainGuards, m as evmCaip2s, v as objectKeys, y as objectValues } from "./multichain-C5wKiJke.mjs";
|
|
2
|
+
import { createStore } from "@xstate/store";
|
|
3
|
+
import { c } from "react/compiler-runtime";
|
|
4
|
+
import { createContext, useContext, useEffect, useRef, useState } from "react";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
import { useSelector } from "@xstate/store-react";
|
|
7
|
+
|
|
8
|
+
//#region src/core/stores/multichain/multichain-context.tsx
|
|
9
|
+
const MultichainContext = createContext(void 0);
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/core/stores/multichain/multichain-provider.tsx
|
|
13
|
+
const MultichainProvider = (t0) => {
|
|
14
|
+
const $ = c(6);
|
|
15
|
+
const { multichain, children } = t0;
|
|
16
|
+
let t1;
|
|
17
|
+
let t2;
|
|
18
|
+
if ($[0] !== multichain) {
|
|
19
|
+
t1 = () => {
|
|
20
|
+
multichain.mount();
|
|
21
|
+
};
|
|
22
|
+
t2 = [multichain];
|
|
23
|
+
$[0] = multichain;
|
|
24
|
+
$[1] = t1;
|
|
25
|
+
$[2] = t2;
|
|
26
|
+
} else {
|
|
27
|
+
t1 = $[1];
|
|
28
|
+
t2 = $[2];
|
|
29
|
+
}
|
|
30
|
+
useEffect(t1, t2);
|
|
31
|
+
let t3;
|
|
32
|
+
if ($[3] !== children || $[4] !== multichain) {
|
|
33
|
+
t3 = /* @__PURE__ */ jsx(MultichainContext.Provider, {
|
|
34
|
+
value: multichain,
|
|
35
|
+
children
|
|
36
|
+
});
|
|
37
|
+
$[3] = children;
|
|
38
|
+
$[4] = multichain;
|
|
39
|
+
$[5] = t3;
|
|
40
|
+
} else t3 = $[5];
|
|
41
|
+
return t3;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
//#region src/core/stores/multichain/use-multichain-context.tsx
|
|
46
|
+
const useMultichainContext = () => {
|
|
47
|
+
const context = useContext(MultichainContext);
|
|
48
|
+
if (context === void 0) throw new Error("useMultichainContext must be used within a WalletContextProvider");
|
|
49
|
+
return context;
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
//#region src/core/wallets/wallet-registry.ts
|
|
54
|
+
function defineWalletRegistry(registry) {
|
|
55
|
+
return registry;
|
|
56
|
+
}
|
|
57
|
+
const walletRegistry = defineWalletRegistry({
|
|
58
|
+
metamask: {
|
|
59
|
+
label: "MetaMask",
|
|
60
|
+
chains: evmCaip2s,
|
|
61
|
+
canConnect: "single-at-once"
|
|
62
|
+
},
|
|
63
|
+
"wallet-connect": {
|
|
64
|
+
label: "WalletConnect",
|
|
65
|
+
chains: [
|
|
66
|
+
...evmCaip2s,
|
|
67
|
+
"xrpl:0",
|
|
68
|
+
"xrpl:1"
|
|
69
|
+
],
|
|
70
|
+
canConnect: "all-at-once"
|
|
71
|
+
},
|
|
72
|
+
ledger: {
|
|
73
|
+
label: "Ledger",
|
|
74
|
+
chains: [
|
|
75
|
+
"eip155:1",
|
|
76
|
+
"eip155:11155111",
|
|
77
|
+
"eip155:14",
|
|
78
|
+
"eip155:16",
|
|
79
|
+
"eip155:114",
|
|
80
|
+
"eip155:19",
|
|
81
|
+
"xrpl:0",
|
|
82
|
+
"xrpl:1"
|
|
83
|
+
],
|
|
84
|
+
canConnect: "single-at-once"
|
|
85
|
+
},
|
|
86
|
+
xaman: {
|
|
87
|
+
label: "Xaman",
|
|
88
|
+
chains: ["xrpl:0", "xrpl:1"],
|
|
89
|
+
canConnect: "single-at-once"
|
|
90
|
+
},
|
|
91
|
+
dcent: {
|
|
92
|
+
label: "D'CENT",
|
|
93
|
+
chains: ["xrpl:0", "xrpl:1"],
|
|
94
|
+
canConnect: "single-at-once"
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
const walletLabels = objectFromEntries(objectEntries(walletRegistry).map(([walletType, wallet]) => [walletType, wallet.label]));
|
|
98
|
+
const walletSupportForChain = objectFromEntries(objectEntries(walletRegistry).map(([walletType, wallet]) => [walletType, {
|
|
99
|
+
chains: wallet.chains,
|
|
100
|
+
canConnect: wallet.canConnect
|
|
101
|
+
}]));
|
|
102
|
+
|
|
103
|
+
//#endregion
|
|
104
|
+
//#region src/react/hooks/use-chain-support/use-chain-support.ts
|
|
105
|
+
/**
|
|
106
|
+
* Hook to access chain configuration.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```tsx
|
|
110
|
+
* // Get all chains
|
|
111
|
+
* const allChains = useChainSupport();
|
|
112
|
+
*
|
|
113
|
+
* // Get EVM chains only
|
|
114
|
+
* const evmChains = useChainSupport({ chainType: 'evm' });
|
|
115
|
+
*
|
|
116
|
+
* // Get XRPL chains only
|
|
117
|
+
* const xrplChains = useChainSupport({ chainType: 'xrpl' });
|
|
118
|
+
*
|
|
119
|
+
* // Get chains supported by a wallet
|
|
120
|
+
* const ledgerChains = useChainSupport({ wallet: 'ledger' });
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
function useChainSupport(filter) {
|
|
124
|
+
const $ = c(6);
|
|
125
|
+
const multichain = useMultichainContext();
|
|
126
|
+
let allChains;
|
|
127
|
+
let t0;
|
|
128
|
+
if ($[0] !== filter || $[1] !== multichain) {
|
|
129
|
+
t0 = Symbol.for("react.early_return_sentinel");
|
|
130
|
+
bb0: {
|
|
131
|
+
const configResolver = multichain.getConfigResolver();
|
|
132
|
+
const filterChainType = filter && "chainType" in filter ? filter.chainType : void 0;
|
|
133
|
+
const filterWallet = filter && "wallet" in filter ? filter.wallet : void 0;
|
|
134
|
+
const firstWallet = multichain.getWalletTypes()[0];
|
|
135
|
+
const resolvedConfig = firstWallet ? configResolver.resolveForWallet(firstWallet) : null;
|
|
136
|
+
if (!resolvedConfig) {
|
|
137
|
+
t0 = [];
|
|
138
|
+
break bb0;
|
|
139
|
+
}
|
|
140
|
+
allChains = objectValues(resolvedConfig.chains);
|
|
141
|
+
if (!filterChainType && !filterWallet) {
|
|
142
|
+
t0 = allChains;
|
|
143
|
+
break bb0;
|
|
144
|
+
}
|
|
145
|
+
if (filterChainType === "evm") {
|
|
146
|
+
t0 = allChains.filter(_temp$4);
|
|
147
|
+
break bb0;
|
|
148
|
+
}
|
|
149
|
+
if (filterChainType === "xrpl") {
|
|
150
|
+
t0 = allChains.filter(_temp2$1);
|
|
151
|
+
break bb0;
|
|
152
|
+
}
|
|
153
|
+
if (filterWallet) {
|
|
154
|
+
const supportedCaip2s = walletSupportForChain[filterWallet].chains;
|
|
155
|
+
let t1;
|
|
156
|
+
if ($[4] !== supportedCaip2s) {
|
|
157
|
+
t1 = (chain_1) => supportedCaip2s.includes(chain_1.caip2);
|
|
158
|
+
$[4] = supportedCaip2s;
|
|
159
|
+
$[5] = t1;
|
|
160
|
+
} else t1 = $[5];
|
|
161
|
+
t0 = allChains.filter(t1);
|
|
162
|
+
break bb0;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
$[0] = filter;
|
|
166
|
+
$[1] = multichain;
|
|
167
|
+
$[2] = allChains;
|
|
168
|
+
$[3] = t0;
|
|
169
|
+
} else {
|
|
170
|
+
allChains = $[2];
|
|
171
|
+
t0 = $[3];
|
|
172
|
+
}
|
|
173
|
+
if (t0 !== Symbol.for("react.early_return_sentinel")) return t0;
|
|
174
|
+
return allChains;
|
|
175
|
+
}
|
|
176
|
+
function _temp2$1(chain_0) {
|
|
177
|
+
return ChainGuards.isXrplCaip2(chain_0.caip2);
|
|
178
|
+
}
|
|
179
|
+
function _temp$4(chain) {
|
|
180
|
+
return ChainGuards.isEvmCaip2(chain.caip2);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
//#endregion
|
|
184
|
+
//#region src/react/hooks/use-chain/use-chain.tsx
|
|
185
|
+
function useChain(caip2, options) {
|
|
186
|
+
const $ = c(9);
|
|
187
|
+
const multichain = useMultichainContext();
|
|
188
|
+
let t0;
|
|
189
|
+
if ($[0] !== multichain) {
|
|
190
|
+
t0 = multichain.getAggregateStore();
|
|
191
|
+
$[0] = multichain;
|
|
192
|
+
$[1] = t0;
|
|
193
|
+
} else t0 = $[1];
|
|
194
|
+
const wallets = useSelector(t0, _temp$3);
|
|
195
|
+
let t1;
|
|
196
|
+
if ($[2] !== caip2 || $[3] !== multichain || $[4] !== options || $[5] !== wallets) {
|
|
197
|
+
t1 = Symbol.for("react.early_return_sentinel");
|
|
198
|
+
bb0: for (const [walletType, context] of objectEntries(wallets)) {
|
|
199
|
+
if (options?.wallet && walletType !== options.wallet) continue;
|
|
200
|
+
if (context?.caip2 === caip2 && context.connectionState === "connected") {
|
|
201
|
+
const narrowedWalletType = walletType;
|
|
202
|
+
const client = multichain.getConnector(narrowedWalletType).getClient();
|
|
203
|
+
t1 = {
|
|
204
|
+
exists: true,
|
|
205
|
+
address: context.activeAddress,
|
|
206
|
+
state: context,
|
|
207
|
+
walletType: narrowedWalletType,
|
|
208
|
+
caip2,
|
|
209
|
+
client
|
|
210
|
+
};
|
|
211
|
+
break bb0;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
$[2] = caip2;
|
|
215
|
+
$[3] = multichain;
|
|
216
|
+
$[4] = options;
|
|
217
|
+
$[5] = wallets;
|
|
218
|
+
$[6] = t1;
|
|
219
|
+
} else t1 = $[6];
|
|
220
|
+
if (t1 !== Symbol.for("react.early_return_sentinel")) return t1;
|
|
221
|
+
let t2;
|
|
222
|
+
if ($[7] !== caip2) {
|
|
223
|
+
t2 = {
|
|
224
|
+
exists: false,
|
|
225
|
+
address: void 0,
|
|
226
|
+
state: void 0,
|
|
227
|
+
walletType: void 0,
|
|
228
|
+
caip2,
|
|
229
|
+
client: null
|
|
230
|
+
};
|
|
231
|
+
$[7] = caip2;
|
|
232
|
+
$[8] = t2;
|
|
233
|
+
} else t2 = $[8];
|
|
234
|
+
return t2;
|
|
235
|
+
}
|
|
236
|
+
function _temp$3(s) {
|
|
237
|
+
return s.context.wallets;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
//#endregion
|
|
241
|
+
//#region src/react/hooks/use-ledger-selection/use-ledger-selection.ts
|
|
242
|
+
const DEFAULT_HD_STANDARD = "bip44";
|
|
243
|
+
function useLedgerSelection(selectedCaip2, options) {
|
|
244
|
+
const $ = c(17);
|
|
245
|
+
const multichain = useMultichainContext();
|
|
246
|
+
let t0;
|
|
247
|
+
if ($[0] !== multichain) {
|
|
248
|
+
t0 = multichain.getConnector("ledger").getSession();
|
|
249
|
+
$[0] = multichain;
|
|
250
|
+
$[1] = t0;
|
|
251
|
+
} else t0 = $[1];
|
|
252
|
+
const session = t0;
|
|
253
|
+
const resolvedHdStandard = options?.initialHdStandard ?? session?.hdStandard ?? DEFAULT_HD_STANDARD;
|
|
254
|
+
let t1;
|
|
255
|
+
if ($[2] !== options?.initialSelections || $[3] !== session) {
|
|
256
|
+
t1 = options?.initialSelections ?? (session ? { [session.caip2]: session.account } : {});
|
|
257
|
+
$[2] = options?.initialSelections;
|
|
258
|
+
$[3] = session;
|
|
259
|
+
$[4] = t1;
|
|
260
|
+
} else t1 = $[4];
|
|
261
|
+
const resolvedSelections = t1;
|
|
262
|
+
const [hdStandard, setHdStandard] = useState(resolvedHdStandard);
|
|
263
|
+
const [selections, setSelections] = useState(resolvedSelections);
|
|
264
|
+
const selectedAddress = selections[selectedCaip2] ?? null;
|
|
265
|
+
let t2;
|
|
266
|
+
if ($[5] !== selectedCaip2) {
|
|
267
|
+
t2 = (address) => {
|
|
268
|
+
setSelections((prev) => {
|
|
269
|
+
if (prev[selectedCaip2] === address) return prev;
|
|
270
|
+
return {
|
|
271
|
+
...prev,
|
|
272
|
+
[selectedCaip2]: address
|
|
273
|
+
};
|
|
274
|
+
});
|
|
275
|
+
};
|
|
276
|
+
$[5] = selectedCaip2;
|
|
277
|
+
$[6] = t2;
|
|
278
|
+
} else t2 = $[6];
|
|
279
|
+
const selectAddress = t2;
|
|
280
|
+
let t3;
|
|
281
|
+
if ($[7] !== selectedCaip2) {
|
|
282
|
+
t3 = () => {
|
|
283
|
+
setSelections((prev_0) => {
|
|
284
|
+
if (!prev_0[selectedCaip2]) return prev_0;
|
|
285
|
+
const next = { ...prev_0 };
|
|
286
|
+
delete next[selectedCaip2];
|
|
287
|
+
return next;
|
|
288
|
+
});
|
|
289
|
+
};
|
|
290
|
+
$[7] = selectedCaip2;
|
|
291
|
+
$[8] = t3;
|
|
292
|
+
} else t3 = $[8];
|
|
293
|
+
const clearSelection = t3;
|
|
294
|
+
let t4;
|
|
295
|
+
if ($[9] !== clearSelection || $[10] !== hdStandard || $[11] !== selectAddress || $[12] !== selectedAddress) {
|
|
296
|
+
t4 = {
|
|
297
|
+
selectedAddress,
|
|
298
|
+
hdStandard,
|
|
299
|
+
selectAddress,
|
|
300
|
+
setHdStandard,
|
|
301
|
+
clearSelection
|
|
302
|
+
};
|
|
303
|
+
$[9] = clearSelection;
|
|
304
|
+
$[10] = hdStandard;
|
|
305
|
+
$[11] = selectAddress;
|
|
306
|
+
$[12] = selectedAddress;
|
|
307
|
+
$[13] = t4;
|
|
308
|
+
} else t4 = $[13];
|
|
309
|
+
const selection = t4;
|
|
310
|
+
let t5;
|
|
311
|
+
if ($[14] !== selection || $[15] !== selections) {
|
|
312
|
+
t5 = {
|
|
313
|
+
selection,
|
|
314
|
+
selections
|
|
315
|
+
};
|
|
316
|
+
$[14] = selection;
|
|
317
|
+
$[15] = selections;
|
|
318
|
+
$[16] = t5;
|
|
319
|
+
} else t5 = $[16];
|
|
320
|
+
return t5;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
//#endregion
|
|
324
|
+
//#region src/react/hooks/use-multichain-events/use-multichain-events.tsx
|
|
325
|
+
const useMultichainEvents = (options) => {
|
|
326
|
+
const $ = c(5);
|
|
327
|
+
const multichain = useMultichainContext();
|
|
328
|
+
const optionsRef = useRef(options);
|
|
329
|
+
let t0;
|
|
330
|
+
if ($[0] !== options) {
|
|
331
|
+
t0 = () => {
|
|
332
|
+
optionsRef.current = options;
|
|
333
|
+
};
|
|
334
|
+
$[0] = options;
|
|
335
|
+
$[1] = t0;
|
|
336
|
+
} else t0 = $[1];
|
|
337
|
+
useEffect(t0);
|
|
338
|
+
let t1;
|
|
339
|
+
let t2;
|
|
340
|
+
if ($[2] !== multichain) {
|
|
341
|
+
t1 = () => {
|
|
342
|
+
const subscriptions = [];
|
|
343
|
+
const wallets = multichain.getWalletTypes();
|
|
344
|
+
for (const walletType of wallets) {
|
|
345
|
+
const connectSub = multichain.onWalletEvent(walletType, "walletConnected", (event) => {
|
|
346
|
+
optionsRef.current.onConnect?.({
|
|
347
|
+
walletType,
|
|
348
|
+
caip2: event.caip2,
|
|
349
|
+
address: event.activeAddress,
|
|
350
|
+
availableAddresses: event.availableAddresses,
|
|
351
|
+
isReconnect: event.isReconnect
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
if (connectSub) subscriptions.push(connectSub);
|
|
355
|
+
const disconnectSub = multichain.onWalletEvent(walletType, "walletDisconnected", () => {
|
|
356
|
+
optionsRef.current.onDisconnect?.({ walletType });
|
|
357
|
+
});
|
|
358
|
+
if (disconnectSub) subscriptions.push(disconnectSub);
|
|
359
|
+
const errorSub = multichain.onWalletEvent(walletType, "walletError", (event_0) => {
|
|
360
|
+
optionsRef.current.onError?.({
|
|
361
|
+
walletType,
|
|
362
|
+
error: new Error(event_0.error.message)
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
if (errorSub) subscriptions.push(errorSub);
|
|
366
|
+
const chainChangedSub = multichain.onWalletEvent(walletType, "walletChainChanged", (event_1) => {
|
|
367
|
+
optionsRef.current.onChainChanged?.({
|
|
368
|
+
walletType,
|
|
369
|
+
caip2: event_1.caip2
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
if (chainChangedSub) subscriptions.push(chainChangedSub);
|
|
373
|
+
const addressChangedSub = multichain.onWalletEvent(walletType, "walletAddressChanged", (event_2) => {
|
|
374
|
+
optionsRef.current.onAccountChanged?.({
|
|
375
|
+
walletType,
|
|
376
|
+
address: event_2.activeAddress
|
|
377
|
+
});
|
|
378
|
+
});
|
|
379
|
+
if (addressChangedSub) subscriptions.push(addressChangedSub);
|
|
380
|
+
}
|
|
381
|
+
return () => {
|
|
382
|
+
for (const sub of subscriptions) sub.unsubscribe();
|
|
383
|
+
};
|
|
384
|
+
};
|
|
385
|
+
t2 = [multichain];
|
|
386
|
+
$[2] = multichain;
|
|
387
|
+
$[3] = t1;
|
|
388
|
+
$[4] = t2;
|
|
389
|
+
} else {
|
|
390
|
+
t1 = $[3];
|
|
391
|
+
t2 = $[4];
|
|
392
|
+
}
|
|
393
|
+
useEffect(t1, t2);
|
|
394
|
+
};
|
|
395
|
+
|
|
396
|
+
//#endregion
|
|
397
|
+
//#region src/core/connectors/connector-types.ts
|
|
398
|
+
function getChainSelectionMode(wallet, walletSupport) {
|
|
399
|
+
if (!wallet) return null;
|
|
400
|
+
return walletSupport[wallet].canConnect === "all-at-once" ? "multi" : "single";
|
|
401
|
+
}
|
|
402
|
+
function buildConnectArgs(wallet, chains) {
|
|
403
|
+
if (!wallet) return null;
|
|
404
|
+
switch (wallet) {
|
|
405
|
+
case "wallet-connect": return chains.length ? {
|
|
406
|
+
wallet,
|
|
407
|
+
chains
|
|
408
|
+
} : null;
|
|
409
|
+
case "metamask": return chains.length ? {
|
|
410
|
+
wallet,
|
|
411
|
+
chain: chains[0]
|
|
412
|
+
} : null;
|
|
413
|
+
case "ledger": return chains.length ? {
|
|
414
|
+
wallet,
|
|
415
|
+
chain: chains[0]
|
|
416
|
+
} : null;
|
|
417
|
+
case "xaman": return { wallet };
|
|
418
|
+
case "dcent": return { wallet };
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
//#endregion
|
|
423
|
+
//#region src/react/hooks/use-wallet-selection/wallet-selection.store.ts
|
|
424
|
+
const INITIAL = {
|
|
425
|
+
selectedWalletType: null,
|
|
426
|
+
selectedCaip2s: []
|
|
427
|
+
};
|
|
428
|
+
function createMultichainSelectionStore(fixedCaip2) {
|
|
429
|
+
const getSelectionMode = (walletType) => walletType ? walletSupportForChain[walletType].canConnect === "all-at-once" ? "multi" : "single" : null;
|
|
430
|
+
return createStore({
|
|
431
|
+
context: INITIAL,
|
|
432
|
+
on: {
|
|
433
|
+
selectWallet: (_ctx, { walletType, preselect }) => ({
|
|
434
|
+
selectedWalletType: walletType,
|
|
435
|
+
selectedCaip2s: preselect
|
|
436
|
+
}),
|
|
437
|
+
clearWallet: () => INITIAL,
|
|
438
|
+
toggleCaip2: (ctx, { caip2 }) => {
|
|
439
|
+
if (fixedCaip2) return ctx;
|
|
440
|
+
if (getSelectionMode(ctx.selectedWalletType) === "single") return {
|
|
441
|
+
...ctx,
|
|
442
|
+
selectedCaip2s: ctx.selectedCaip2s[0] === caip2 ? [] : [caip2]
|
|
443
|
+
};
|
|
444
|
+
const has = ctx.selectedCaip2s.includes(caip2);
|
|
445
|
+
return {
|
|
446
|
+
...ctx,
|
|
447
|
+
selectedCaip2s: has ? ctx.selectedCaip2s.filter((selected) => selected !== caip2) : [...ctx.selectedCaip2s, caip2]
|
|
448
|
+
};
|
|
449
|
+
},
|
|
450
|
+
setSelectedCaip2s: (ctx, { caip2s }) => {
|
|
451
|
+
if (fixedCaip2) return {
|
|
452
|
+
...ctx,
|
|
453
|
+
selectedCaip2s: [fixedCaip2]
|
|
454
|
+
};
|
|
455
|
+
if (getSelectionMode(ctx.selectedWalletType) === "single") return {
|
|
456
|
+
...ctx,
|
|
457
|
+
selectedCaip2s: caip2s.length ? [caip2s[0]] : []
|
|
458
|
+
};
|
|
459
|
+
return {
|
|
460
|
+
...ctx,
|
|
461
|
+
selectedCaip2s: [...caip2s]
|
|
462
|
+
};
|
|
463
|
+
},
|
|
464
|
+
reset: () => INITIAL
|
|
465
|
+
}
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
//#endregion
|
|
470
|
+
//#region src/react/hooks/use-wallet-selection/wallet-selection.utils.ts
|
|
471
|
+
function isSingleChainMode(config) {
|
|
472
|
+
return config.mode.includes("single-chain");
|
|
473
|
+
}
|
|
474
|
+
function deriveSelectionWallets(walletTypes, walletStates, chainOptions) {
|
|
475
|
+
return walletTypes.map((type) => {
|
|
476
|
+
const state = walletStates[type];
|
|
477
|
+
return {
|
|
478
|
+
type,
|
|
479
|
+
name: walletLabels[type],
|
|
480
|
+
caip2s: chainOptions[type] ?? [],
|
|
481
|
+
multiChain: walletSupportForChain[type].canConnect === "all-at-once",
|
|
482
|
+
isConnecting: state?.connectionState === "connecting",
|
|
483
|
+
isConnected: state?.connectionState === "connected",
|
|
484
|
+
caip2: state?.caip2 ?? null
|
|
485
|
+
};
|
|
486
|
+
});
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
//#endregion
|
|
490
|
+
//#region src/react/hooks/use-wallet-selection/wallet-selection.provider.tsx
|
|
491
|
+
const MultichainSelectionContext = createContext(null);
|
|
492
|
+
function buildChainOptions(wallets, fixedCaip2) {
|
|
493
|
+
const options = {};
|
|
494
|
+
for (const [walletType, setting] of objectEntries(wallets)) {
|
|
495
|
+
if (!setting) continue;
|
|
496
|
+
const supported = walletSupportForChain[walletType].chains;
|
|
497
|
+
const requested = setting === "all" ? supported : setting.filter((caip2) => supported.includes(caip2));
|
|
498
|
+
if (fixedCaip2) {
|
|
499
|
+
if (requested.includes(fixedCaip2)) options[walletType] = [fixedCaip2];
|
|
500
|
+
} else options[walletType] = [...requested];
|
|
501
|
+
}
|
|
502
|
+
return options;
|
|
503
|
+
}
|
|
504
|
+
function MultichainSelectionProvider(t0) {
|
|
505
|
+
const $ = c(5);
|
|
506
|
+
const { config, children } = t0;
|
|
507
|
+
let t1;
|
|
508
|
+
if ($[0] !== config) {
|
|
509
|
+
t1 = () => {
|
|
510
|
+
const fixedCaip2 = isSingleChainMode(config) ? config.caip2 : null;
|
|
511
|
+
const chainOptions = buildChainOptions(config.wallets, fixedCaip2);
|
|
512
|
+
return {
|
|
513
|
+
store: createMultichainSelectionStore(fixedCaip2),
|
|
514
|
+
mode: config.mode,
|
|
515
|
+
fixedCaip2,
|
|
516
|
+
chainOptions,
|
|
517
|
+
wallets: objectKeys(chainOptions)
|
|
518
|
+
};
|
|
519
|
+
};
|
|
520
|
+
$[0] = config;
|
|
521
|
+
$[1] = t1;
|
|
522
|
+
} else t1 = $[1];
|
|
523
|
+
const [ctx] = useState(t1);
|
|
524
|
+
let t2;
|
|
525
|
+
if ($[2] !== children || $[3] !== ctx) {
|
|
526
|
+
t2 = /* @__PURE__ */ jsx(MultichainSelectionContext.Provider, {
|
|
527
|
+
value: ctx,
|
|
528
|
+
children
|
|
529
|
+
});
|
|
530
|
+
$[2] = children;
|
|
531
|
+
$[3] = ctx;
|
|
532
|
+
$[4] = t2;
|
|
533
|
+
} else t2 = $[4];
|
|
534
|
+
return t2;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
//#endregion
|
|
538
|
+
//#region src/react/hooks/use-wallet-selection/use-wallet-selection.ts
|
|
539
|
+
function useMultichainSelection() {
|
|
540
|
+
const $ = c(46);
|
|
541
|
+
const ctx = useContext(MultichainSelectionContext);
|
|
542
|
+
if (!ctx) throw new Error("useMultichainSelection must be used within MultichainSelectionProvider");
|
|
543
|
+
const { store, mode, fixedCaip2, chainOptions, wallets: walletTypes } = ctx;
|
|
544
|
+
const { selectedWalletType, selectedCaip2s } = useSelector(store, _temp$2);
|
|
545
|
+
const multichain = useMultichainContext();
|
|
546
|
+
let t0;
|
|
547
|
+
if ($[0] !== multichain) {
|
|
548
|
+
t0 = multichain.getAggregateStore();
|
|
549
|
+
$[0] = multichain;
|
|
550
|
+
$[1] = t0;
|
|
551
|
+
} else t0 = $[1];
|
|
552
|
+
const walletStates = useSelector(t0, _temp2);
|
|
553
|
+
let t1;
|
|
554
|
+
let wallets;
|
|
555
|
+
if ($[2] !== chainOptions || $[3] !== selectedWalletType || $[4] !== walletStates || $[5] !== walletTypes) {
|
|
556
|
+
wallets = deriveSelectionWallets(walletTypes, walletStates, chainOptions);
|
|
557
|
+
t1 = selectedWalletType ? wallets.find((wallet) => wallet.type === selectedWalletType) ?? null : null;
|
|
558
|
+
$[2] = chainOptions;
|
|
559
|
+
$[3] = selectedWalletType;
|
|
560
|
+
$[4] = walletStates;
|
|
561
|
+
$[5] = walletTypes;
|
|
562
|
+
$[6] = t1;
|
|
563
|
+
$[7] = wallets;
|
|
564
|
+
} else {
|
|
565
|
+
t1 = $[6];
|
|
566
|
+
wallets = $[7];
|
|
567
|
+
}
|
|
568
|
+
const selectedWallet = t1;
|
|
569
|
+
let t2;
|
|
570
|
+
if ($[8] !== selectedWalletType) {
|
|
571
|
+
t2 = getChainSelectionMode(selectedWalletType, walletSupportForChain);
|
|
572
|
+
$[8] = selectedWalletType;
|
|
573
|
+
$[9] = t2;
|
|
574
|
+
} else t2 = $[9];
|
|
575
|
+
const chainSelectionMode = t2;
|
|
576
|
+
let t3;
|
|
577
|
+
if ($[10] !== selectedCaip2s || $[11] !== selectedWalletType) {
|
|
578
|
+
t3 = buildConnectArgs(selectedWalletType, selectedCaip2s);
|
|
579
|
+
$[10] = selectedCaip2s;
|
|
580
|
+
$[11] = selectedWalletType;
|
|
581
|
+
$[12] = t3;
|
|
582
|
+
} else t3 = $[12];
|
|
583
|
+
const connectArgs = t3;
|
|
584
|
+
let t4;
|
|
585
|
+
if ($[13] !== fixedCaip2 || $[14] !== walletStates) {
|
|
586
|
+
t4 = (walletType) => {
|
|
587
|
+
const state = walletStates[walletType];
|
|
588
|
+
const caip2 = fixedCaip2 ?? state?.caip2;
|
|
589
|
+
return caip2 ? [caip2] : [];
|
|
590
|
+
};
|
|
591
|
+
$[13] = fixedCaip2;
|
|
592
|
+
$[14] = walletStates;
|
|
593
|
+
$[15] = t4;
|
|
594
|
+
} else t4 = $[15];
|
|
595
|
+
const preselectFor = t4;
|
|
596
|
+
let t5;
|
|
597
|
+
if ($[16] !== preselectFor || $[17] !== store) {
|
|
598
|
+
t5 = (walletType_0) => {
|
|
599
|
+
const preselect = preselectFor(walletType_0);
|
|
600
|
+
const args = buildConnectArgs(walletType_0, preselect);
|
|
601
|
+
if (!args) throw new Error(`Cannot build connect args for "${walletType_0}": no chains available. Ensure the wallet has chains configured or a chain is selected.`);
|
|
602
|
+
store.trigger.selectWallet({
|
|
603
|
+
walletType: walletType_0,
|
|
604
|
+
preselect
|
|
605
|
+
});
|
|
606
|
+
return args;
|
|
607
|
+
};
|
|
608
|
+
$[16] = preselectFor;
|
|
609
|
+
$[17] = store;
|
|
610
|
+
$[18] = t5;
|
|
611
|
+
} else t5 = $[18];
|
|
612
|
+
const selectWallet = t5;
|
|
613
|
+
let t6;
|
|
614
|
+
if ($[19] !== store) {
|
|
615
|
+
t6 = () => store.trigger.clearWallet();
|
|
616
|
+
$[19] = store;
|
|
617
|
+
$[20] = t6;
|
|
618
|
+
} else t6 = $[20];
|
|
619
|
+
const clearWallet = t6;
|
|
620
|
+
let t7;
|
|
621
|
+
if ($[21] !== store) {
|
|
622
|
+
t7 = (caip2_0) => store.trigger.toggleCaip2({ caip2: caip2_0 });
|
|
623
|
+
$[21] = store;
|
|
624
|
+
$[22] = t7;
|
|
625
|
+
} else t7 = $[22];
|
|
626
|
+
const toggleCaip2 = t7;
|
|
627
|
+
let t8;
|
|
628
|
+
if ($[23] !== store) {
|
|
629
|
+
t8 = (caip2s) => store.trigger.setSelectedCaip2s({ caip2s });
|
|
630
|
+
$[23] = store;
|
|
631
|
+
$[24] = t8;
|
|
632
|
+
} else t8 = $[24];
|
|
633
|
+
const setSelectedCaip2s = t8;
|
|
634
|
+
let t9;
|
|
635
|
+
if ($[25] !== store) {
|
|
636
|
+
t9 = () => store.trigger.reset();
|
|
637
|
+
$[25] = store;
|
|
638
|
+
$[26] = t9;
|
|
639
|
+
} else t9 = $[26];
|
|
640
|
+
const reset = t9;
|
|
641
|
+
let t10;
|
|
642
|
+
if ($[27] !== selectedWallet?.caip2s) {
|
|
643
|
+
t10 = selectedWallet?.caip2s ?? [];
|
|
644
|
+
$[27] = selectedWallet?.caip2s;
|
|
645
|
+
$[28] = t10;
|
|
646
|
+
} else t10 = $[28];
|
|
647
|
+
let t11;
|
|
648
|
+
if ($[29] !== chainSelectionMode || $[30] !== clearWallet || $[31] !== fixedCaip2 || $[32] !== mode || $[33] !== reset || $[34] !== selectWallet || $[35] !== selectedCaip2s || $[36] !== selectedWallet || $[37] !== selectedWalletType || $[38] !== setSelectedCaip2s || $[39] !== t10 || $[40] !== toggleCaip2 || $[41] !== wallets) {
|
|
649
|
+
t11 = {
|
|
650
|
+
mode,
|
|
651
|
+
fixedCaip2,
|
|
652
|
+
wallets,
|
|
653
|
+
selectedWalletType,
|
|
654
|
+
selectedWallet,
|
|
655
|
+
selectedCaip2s,
|
|
656
|
+
availableCaip2s: t10,
|
|
657
|
+
chainSelectionMode,
|
|
658
|
+
selectWallet,
|
|
659
|
+
clearWallet,
|
|
660
|
+
toggleCaip2,
|
|
661
|
+
setSelectedCaip2s,
|
|
662
|
+
reset
|
|
663
|
+
};
|
|
664
|
+
$[29] = chainSelectionMode;
|
|
665
|
+
$[30] = clearWallet;
|
|
666
|
+
$[31] = fixedCaip2;
|
|
667
|
+
$[32] = mode;
|
|
668
|
+
$[33] = reset;
|
|
669
|
+
$[34] = selectWallet;
|
|
670
|
+
$[35] = selectedCaip2s;
|
|
671
|
+
$[36] = selectedWallet;
|
|
672
|
+
$[37] = selectedWalletType;
|
|
673
|
+
$[38] = setSelectedCaip2s;
|
|
674
|
+
$[39] = t10;
|
|
675
|
+
$[40] = toggleCaip2;
|
|
676
|
+
$[41] = wallets;
|
|
677
|
+
$[42] = t11;
|
|
678
|
+
} else t11 = $[42];
|
|
679
|
+
const base = t11;
|
|
680
|
+
let t12;
|
|
681
|
+
if ($[43] !== base || $[44] !== connectArgs) {
|
|
682
|
+
t12 = connectArgs ? {
|
|
683
|
+
...base,
|
|
684
|
+
canConnect: true,
|
|
685
|
+
connectArgs
|
|
686
|
+
} : {
|
|
687
|
+
...base,
|
|
688
|
+
canConnect: false,
|
|
689
|
+
connectArgs: null
|
|
690
|
+
};
|
|
691
|
+
$[43] = base;
|
|
692
|
+
$[44] = connectArgs;
|
|
693
|
+
$[45] = t12;
|
|
694
|
+
} else t12 = $[45];
|
|
695
|
+
return t12;
|
|
696
|
+
}
|
|
697
|
+
function _temp2(snapshot_0) {
|
|
698
|
+
return snapshot_0.context.wallets;
|
|
699
|
+
}
|
|
700
|
+
function _temp$2(snapshot) {
|
|
701
|
+
return snapshot.context;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
//#endregion
|
|
705
|
+
//#region src/react/hooks/use-multichain/use-multichain.tsx
|
|
706
|
+
/**
|
|
707
|
+
* Hook for wallet connection actions.
|
|
708
|
+
*
|
|
709
|
+
* Use this for connect/disconnect operations.
|
|
710
|
+
* For connection state, use useWallet() instead.
|
|
711
|
+
*
|
|
712
|
+
* @example
|
|
713
|
+
* ```tsx
|
|
714
|
+
* const { connect, disconnect, getConnector } = useMultichain();
|
|
715
|
+
*
|
|
716
|
+
* // Connect MetaMask to a single chain
|
|
717
|
+
* await connect({ wallet: 'metamask', chain: 'eip155:14' });
|
|
718
|
+
*
|
|
719
|
+
* // Connect WalletConnect to multiple chains
|
|
720
|
+
* await connect({ wallet: 'wallet-connect', chains: ['eip155:14', 'eip155:1'] });
|
|
721
|
+
*
|
|
722
|
+
* // Connect Ledger with options
|
|
723
|
+
* await connect({ wallet: 'ledger', chain: 'eip155:14', options: { bip44, ledgerHDStandard } });
|
|
724
|
+
*
|
|
725
|
+
* // Disconnect
|
|
726
|
+
* await disconnect('metamask');
|
|
727
|
+
*
|
|
728
|
+
* // Get connector for advanced operations
|
|
729
|
+
* const connector = getConnector('metamask');
|
|
730
|
+
* const client = connector.getClient();
|
|
731
|
+
* ```
|
|
732
|
+
*/
|
|
733
|
+
function useMultichain() {
|
|
734
|
+
const $ = c(2);
|
|
735
|
+
const multichain = useMultichainContext();
|
|
736
|
+
let t0;
|
|
737
|
+
if ($[0] !== multichain) {
|
|
738
|
+
t0 = {
|
|
739
|
+
connect: (args) => multichain.connect(args),
|
|
740
|
+
disconnect: (wallet) => multichain.disconnect(wallet),
|
|
741
|
+
disconnectAll: () => multichain.disconnectAll(),
|
|
742
|
+
getConnector: (wallet_0) => multichain.getConnector(wallet_0)
|
|
743
|
+
};
|
|
744
|
+
$[0] = multichain;
|
|
745
|
+
$[1] = t0;
|
|
746
|
+
} else t0 = $[1];
|
|
747
|
+
return t0;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
//#endregion
|
|
751
|
+
//#region src/react/hooks/use-wallet-support/use-wallet-support.ts
|
|
752
|
+
/**
|
|
753
|
+
* Hook to access wallet support configuration.
|
|
754
|
+
*
|
|
755
|
+
* @example
|
|
756
|
+
* ```tsx
|
|
757
|
+
* // Get all wallets
|
|
758
|
+
* const wallets = useWalletSupport();
|
|
759
|
+
*
|
|
760
|
+
* // Exclude specific wallets
|
|
761
|
+
* const simpleWallets = useWalletSupport({ exclude: ['ledger'] });
|
|
762
|
+
*
|
|
763
|
+
* // All wallet info with chains and mode
|
|
764
|
+
* wallets // [{ type: 'metamask', name: 'MetaMask', chains: [...], singleChain: true }, ...]
|
|
765
|
+
*
|
|
766
|
+
* // Find specific wallet
|
|
767
|
+
* const mm = wallets.find(w => w.type === 'metamask');
|
|
768
|
+
* mm.chains // ['eip155:14', 'eip155:16', ...]
|
|
769
|
+
* mm.singleChain // true
|
|
770
|
+
* ```
|
|
771
|
+
*/
|
|
772
|
+
function useWalletSupport(filter) {
|
|
773
|
+
const $ = c(3);
|
|
774
|
+
const multichain = useMultichainContext();
|
|
775
|
+
const excludeList = filter?.exclude;
|
|
776
|
+
let t0;
|
|
777
|
+
if ($[0] !== excludeList || $[1] !== multichain) {
|
|
778
|
+
const walletTypes = multichain.getWalletTypes();
|
|
779
|
+
t0 = (excludeList ? walletTypes.filter((type) => !excludeList.includes(type)) : walletTypes).map(_temp$1);
|
|
780
|
+
$[0] = excludeList;
|
|
781
|
+
$[1] = multichain;
|
|
782
|
+
$[2] = t0;
|
|
783
|
+
} else t0 = $[2];
|
|
784
|
+
return t0;
|
|
785
|
+
}
|
|
786
|
+
function _temp$1(type_0) {
|
|
787
|
+
return {
|
|
788
|
+
type: type_0,
|
|
789
|
+
name: walletLabels[type_0],
|
|
790
|
+
chains: [...walletSupportForChain[type_0].chains],
|
|
791
|
+
singleChain: walletSupportForChain[type_0].canConnect === "single-at-once"
|
|
792
|
+
};
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
//#endregion
|
|
796
|
+
//#region src/react/hooks/use-wallet/use-wallet.tsx
|
|
797
|
+
/**
|
|
798
|
+
* Hook to access a specific wallet's state and connector.
|
|
799
|
+
*
|
|
800
|
+
* @example
|
|
801
|
+
* ```tsx
|
|
802
|
+
* const { state, connector, isConnected } = useWallet('metamask');
|
|
803
|
+
*
|
|
804
|
+
* if (isConnected) {
|
|
805
|
+
* const client = connector.getClient();
|
|
806
|
+
* await client.getPublicClient().readContract({...});
|
|
807
|
+
* }
|
|
808
|
+
* ```
|
|
809
|
+
*/
|
|
810
|
+
function useWallet(walletType) {
|
|
811
|
+
const $ = c(13);
|
|
812
|
+
const multichain = useMultichainContext();
|
|
813
|
+
let t0;
|
|
814
|
+
if ($[0] !== multichain) {
|
|
815
|
+
t0 = multichain.getAggregateStore();
|
|
816
|
+
$[0] = multichain;
|
|
817
|
+
$[1] = t0;
|
|
818
|
+
} else t0 = $[1];
|
|
819
|
+
let t1;
|
|
820
|
+
if ($[2] !== walletType) {
|
|
821
|
+
t1 = (s) => s.context.wallets[walletType];
|
|
822
|
+
$[2] = walletType;
|
|
823
|
+
$[3] = t1;
|
|
824
|
+
} else t1 = $[3];
|
|
825
|
+
const state = useSelector(t0, t1);
|
|
826
|
+
let t2;
|
|
827
|
+
if ($[4] !== multichain || $[5] !== walletType) {
|
|
828
|
+
t2 = multichain.getConnector(walletType);
|
|
829
|
+
$[4] = multichain;
|
|
830
|
+
$[5] = walletType;
|
|
831
|
+
$[6] = t2;
|
|
832
|
+
} else t2 = $[6];
|
|
833
|
+
const connector = t2;
|
|
834
|
+
const t3 = state?.connectionState === "connected";
|
|
835
|
+
const t4 = state?.connectionState === "connecting";
|
|
836
|
+
let t5;
|
|
837
|
+
if ($[7] !== connector || $[8] !== state || $[9] !== t3 || $[10] !== t4 || $[11] !== walletType) {
|
|
838
|
+
t5 = {
|
|
839
|
+
state,
|
|
840
|
+
connector,
|
|
841
|
+
walletType,
|
|
842
|
+
isConnected: t3,
|
|
843
|
+
isConnecting: t4
|
|
844
|
+
};
|
|
845
|
+
$[7] = connector;
|
|
846
|
+
$[8] = state;
|
|
847
|
+
$[9] = t3;
|
|
848
|
+
$[10] = t4;
|
|
849
|
+
$[11] = walletType;
|
|
850
|
+
$[12] = t5;
|
|
851
|
+
} else t5 = $[12];
|
|
852
|
+
return t5;
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
//#endregion
|
|
856
|
+
//#region src/react/hooks/use-wallets/use-wallets.ts
|
|
857
|
+
const useWallets = () => {
|
|
858
|
+
const $ = c(4);
|
|
859
|
+
const multichain = useMultichainContext();
|
|
860
|
+
const walletTypes = multichain.getWalletTypes();
|
|
861
|
+
let t0;
|
|
862
|
+
if ($[0] !== multichain) {
|
|
863
|
+
t0 = multichain.getAggregateStore();
|
|
864
|
+
$[0] = multichain;
|
|
865
|
+
$[1] = t0;
|
|
866
|
+
} else t0 = $[1];
|
|
867
|
+
const wallets = useSelector(t0, _temp);
|
|
868
|
+
let t1;
|
|
869
|
+
if ($[2] !== wallets) {
|
|
870
|
+
t1 = (type) => ({
|
|
871
|
+
state: wallets[type],
|
|
872
|
+
type
|
|
873
|
+
});
|
|
874
|
+
$[2] = wallets;
|
|
875
|
+
$[3] = t1;
|
|
876
|
+
} else t1 = $[3];
|
|
877
|
+
return walletTypes.map(t1);
|
|
878
|
+
};
|
|
879
|
+
function _temp(s) {
|
|
880
|
+
return s.context.wallets;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
//#endregion
|
|
884
|
+
export { useMultichainSelection as a, useLedgerSelection as c, MultichainProvider as d, useMultichain as i, useChain as l, useWallet as n, MultichainSelectionProvider as o, useWalletSupport as r, useMultichainEvents as s, useWallets as t, useChainSupport as u };
|
|
885
|
+
//# sourceMappingURL=use-wallets-DXRPNM7H.mjs.map
|