@naculus/connect-appkit-vue 0.2.3 → 0.2.5
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 +12 -6
- package/dist/index.cjs +1203 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +443 -4
- package/dist/index.d.ts +443 -4
- package/dist/index.js +1211 -20
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -48,10 +48,33 @@ __export(index_exports, {
|
|
|
48
48
|
AppkitTabs: () => AppkitTabs,
|
|
49
49
|
AppkitToggleGroup: () => AppkitToggleGroup,
|
|
50
50
|
AppkitTooltip: () => AppkitTooltip,
|
|
51
|
+
useAccount: () => useAccount,
|
|
51
52
|
useAccounts: () => useAccounts,
|
|
53
|
+
useBalance: () => useBalance,
|
|
54
|
+
useCapabilities: () => useCapabilities,
|
|
52
55
|
useChain: () => useChain,
|
|
56
|
+
useCompareCosts: () => useCompareCosts,
|
|
57
|
+
useConnect: () => useConnect,
|
|
58
|
+
useDelegation: () => useDelegation,
|
|
59
|
+
useDisconnect: () => useDisconnect,
|
|
60
|
+
useExecuteRoute: () => useExecuteRoute,
|
|
61
|
+
useLastTx: () => useLastTx,
|
|
62
|
+
useLookupAddress: () => useLookupAddress,
|
|
63
|
+
useNotification: () => useNotification,
|
|
53
64
|
usePassphraseGate: () => usePassphraseGate,
|
|
54
|
-
|
|
65
|
+
useResolveName: () => useResolveName,
|
|
66
|
+
useRouteQuote: () => useRouteQuote,
|
|
67
|
+
useSession: () => useSession,
|
|
68
|
+
useSolanaAccount: () => useSolanaAccount,
|
|
69
|
+
useSolanaBalance: () => useSolanaBalance,
|
|
70
|
+
useSolanaRoles: () => useSolanaRoles,
|
|
71
|
+
useSwitchChain: () => useSwitchChain,
|
|
72
|
+
useTokenBalance: () => useTokenBalance,
|
|
73
|
+
useTokenList: () => useTokenList,
|
|
74
|
+
useTokenSearch: () => useTokenSearch,
|
|
75
|
+
useTxHistory: () => useTxHistory,
|
|
76
|
+
useTxMonitor: () => useTxMonitor,
|
|
77
|
+
useValidateDestination: () => useValidateDestination
|
|
55
78
|
});
|
|
56
79
|
module.exports = __toCommonJS(index_exports);
|
|
57
80
|
|
|
@@ -266,36 +289,906 @@ function useAccounts(accounts) {
|
|
|
266
289
|
};
|
|
267
290
|
}
|
|
268
291
|
|
|
269
|
-
// src/
|
|
292
|
+
// src/useNotification.ts
|
|
270
293
|
var import_connect_appkit_core = require("@naculus/connect-appkit-core");
|
|
294
|
+
var import_connect_core2 = require("@naculus/connect-core");
|
|
271
295
|
var import_vue2 = require("vue");
|
|
296
|
+
function useNotification(options = {}) {
|
|
297
|
+
const channel = (0, import_vue2.unref)(options.channel) ?? new import_connect_core2.InAppChannel();
|
|
298
|
+
const storage = (0, import_vue2.unref)(options.storage) ?? (0, import_connect_appkit_core.createNotificationSettingsStorage)();
|
|
299
|
+
const notifications = (0, import_vue2.shallowRef)(channel.getHistory());
|
|
300
|
+
const settings = (0, import_vue2.shallowRef)(
|
|
301
|
+
import_connect_appkit_core.DEFAULT_NOTIFICATION_SETTINGS
|
|
302
|
+
);
|
|
303
|
+
const unreadCount = (0, import_vue2.computed)(
|
|
304
|
+
() => notifications.value.filter((item) => !item.read).length
|
|
305
|
+
);
|
|
306
|
+
let disposed = false;
|
|
307
|
+
void (0, import_connect_appkit_core.loadNotificationSettings)(storage).then((saved) => {
|
|
308
|
+
if (!disposed && saved) settings.value = saved;
|
|
309
|
+
});
|
|
310
|
+
channel.onNotification = (item) => {
|
|
311
|
+
if (!disposed) notifications.value = [...notifications.value, item];
|
|
312
|
+
};
|
|
313
|
+
void channel.restore().then(() => {
|
|
314
|
+
if (!disposed) notifications.value = channel.getHistory();
|
|
315
|
+
});
|
|
316
|
+
(0, import_vue2.onScopeDispose)(() => {
|
|
317
|
+
disposed = true;
|
|
318
|
+
channel.onNotification = void 0;
|
|
319
|
+
});
|
|
320
|
+
const updateSettings = (update) => {
|
|
321
|
+
settings.value = (0, import_connect_appkit_core.updateNotificationSettings)(settings.value, update);
|
|
322
|
+
(0, import_connect_appkit_core.saveNotificationSettings)(storage, settings.value);
|
|
323
|
+
};
|
|
324
|
+
return {
|
|
325
|
+
notifications,
|
|
326
|
+
unreadCount,
|
|
327
|
+
settings,
|
|
328
|
+
addNotification: (item) => (0, import_connect_appkit_core.addInAppNotification)(channel, item),
|
|
329
|
+
clear: () => {
|
|
330
|
+
channel.clear();
|
|
331
|
+
notifications.value = [];
|
|
332
|
+
},
|
|
333
|
+
clearOne: (id) => {
|
|
334
|
+
void (0, import_connect_appkit_core.clearOneInAppNotification)(channel, id).then(() => {
|
|
335
|
+
if (!disposed) notifications.value = channel.getHistory();
|
|
336
|
+
});
|
|
337
|
+
},
|
|
338
|
+
markAsRead: (id) => {
|
|
339
|
+
channel.markAsRead(id);
|
|
340
|
+
notifications.value = notifications.value.map(
|
|
341
|
+
(item) => item.id === id ? { ...item, read: true } : item
|
|
342
|
+
);
|
|
343
|
+
},
|
|
344
|
+
markAllAsRead: () => {
|
|
345
|
+
channel.markAllAsRead();
|
|
346
|
+
notifications.value = notifications.value.map((item) => ({
|
|
347
|
+
...item,
|
|
348
|
+
read: true
|
|
349
|
+
}));
|
|
350
|
+
},
|
|
351
|
+
updateSettings,
|
|
352
|
+
setChannels: (channels) => updateSettings((0, import_connect_appkit_core.channelsUpdate)(channels)),
|
|
353
|
+
muteChain: (chainId) => updateSettings((0, import_connect_appkit_core.mutedChainSettings)(settings.value, chainId, true)),
|
|
354
|
+
unmuteChain: (chainId) => updateSettings((0, import_connect_appkit_core.mutedChainSettings)(settings.value, chainId, false))
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// src/useAccount.ts
|
|
359
|
+
var import_vue3 = require("vue");
|
|
360
|
+
function useAccount(accounts, connected) {
|
|
361
|
+
const parsed = useAccounts(accounts);
|
|
362
|
+
const isConnected = (0, import_vue3.computed)(() => (0, import_vue3.toValue)(connected));
|
|
363
|
+
const accountList = (0, import_vue3.computed)(() => (0, import_vue3.toValue)(accounts) ?? []);
|
|
364
|
+
return {
|
|
365
|
+
accounts: (0, import_vue3.computed)(
|
|
366
|
+
() => isConnected.value && accountList.value.length > 0 ? parsed.accounts.value : null
|
|
367
|
+
),
|
|
368
|
+
evmAccount: (0, import_vue3.computed)(
|
|
369
|
+
() => isConnected.value ? parsed.evmAccount.value : null
|
|
370
|
+
),
|
|
371
|
+
primaryAccount: (0, import_vue3.computed)(() => accountList.value[0] ?? null),
|
|
372
|
+
isConnected,
|
|
373
|
+
count: (0, import_vue3.computed)(() => accountList.value.length)
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// src/useSession.ts
|
|
378
|
+
var import_vue4 = require("vue");
|
|
379
|
+
function readSession(manager) {
|
|
380
|
+
const bundle = manager?.getActiveBundle();
|
|
381
|
+
if (!bundle) {
|
|
382
|
+
return {
|
|
383
|
+
session: null,
|
|
384
|
+
chainSessions: [],
|
|
385
|
+
activeChainId: null,
|
|
386
|
+
connectorId: null
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
return {
|
|
390
|
+
session: bundle.walletSession,
|
|
391
|
+
chainSessions: Array.from(bundle.chainSessions.values()),
|
|
392
|
+
activeChainId: bundle.activeChainId,
|
|
393
|
+
connectorId: bundle.walletSession.walletType
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
function useSession(manager) {
|
|
397
|
+
const snapshot = (0, import_vue4.shallowRef)(readSession((0, import_vue4.toValue)(manager)));
|
|
398
|
+
(0, import_vue4.watch)(
|
|
399
|
+
() => (0, import_vue4.toValue)(manager),
|
|
400
|
+
(current, _previous, onCleanup) => {
|
|
401
|
+
const update = () => {
|
|
402
|
+
snapshot.value = readSession(current);
|
|
403
|
+
};
|
|
404
|
+
update();
|
|
405
|
+
if (!current) return;
|
|
406
|
+
current.on("sessionConnected", update);
|
|
407
|
+
current.on("sessionDisconnected", update);
|
|
408
|
+
current.on("chainChanged", update);
|
|
409
|
+
onCleanup(() => {
|
|
410
|
+
current.off("sessionConnected", update);
|
|
411
|
+
current.off("sessionDisconnected", update);
|
|
412
|
+
current.off("chainChanged", update);
|
|
413
|
+
});
|
|
414
|
+
},
|
|
415
|
+
{ immediate: true }
|
|
416
|
+
);
|
|
417
|
+
return {
|
|
418
|
+
session: (0, import_vue4.computed)(() => snapshot.value.session),
|
|
419
|
+
chainSessions: (0, import_vue4.computed)(() => snapshot.value.chainSessions),
|
|
420
|
+
activeChainId: (0, import_vue4.computed)(() => snapshot.value.activeChainId),
|
|
421
|
+
isConnected: (0, import_vue4.computed)(() => snapshot.value.session !== null),
|
|
422
|
+
connectorId: (0, import_vue4.computed)(() => snapshot.value.connectorId)
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
// src/useConnect.ts
|
|
427
|
+
var import_connect_core3 = require("@naculus/connect-core");
|
|
428
|
+
var import_vue5 = require("vue");
|
|
429
|
+
function useConnect(action, status) {
|
|
430
|
+
const isLoading = (0, import_vue5.shallowRef)(false);
|
|
431
|
+
const error = (0, import_vue5.shallowRef)(null);
|
|
432
|
+
let disposed = false;
|
|
433
|
+
let inFlight = null;
|
|
434
|
+
const connect = () => {
|
|
435
|
+
if (inFlight) return inFlight;
|
|
436
|
+
const invoke = (0, import_vue5.unref)(action);
|
|
437
|
+
isLoading.value = true;
|
|
438
|
+
error.value = null;
|
|
439
|
+
const pending = Promise.resolve().then(() => invoke()).catch((cause) => {
|
|
440
|
+
if (disposed) return;
|
|
441
|
+
const message = cause instanceof Error ? cause.message : "Connection failed";
|
|
442
|
+
error.value = cause instanceof import_connect_core3.WalletError ? cause : new Error(message);
|
|
443
|
+
}).finally(() => {
|
|
444
|
+
if (inFlight === pending) inFlight = null;
|
|
445
|
+
if (!disposed) isLoading.value = false;
|
|
446
|
+
});
|
|
447
|
+
inFlight = pending;
|
|
448
|
+
return pending;
|
|
449
|
+
};
|
|
450
|
+
(0, import_vue5.onScopeDispose)(() => {
|
|
451
|
+
disposed = true;
|
|
452
|
+
});
|
|
453
|
+
return {
|
|
454
|
+
connect,
|
|
455
|
+
isConnecting: (0, import_vue5.computed)(
|
|
456
|
+
() => isLoading.value || (0, import_vue5.toValue)(status) === "connecting"
|
|
457
|
+
),
|
|
458
|
+
error
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
// src/useDisconnect.ts
|
|
463
|
+
var import_vue6 = require("vue");
|
|
464
|
+
function useDisconnect(action, status) {
|
|
465
|
+
const isDisconnecting = (0, import_vue6.shallowRef)(false);
|
|
466
|
+
const error = (0, import_vue6.shallowRef)(null);
|
|
467
|
+
let disposed = false;
|
|
468
|
+
let inFlight = null;
|
|
469
|
+
const disconnect = () => {
|
|
470
|
+
if (inFlight) return inFlight;
|
|
471
|
+
if ((0, import_vue6.toValue)(status) === "disconnected") return Promise.resolve();
|
|
472
|
+
const invoke = (0, import_vue6.unref)(action);
|
|
473
|
+
isDisconnecting.value = true;
|
|
474
|
+
error.value = null;
|
|
475
|
+
const pending = Promise.resolve().then(() => invoke()).catch((cause) => {
|
|
476
|
+
if (!disposed) {
|
|
477
|
+
error.value = cause instanceof Error ? cause : new Error("Disconnect failed");
|
|
478
|
+
}
|
|
479
|
+
}).finally(() => {
|
|
480
|
+
if (inFlight === pending) inFlight = null;
|
|
481
|
+
if (!disposed) isDisconnecting.value = false;
|
|
482
|
+
});
|
|
483
|
+
inFlight = pending;
|
|
484
|
+
return pending;
|
|
485
|
+
};
|
|
486
|
+
const cleanup = () => {
|
|
487
|
+
disposed = true;
|
|
488
|
+
};
|
|
489
|
+
(0, import_vue6.onScopeDispose)(cleanup);
|
|
490
|
+
return { disconnect, isDisconnecting, error, cleanup };
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// src/useSwitchChain.ts
|
|
494
|
+
var import_connect_appkit_core2 = require("@naculus/connect-appkit-core");
|
|
495
|
+
var import_vue7 = require("vue");
|
|
496
|
+
function useSwitchChain(action, chainId) {
|
|
497
|
+
const isSwitching = (0, import_vue7.shallowRef)(false);
|
|
498
|
+
const error = (0, import_vue7.shallowRef)(null);
|
|
499
|
+
let generation = 0;
|
|
500
|
+
let active = 0;
|
|
501
|
+
let disposed = false;
|
|
502
|
+
const switchChain = async (targetChainId) => {
|
|
503
|
+
const invoke = (0, import_vue7.unref)(action);
|
|
504
|
+
const mine = ++generation;
|
|
505
|
+
active++;
|
|
506
|
+
isSwitching.value = true;
|
|
507
|
+
error.value = null;
|
|
508
|
+
try {
|
|
509
|
+
await invoke(targetChainId);
|
|
510
|
+
} catch (cause) {
|
|
511
|
+
const walletError = (0, import_connect_appkit_core2.toChainSwitchError)(cause);
|
|
512
|
+
if (!disposed && mine === generation) error.value = walletError;
|
|
513
|
+
throw walletError;
|
|
514
|
+
} finally {
|
|
515
|
+
active--;
|
|
516
|
+
if (!disposed) isSwitching.value = active > 0;
|
|
517
|
+
}
|
|
518
|
+
};
|
|
519
|
+
(0, import_vue7.onScopeDispose)(() => {
|
|
520
|
+
disposed = true;
|
|
521
|
+
generation++;
|
|
522
|
+
});
|
|
523
|
+
return {
|
|
524
|
+
switchChain,
|
|
525
|
+
isSwitching,
|
|
526
|
+
currentChainId: (0, import_vue7.computed)(() => (0, import_vue7.toValue)(chainId) ?? null),
|
|
527
|
+
error,
|
|
528
|
+
clearError: () => {
|
|
529
|
+
error.value = null;
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// src/useBalance.ts
|
|
535
|
+
var import_connect_appkit_core3 = require("@naculus/connect-appkit-core");
|
|
536
|
+
var import_connect_core4 = require("@naculus/connect-core");
|
|
537
|
+
var import_vue8 = require("vue");
|
|
538
|
+
function useBalance(account, client, options = {}) {
|
|
539
|
+
const balance = (0, import_vue8.shallowRef)(null);
|
|
540
|
+
const isFetching = (0, import_vue8.shallowRef)(false);
|
|
541
|
+
const error = (0, import_vue8.shallowRef)(null);
|
|
542
|
+
let generation = 0;
|
|
543
|
+
let disposed = false;
|
|
544
|
+
let timer = null;
|
|
545
|
+
const refetch = async () => {
|
|
546
|
+
const reader = (0, import_vue8.toValue)(client);
|
|
547
|
+
const address = (0, import_connect_appkit_core3.bareEvmAddress)((0, import_vue8.toValue)(account));
|
|
548
|
+
const own = ++generation;
|
|
549
|
+
if (!reader || !address) {
|
|
550
|
+
balance.value = null;
|
|
551
|
+
error.value = null;
|
|
552
|
+
isFetching.value = false;
|
|
553
|
+
return;
|
|
554
|
+
}
|
|
555
|
+
isFetching.value = true;
|
|
556
|
+
error.value = null;
|
|
557
|
+
try {
|
|
558
|
+
const next = await reader.getBalance({ address });
|
|
559
|
+
if (disposed || own !== generation) return;
|
|
560
|
+
balance.value = next.toString();
|
|
561
|
+
} catch (cause) {
|
|
562
|
+
if (disposed || own !== generation) return;
|
|
563
|
+
balance.value = null;
|
|
564
|
+
error.value = cause instanceof Error ? cause : new Error("Balance read failed");
|
|
565
|
+
} finally {
|
|
566
|
+
if (!disposed && own === generation) isFetching.value = false;
|
|
567
|
+
}
|
|
568
|
+
};
|
|
569
|
+
const stopTimer = () => {
|
|
570
|
+
if (timer) clearInterval(timer);
|
|
571
|
+
timer = null;
|
|
572
|
+
};
|
|
573
|
+
(0, import_vue8.watch)(
|
|
574
|
+
[
|
|
575
|
+
() => (0, import_vue8.toValue)(account),
|
|
576
|
+
() => (0, import_vue8.toValue)(client),
|
|
577
|
+
() => (0, import_vue8.toValue)(options.refreshInterval) ?? 0
|
|
578
|
+
],
|
|
579
|
+
([, , interval]) => {
|
|
580
|
+
stopTimer();
|
|
581
|
+
void refetch();
|
|
582
|
+
if (interval > 0) timer = setInterval(() => void refetch(), interval);
|
|
583
|
+
},
|
|
584
|
+
{ immediate: true }
|
|
585
|
+
);
|
|
586
|
+
(0, import_vue8.onScopeDispose)(() => {
|
|
587
|
+
disposed = true;
|
|
588
|
+
generation++;
|
|
589
|
+
stopTimer();
|
|
590
|
+
});
|
|
591
|
+
return {
|
|
592
|
+
balance,
|
|
593
|
+
formatted: (0, import_vue8.computed)(
|
|
594
|
+
() => balance.value === null ? null : (0, import_connect_core4.formatUnits)(BigInt(balance.value), (0, import_vue8.toValue)(options.decimals) ?? 18)
|
|
595
|
+
),
|
|
596
|
+
symbol: (0, import_vue8.computed)(() => (0, import_vue8.toValue)(options.symbol) ?? null),
|
|
597
|
+
isFetching,
|
|
598
|
+
error,
|
|
599
|
+
refetch
|
|
600
|
+
};
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
// src/useRouteQuote.ts
|
|
604
|
+
var import_connect_appkit_core4 = require("@naculus/connect-appkit-core");
|
|
605
|
+
var import_vue9 = require("vue");
|
|
606
|
+
function useRouteQuote(input, getQuotes, options = {}) {
|
|
607
|
+
const quotes = (0, import_vue9.shallowRef)([]);
|
|
608
|
+
const loading = (0, import_vue9.shallowRef)(false);
|
|
609
|
+
const error = (0, import_vue9.shallowRef)(null);
|
|
610
|
+
let generation = 0;
|
|
611
|
+
let disposed = false;
|
|
612
|
+
let timer = null;
|
|
613
|
+
const clearTimer = () => {
|
|
614
|
+
if (timer) clearTimeout(timer);
|
|
615
|
+
timer = null;
|
|
616
|
+
};
|
|
617
|
+
const fetchQuotes = async () => {
|
|
618
|
+
const current = (0, import_vue9.toValue)(input);
|
|
619
|
+
const fn = (0, import_vue9.unref)(getQuotes);
|
|
620
|
+
const own = ++generation;
|
|
621
|
+
if (!(0, import_connect_appkit_core4.isQuotableInput)(current)) {
|
|
622
|
+
quotes.value = [];
|
|
623
|
+
return;
|
|
624
|
+
}
|
|
625
|
+
if (!fn) return;
|
|
626
|
+
loading.value = true;
|
|
627
|
+
error.value = null;
|
|
628
|
+
try {
|
|
629
|
+
const result = await fn(
|
|
630
|
+
current.fromChain,
|
|
631
|
+
current.toChain,
|
|
632
|
+
current.fromToken,
|
|
633
|
+
current.amount,
|
|
634
|
+
current.options,
|
|
635
|
+
current.toToken
|
|
636
|
+
);
|
|
637
|
+
if (disposed || own !== generation) return;
|
|
638
|
+
quotes.value = result;
|
|
639
|
+
} catch (cause) {
|
|
640
|
+
if (disposed || own !== generation) return;
|
|
641
|
+
error.value = cause instanceof Error ? cause : new Error(String(cause));
|
|
642
|
+
quotes.value = [];
|
|
643
|
+
} finally {
|
|
644
|
+
if (!disposed && own === generation) loading.value = false;
|
|
645
|
+
}
|
|
646
|
+
};
|
|
647
|
+
(0, import_vue9.watch)(
|
|
648
|
+
[
|
|
649
|
+
() => (0, import_vue9.toValue)(input).fromChain,
|
|
650
|
+
() => (0, import_vue9.toValue)(input).toChain,
|
|
651
|
+
() => (0, import_vue9.toValue)(input).fromToken,
|
|
652
|
+
() => (0, import_vue9.toValue)(input).toToken,
|
|
653
|
+
() => (0, import_vue9.toValue)(input).amount,
|
|
654
|
+
() => (0, import_vue9.unref)(getQuotes)
|
|
655
|
+
],
|
|
656
|
+
([fromChain, toChain, fromToken, , amount]) => {
|
|
657
|
+
clearTimer();
|
|
658
|
+
if (!fromChain || !toChain || !fromToken || !amount) {
|
|
659
|
+
quotes.value = [];
|
|
660
|
+
return;
|
|
661
|
+
}
|
|
662
|
+
timer = setTimeout(() => {
|
|
663
|
+
timer = null;
|
|
664
|
+
void fetchQuotes();
|
|
665
|
+
}, options.debounceMs ?? 300);
|
|
666
|
+
},
|
|
667
|
+
{ immediate: true }
|
|
668
|
+
);
|
|
669
|
+
(0, import_vue9.onScopeDispose)(() => {
|
|
670
|
+
disposed = true;
|
|
671
|
+
generation++;
|
|
672
|
+
clearTimer();
|
|
673
|
+
});
|
|
674
|
+
return {
|
|
675
|
+
quotes,
|
|
676
|
+
loading,
|
|
677
|
+
error,
|
|
678
|
+
refresh: fetchQuotes,
|
|
679
|
+
clear: () => {
|
|
680
|
+
clearTimer();
|
|
681
|
+
generation++;
|
|
682
|
+
quotes.value = [];
|
|
683
|
+
error.value = null;
|
|
684
|
+
loading.value = false;
|
|
685
|
+
}
|
|
686
|
+
};
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
// src/useCompareCosts.ts
|
|
690
|
+
var import_connect_appkit_core5 = require("@naculus/connect-appkit-core");
|
|
691
|
+
var import_vue10 = require("vue");
|
|
692
|
+
function useCompareCosts(input, compareCosts) {
|
|
693
|
+
const comparisons = (0, import_vue10.shallowRef)([]);
|
|
694
|
+
const loading = (0, import_vue10.shallowRef)(false);
|
|
695
|
+
const error = (0, import_vue10.shallowRef)(null);
|
|
696
|
+
let generation = 0;
|
|
697
|
+
let disposed = false;
|
|
698
|
+
const fetchComparisons = async () => {
|
|
699
|
+
const { operation, chains, options } = (0, import_vue10.toValue)(input);
|
|
700
|
+
const fn = (0, import_vue10.unref)(compareCosts);
|
|
701
|
+
const own = ++generation;
|
|
702
|
+
if (!chains || chains.length === 0) {
|
|
703
|
+
comparisons.value = [];
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
if (!fn) return;
|
|
707
|
+
loading.value = true;
|
|
708
|
+
error.value = null;
|
|
709
|
+
try {
|
|
710
|
+
const result = await fn(operation, chains, options);
|
|
711
|
+
if (disposed || own !== generation) return;
|
|
712
|
+
comparisons.value = result;
|
|
713
|
+
} catch (cause) {
|
|
714
|
+
if (disposed || own !== generation) return;
|
|
715
|
+
error.value = cause instanceof Error ? cause : new Error(String(cause));
|
|
716
|
+
comparisons.value = [];
|
|
717
|
+
} finally {
|
|
718
|
+
if (!disposed && own === generation) loading.value = false;
|
|
719
|
+
}
|
|
720
|
+
};
|
|
721
|
+
(0, import_vue10.watch)(
|
|
722
|
+
[() => (0, import_connect_appkit_core5.compareCostsKey)((0, import_vue10.toValue)(input)), () => (0, import_vue10.unref)(compareCosts)],
|
|
723
|
+
() => {
|
|
724
|
+
void fetchComparisons();
|
|
725
|
+
},
|
|
726
|
+
{ immediate: true }
|
|
727
|
+
);
|
|
728
|
+
(0, import_vue10.onScopeDispose)(() => {
|
|
729
|
+
disposed = true;
|
|
730
|
+
generation++;
|
|
731
|
+
});
|
|
732
|
+
return { comparisons, loading, error, refresh: fetchComparisons };
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// src/useExecuteRoute.ts
|
|
736
|
+
var import_connect_appkit_core6 = require("@naculus/connect-appkit-core");
|
|
737
|
+
var import_vue11 = require("vue");
|
|
738
|
+
function useExecuteRoute(executeRoute) {
|
|
739
|
+
const executing = (0, import_vue11.shallowRef)(false);
|
|
740
|
+
const result = (0, import_vue11.shallowRef)(null);
|
|
741
|
+
const error = (0, import_vue11.shallowRef)(null);
|
|
742
|
+
let inFlight = false;
|
|
743
|
+
let disposed = false;
|
|
744
|
+
const execute = async (quote, recipient, options) => {
|
|
745
|
+
const fn = (0, import_vue11.unref)(executeRoute);
|
|
746
|
+
if (!fn) {
|
|
747
|
+
error.value = {
|
|
748
|
+
code: "no_executor",
|
|
749
|
+
message: "No executeRoute function provided"
|
|
750
|
+
};
|
|
751
|
+
result.value = null;
|
|
752
|
+
return null;
|
|
753
|
+
}
|
|
754
|
+
const recipientError = (0, import_connect_appkit_core6.validateRouteRecipient)(quote, recipient);
|
|
755
|
+
if (recipientError) {
|
|
756
|
+
error.value = recipientError;
|
|
757
|
+
result.value = null;
|
|
758
|
+
return null;
|
|
759
|
+
}
|
|
760
|
+
if (inFlight) {
|
|
761
|
+
error.value = {
|
|
762
|
+
code: "execution_in_progress",
|
|
763
|
+
message: "A route execution is already in progress"
|
|
764
|
+
};
|
|
765
|
+
return null;
|
|
766
|
+
}
|
|
767
|
+
inFlight = true;
|
|
768
|
+
executing.value = true;
|
|
769
|
+
error.value = null;
|
|
770
|
+
result.value = null;
|
|
771
|
+
try {
|
|
772
|
+
const execResult = await fn(quote, recipient, options);
|
|
773
|
+
if (!disposed) result.value = execResult;
|
|
774
|
+
return execResult;
|
|
775
|
+
} catch (cause) {
|
|
776
|
+
if (!disposed) error.value = (0, import_connect_appkit_core6.toExecuteRouteError)(cause);
|
|
777
|
+
return null;
|
|
778
|
+
} finally {
|
|
779
|
+
inFlight = false;
|
|
780
|
+
if (!disposed) executing.value = false;
|
|
781
|
+
}
|
|
782
|
+
};
|
|
783
|
+
(0, import_vue11.onScopeDispose)(() => {
|
|
784
|
+
disposed = true;
|
|
785
|
+
});
|
|
786
|
+
return {
|
|
787
|
+
execute,
|
|
788
|
+
executing,
|
|
789
|
+
result,
|
|
790
|
+
error,
|
|
791
|
+
reset: () => {
|
|
792
|
+
result.value = null;
|
|
793
|
+
error.value = null;
|
|
794
|
+
executing.value = false;
|
|
795
|
+
}
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
// src/useTokenList.ts
|
|
800
|
+
var import_connect_appkit_core7 = require("@naculus/connect-appkit-core");
|
|
801
|
+
var import_connect_core5 = require("@naculus/connect-core");
|
|
802
|
+
var import_vue12 = require("vue");
|
|
803
|
+
function useTokenList(chainId, options = {}) {
|
|
804
|
+
const config = {};
|
|
805
|
+
if (options.sources) config.sources = options.sources;
|
|
806
|
+
const manager = options.manager ?? new import_connect_core5.TokenListManager(config);
|
|
807
|
+
const tokens = (0, import_vue12.shallowRef)([]);
|
|
808
|
+
const isLoading = (0, import_vue12.shallowRef)(options.autoLoad !== false);
|
|
809
|
+
const isLoaded = (0, import_vue12.shallowRef)(false);
|
|
810
|
+
const error = (0, import_vue12.shallowRef)(null);
|
|
811
|
+
let generation = 0;
|
|
812
|
+
let disposed = false;
|
|
813
|
+
const select = () => {
|
|
814
|
+
const id = (0, import_vue12.toValue)(chainId);
|
|
815
|
+
const numeric = id ? (0, import_connect_appkit_core7.eip155ChainIdToNumber)(id) : void 0;
|
|
816
|
+
return manager.getTokens(
|
|
817
|
+
numeric !== void 0 ? { chainId: numeric } : void 0
|
|
818
|
+
);
|
|
819
|
+
};
|
|
820
|
+
const run = async (op) => {
|
|
821
|
+
const own = ++generation;
|
|
822
|
+
isLoading.value = true;
|
|
823
|
+
error.value = null;
|
|
824
|
+
try {
|
|
825
|
+
await op();
|
|
826
|
+
if (disposed || own !== generation) return;
|
|
827
|
+
tokens.value = select();
|
|
828
|
+
isLoaded.value = true;
|
|
829
|
+
} catch (cause) {
|
|
830
|
+
if (disposed || own !== generation) return;
|
|
831
|
+
error.value = cause instanceof Error ? cause : new Error(String(cause));
|
|
832
|
+
} finally {
|
|
833
|
+
if (!disposed && own === generation) isLoading.value = false;
|
|
834
|
+
}
|
|
835
|
+
};
|
|
836
|
+
(0, import_vue12.watch)(
|
|
837
|
+
() => (0, import_vue12.toValue)(chainId),
|
|
838
|
+
() => {
|
|
839
|
+
if (options.autoLoad !== false) void run(() => manager.load());
|
|
840
|
+
},
|
|
841
|
+
{ immediate: true }
|
|
842
|
+
);
|
|
843
|
+
(0, import_vue12.onScopeDispose)(() => {
|
|
844
|
+
disposed = true;
|
|
845
|
+
generation++;
|
|
846
|
+
});
|
|
847
|
+
return {
|
|
848
|
+
tokens,
|
|
849
|
+
isLoading,
|
|
850
|
+
isLoaded,
|
|
851
|
+
error,
|
|
852
|
+
refetch: () => run(() => manager.refresh())
|
|
853
|
+
};
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
// src/useTokenSearch.ts
|
|
857
|
+
var import_connect_appkit_core8 = require("@naculus/connect-appkit-core");
|
|
858
|
+
var import_connect_core6 = require("@naculus/connect-core");
|
|
859
|
+
var import_vue13 = require("vue");
|
|
860
|
+
var DEBOUNCE_MS = 300;
|
|
861
|
+
var EMPTY = { exact: [], fuzzy: [], hasMore: false };
|
|
862
|
+
var sharedManager = null;
|
|
863
|
+
function getSharedManager() {
|
|
864
|
+
if (!sharedManager) {
|
|
865
|
+
sharedManager = new import_connect_core6.TokenListManager();
|
|
866
|
+
sharedManager.load().catch(() => {
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
return sharedManager;
|
|
870
|
+
}
|
|
871
|
+
function useTokenSearch(query, chainId, options = {}) {
|
|
872
|
+
const results = (0, import_vue13.shallowRef)(EMPTY);
|
|
873
|
+
const isSearching = (0, import_vue13.shallowRef)(false);
|
|
874
|
+
let timer = null;
|
|
875
|
+
const clear = () => {
|
|
876
|
+
if (timer) clearTimeout(timer);
|
|
877
|
+
timer = null;
|
|
878
|
+
};
|
|
879
|
+
(0, import_vue13.watch)(
|
|
880
|
+
[() => ((0, import_vue13.toValue)(query) ?? "").trim(), () => (0, import_vue13.toValue)(chainId)],
|
|
881
|
+
([q, id]) => {
|
|
882
|
+
clear();
|
|
883
|
+
if (!q) {
|
|
884
|
+
results.value = EMPTY;
|
|
885
|
+
isSearching.value = false;
|
|
886
|
+
return;
|
|
887
|
+
}
|
|
888
|
+
isSearching.value = true;
|
|
889
|
+
timer = setTimeout(() => {
|
|
890
|
+
timer = null;
|
|
891
|
+
const manager = options.manager ?? getSharedManager();
|
|
892
|
+
const numeric = id ? (0, import_connect_appkit_core8.eip155ChainIdToNumber)(id) : void 0;
|
|
893
|
+
results.value = manager.search(q, {
|
|
894
|
+
chainId: numeric,
|
|
895
|
+
limit: options.limit ?? 20
|
|
896
|
+
});
|
|
897
|
+
isSearching.value = false;
|
|
898
|
+
}, options.debounceMs ?? DEBOUNCE_MS);
|
|
899
|
+
},
|
|
900
|
+
{ immediate: true }
|
|
901
|
+
);
|
|
902
|
+
(0, import_vue13.onScopeDispose)(clear);
|
|
903
|
+
return { results, isSearching };
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
// src/useValidateDestination.ts
|
|
907
|
+
var import_connect_appkit_core9 = require("@naculus/connect-appkit-core");
|
|
908
|
+
var import_vue14 = require("vue");
|
|
909
|
+
function useValidateDestination(address) {
|
|
910
|
+
return {
|
|
911
|
+
validation: (0, import_vue14.computed)(() => (0, import_connect_appkit_core9.validateDestination)((0, import_vue14.toValue)(address) ?? ""))
|
|
912
|
+
};
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
// src/useTokenBalance.ts
|
|
916
|
+
var import_connect_appkit_core10 = require("@naculus/connect-appkit-core");
|
|
917
|
+
var import_connect_core7 = require("@naculus/connect-core");
|
|
918
|
+
var import_vue15 = require("vue");
|
|
919
|
+
function tokensKey(tokens) {
|
|
920
|
+
return tokens.map((t) => `${t.address.toLowerCase()}|${t.decimals}|${t.symbol}`).join(",");
|
|
921
|
+
}
|
|
922
|
+
function useTokenBalance(account, client, tokens, options = {}) {
|
|
923
|
+
const tokenBalances = (0, import_vue15.shallowRef)([]);
|
|
924
|
+
const isFetching = (0, import_vue15.shallowRef)(false);
|
|
925
|
+
const error = (0, import_vue15.shallowRef)(null);
|
|
926
|
+
let generation = 0;
|
|
927
|
+
let disposed = false;
|
|
928
|
+
let timer = null;
|
|
929
|
+
const refetch = async () => {
|
|
930
|
+
const reader = (0, import_vue15.toValue)(client);
|
|
931
|
+
const address = (0, import_connect_appkit_core10.bareEvmAddress)((0, import_vue15.toValue)(account));
|
|
932
|
+
const list = (0, import_vue15.toValue)(tokens) ?? [];
|
|
933
|
+
const own = ++generation;
|
|
934
|
+
if (!reader || !address || list.length === 0) {
|
|
935
|
+
tokenBalances.value = [];
|
|
936
|
+
error.value = null;
|
|
937
|
+
isFetching.value = false;
|
|
938
|
+
return;
|
|
939
|
+
}
|
|
940
|
+
isFetching.value = true;
|
|
941
|
+
error.value = null;
|
|
942
|
+
try {
|
|
943
|
+
const results = await Promise.all(
|
|
944
|
+
list.map(async (token) => {
|
|
945
|
+
try {
|
|
946
|
+
const raw = await reader.readContract({
|
|
947
|
+
address: token.address,
|
|
948
|
+
abi: import_connect_core7.ERC20_MIN_ABI,
|
|
949
|
+
functionName: "balanceOf",
|
|
950
|
+
args: [address]
|
|
951
|
+
});
|
|
952
|
+
const value = BigInt(raw);
|
|
953
|
+
return {
|
|
954
|
+
...token,
|
|
955
|
+
balance: value.toString(),
|
|
956
|
+
formatted: (0, import_connect_core7.formatUnits)(value, token.decimals)
|
|
957
|
+
};
|
|
958
|
+
} catch {
|
|
959
|
+
return { ...token, balance: null, formatted: null };
|
|
960
|
+
}
|
|
961
|
+
})
|
|
962
|
+
);
|
|
963
|
+
if (disposed || own !== generation) return;
|
|
964
|
+
tokenBalances.value = results;
|
|
965
|
+
} catch (cause) {
|
|
966
|
+
if (disposed || own !== generation) return;
|
|
967
|
+
tokenBalances.value = [];
|
|
968
|
+
error.value = cause instanceof Error ? cause : new Error("Failed to fetch token balances");
|
|
969
|
+
} finally {
|
|
970
|
+
if (!disposed && own === generation) isFetching.value = false;
|
|
971
|
+
}
|
|
972
|
+
};
|
|
973
|
+
const stopTimer = () => {
|
|
974
|
+
if (timer) clearInterval(timer);
|
|
975
|
+
timer = null;
|
|
976
|
+
};
|
|
977
|
+
(0, import_vue15.watch)(
|
|
978
|
+
[
|
|
979
|
+
() => (0, import_vue15.toValue)(account),
|
|
980
|
+
() => (0, import_vue15.toValue)(client),
|
|
981
|
+
() => tokensKey((0, import_vue15.toValue)(tokens) ?? []),
|
|
982
|
+
() => (0, import_vue15.toValue)(options.refreshInterval) ?? 0
|
|
983
|
+
],
|
|
984
|
+
([, , , interval]) => {
|
|
985
|
+
stopTimer();
|
|
986
|
+
void refetch();
|
|
987
|
+
if (interval > 0) timer = setInterval(() => void refetch(), interval);
|
|
988
|
+
},
|
|
989
|
+
{ immediate: true }
|
|
990
|
+
);
|
|
991
|
+
(0, import_vue15.onScopeDispose)(() => {
|
|
992
|
+
disposed = true;
|
|
993
|
+
generation++;
|
|
994
|
+
stopTimer();
|
|
995
|
+
});
|
|
996
|
+
return {
|
|
997
|
+
tokenBalances,
|
|
998
|
+
isFetching,
|
|
999
|
+
error,
|
|
1000
|
+
refetch,
|
|
1001
|
+
getTokenBalance: (tokenAddress) => tokenBalances.value.find(
|
|
1002
|
+
(t) => t.address.toLowerCase() === tokenAddress.toLowerCase()
|
|
1003
|
+
)
|
|
1004
|
+
};
|
|
1005
|
+
}
|
|
1006
|
+
|
|
1007
|
+
// src/useDelegation.ts
|
|
1008
|
+
var import_connect_appkit_core11 = require("@naculus/connect-appkit-core");
|
|
1009
|
+
var import_connect_core8 = require("@naculus/connect-core");
|
|
1010
|
+
var import_vue16 = require("vue");
|
|
1011
|
+
function useDelegation(account, client, chainId) {
|
|
1012
|
+
const status = (0, import_vue16.shallowRef)(import_connect_core8.UNKNOWN_DELEGATION);
|
|
1013
|
+
const isFetching = (0, import_vue16.shallowRef)(false);
|
|
1014
|
+
const error = (0, import_vue16.shallowRef)(null);
|
|
1015
|
+
let generation = 0;
|
|
1016
|
+
let disposed = false;
|
|
1017
|
+
const refetch = async () => {
|
|
1018
|
+
const mine = ++generation;
|
|
1019
|
+
const reader = (0, import_vue16.toValue)(client);
|
|
1020
|
+
const address = (0, import_connect_appkit_core11.bareEvmAddress)((0, import_vue16.toValue)(account));
|
|
1021
|
+
status.value = import_connect_core8.UNKNOWN_DELEGATION;
|
|
1022
|
+
error.value = null;
|
|
1023
|
+
if (!reader || !address) {
|
|
1024
|
+
isFetching.value = false;
|
|
1025
|
+
return;
|
|
1026
|
+
}
|
|
1027
|
+
isFetching.value = true;
|
|
1028
|
+
try {
|
|
1029
|
+
const code = await reader.getCode({ address });
|
|
1030
|
+
if (!disposed && mine === generation) {
|
|
1031
|
+
status.value = (0, import_connect_core8.readDelegation)(code ?? "0x");
|
|
1032
|
+
}
|
|
1033
|
+
} catch (cause) {
|
|
1034
|
+
if (!disposed && mine === generation) {
|
|
1035
|
+
status.value = import_connect_core8.UNKNOWN_DELEGATION;
|
|
1036
|
+
error.value = cause instanceof Error ? cause : new Error("Code read failed");
|
|
1037
|
+
}
|
|
1038
|
+
} finally {
|
|
1039
|
+
if (!disposed && mine === generation) isFetching.value = false;
|
|
1040
|
+
}
|
|
1041
|
+
};
|
|
1042
|
+
(0, import_vue16.watch)(
|
|
1043
|
+
() => [(0, import_vue16.toValue)(account), (0, import_vue16.toValue)(client), (0, import_vue16.toValue)(chainId)],
|
|
1044
|
+
() => {
|
|
1045
|
+
void refetch();
|
|
1046
|
+
},
|
|
1047
|
+
{ immediate: true, flush: "sync" }
|
|
1048
|
+
);
|
|
1049
|
+
(0, import_vue16.onScopeDispose)(() => {
|
|
1050
|
+
disposed = true;
|
|
1051
|
+
generation++;
|
|
1052
|
+
});
|
|
1053
|
+
return {
|
|
1054
|
+
delegated: (0, import_vue16.computed)(() => status.value.delegated),
|
|
1055
|
+
delegate: (0, import_vue16.computed)(() => status.value.delegate),
|
|
1056
|
+
isFetching,
|
|
1057
|
+
error,
|
|
1058
|
+
refetch
|
|
1059
|
+
};
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
// src/name-lookup.ts
|
|
1063
|
+
var import_connect_appkit_core12 = require("@naculus/connect-appkit-core");
|
|
1064
|
+
var import_vue17 = require("vue");
|
|
1065
|
+
function useNameLookup(options) {
|
|
1066
|
+
const data = (0, import_vue17.shallowRef)(null);
|
|
1067
|
+
const loading = (0, import_vue17.shallowRef)(false);
|
|
1068
|
+
const error = (0, import_vue17.shallowRef)(null);
|
|
1069
|
+
let generation = 0;
|
|
1070
|
+
let disposed = false;
|
|
1071
|
+
const run = () => {
|
|
1072
|
+
const input = (0, import_vue17.toValue)(options.input).trim();
|
|
1073
|
+
const skip = (0, import_vue17.toValue)(options.skip) ?? false;
|
|
1074
|
+
const scope = (0, import_vue17.toValue)(options.scope);
|
|
1075
|
+
const config = (0, import_vue17.toValue)(options.resolverConfig);
|
|
1076
|
+
const mine = ++generation;
|
|
1077
|
+
if (!input || skip) {
|
|
1078
|
+
data.value = null;
|
|
1079
|
+
loading.value = false;
|
|
1080
|
+
error.value = null;
|
|
1081
|
+
return;
|
|
1082
|
+
}
|
|
1083
|
+
data.value = null;
|
|
1084
|
+
loading.value = true;
|
|
1085
|
+
error.value = null;
|
|
1086
|
+
Promise.resolve().then(() => options.query((0, import_connect_appkit_core12.getResolver)(config), input, scope)).then((result) => {
|
|
1087
|
+
if (disposed || mine !== generation) return;
|
|
1088
|
+
data.value = result;
|
|
1089
|
+
loading.value = false;
|
|
1090
|
+
}).catch((cause) => {
|
|
1091
|
+
if (disposed || mine !== generation) return;
|
|
1092
|
+
data.value = null;
|
|
1093
|
+
error.value = cause instanceof Error ? cause : new Error(String(cause));
|
|
1094
|
+
loading.value = false;
|
|
1095
|
+
});
|
|
1096
|
+
};
|
|
1097
|
+
(0, import_vue17.watch)(
|
|
1098
|
+
() => [
|
|
1099
|
+
(0, import_vue17.toValue)(options.input),
|
|
1100
|
+
(0, import_vue17.toValue)(options.skip),
|
|
1101
|
+
(0, import_vue17.toValue)(options.scope),
|
|
1102
|
+
(0, import_vue17.toValue)(options.resolverConfig)
|
|
1103
|
+
],
|
|
1104
|
+
run,
|
|
1105
|
+
{ immediate: true, flush: "sync", deep: true }
|
|
1106
|
+
);
|
|
1107
|
+
(0, import_vue17.onScopeDispose)(() => {
|
|
1108
|
+
disposed = true;
|
|
1109
|
+
generation++;
|
|
1110
|
+
});
|
|
1111
|
+
return {
|
|
1112
|
+
data,
|
|
1113
|
+
isLoading: (0, import_vue17.computed)(() => loading.value),
|
|
1114
|
+
error,
|
|
1115
|
+
refetch: run
|
|
1116
|
+
};
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
// src/useResolveName.ts
|
|
1120
|
+
function useResolveName(name, options) {
|
|
1121
|
+
return useNameLookup({
|
|
1122
|
+
input: name,
|
|
1123
|
+
skip: options?.skip,
|
|
1124
|
+
resolverConfig: options?.resolverConfig,
|
|
1125
|
+
query: (resolver, input) => resolver.resolveName(input)
|
|
1126
|
+
});
|
|
1127
|
+
}
|
|
1128
|
+
|
|
1129
|
+
// src/useLookupAddress.ts
|
|
1130
|
+
function useLookupAddress(address, options) {
|
|
1131
|
+
return useNameLookup({
|
|
1132
|
+
input: address,
|
|
1133
|
+
scope: options?.chainId,
|
|
1134
|
+
skip: options?.skip,
|
|
1135
|
+
resolverConfig: options?.resolverConfig,
|
|
1136
|
+
query: (resolver, input, scope) => resolver.lookupAddress(input, scope)
|
|
1137
|
+
});
|
|
1138
|
+
}
|
|
1139
|
+
|
|
1140
|
+
// src/useSolanaAccount.ts
|
|
1141
|
+
var import_vue18 = require("vue");
|
|
1142
|
+
function useSolanaAccount(accounts, connected) {
|
|
1143
|
+
const isConnected = (0, import_vue18.computed)(() => (0, import_vue18.toValue)(connected));
|
|
1144
|
+
const caip10 = (0, import_vue18.computed)(
|
|
1145
|
+
() => isConnected.value ? ((0, import_vue18.toValue)(accounts) ?? []).find(
|
|
1146
|
+
(account) => account.startsWith("solana:")
|
|
1147
|
+
) ?? null : null
|
|
1148
|
+
);
|
|
1149
|
+
const parts = (0, import_vue18.computed)(() => caip10.value?.split(":") ?? []);
|
|
1150
|
+
return {
|
|
1151
|
+
address: (0, import_vue18.computed)(
|
|
1152
|
+
() => parts.value.length >= 3 ? parts.value.at(-1) ?? null : null
|
|
1153
|
+
),
|
|
1154
|
+
caip10,
|
|
1155
|
+
chainId: (0, import_vue18.computed)(
|
|
1156
|
+
() => parts.value.length >= 3 ? parts.value.slice(0, -1).join(":") : null
|
|
1157
|
+
),
|
|
1158
|
+
isConnected
|
|
1159
|
+
};
|
|
1160
|
+
}
|
|
1161
|
+
|
|
1162
|
+
// src/useChain.ts
|
|
1163
|
+
var import_connect_appkit_core13 = require("@naculus/connect-appkit-core");
|
|
1164
|
+
var import_vue19 = require("vue");
|
|
272
1165
|
function useChain(chains, chainId) {
|
|
273
|
-
const list = (0,
|
|
274
|
-
const id = (0,
|
|
275
|
-
const currentChain = (0,
|
|
1166
|
+
const list = (0, import_vue19.computed)(() => (0, import_vue19.toValue)(chains) ?? []);
|
|
1167
|
+
const id = (0, import_vue19.computed)(() => (0, import_vue19.toValue)(chainId) ?? null);
|
|
1168
|
+
const currentChain = (0, import_vue19.computed)(() => (0, import_connect_appkit_core13.resolveChain)(list.value, id.value));
|
|
276
1169
|
return {
|
|
277
1170
|
currentChain,
|
|
278
|
-
chainInfo: (0,
|
|
279
|
-
availableChains: (0,
|
|
280
|
-
currentChainNumber: (0,
|
|
281
|
-
() => currentChain.value ? (0,
|
|
1171
|
+
chainInfo: (0, import_vue19.computed)(() => (0, import_connect_appkit_core13.describeChain)(list.value, id.value)),
|
|
1172
|
+
availableChains: (0, import_vue19.computed)(() => (0, import_connect_appkit_core13.chainsForNamespace)(list.value, id.value)),
|
|
1173
|
+
currentChainNumber: (0, import_vue19.computed)(
|
|
1174
|
+
() => currentChain.value ? (0, import_connect_appkit_core13.chainNumber)(currentChain.value) : null
|
|
282
1175
|
),
|
|
283
|
-
namespace: (0,
|
|
284
|
-
() => currentChain.value ? (0,
|
|
1176
|
+
namespace: (0, import_vue19.computed)(
|
|
1177
|
+
() => currentChain.value ? (0, import_connect_appkit_core13.chainNamespace)(currentChain.value) : null
|
|
285
1178
|
)
|
|
286
1179
|
};
|
|
287
1180
|
}
|
|
288
1181
|
|
|
289
1182
|
// src/usePassphraseGate.ts
|
|
290
|
-
var
|
|
1183
|
+
var import_vue20 = require("vue");
|
|
291
1184
|
function usePassphraseGate(gate) {
|
|
292
|
-
const request = (0,
|
|
1185
|
+
const request = (0, import_vue20.shallowRef)(gate.getSnapshot());
|
|
293
1186
|
const unsubscribe = gate.subscribe(() => {
|
|
294
1187
|
request.value = gate.getSnapshot();
|
|
295
1188
|
});
|
|
296
|
-
(0,
|
|
1189
|
+
(0, import_vue20.onScopeDispose)(unsubscribe);
|
|
297
1190
|
return {
|
|
298
|
-
request: (0,
|
|
1191
|
+
request: (0, import_vue20.readonly)(request),
|
|
299
1192
|
submit: (passphrase) => gate.submit(passphrase),
|
|
300
1193
|
cancel: (reason) => gate.cancel(reason),
|
|
301
1194
|
forget: (reason) => gate.forget(reason)
|
|
@@ -303,17 +1196,17 @@ function usePassphraseGate(gate) {
|
|
|
303
1196
|
}
|
|
304
1197
|
|
|
305
1198
|
// src/useSolanaBalance.ts
|
|
306
|
-
var
|
|
307
|
-
var
|
|
1199
|
+
var import_connect_core9 = require("@naculus/connect-core");
|
|
1200
|
+
var import_vue21 = require("vue");
|
|
308
1201
|
function useSolanaBalance(address, rpcUrl) {
|
|
309
|
-
const balance = (0,
|
|
310
|
-
const isFetching = (0,
|
|
311
|
-
const error = (0,
|
|
1202
|
+
const balance = (0, import_vue21.shallowRef)(null);
|
|
1203
|
+
const isFetching = (0, import_vue21.ref)(false);
|
|
1204
|
+
const error = (0, import_vue21.shallowRef)(null);
|
|
312
1205
|
let generation = 0;
|
|
313
1206
|
let disposed = false;
|
|
314
1207
|
const refetch = async () => {
|
|
315
|
-
const addr = (0,
|
|
316
|
-
const url = (0,
|
|
1208
|
+
const addr = (0, import_vue21.toValue)(address);
|
|
1209
|
+
const url = (0, import_vue21.toValue)(rpcUrl);
|
|
317
1210
|
if (!addr || !url) {
|
|
318
1211
|
balance.value = null;
|
|
319
1212
|
return;
|
|
@@ -322,7 +1215,7 @@ function useSolanaBalance(address, rpcUrl) {
|
|
|
322
1215
|
isFetching.value = true;
|
|
323
1216
|
error.value = null;
|
|
324
1217
|
try {
|
|
325
|
-
const next = await (0,
|
|
1218
|
+
const next = await (0, import_connect_core9.getSolanaBalance)(url, addr);
|
|
326
1219
|
if (disposed || own !== generation) return;
|
|
327
1220
|
balance.value = next;
|
|
328
1221
|
} catch (err) {
|
|
@@ -333,16 +1226,275 @@ function useSolanaBalance(address, rpcUrl) {
|
|
|
333
1226
|
if (!disposed && own === generation) isFetching.value = false;
|
|
334
1227
|
}
|
|
335
1228
|
};
|
|
336
|
-
(0,
|
|
337
|
-
(0,
|
|
338
|
-
(0,
|
|
1229
|
+
(0, import_vue21.watchEffect)(() => {
|
|
1230
|
+
(0, import_vue21.toValue)(address);
|
|
1231
|
+
(0, import_vue21.toValue)(rpcUrl);
|
|
339
1232
|
void refetch();
|
|
340
1233
|
});
|
|
341
|
-
(0,
|
|
1234
|
+
(0, import_vue21.onScopeDispose)(() => {
|
|
342
1235
|
disposed = true;
|
|
343
1236
|
});
|
|
344
1237
|
return { balance, isFetching, error, refetch };
|
|
345
1238
|
}
|
|
1239
|
+
|
|
1240
|
+
// src/useLastTx.ts
|
|
1241
|
+
var import_vue22 = require("vue");
|
|
1242
|
+
function useLastTx(monitor) {
|
|
1243
|
+
const lastTx = (0, import_vue22.shallowRef)(null);
|
|
1244
|
+
const lastConfirmedTx = (0, import_vue22.shallowRef)(null);
|
|
1245
|
+
const lastFailedTx = (0, import_vue22.shallowRef)(null);
|
|
1246
|
+
(0, import_vue22.watch)(
|
|
1247
|
+
() => (0, import_vue22.toValue)(monitor),
|
|
1248
|
+
(activeMonitor, _previous, onCleanup) => {
|
|
1249
|
+
if (!activeMonitor) return;
|
|
1250
|
+
const recordLatest = (entry) => {
|
|
1251
|
+
if (!lastTx.value || entry.createdAt >= lastTx.value.createdAt) {
|
|
1252
|
+
lastTx.value = entry;
|
|
1253
|
+
}
|
|
1254
|
+
};
|
|
1255
|
+
const onConfirmed = (entry) => {
|
|
1256
|
+
lastConfirmedTx.value = entry;
|
|
1257
|
+
recordLatest(entry);
|
|
1258
|
+
};
|
|
1259
|
+
const onFailed = (entry) => {
|
|
1260
|
+
lastFailedTx.value = entry;
|
|
1261
|
+
recordLatest(entry);
|
|
1262
|
+
};
|
|
1263
|
+
activeMonitor.on("confirmed", onConfirmed);
|
|
1264
|
+
activeMonitor.on("failed", onFailed);
|
|
1265
|
+
onCleanup(() => {
|
|
1266
|
+
activeMonitor.off("confirmed", onConfirmed);
|
|
1267
|
+
activeMonitor.off("failed", onFailed);
|
|
1268
|
+
});
|
|
1269
|
+
},
|
|
1270
|
+
{ immediate: true }
|
|
1271
|
+
);
|
|
1272
|
+
return {
|
|
1273
|
+
lastTx,
|
|
1274
|
+
lastConfirmedTx,
|
|
1275
|
+
lastFailedTx,
|
|
1276
|
+
clear: () => {
|
|
1277
|
+
lastTx.value = null;
|
|
1278
|
+
lastConfirmedTx.value = null;
|
|
1279
|
+
lastFailedTx.value = null;
|
|
1280
|
+
}
|
|
1281
|
+
};
|
|
1282
|
+
}
|
|
1283
|
+
|
|
1284
|
+
// src/useTxHistory.ts
|
|
1285
|
+
var import_vue23 = require("vue");
|
|
1286
|
+
function useTxHistory(address, chainId, monitor) {
|
|
1287
|
+
const entries = (0, import_vue23.shallowRef)([]);
|
|
1288
|
+
const isLoading = (0, import_vue23.shallowRef)(false);
|
|
1289
|
+
const error = (0, import_vue23.shallowRef)(null);
|
|
1290
|
+
let generation = 0;
|
|
1291
|
+
const refresh = async () => {
|
|
1292
|
+
const mine = ++generation;
|
|
1293
|
+
const activeMonitor = (0, import_vue23.toValue)(monitor);
|
|
1294
|
+
if (!activeMonitor) {
|
|
1295
|
+
entries.value = [];
|
|
1296
|
+
isLoading.value = false;
|
|
1297
|
+
error.value = null;
|
|
1298
|
+
return;
|
|
1299
|
+
}
|
|
1300
|
+
isLoading.value = true;
|
|
1301
|
+
error.value = null;
|
|
1302
|
+
try {
|
|
1303
|
+
const result = await activeMonitor.getTxHistory(
|
|
1304
|
+
(0, import_vue23.toValue)(address) ?? void 0,
|
|
1305
|
+
(0, import_vue23.toValue)(chainId) ?? void 0
|
|
1306
|
+
);
|
|
1307
|
+
if (mine === generation) entries.value = result;
|
|
1308
|
+
} catch (err) {
|
|
1309
|
+
if (mine !== generation) return;
|
|
1310
|
+
error.value = err instanceof Error ? err : new Error("Failed to load transaction history");
|
|
1311
|
+
} finally {
|
|
1312
|
+
if (mine === generation) isLoading.value = false;
|
|
1313
|
+
}
|
|
1314
|
+
};
|
|
1315
|
+
(0, import_vue23.watch)(
|
|
1316
|
+
() => [(0, import_vue23.toValue)(monitor), (0, import_vue23.toValue)(address), (0, import_vue23.toValue)(chainId)],
|
|
1317
|
+
([activeMonitor], _previous, onCleanup) => {
|
|
1318
|
+
if (!activeMonitor) {
|
|
1319
|
+
void refresh();
|
|
1320
|
+
return;
|
|
1321
|
+
}
|
|
1322
|
+
const onStatusChange = () => {
|
|
1323
|
+
void refresh();
|
|
1324
|
+
};
|
|
1325
|
+
activeMonitor.on("statusChange", onStatusChange);
|
|
1326
|
+
onCleanup(() => activeMonitor.off("statusChange", onStatusChange));
|
|
1327
|
+
void refresh();
|
|
1328
|
+
},
|
|
1329
|
+
{ immediate: true }
|
|
1330
|
+
);
|
|
1331
|
+
return {
|
|
1332
|
+
entries,
|
|
1333
|
+
isLoading,
|
|
1334
|
+
error,
|
|
1335
|
+
refresh,
|
|
1336
|
+
summary: (0, import_vue23.computed)(() => ({
|
|
1337
|
+
pending: entries.value.filter((item) => item.status === "pending").length,
|
|
1338
|
+
confirmed: entries.value.filter((item) => item.status === "confirmed").length,
|
|
1339
|
+
failed: entries.value.filter((item) => item.status === "failed").length
|
|
1340
|
+
}))
|
|
1341
|
+
};
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
// src/useTxMonitor.ts
|
|
1345
|
+
var import_vue24 = require("vue");
|
|
1346
|
+
function useTxMonitor(hash, chainId, monitor) {
|
|
1347
|
+
const entry = (0, import_vue24.shallowRef)(null);
|
|
1348
|
+
const isLoading = (0, import_vue24.shallowRef)(false);
|
|
1349
|
+
const isWatching = (0, import_vue24.shallowRef)(false);
|
|
1350
|
+
const error = (0, import_vue24.shallowRef)(null);
|
|
1351
|
+
let generation = 0;
|
|
1352
|
+
const refresh = async () => {
|
|
1353
|
+
const activeMonitor = (0, import_vue24.toValue)(monitor);
|
|
1354
|
+
const activeHash = (0, import_vue24.toValue)(hash);
|
|
1355
|
+
const activeChainId = (0, import_vue24.toValue)(chainId);
|
|
1356
|
+
if (!activeMonitor || !activeHash) return;
|
|
1357
|
+
isLoading.value = true;
|
|
1358
|
+
error.value = null;
|
|
1359
|
+
try {
|
|
1360
|
+
await activeMonitor.refreshTx(activeHash, activeChainId ?? void 0);
|
|
1361
|
+
const current = activeMonitor.getTxStatus(
|
|
1362
|
+
activeHash,
|
|
1363
|
+
activeChainId ?? void 0
|
|
1364
|
+
);
|
|
1365
|
+
if (current) entry.value = current;
|
|
1366
|
+
} catch (err) {
|
|
1367
|
+
error.value = err instanceof Error ? err : new Error("Failed to refresh transaction");
|
|
1368
|
+
} finally {
|
|
1369
|
+
isLoading.value = false;
|
|
1370
|
+
}
|
|
1371
|
+
};
|
|
1372
|
+
const stopWatching = () => {
|
|
1373
|
+
const activeMonitor = (0, import_vue24.toValue)(monitor);
|
|
1374
|
+
const activeHash = (0, import_vue24.toValue)(hash);
|
|
1375
|
+
const activeChainId = (0, import_vue24.toValue)(chainId);
|
|
1376
|
+
if (!activeMonitor || !activeHash) return;
|
|
1377
|
+
activeMonitor.stopWatching(activeHash, activeChainId ?? void 0);
|
|
1378
|
+
isWatching.value = false;
|
|
1379
|
+
};
|
|
1380
|
+
(0, import_vue24.watch)(
|
|
1381
|
+
() => [(0, import_vue24.toValue)(monitor), (0, import_vue24.toValue)(hash), (0, import_vue24.toValue)(chainId)],
|
|
1382
|
+
([activeMonitor, activeHash, activeChainId], _previous, onCleanup) => {
|
|
1383
|
+
const mine = ++generation;
|
|
1384
|
+
if (!activeMonitor || !activeHash || !activeChainId) {
|
|
1385
|
+
entry.value = null;
|
|
1386
|
+
isLoading.value = false;
|
|
1387
|
+
isWatching.value = false;
|
|
1388
|
+
error.value = null;
|
|
1389
|
+
return;
|
|
1390
|
+
}
|
|
1391
|
+
let cancelled = false;
|
|
1392
|
+
const onStatusChange = (updated) => {
|
|
1393
|
+
if (!cancelled && updated.hash === activeHash && updated.chainId === activeChainId) {
|
|
1394
|
+
entry.value = { ...updated };
|
|
1395
|
+
}
|
|
1396
|
+
};
|
|
1397
|
+
activeMonitor.on("statusChange", onStatusChange);
|
|
1398
|
+
onCleanup(() => {
|
|
1399
|
+
cancelled = true;
|
|
1400
|
+
activeMonitor.off("statusChange", onStatusChange);
|
|
1401
|
+
});
|
|
1402
|
+
isWatching.value = true;
|
|
1403
|
+
isLoading.value = true;
|
|
1404
|
+
error.value = null;
|
|
1405
|
+
const current = activeMonitor.getTxStatus(activeHash, activeChainId);
|
|
1406
|
+
if (current) entry.value = current;
|
|
1407
|
+
activeMonitor.watchTx(activeHash, activeChainId, {}).then((initial) => {
|
|
1408
|
+
if (cancelled || mine !== generation) return;
|
|
1409
|
+
entry.value = initial;
|
|
1410
|
+
isLoading.value = false;
|
|
1411
|
+
}).catch((err) => {
|
|
1412
|
+
if (cancelled || mine !== generation) return;
|
|
1413
|
+
error.value = err instanceof Error ? err : new Error("Failed to watch transaction");
|
|
1414
|
+
isLoading.value = false;
|
|
1415
|
+
});
|
|
1416
|
+
},
|
|
1417
|
+
{ immediate: true }
|
|
1418
|
+
);
|
|
1419
|
+
return {
|
|
1420
|
+
entry,
|
|
1421
|
+
status: (0, import_vue24.computed)(() => entry.value?.status ?? "idle"),
|
|
1422
|
+
isLoading,
|
|
1423
|
+
isWatching,
|
|
1424
|
+
error,
|
|
1425
|
+
refresh,
|
|
1426
|
+
stopWatching
|
|
1427
|
+
};
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
// src/useCapabilities.ts
|
|
1431
|
+
var import_connect_appkit_core14 = require("@naculus/connect-appkit-core");
|
|
1432
|
+
var import_vue25 = require("vue");
|
|
1433
|
+
function useCapabilities(client, session, chainId) {
|
|
1434
|
+
const capabilities = (0, import_vue25.shallowRef)(
|
|
1435
|
+
null
|
|
1436
|
+
);
|
|
1437
|
+
const isFetching = (0, import_vue25.shallowRef)(false);
|
|
1438
|
+
const error = (0, import_vue25.shallowRef)(null);
|
|
1439
|
+
let generation = 0;
|
|
1440
|
+
const refetch = async () => {
|
|
1441
|
+
const mine = ++generation;
|
|
1442
|
+
const activeClient = (0, import_vue25.toValue)(client);
|
|
1443
|
+
const activeSession = (0, import_vue25.toValue)(session);
|
|
1444
|
+
if (!activeClient?.getCapabilities || !activeSession) {
|
|
1445
|
+
capabilities.value = null;
|
|
1446
|
+
isFetching.value = false;
|
|
1447
|
+
error.value = null;
|
|
1448
|
+
return;
|
|
1449
|
+
}
|
|
1450
|
+
isFetching.value = true;
|
|
1451
|
+
error.value = null;
|
|
1452
|
+
try {
|
|
1453
|
+
const raw = await activeClient.getCapabilities(activeSession);
|
|
1454
|
+
if (mine !== generation) return;
|
|
1455
|
+
capabilities.value = (0, import_connect_appkit_core14.normalizeCapabilities)(raw);
|
|
1456
|
+
} catch (err) {
|
|
1457
|
+
if (mine !== generation) return;
|
|
1458
|
+
capabilities.value = null;
|
|
1459
|
+
error.value = err instanceof Error ? err : new Error("Capability query failed");
|
|
1460
|
+
} finally {
|
|
1461
|
+
if (mine === generation) isFetching.value = false;
|
|
1462
|
+
}
|
|
1463
|
+
};
|
|
1464
|
+
(0, import_vue25.watchEffect)(() => {
|
|
1465
|
+
void (0, import_vue25.toValue)(client);
|
|
1466
|
+
void (0, import_vue25.toValue)(session);
|
|
1467
|
+
void refetch();
|
|
1468
|
+
});
|
|
1469
|
+
return {
|
|
1470
|
+
capabilities,
|
|
1471
|
+
current: (0, import_vue25.computed)(
|
|
1472
|
+
() => (0, import_connect_appkit_core14.selectChainCapabilities)(capabilities.value, (0, import_vue25.toValue)(chainId))
|
|
1473
|
+
),
|
|
1474
|
+
atomic: (0, import_vue25.computed)(
|
|
1475
|
+
() => (0, import_connect_appkit_core14.atomicSupportFor)(capabilities.value, (0, import_vue25.toValue)(chainId))
|
|
1476
|
+
),
|
|
1477
|
+
isFetching,
|
|
1478
|
+
error,
|
|
1479
|
+
refetch
|
|
1480
|
+
};
|
|
1481
|
+
}
|
|
1482
|
+
|
|
1483
|
+
// src/useSolanaRoles.ts
|
|
1484
|
+
var import_connect_appkit_core15 = require("@naculus/connect-appkit-core");
|
|
1485
|
+
var import_vue26 = require("vue");
|
|
1486
|
+
function useSolanaRoles(connector, session) {
|
|
1487
|
+
const state = (0, import_vue26.computed)(
|
|
1488
|
+
() => (0, import_connect_appkit_core15.readSolanaRoles)((0, import_vue26.toValue)(connector), (0, import_vue26.toValue)(session))
|
|
1489
|
+
);
|
|
1490
|
+
return {
|
|
1491
|
+
roles: (0, import_vue26.computed)(() => state.value.roles),
|
|
1492
|
+
absence: (0, import_vue26.computed)(() => state.value.absence),
|
|
1493
|
+
identity: (0, import_vue26.computed)(() => state.value.roles?.identity ?? null),
|
|
1494
|
+
signer: (0, import_vue26.computed)(() => state.value.roles?.signer ?? null),
|
|
1495
|
+
payer: (0, import_vue26.computed)(() => state.value.roles?.payer ?? null)
|
|
1496
|
+
};
|
|
1497
|
+
}
|
|
346
1498
|
// Annotate the CommonJS export names for ESM import in node:
|
|
347
1499
|
0 && (module.exports = {
|
|
348
1500
|
AppkitAccordion,
|
|
@@ -373,9 +1525,32 @@ function useSolanaBalance(address, rpcUrl) {
|
|
|
373
1525
|
AppkitTabs,
|
|
374
1526
|
AppkitToggleGroup,
|
|
375
1527
|
AppkitTooltip,
|
|
1528
|
+
useAccount,
|
|
376
1529
|
useAccounts,
|
|
1530
|
+
useBalance,
|
|
1531
|
+
useCapabilities,
|
|
377
1532
|
useChain,
|
|
1533
|
+
useCompareCosts,
|
|
1534
|
+
useConnect,
|
|
1535
|
+
useDelegation,
|
|
1536
|
+
useDisconnect,
|
|
1537
|
+
useExecuteRoute,
|
|
1538
|
+
useLastTx,
|
|
1539
|
+
useLookupAddress,
|
|
1540
|
+
useNotification,
|
|
378
1541
|
usePassphraseGate,
|
|
379
|
-
|
|
1542
|
+
useResolveName,
|
|
1543
|
+
useRouteQuote,
|
|
1544
|
+
useSession,
|
|
1545
|
+
useSolanaAccount,
|
|
1546
|
+
useSolanaBalance,
|
|
1547
|
+
useSolanaRoles,
|
|
1548
|
+
useSwitchChain,
|
|
1549
|
+
useTokenBalance,
|
|
1550
|
+
useTokenList,
|
|
1551
|
+
useTokenSearch,
|
|
1552
|
+
useTxHistory,
|
|
1553
|
+
useTxMonitor,
|
|
1554
|
+
useValidateDestination
|
|
380
1555
|
});
|
|
381
1556
|
//# sourceMappingURL=index.cjs.map
|