@solana/connector 0.1.9 → 0.1.10
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 +97 -0
- package/dist/chunk-4JT24DIX.js +466 -0
- package/dist/chunk-4JT24DIX.js.map +1 -0
- package/dist/chunk-4KD6HQQG.js +69 -0
- package/dist/chunk-4KD6HQQG.js.map +1 -0
- package/dist/{chunk-DSUCH44G.js → chunk-64LV76OK.js} +2 -67
- package/dist/chunk-64LV76OK.js.map +1 -0
- package/dist/{chunk-5HRJKCIL.js → chunk-6AJJJG5B.js} +567 -133
- package/dist/chunk-6AJJJG5B.js.map +1 -0
- package/dist/chunk-7XHVZW2L.mjs +460 -0
- package/dist/chunk-7XHVZW2L.mjs.map +1 -0
- package/dist/{chunk-WDXEP4AJ.js → chunk-ATYK5OKR.js} +81 -33
- package/dist/chunk-ATYK5OKR.js.map +1 -0
- package/dist/{chunk-J7DHGLW6.mjs → chunk-DKCZA2QI.mjs} +3 -61
- package/dist/chunk-DKCZA2QI.mjs.map +1 -0
- package/dist/chunk-FVA4TUI4.mjs +178 -0
- package/dist/chunk-FVA4TUI4.mjs.map +1 -0
- package/dist/chunk-HO6QNKFM.mjs +61 -0
- package/dist/chunk-HO6QNKFM.mjs.map +1 -0
- package/dist/chunk-MN7XNCYI.js +230 -0
- package/dist/chunk-MN7XNCYI.js.map +1 -0
- package/dist/{chunk-MAXA3HEP.mjs → chunk-QOIQBWMP.mjs} +477 -51
- package/dist/chunk-QOIQBWMP.mjs.map +1 -0
- package/dist/{chunk-P5LXUDP6.mjs → chunk-WGZYKDXF.mjs} +57 -11
- package/dist/chunk-WGZYKDXF.mjs.map +1 -0
- package/dist/compat.js +10 -9
- package/dist/compat.js.map +1 -1
- package/dist/compat.mjs +2 -1
- package/dist/compat.mjs.map +1 -1
- package/dist/headless.d.mts +217 -100
- package/dist/headless.d.ts +217 -100
- package/dist/headless.js +190 -168
- package/dist/headless.mjs +5 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +233 -203
- package/dist/index.mjs +6 -4
- package/dist/react.d.mts +72 -4
- package/dist/react.d.ts +72 -4
- package/dist/react.js +52 -36
- package/dist/react.mjs +2 -2
- package/dist/{standard-shim-CT49DM5l.d.mts → standard-shim-BTUm7cur.d.mts} +280 -1
- package/dist/{standard-shim-D9guL5fz.d.ts → standard-shim-LsQ97i9T.d.ts} +280 -1
- package/dist/walletconnect-D4JN6H2O.js +28 -0
- package/dist/walletconnect-D4JN6H2O.js.map +1 -0
- package/dist/walletconnect-I3PZUBTA.mjs +3 -0
- package/dist/walletconnect-I3PZUBTA.mjs.map +1 -0
- package/package.json +6 -2
- package/dist/chunk-5HRJKCIL.js.map +0 -1
- package/dist/chunk-DSUCH44G.js.map +0 -1
- package/dist/chunk-I6TJLYNA.js +0 -535
- package/dist/chunk-I6TJLYNA.js.map +0 -1
- package/dist/chunk-J7DHGLW6.mjs.map +0 -1
- package/dist/chunk-JOBLG62A.mjs +0 -476
- package/dist/chunk-JOBLG62A.mjs.map +0 -1
- package/dist/chunk-MAXA3HEP.mjs.map +0 -1
- package/dist/chunk-P5LXUDP6.mjs.map +0 -1
- package/dist/chunk-WDXEP4AJ.js.map +0 -1
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { tryCatchSync, isWeb3jsTransaction, prepareTransactionForWallet, convertSignedTransaction } from './chunk-HO6QNKFM.mjs';
|
|
2
|
+
import { createLogger, getPublicSolanaRpcUrl, getExplorerLink, __publicField, TransactionError, Errors, ValidationError, isConnectorError } from './chunk-DKCZA2QI.mjs';
|
|
2
3
|
import { Component, useTransition, useState, useCallback, useMemo } from 'react';
|
|
3
4
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
5
|
import { install } from '@solana/webcrypto-ed25519-polyfill';
|
|
5
|
-
import {
|
|
6
|
+
import { Storage, createSolanaMainnet, createSolanaDevnet, createSolanaTestnet, createSolanaLocalnet } from '@wallet-ui/core';
|
|
7
|
+
import { isAddress, address } from '@solana/addresses';
|
|
8
|
+
import { z } from 'zod/v4';
|
|
6
9
|
import { getBase58Decoder } from '@solana/codecs';
|
|
7
10
|
import { getTransactionDecoder, assertIsTransactionWithinSizeLimit } from '@solana/transactions';
|
|
8
11
|
|
|
@@ -620,6 +623,38 @@ var logger2 = createLogger("WalletAuthenticity"), WalletAuthenticityVerifier = c
|
|
|
620
623
|
}
|
|
621
624
|
};
|
|
622
625
|
|
|
626
|
+
// src/lib/wallet/wallet-icon-overrides.ts
|
|
627
|
+
var PHANTOM_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSIxMiIgZmlsbD0iIzk3ODZFNCIvPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF80NF82MTApIj48cGF0aCBkPSJNNS43NjU1IDE1Ljc5N0M1Ljc2NTUgMTcuMjIyIDYuNDk4NzkgMTcuNTUgNy4yNjE0MSAxNy41NUM4Ljg3NDYzIDE3LjU1IDEwLjA4NyAxNi4wODQxIDEwLjgxMDUgMTQuOTI1NkMxMC43MjI1IDE1LjE4MTkgMTAuNjczNiAxNS40MzgyIDEwLjY3MzYgMTUuNjg0MkMxMC42NzM2IDE2LjM2MDkgMTEuMDQ1MiAxNi44NDI3IDExLjc3ODUgMTYuODQyN0MxMi43ODU1IDE2Ljg0MjcgMTMuODYxIDE1LjkyIDE0LjQxODMgMTQuOTI1NkMxNC4zNzkyIDE1LjA2OTIgMTQuMzU5NiAxNS4yMDI0IDE0LjM1OTYgMTUuMzI1NEMxNC4zNTk2IDE1Ljc5NyAxNC42MTM4IDE2LjA5NDMgMTUuMTMyIDE2LjA5NDNDMTYuNzY0OCAxNi4wOTQzIDE4LjQwNzQgMTMuMDcwMSAxOC40MDc0IDEwLjQyNTJDMTguNDA3NCA4LjM2NDU5IDE3LjQxMDEgNi41NTAwNSAxNC45MDcxIDYuNTUwMDVDMTAuNTA3NCA2LjU1MDA1IDUuNzY1NSAxMi4xNjc5IDUuNzY1NSAxNS43OTdaTTEzLjM5MTcgMTAuMTk5NkMxMy4zOTE3IDkuNjg3MDUgMTMuNjY1NCA5LjMyODI1IDE0LjA2NjMgOS4zMjgyNUMxNC40NTc0IDkuMzI4MjUgMTQuNzMxMiA5LjY4NzA1IDE0LjczMTIgMTAuMTk5NkMxNC43MzEyIDEwLjcxMjIgMTQuNDU3NCAxMS4wODEzIDE0LjA2NjMgMTEuMDgxM0MxMy42NjU0IDExLjA4MTMgMTMuMzkxNyAxMC43MTIyIDEzLjM5MTcgMTAuMTk5NlpNMTUuNDg0IDEwLjE5OTZDMTUuNDg0IDkuNjg3MDUgMTUuNzU3OCA5LjMyODI1IDE2LjE1ODYgOS4zMjgyNUMxNi41NDk3IDkuMzI4MjUgMTYuODIzNSA5LjY4NzA1IDE2LjgyMzUgMTAuMTk5NkMxNi44MjM1IDEwLjcxMjIgMTYuNTQ5NyAxMS4wODEzIDE2LjE1ODYgMTEuMDgxM0MxNS43NTc4IDExLjA4MTMgMTUuNDg0IDEwLjcxMjIgMTUuNDg0IDEwLjE5OTZaIiBmaWxsPSIjRkVGREY4Ii8+PC9nPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDBfNDRfNjEwIj48cmVjdCB3aWR0aD0iMTIuNzYiIGhlaWdodD0iMTEiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LjcwNjQyIDYuNTQ5OTMpIi8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+", SOLFLARE_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSIxMiIgZmlsbD0iI0ZGRUY0NiIvPjxwYXRoIGQ9Ik0xMi4xMjg1IDEyLjUyNjZMMTIuOTU1NiAxMS43Mjc2TDE0LjQ5NzYgMTIuMjMyM0MxNS41MDcgMTIuNTY4NyAxNi4wMTE3IDEzLjE4NTUgMTYuMDExNyAxNC4wNTQ3QzE2LjAxMTcgMTQuNzEzNiAxNS43NTkzIDE1LjE0ODIgMTUuMjU0NyAxNS43MDg5TDE1LjEwMDUgMTUuODc3MUwxNS4xNTY1IDE1LjQ4NDZDMTUuMzgwOCAxNC4wNTQ3IDE0Ljk2MDMgMTMuNDM3OSAxMy41NzI0IDEyLjk4OTJMMTIuMTI4NSAxMi41MjY2Wk0xMC4wNTM3IDcuNjM0MTRMMTQuMjU5MyA5LjAzNkwxMy4zNDgxIDkuOTA1MTdMMTEuMTYxMiA5LjE3NjE5QzEwLjQwNDIgOC45MjM4NSAxMC4xNTE4IDguNTE3MzEgMTAuMDUzNyA3LjY2MjE3VjcuNjM0MTRaTTkuODAxMzUgMTQuNzU1NkwxMC43NTQ2IDEzLjg0NDRMMTIuNTQ5MSAxNC40MzMyQzEzLjQ4ODMgMTQuNzQxNiAxMy44MTA3IDE1LjE0ODIgMTMuNzEyNiAxNi4xNzE1TDkuODAxMzUgMTQuNzU1NlpNOC41OTU3NyAxMC42OTAyQzguNTk1NzcgMTAuNDIzOSA4LjczNTk1IDEwLjE3MTUgOC45NzQyNyA5Ljk2MTIyQzkuMjI2NjEgMTAuMzI1NyA5LjY2MTE4IDEwLjY0ODEgMTAuMzQ4MSAxMC44NzI1TDExLjgzNDEgMTEuMzYzMUwxMS4wMDcgMTIuMTYyMkw5LjU0OTAzIDExLjY4NTVDOC44NzYxNCAxMS40NjEyIDguNTk1NzcgMTEuMTI0OCA4LjU5NTc3IDEwLjY5MDJaTTEyLjk5NzYgMTguMDVDMTYuMDgxNyAxNi4wMDMzIDE3LjczNTkgMTQuNjE1NCAxNy43MzU5IDEyLjkwNTJDMTcuNzM1OSAxMS43Njk2IDE3LjA2MyAxMS4xMzg4IDE1LjU3NzEgMTAuNjQ4MUwxNC40NTU2IDEwLjI2OTZMMTcuNTI1NyA3LjMyNTcyTDE2LjkwODggNi42NjY4NEwxNS45OTc2IDcuNDY1OUwxMS42OTM5IDYuMDUwMDJDMTAuMzYyMSA2LjQ4NDYgOC42Nzk4OCA3Ljc2MDMgOC42Nzk4OCA5LjAzNkM4LjY3OTg4IDkuMTc2MTggOC42OTM5IDkuMzE2MzcgOC43MzU5NSA5LjQ3MDU5QzcuNjI4NDcgMTAuMTAxNCA3LjE3OTg4IDEwLjY5MDIgNy4xNzk4OCAxMS40MTkxQzcuMTc5ODggMTIuMTA2MSA3LjU0NDM2IDEyLjc5MyA4LjcwNzkyIDEzLjE3MTVMOS42MzMxNCAxMy40Nzk5TDYuNDM2ODkgMTYuNTVMNy4wNTM3MSAxNy4yMDg5TDguMDQ5MDQgMTYuMjk3N0wxMi45OTc2IDE4LjA1WiIgZmlsbD0iIzAyMDUwQSIvPjwvc3ZnPg==", BACKPACK_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSIxMiIgZmlsbD0iI0UzM0UzRiIvPjxwYXRoIGQ9Ik0xNS41MTg2IDEzLjkyNzJDMTUuOTgxMSAxMy45MjcyIDE2LjIxMjcgMTMuOTI3MSAxNi4zNTY0IDE0LjA3MDhDMTYuNTAwMiAxNC4yMTQ1IDE2LjUgMTQuNDQ2MiAxNi41IDE0LjkwODdWMTUuNTY0QzE2LjUgMTYuNDg5MyAxNi41MDAyIDE2Ljk1MjIgMTYuMjEyOSAxNy4yMzk3QzE1LjkyNTMgMTcuNTI3MyAxNS40NjE4IDE3LjUyNzggMTQuNTM2MSAxNy41Mjc4SDkuNDYzODdDOC41Mzg0MiAxNy41Mjc4IDguMDc1NjcgMTcuNTI3MSA3Ljc4ODA5IDE3LjIzOTdDNy41MDA1NCAxNi45NTIyIDcuNSAxNi40ODk0IDcuNSAxNS41NjRWMTQuOTA4N0M3LjUgMTQuNDQ2MiA3LjQ5OTgyIDE0LjIxNDUgNy42NDM1NSAxNC4wNzA4QzcuNzg3MyAxMy45MjcxIDguMDE4OTEgMTMuOTI3MiA4LjQ4MTQ1IDEzLjkyNzJIMTUuNTE4NlpNMTIgNi4zNTg4OUMxNi41NjUzIDYuMzU4ODkgMTYuNSA5LjQwMjM4IDE2LjUgMTAuODU4OVYxMi40OTU2QzE2LjQ5OTkgMTIuNzY2NyAxNi4yNzk5IDEyLjk4NjggMTYuMDA4OCAxMi45ODY4SDcuOTkxMjFDNy43MjAxMiAxMi45ODY4IDcuNTAwMDYgMTIuNzY2NyA3LjUgMTIuNDk1NkM3LjUgMTIuNDk1NiA3LjUgMTIuMzE1MyA3LjUgMTAuODU4OUM3LjQ5OTk5IDkuNDAyMzkgNy40MzQ3OCA2LjM1ODkzIDEyIDYuMzU4ODlaTTEyIDcuNTE5MDRDMTEuMjMxOSA3LjUxOTEgMTAuNjA5NCA4LjE0MTU1IDEwLjYwOTQgOC45MDk2N0MxMC42MDk0IDkuNjc3NzggMTEuMjMxOSAxMC4zMDAyIDEyIDEwLjMwMDNDMTIuNzY4MiAxMC4zMDAzIDEzLjM5MDYgOS42Nzc4MiAxMy4zOTA2IDguOTA5NjdDMTMuMzkwNiA4LjE0MTUxIDEyLjc2ODIgNy41MTkwNCAxMiA3LjUxOTA0Wk0xMS45OTkgNC40NzIxN0MxMi45ODQxIDQuNDcyMjIgMTMuODQ2MiA0LjgxNjczIDE0LjA3NDIgNS4zNzc0NEMxNC4xMDg1IDUuNDczODcgMTQuMTI1OCA1LjUyMjIyIDE0LjA5NTcgNS41NTgxMUMxNC4wNjUyIDUuNTk0MDIgMTQuMDA1OCA1LjU4MzQyIDEzLjg4NzcgNS41NjIwMUMxMy41ODIyIDUuNTA2NjUgMTMuMTQ5MyA1LjQ2ODc3IDEyLjc2ODYgNS40NTc1MkMxMi41MjU4IDUuNDQ0NDggMTIuMjY5NSA1LjQzNzk5IDEyIDUuNDM3OTlDMTEuNzMwNSA1LjQzNzk5IDExLjQ3NDIgNS40NDQ0OCAxMS4yMzE0IDUuNDU3NTJDMTAuODQ5IDUuNDY4NzcgMTAuNDE0OSA1LjUwNjU4IDEwLjEwODQgNS41NjAwNkM5Ljk5MzM1IDUuNTgwMTMgOS45MzU2NSA1LjU5MDQ3IDkuOTA1MjcgNS41NTUxOEM5Ljg3NDk3IDUuNTE5MzUgOS44OTEyOCA1LjQ3MTQ0IDkuOTI0OCA1LjM3NjQ2QzEwLjE1MSA0LjgxNzQ4IDExLjAxNDIgNC40NzIxNyAxMS45OTkgNC40NzIxN1oiIGZpbGw9IndoaXRlIi8+PC9zdmc+", WALLET_ICON_OVERRIDES = {
|
|
628
|
+
Phantom: PHANTOM_ICON,
|
|
629
|
+
Solflare: SOLFLARE_ICON,
|
|
630
|
+
Backpack: BACKPACK_ICON
|
|
631
|
+
}, ICON_PROXY_CACHE = /* @__PURE__ */ new WeakMap();
|
|
632
|
+
function getWalletIconOverride(walletName) {
|
|
633
|
+
return WALLET_ICON_OVERRIDES[walletName];
|
|
634
|
+
}
|
|
635
|
+
function createIconProxy(wallet, icon) {
|
|
636
|
+
let cached = ICON_PROXY_CACHE.get(wallet);
|
|
637
|
+
if (cached) return cached;
|
|
638
|
+
let proxy = new Proxy(wallet, {
|
|
639
|
+
get(target, prop) {
|
|
640
|
+
if (prop === "icon") return icon;
|
|
641
|
+
let value = Reflect.get(target, prop, target);
|
|
642
|
+
return typeof value == "function" ? value.bind(target) : value;
|
|
643
|
+
}
|
|
644
|
+
});
|
|
645
|
+
return ICON_PROXY_CACHE.set(wallet, proxy), proxy;
|
|
646
|
+
}
|
|
647
|
+
function applyWalletIconOverride(wallet) {
|
|
648
|
+
let override = getWalletIconOverride(wallet.name);
|
|
649
|
+
if (!override || wallet.icon === override) return wallet;
|
|
650
|
+
if (Object.isExtensible(wallet))
|
|
651
|
+
try {
|
|
652
|
+
return wallet.icon = override, wallet;
|
|
653
|
+
} catch {
|
|
654
|
+
}
|
|
655
|
+
return createIconProxy(wallet, override);
|
|
656
|
+
}
|
|
657
|
+
|
|
623
658
|
// src/lib/wallet/detector.ts
|
|
624
659
|
var logger3 = createLogger("WalletDetector");
|
|
625
660
|
function hasFeature(wallet, featureName) {
|
|
@@ -750,9 +785,9 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
750
785
|
* Convert a Wallet Standard wallet to WalletInfo with capability checks
|
|
751
786
|
*/
|
|
752
787
|
mapToWalletInfo(wallet) {
|
|
753
|
-
let hasConnect = hasFeature(
|
|
788
|
+
let walletWithIcon = applyWalletIconOverride(wallet), hasConnect = hasFeature(walletWithIcon, "standard:connect"), hasDisconnect = hasFeature(walletWithIcon, "standard:disconnect"), isSolana = Array.isArray(walletWithIcon.chains) && walletWithIcon.chains.some((c) => typeof c == "string" && c.includes("solana"));
|
|
754
789
|
return {
|
|
755
|
-
wallet,
|
|
790
|
+
wallet: walletWithIcon,
|
|
756
791
|
installed: true,
|
|
757
792
|
connectable: hasConnect && hasDisconnect && isSolana
|
|
758
793
|
};
|
|
@@ -797,6 +832,9 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
797
832
|
__publicField(this, "walletChangeUnsub", null);
|
|
798
833
|
__publicField(this, "pollTimer", null);
|
|
799
834
|
__publicField(this, "pollAttempts", 0);
|
|
835
|
+
__publicField(this, "connectAttemptId", 0);
|
|
836
|
+
__publicField(this, "pendingWallet", null);
|
|
837
|
+
__publicField(this, "pendingWalletName", null);
|
|
800
838
|
this.walletStorage = walletStorage;
|
|
801
839
|
}
|
|
802
840
|
/**
|
|
@@ -804,8 +842,8 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
804
842
|
*/
|
|
805
843
|
async connect(wallet, walletName) {
|
|
806
844
|
if (typeof window > "u") return;
|
|
807
|
-
let name = walletName || wallet.name;
|
|
808
|
-
this.eventEmitter.emit({
|
|
845
|
+
let name = walletName || wallet.name, attemptId = ++this.connectAttemptId;
|
|
846
|
+
this.pendingWallet = wallet, this.pendingWalletName = name, this.eventEmitter.emit({
|
|
809
847
|
type: "connecting",
|
|
810
848
|
wallet: name,
|
|
811
849
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
@@ -813,7 +851,10 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
813
851
|
try {
|
|
814
852
|
let connect = getConnectFeature(wallet);
|
|
815
853
|
if (!connect) throw new Error(`Wallet ${name} does not support standard connect`);
|
|
816
|
-
let result = await connect({ silent: false })
|
|
854
|
+
let result = await connect({ silent: false });
|
|
855
|
+
if (attemptId !== this.connectAttemptId)
|
|
856
|
+
throw new Error("Connection cancelled");
|
|
857
|
+
let walletAccounts = wallet.accounts, accountMap = /* @__PURE__ */ new Map();
|
|
817
858
|
for (let a of [...walletAccounts, ...result.accounts]) accountMap.set(a.address, a);
|
|
818
859
|
let accounts = Array.from(accountMap.values()).map((a) => this.toAccountInfo(a)), state = this.getState(), previouslySelected = state.selectedAccount, previousAddresses = new Set(state.accounts.map((a) => a.address)), selected = accounts.find((a) => !previousAddresses.has(a.address))?.address ?? previouslySelected ?? accounts[0]?.address ?? null;
|
|
819
860
|
this.stateManager.updateState(
|
|
@@ -840,6 +881,8 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
840
881
|
accountsCount: accounts.length
|
|
841
882
|
}), this.walletStorage && (!("isAvailable" in this.walletStorage) || typeof this.walletStorage.isAvailable != "function" || this.walletStorage.isAvailable() ? this.walletStorage.set(name) : this.log("Storage not available (private browsing?), skipping wallet persistence")), this.subscribeToWalletEvents();
|
|
842
883
|
} catch (e) {
|
|
884
|
+
if (attemptId !== this.connectAttemptId)
|
|
885
|
+
throw e;
|
|
843
886
|
let errorMessage = e instanceof Error ? e.message : String(e);
|
|
844
887
|
throw this.eventEmitter.emit({
|
|
845
888
|
type: "connection:failed",
|
|
@@ -861,22 +904,21 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
861
904
|
},
|
|
862
905
|
true
|
|
863
906
|
), e;
|
|
907
|
+
} finally {
|
|
908
|
+
this.pendingWallet === wallet && this.pendingWalletName === name && (this.pendingWallet = null, this.pendingWalletName = null);
|
|
864
909
|
}
|
|
865
910
|
}
|
|
866
911
|
/**
|
|
867
912
|
* Disconnect from wallet
|
|
868
913
|
*/
|
|
869
914
|
async disconnect() {
|
|
870
|
-
this.walletChangeUnsub && (this.walletChangeUnsub(), this.walletChangeUnsub = null), this.stopPollingWalletAccounts();
|
|
871
|
-
let wallet = this.getState().selectedWallet;
|
|
872
|
-
if (
|
|
873
|
-
let disconnect = getDisconnectFeature(wallet);
|
|
874
|
-
disconnect && await disconnect();
|
|
875
|
-
}
|
|
876
|
-
this.stateManager.updateState(
|
|
915
|
+
this.connectAttemptId++, this.walletChangeUnsub && (this.walletChangeUnsub(), this.walletChangeUnsub = null), this.stopPollingWalletAccounts();
|
|
916
|
+
let wallet = this.getState().selectedWallet ?? this.pendingWallet;
|
|
917
|
+
if (this.pendingWallet = null, this.pendingWalletName = null, this.stateManager.updateState(
|
|
877
918
|
{
|
|
878
919
|
selectedWallet: null,
|
|
879
920
|
connected: false,
|
|
921
|
+
connecting: false,
|
|
880
922
|
accounts: [],
|
|
881
923
|
selectedAccount: null
|
|
882
924
|
},
|
|
@@ -884,7 +926,14 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
884
926
|
), this.eventEmitter.emit({
|
|
885
927
|
type: "wallet:disconnected",
|
|
886
928
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
887
|
-
}), this.walletStorage && "clear" in this.walletStorage && typeof this.walletStorage.clear == "function" ? this.walletStorage.clear() : this.walletStorage?.set(void 0)
|
|
929
|
+
}), this.walletStorage && "clear" in this.walletStorage && typeof this.walletStorage.clear == "function" ? this.walletStorage.clear() : this.walletStorage?.set(void 0), wallet) {
|
|
930
|
+
let disconnect = getDisconnectFeature(wallet);
|
|
931
|
+
if (disconnect)
|
|
932
|
+
try {
|
|
933
|
+
await disconnect();
|
|
934
|
+
} catch {
|
|
935
|
+
}
|
|
936
|
+
}
|
|
888
937
|
}
|
|
889
938
|
/**
|
|
890
939
|
* Select a different account
|
|
@@ -1092,12 +1141,12 @@ var logger4 = createLogger("AutoConnector"), MIN_ADDRESS_LENGTH = 30, AutoConnec
|
|
|
1092
1141
|
],
|
|
1093
1142
|
features,
|
|
1094
1143
|
accounts: []
|
|
1095
|
-
};
|
|
1144
|
+
}, walletWithIcon = applyWalletIconOverride(wallet);
|
|
1096
1145
|
this.stateManager.updateState(
|
|
1097
1146
|
{
|
|
1098
1147
|
wallets: [
|
|
1099
1148
|
{
|
|
1100
|
-
wallet,
|
|
1149
|
+
wallet: walletWithIcon,
|
|
1101
1150
|
installed: true,
|
|
1102
1151
|
connectable: true
|
|
1103
1152
|
}
|
|
@@ -1105,7 +1154,7 @@ var logger4 = createLogger("AutoConnector"), MIN_ADDRESS_LENGTH = 30, AutoConnec
|
|
|
1105
1154
|
},
|
|
1106
1155
|
true
|
|
1107
1156
|
), await ready;
|
|
1108
|
-
let walletsApi = getWalletsRegistry(), registryWallet = walletsApi.get().find((w) => w.name === storedWalletName), walletToUse = registryWallet ||
|
|
1157
|
+
let walletsApi = getWalletsRegistry(), registryWallet = walletsApi.get().find((w) => w.name === storedWalletName), walletToUse = applyWalletIconOverride(registryWallet || walletWithIcon);
|
|
1109
1158
|
return this.debug && logger4.info("Attempting to connect via instant auto-connect", {
|
|
1110
1159
|
walletName: storedWalletName,
|
|
1111
1160
|
usingRegistry: !!registryWallet
|
|
@@ -1319,6 +1368,7 @@ var logger5 = createLogger("ConnectorClient"), ConnectorClient = class {
|
|
|
1319
1368
|
__publicField(this, "healthMonitor");
|
|
1320
1369
|
__publicField(this, "initialized", false);
|
|
1321
1370
|
__publicField(this, "config");
|
|
1371
|
+
__publicField(this, "walletConnectRegistration", null);
|
|
1322
1372
|
this.config = config;
|
|
1323
1373
|
let initialState = {
|
|
1324
1374
|
wallets: [],
|
|
@@ -1362,7 +1412,9 @@ var logger5 = createLogger("ConnectorClient"), ConnectorClient = class {
|
|
|
1362
1412
|
initialize() {
|
|
1363
1413
|
if (typeof window > "u" || this.initialized) return;
|
|
1364
1414
|
let { error } = tryCatchSync(() => {
|
|
1365
|
-
this.walletDetector.initialize(), this.config.
|
|
1415
|
+
this.walletDetector.initialize(), this.config.walletConnect?.enabled && this.initializeWalletConnect().catch((err) => {
|
|
1416
|
+
this.config.debug && logger5.error("WalletConnect initialization failed", { error: err });
|
|
1417
|
+
}), this.config.autoConnect && setTimeout(() => {
|
|
1366
1418
|
this.autoConnector.attemptAutoConnect().catch((err) => {
|
|
1367
1419
|
this.config.debug && logger5.error("Auto-connect error", { error: err });
|
|
1368
1420
|
});
|
|
@@ -1370,6 +1422,19 @@ var logger5 = createLogger("ConnectorClient"), ConnectorClient = class {
|
|
|
1370
1422
|
});
|
|
1371
1423
|
error && this.config.debug && logger5.error("Connector initialization failed", { error });
|
|
1372
1424
|
}
|
|
1425
|
+
/**
|
|
1426
|
+
* Initialize WalletConnect integration
|
|
1427
|
+
* Dynamically imports and registers the WalletConnect wallet
|
|
1428
|
+
*/
|
|
1429
|
+
async initializeWalletConnect() {
|
|
1430
|
+
if (this.config.walletConnect?.enabled)
|
|
1431
|
+
try {
|
|
1432
|
+
let { registerWalletConnectWallet } = await import('./walletconnect-I3PZUBTA.mjs');
|
|
1433
|
+
this.walletConnectRegistration = await registerWalletConnectWallet(this.config.walletConnect), this.config.debug && logger5.info("WalletConnect wallet registered successfully");
|
|
1434
|
+
} catch (error) {
|
|
1435
|
+
this.config.debug && logger5.error("Failed to register WalletConnect wallet", { error });
|
|
1436
|
+
}
|
|
1437
|
+
}
|
|
1373
1438
|
async select(walletName) {
|
|
1374
1439
|
let wallet = this.stateManager.getSnapshot().wallets.find((w) => w.wallet.name === walletName)?.wallet;
|
|
1375
1440
|
if (!wallet) throw new Error(`Wallet ${walletName} not found`);
|
|
@@ -1462,6 +1527,12 @@ var logger5 = createLogger("ConnectorClient"), ConnectorClient = class {
|
|
|
1462
1527
|
this.debugMetrics.resetMetrics();
|
|
1463
1528
|
}
|
|
1464
1529
|
destroy() {
|
|
1530
|
+
if (this.walletConnectRegistration)
|
|
1531
|
+
try {
|
|
1532
|
+
this.walletConnectRegistration.unregister(), this.walletConnectRegistration = null;
|
|
1533
|
+
} catch (error) {
|
|
1534
|
+
this.config.debug && logger5.warn("Error unregistering WalletConnect wallet", { error });
|
|
1535
|
+
}
|
|
1465
1536
|
this.connectionManager.disconnect().catch(() => {
|
|
1466
1537
|
}), this.walletDetector.destroy(), this.eventEmitter.offAll(), this.stateManager.clear();
|
|
1467
1538
|
}
|
|
@@ -1764,6 +1835,355 @@ function getPolyfillStatus() {
|
|
|
1764
1835
|
environment: typeof window < "u" ? "browser" : "server"
|
|
1765
1836
|
};
|
|
1766
1837
|
}
|
|
1838
|
+
var logger8 = createLogger("EnhancedStorage"), STORAGE_VERSION = "v1", EnhancedStorage = class extends Storage {
|
|
1839
|
+
constructor(key, initial, options) {
|
|
1840
|
+
super(key, initial);
|
|
1841
|
+
this.options = options;
|
|
1842
|
+
__publicField(this, "errorHandlers", /* @__PURE__ */ new Set());
|
|
1843
|
+
__publicField(this, "validators", []);
|
|
1844
|
+
__publicField(this, "memoryFallback");
|
|
1845
|
+
this.memoryFallback = initial, options?.onError && this.errorHandlers.add(options.onError), options?.validator && this.validators.push(options.validator);
|
|
1846
|
+
}
|
|
1847
|
+
set(value) {
|
|
1848
|
+
try {
|
|
1849
|
+
return this.validate(value) ? (super.set(value), this.memoryFallback = value, true) : (logger8.warn("Validation failed", { key: this.key }), false);
|
|
1850
|
+
} catch (error) {
|
|
1851
|
+
return this.handleError(error), this.options?.useMemoryFallback ? (this.memoryFallback = value, true) : false;
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
get() {
|
|
1855
|
+
try {
|
|
1856
|
+
return super.get();
|
|
1857
|
+
} catch (error) {
|
|
1858
|
+
return this.handleError(error), this.options?.useMemoryFallback ? this.memoryFallback : this.initial;
|
|
1859
|
+
}
|
|
1860
|
+
}
|
|
1861
|
+
validate(value) {
|
|
1862
|
+
return this.validators.every((validator) => validator(value));
|
|
1863
|
+
}
|
|
1864
|
+
addValidator(validator) {
|
|
1865
|
+
return this.validators.push(validator), this;
|
|
1866
|
+
}
|
|
1867
|
+
onError(handler) {
|
|
1868
|
+
return this.errorHandlers.add(handler), this;
|
|
1869
|
+
}
|
|
1870
|
+
transform(transformer) {
|
|
1871
|
+
return transformer(this.get());
|
|
1872
|
+
}
|
|
1873
|
+
reset() {
|
|
1874
|
+
this.set(this.initial);
|
|
1875
|
+
}
|
|
1876
|
+
clear() {
|
|
1877
|
+
try {
|
|
1878
|
+
typeof window < "u" && window.localStorage && window.localStorage.removeItem(this.key), this.reset();
|
|
1879
|
+
} catch (error) {
|
|
1880
|
+
this.handleError(error);
|
|
1881
|
+
}
|
|
1882
|
+
}
|
|
1883
|
+
isAvailable() {
|
|
1884
|
+
try {
|
|
1885
|
+
if (typeof window > "u") return false;
|
|
1886
|
+
let testKey = `__storage_test_${this.key}__`;
|
|
1887
|
+
return window.localStorage.setItem(testKey, "test"), window.localStorage.removeItem(testKey), true;
|
|
1888
|
+
} catch {
|
|
1889
|
+
return false;
|
|
1890
|
+
}
|
|
1891
|
+
}
|
|
1892
|
+
static migrate(oldKey, newStorage) {
|
|
1893
|
+
try {
|
|
1894
|
+
if (typeof window > "u") return false;
|
|
1895
|
+
let oldValue = window.localStorage.getItem(oldKey);
|
|
1896
|
+
if (oldValue) {
|
|
1897
|
+
let parsed = JSON.parse(oldValue);
|
|
1898
|
+
return newStorage.set(parsed), window.localStorage.removeItem(oldKey), true;
|
|
1899
|
+
}
|
|
1900
|
+
return false;
|
|
1901
|
+
} catch {
|
|
1902
|
+
return false;
|
|
1903
|
+
}
|
|
1904
|
+
}
|
|
1905
|
+
handleError(error) {
|
|
1906
|
+
logger8.error("Storage error", { key: this.key, error }), this.errorHandlers.forEach((handler) => {
|
|
1907
|
+
try {
|
|
1908
|
+
handler(error);
|
|
1909
|
+
} catch (err) {
|
|
1910
|
+
logger8.error("Error in error handler", { error: err });
|
|
1911
|
+
}
|
|
1912
|
+
});
|
|
1913
|
+
}
|
|
1914
|
+
};
|
|
1915
|
+
function createEnhancedStorageAccount(options) {
|
|
1916
|
+
let key = options?.key ?? `connector-kit:${STORAGE_VERSION}:account`;
|
|
1917
|
+
return new EnhancedStorage(key, options?.initial, {
|
|
1918
|
+
validator: options?.validator,
|
|
1919
|
+
onError: options?.onError,
|
|
1920
|
+
useMemoryFallback: true
|
|
1921
|
+
// Always fallback for SSR
|
|
1922
|
+
});
|
|
1923
|
+
}
|
|
1924
|
+
function createEnhancedStorageCluster(options) {
|
|
1925
|
+
let key = options?.key ?? `connector-kit:${STORAGE_VERSION}:cluster`, storage = new EnhancedStorage(key, options?.initial ?? "solana:mainnet", {
|
|
1926
|
+
onError: options?.onError,
|
|
1927
|
+
useMemoryFallback: true
|
|
1928
|
+
});
|
|
1929
|
+
return options?.validClusters && storage.addValidator((clusterId) => options.validClusters.includes(clusterId)), storage;
|
|
1930
|
+
}
|
|
1931
|
+
function createEnhancedStorageWallet(options) {
|
|
1932
|
+
let key = options?.key ?? `connector-kit:${STORAGE_VERSION}:wallet`;
|
|
1933
|
+
return new EnhancedStorage(key, options?.initial, {
|
|
1934
|
+
onError: options?.onError,
|
|
1935
|
+
useMemoryFallback: true
|
|
1936
|
+
});
|
|
1937
|
+
}
|
|
1938
|
+
var EnhancedStorageAdapter = class {
|
|
1939
|
+
constructor(storage) {
|
|
1940
|
+
this.storage = storage;
|
|
1941
|
+
}
|
|
1942
|
+
get() {
|
|
1943
|
+
return this.storage.get();
|
|
1944
|
+
}
|
|
1945
|
+
set(value) {
|
|
1946
|
+
this.storage.set(value);
|
|
1947
|
+
}
|
|
1948
|
+
subscribe(callback) {
|
|
1949
|
+
return this.storage.value.subscribe(callback);
|
|
1950
|
+
}
|
|
1951
|
+
validate(value) {
|
|
1952
|
+
return this.storage.validate(value);
|
|
1953
|
+
}
|
|
1954
|
+
reset() {
|
|
1955
|
+
this.storage.reset();
|
|
1956
|
+
}
|
|
1957
|
+
clear() {
|
|
1958
|
+
this.storage.clear();
|
|
1959
|
+
}
|
|
1960
|
+
isAvailable() {
|
|
1961
|
+
return this.storage.isAvailable();
|
|
1962
|
+
}
|
|
1963
|
+
transform(transformer) {
|
|
1964
|
+
return this.storage.transform(transformer);
|
|
1965
|
+
}
|
|
1966
|
+
addValidator(validator) {
|
|
1967
|
+
return this.storage.addValidator(validator), this;
|
|
1968
|
+
}
|
|
1969
|
+
onError(handler) {
|
|
1970
|
+
return this.storage.onError(handler), this;
|
|
1971
|
+
}
|
|
1972
|
+
};
|
|
1973
|
+
var logger9 = createLogger("DefaultConfig");
|
|
1974
|
+
function getDefaultConfig(options) {
|
|
1975
|
+
let {
|
|
1976
|
+
appName,
|
|
1977
|
+
appUrl,
|
|
1978
|
+
autoConnect = true,
|
|
1979
|
+
debug,
|
|
1980
|
+
network = "mainnet-beta",
|
|
1981
|
+
enableMobile = true,
|
|
1982
|
+
storage,
|
|
1983
|
+
clusters,
|
|
1984
|
+
customClusters = [],
|
|
1985
|
+
persistClusterSelection = true,
|
|
1986
|
+
clusterStorageKey,
|
|
1987
|
+
enableErrorBoundary = true,
|
|
1988
|
+
maxRetries = DEFAULT_MAX_RETRIES,
|
|
1989
|
+
onError,
|
|
1990
|
+
imageProxy,
|
|
1991
|
+
programLabels,
|
|
1992
|
+
coingecko,
|
|
1993
|
+
walletConnect
|
|
1994
|
+
} = options, defaultClusters = clusters ?? [
|
|
1995
|
+
createSolanaMainnet(),
|
|
1996
|
+
createSolanaDevnet(),
|
|
1997
|
+
createSolanaTestnet(),
|
|
1998
|
+
...network === "localnet" ? [createSolanaLocalnet()] : [],
|
|
1999
|
+
...customClusters || []
|
|
2000
|
+
], validClusterIds = defaultClusters.map((c) => c.id), accountStorage = createEnhancedStorageAccount({
|
|
2001
|
+
validator: (address) => address ? isAddress(address) : true,
|
|
2002
|
+
onError: (error) => {
|
|
2003
|
+
debug && logger9.error("Account Storage error", { error }), onError && onError(error, {
|
|
2004
|
+
componentStack: "account-storage"
|
|
2005
|
+
});
|
|
2006
|
+
}
|
|
2007
|
+
}), clusterStorage = createEnhancedStorageCluster({
|
|
2008
|
+
key: clusterStorageKey,
|
|
2009
|
+
initial: getInitialCluster(network),
|
|
2010
|
+
validClusters: persistClusterSelection ? validClusterIds : void 0,
|
|
2011
|
+
onError: (error) => {
|
|
2012
|
+
debug && logger9.error("Cluster Storage error", { error }), onError && onError(error, {
|
|
2013
|
+
componentStack: "cluster-storage"
|
|
2014
|
+
});
|
|
2015
|
+
}
|
|
2016
|
+
}), walletStorage = createEnhancedStorageWallet({
|
|
2017
|
+
onError: (error) => {
|
|
2018
|
+
debug && logger9.error("Wallet Storage error", { error }), onError && onError(error, {
|
|
2019
|
+
componentStack: "wallet-storage"
|
|
2020
|
+
});
|
|
2021
|
+
}
|
|
2022
|
+
});
|
|
2023
|
+
if (typeof window < "u") {
|
|
2024
|
+
let oldAccountKey = "connector-kit:account", oldWalletKey = "connector-kit:wallet", oldClusterKey = clusterStorageKey || "connector-kit:cluster";
|
|
2025
|
+
EnhancedStorage.migrate(oldAccountKey, accountStorage), EnhancedStorage.migrate(oldWalletKey, walletStorage), EnhancedStorage.migrate(oldClusterKey, clusterStorage);
|
|
2026
|
+
}
|
|
2027
|
+
let defaultStorage = storage ?? {
|
|
2028
|
+
account: new EnhancedStorageAdapter(accountStorage),
|
|
2029
|
+
cluster: new EnhancedStorageAdapter(clusterStorage),
|
|
2030
|
+
wallet: new EnhancedStorageAdapter(walletStorage)
|
|
2031
|
+
}, walletConnectConfig = buildWalletConnectConfig(walletConnect, appName, appUrl, clusterStorageKey ?? "connector-kit:v1:cluster");
|
|
2032
|
+
return {
|
|
2033
|
+
autoConnect,
|
|
2034
|
+
debug: debug ?? process.env.NODE_ENV === "development",
|
|
2035
|
+
storage: defaultStorage,
|
|
2036
|
+
appName,
|
|
2037
|
+
appUrl,
|
|
2038
|
+
enableMobile,
|
|
2039
|
+
network,
|
|
2040
|
+
cluster: {
|
|
2041
|
+
clusters: defaultClusters,
|
|
2042
|
+
persistSelection: persistClusterSelection,
|
|
2043
|
+
initialCluster: getInitialCluster(network)
|
|
2044
|
+
},
|
|
2045
|
+
errorBoundary: {
|
|
2046
|
+
enabled: enableErrorBoundary,
|
|
2047
|
+
maxRetries,
|
|
2048
|
+
onError
|
|
2049
|
+
},
|
|
2050
|
+
imageProxy,
|
|
2051
|
+
programLabels,
|
|
2052
|
+
coingecko,
|
|
2053
|
+
walletConnect: walletConnectConfig
|
|
2054
|
+
};
|
|
2055
|
+
}
|
|
2056
|
+
function buildWalletConnectConfig(walletConnect, appName, appUrl, clusterStorageKey) {
|
|
2057
|
+
if (!walletConnect) return;
|
|
2058
|
+
let configProjectId = typeof walletConnect == "object" ? walletConnect.projectId : void 0, envProjectId = typeof process < "u" ? process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID : void 0, projectId = configProjectId || envProjectId;
|
|
2059
|
+
if (!projectId) {
|
|
2060
|
+
(typeof walletConnect == "object" || walletConnect === true) && logger9.warn("WalletConnect enabled but no project ID found. Set NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID or provide projectId in config.");
|
|
2061
|
+
return;
|
|
2062
|
+
}
|
|
2063
|
+
let origin = appUrl || (typeof window < "u" ? window.location.origin : "http://localhost:3000"), customMetadata = typeof walletConnect == "object" ? walletConnect.metadata : void 0, customDefaultChain = typeof walletConnect == "object" ? walletConnect.defaultChain : void 0, customRelayUrl = typeof walletConnect == "object" ? walletConnect.relayUrl : void 0;
|
|
2064
|
+
return {
|
|
2065
|
+
enabled: true,
|
|
2066
|
+
projectId,
|
|
2067
|
+
metadata: {
|
|
2068
|
+
name: customMetadata?.name ?? appName,
|
|
2069
|
+
description: customMetadata?.description ?? `${appName} - Powered by ConnectorKit`,
|
|
2070
|
+
url: customMetadata?.url ?? origin,
|
|
2071
|
+
icons: customMetadata?.icons ?? [`${origin}/icon.svg`]
|
|
2072
|
+
},
|
|
2073
|
+
defaultChain: customDefaultChain ?? "solana:mainnet",
|
|
2074
|
+
relayUrl: customRelayUrl,
|
|
2075
|
+
// Auto-sync with cluster storage
|
|
2076
|
+
getCurrentChain: () => {
|
|
2077
|
+
if (typeof window > "u") return "solana:mainnet";
|
|
2078
|
+
let storageKey = clusterStorageKey || "connector-kit:v1:cluster";
|
|
2079
|
+
try {
|
|
2080
|
+
let stored = localStorage.getItem(storageKey);
|
|
2081
|
+
if (stored) {
|
|
2082
|
+
let id = JSON.parse(stored);
|
|
2083
|
+
if (id === "solana:mainnet" || id === "solana:devnet" || id === "solana:testnet")
|
|
2084
|
+
return id;
|
|
2085
|
+
}
|
|
2086
|
+
} catch {
|
|
2087
|
+
}
|
|
2088
|
+
return customDefaultChain ?? "solana:mainnet";
|
|
2089
|
+
}
|
|
2090
|
+
// Note: onDisplayUri, onSessionEstablished, onSessionDisconnected are auto-wired by AppProvider
|
|
2091
|
+
};
|
|
2092
|
+
}
|
|
2093
|
+
function getInitialCluster(network = "mainnet-beta") {
|
|
2094
|
+
return toClusterId(network);
|
|
2095
|
+
}
|
|
2096
|
+
function getDefaultMobileConfig(options) {
|
|
2097
|
+
let baseUrl = options.appUrl || (typeof window < "u" ? window.location.origin : "https://localhost:3000");
|
|
2098
|
+
return {
|
|
2099
|
+
appIdentity: {
|
|
2100
|
+
name: options.appName,
|
|
2101
|
+
uri: baseUrl,
|
|
2102
|
+
icon: `${baseUrl}/favicon.ico`
|
|
2103
|
+
},
|
|
2104
|
+
cluster: options.network || "mainnet-beta"
|
|
2105
|
+
};
|
|
2106
|
+
}
|
|
2107
|
+
var solanaNetworkSchema = z.enum(["mainnet", "mainnet-beta", "devnet", "testnet", "localnet"]), solanaClusterIdSchema = z.string().regex(/^solana:(mainnet|devnet|testnet|localnet|[a-zA-Z0-9-]+)$/, {
|
|
2108
|
+
message: 'Cluster ID must be in format "solana:<network>" (e.g., "solana:mainnet")'
|
|
2109
|
+
}), urlSchema = z.string().url("Invalid URL format"), optionalUrlSchema = urlSchema.optional(), coinGeckoConfigSchema = z.strictObject({
|
|
2110
|
+
apiKey: z.string().optional(),
|
|
2111
|
+
isPro: z.boolean().optional(),
|
|
2112
|
+
maxRetries: z.number().int().positive().max(10).optional(),
|
|
2113
|
+
baseDelay: z.number().int().positive().max(3e4).optional(),
|
|
2114
|
+
maxTimeout: z.number().int().positive().max(12e4).optional()
|
|
2115
|
+
}).optional(), walletConnectMetadataSchema = z.object({
|
|
2116
|
+
name: z.string().min(1, "WalletConnect app name is required"),
|
|
2117
|
+
description: z.string(),
|
|
2118
|
+
url: urlSchema,
|
|
2119
|
+
icons: z.array(z.string())
|
|
2120
|
+
}), walletConnectObjectConfigSchema = z.object({
|
|
2121
|
+
enabled: z.boolean().optional(),
|
|
2122
|
+
projectId: z.string().min(1, "WalletConnect projectId is required"),
|
|
2123
|
+
metadata: walletConnectMetadataSchema,
|
|
2124
|
+
defaultChain: z.enum(["solana:mainnet", "solana:devnet", "solana:testnet"]).optional(),
|
|
2125
|
+
onDisplayUri: z.custom((val) => typeof val == "function").optional(),
|
|
2126
|
+
onSessionEstablished: z.custom((val) => typeof val == "function").optional(),
|
|
2127
|
+
onSessionDisconnected: z.custom((val) => typeof val == "function").optional(),
|
|
2128
|
+
relayUrl: urlSchema.optional()
|
|
2129
|
+
}), walletConnectConfigSchema = z.union([z.literal(true), walletConnectObjectConfigSchema]).optional(), storageAdapterSchema = z.looseObject({
|
|
2130
|
+
get: z.custom((val) => typeof val == "function"),
|
|
2131
|
+
set: z.custom((val) => typeof val == "function")
|
|
2132
|
+
}), storageConfigSchema = z.object({
|
|
2133
|
+
account: storageAdapterSchema,
|
|
2134
|
+
cluster: storageAdapterSchema,
|
|
2135
|
+
wallet: storageAdapterSchema
|
|
2136
|
+
}).optional(), solanaClusterSchema = z.object({
|
|
2137
|
+
id: solanaClusterIdSchema,
|
|
2138
|
+
label: z.string().min(1, "Cluster label cannot be empty"),
|
|
2139
|
+
url: urlSchema,
|
|
2140
|
+
urlWs: urlSchema.optional()
|
|
2141
|
+
}), clusterConfigSchema = z.object({
|
|
2142
|
+
clusters: z.array(solanaClusterSchema).optional(),
|
|
2143
|
+
persistSelection: z.boolean().optional(),
|
|
2144
|
+
initialCluster: solanaClusterIdSchema.optional()
|
|
2145
|
+
}).optional(), defaultConfigOptionsSchema = z.object({
|
|
2146
|
+
// Required
|
|
2147
|
+
appName: z.string().min(1, "Application name is required"),
|
|
2148
|
+
// Optional strings
|
|
2149
|
+
appUrl: optionalUrlSchema,
|
|
2150
|
+
imageProxy: z.string().optional(),
|
|
2151
|
+
clusterStorageKey: z.string().optional(),
|
|
2152
|
+
// Optional booleans
|
|
2153
|
+
autoConnect: z.boolean().optional(),
|
|
2154
|
+
debug: z.boolean().optional(),
|
|
2155
|
+
enableMobile: z.boolean().optional(),
|
|
2156
|
+
persistClusterSelection: z.boolean().optional(),
|
|
2157
|
+
enableErrorBoundary: z.boolean().optional(),
|
|
2158
|
+
// Network
|
|
2159
|
+
network: solanaNetworkSchema.optional(),
|
|
2160
|
+
// Numbers
|
|
2161
|
+
maxRetries: z.number().int().positive().max(10).optional(),
|
|
2162
|
+
// Complex types
|
|
2163
|
+
storage: storageConfigSchema,
|
|
2164
|
+
clusters: z.array(solanaClusterSchema).optional(),
|
|
2165
|
+
customClusters: z.array(solanaClusterSchema).optional(),
|
|
2166
|
+
programLabels: z.record(z.string(), z.string()).optional(),
|
|
2167
|
+
coingecko: coinGeckoConfigSchema,
|
|
2168
|
+
walletConnect: walletConnectConfigSchema,
|
|
2169
|
+
// Functions (can't validate implementation, just existence)
|
|
2170
|
+
onError: z.custom((val) => typeof val == "function").optional()
|
|
2171
|
+
}); z.strictObject({
|
|
2172
|
+
autoConnect: z.boolean().optional(),
|
|
2173
|
+
debug: z.boolean().optional(),
|
|
2174
|
+
storage: storageConfigSchema,
|
|
2175
|
+
cluster: clusterConfigSchema,
|
|
2176
|
+
imageProxy: z.string().optional(),
|
|
2177
|
+
programLabels: z.record(z.string(), z.string()).optional(),
|
|
2178
|
+
coingecko: coinGeckoConfigSchema,
|
|
2179
|
+
walletConnect: walletConnectConfigSchema
|
|
2180
|
+
}).optional();
|
|
2181
|
+
function validateConfigOptions(options) {
|
|
2182
|
+
return defaultConfigOptionsSchema.safeParse(options);
|
|
2183
|
+
}
|
|
2184
|
+
function parseConfigOptions(options) {
|
|
2185
|
+
return defaultConfigOptionsSchema.parse(options);
|
|
2186
|
+
}
|
|
1767
2187
|
|
|
1768
2188
|
// src/utils/formatting.ts
|
|
1769
2189
|
function formatAddress(address, options = {}) {
|
|
@@ -1975,7 +2395,7 @@ async function copySignatureToClipboard(signature, options) {
|
|
|
1975
2395
|
}
|
|
1976
2396
|
|
|
1977
2397
|
// src/lib/transaction/transaction-validator.ts
|
|
1978
|
-
var
|
|
2398
|
+
var logger10 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232, MIN_TRANSACTION_SIZE = 64, TransactionValidator = class {
|
|
1979
2399
|
/**
|
|
1980
2400
|
* Validate a transaction before signing
|
|
1981
2401
|
*
|
|
@@ -1998,7 +2418,7 @@ var logger8 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232,
|
|
|
1998
2418
|
try {
|
|
1999
2419
|
serialized = transaction.serialize();
|
|
2000
2420
|
} catch (serializeError) {
|
|
2001
|
-
|
|
2421
|
+
logger10.debug("Transaction not yet serializable (may need signing)", {
|
|
2002
2422
|
error: serializeError instanceof Error ? serializeError.message : String(serializeError)
|
|
2003
2423
|
});
|
|
2004
2424
|
}
|
|
@@ -2008,10 +2428,10 @@ var logger8 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232,
|
|
|
2008
2428
|
return errors.push(
|
|
2009
2429
|
"Transaction type not recognized - must be a Transaction object with serialize() or Uint8Array"
|
|
2010
2430
|
), { valid: false, errors, warnings };
|
|
2011
|
-
serialized && (size = serialized.length, size > maxSize && (errors.push(`Transaction too large: ${size} bytes (max ${maxSize} bytes)`),
|
|
2431
|
+
serialized && (size = serialized.length, size > maxSize && (errors.push(`Transaction too large: ${size} bytes (max ${maxSize} bytes)`), logger10.warn("Transaction exceeds maximum size", { size, maxSize })), size < minSize && warnings.push(`Transaction is very small: ${size} bytes (min recommended ${minSize} bytes)`), size === 0 && errors.push("Transaction is empty (0 bytes)"), this.hasSuspiciousPattern(serialized) && warnings.push("Transaction contains unusual patterns - please review carefully"));
|
|
2012
2432
|
} catch (error) {
|
|
2013
2433
|
let errorMessage = error instanceof Error ? error.message : String(error);
|
|
2014
|
-
errors.push(`Transaction validation failed: ${errorMessage}`),
|
|
2434
|
+
errors.push(`Transaction validation failed: ${errorMessage}`), logger10.error("Validation error", { error: errorMessage });
|
|
2015
2435
|
}
|
|
2016
2436
|
if (checkDuplicateSignatures && typeof transaction == "object" && "signatures" in transaction) {
|
|
2017
2437
|
let signatures = transaction.signatures;
|
|
@@ -2024,7 +2444,7 @@ var logger8 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232,
|
|
|
2024
2444
|
}
|
|
2025
2445
|
strict && warnings.length > 0 && (errors.push(...warnings.map((w) => `Strict mode: ${w}`)), warnings.length = 0);
|
|
2026
2446
|
let valid = errors.length === 0;
|
|
2027
|
-
return valid ? warnings.length > 0 ?
|
|
2447
|
+
return valid ? warnings.length > 0 ? logger10.debug("Transaction validation passed with warnings", { warnings, size }) : logger10.debug("Transaction validation passed", { size }) : logger10.warn("Transaction validation failed", { errors, size }), {
|
|
2028
2448
|
valid,
|
|
2029
2449
|
errors,
|
|
2030
2450
|
warnings,
|
|
@@ -2064,7 +2484,7 @@ var logger8 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232,
|
|
|
2064
2484
|
let result = this.validate(transaction, options);
|
|
2065
2485
|
if (!result.valid)
|
|
2066
2486
|
throw new Error(`Transaction validation failed: ${result.errors.join(", ")}`);
|
|
2067
|
-
result.warnings.length > 0 &&
|
|
2487
|
+
result.warnings.length > 0 && logger10.warn("Transaction validation warnings", { warnings: result.warnings });
|
|
2068
2488
|
}
|
|
2069
2489
|
/**
|
|
2070
2490
|
* Batch validate multiple transactions
|
|
@@ -2075,10 +2495,10 @@ var logger8 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232,
|
|
|
2075
2495
|
* @returns Array of validation results
|
|
2076
2496
|
*/
|
|
2077
2497
|
static validateBatch(transactions, options) {
|
|
2078
|
-
return transactions.map((tx, index) => (
|
|
2498
|
+
return transactions.map((tx, index) => (logger10.debug(`Validating transaction ${index + 1}/${transactions.length}`), this.validate(tx, options)));
|
|
2079
2499
|
}
|
|
2080
2500
|
};
|
|
2081
|
-
var
|
|
2501
|
+
var logger11 = createLogger("TransactionSigner");
|
|
2082
2502
|
function signatureBytesToBase58(bytes) {
|
|
2083
2503
|
if (bytes.length !== 64)
|
|
2084
2504
|
throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);
|
|
@@ -2116,11 +2536,11 @@ function createTransactionSigner(config) {
|
|
|
2116
2536
|
throw Errors.featureNotSupported("transaction signing");
|
|
2117
2537
|
let validation = TransactionValidator.validate(transaction);
|
|
2118
2538
|
if (!validation.valid)
|
|
2119
|
-
throw
|
|
2120
|
-
validation.warnings.length > 0 &&
|
|
2539
|
+
throw logger11.error("Transaction validation failed", { errors: validation.errors }), Errors.invalidTransaction(validation.errors.join(", "));
|
|
2540
|
+
validation.warnings.length > 0 && logger11.warn("Transaction validation warnings", { warnings: validation.warnings });
|
|
2121
2541
|
try {
|
|
2122
2542
|
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } = prepareTransactionForWallet(transaction);
|
|
2123
|
-
|
|
2543
|
+
logger11.debug("Signing transaction", {
|
|
2124
2544
|
wasWeb3js,
|
|
2125
2545
|
serializedLength: serialized.length,
|
|
2126
2546
|
serializedType: serialized.constructor.name,
|
|
@@ -2129,26 +2549,26 @@ function createTransactionSigner(config) {
|
|
|
2129
2549
|
});
|
|
2130
2550
|
let result, usedFormat = "";
|
|
2131
2551
|
try {
|
|
2132
|
-
|
|
2552
|
+
logger11.debug("Trying array format: transactions: [Uint8Array]"), result = await signFeature.signTransaction({
|
|
2133
2553
|
account,
|
|
2134
2554
|
transactions: [serialized],
|
|
2135
2555
|
...cluster ? { chain: cluster.id } : {}
|
|
2136
2556
|
}), usedFormat = "array";
|
|
2137
2557
|
} catch (err1) {
|
|
2138
2558
|
let error1 = err1 instanceof Error ? err1 : new Error(String(err1));
|
|
2139
|
-
|
|
2559
|
+
logger11.debug("Array format failed, trying singular format", { error: error1.message });
|
|
2140
2560
|
try {
|
|
2141
|
-
|
|
2561
|
+
logger11.debug("Trying singular format: transaction: Uint8Array"), result = await signFeature.signTransaction({
|
|
2142
2562
|
account,
|
|
2143
2563
|
transaction: serialized,
|
|
2144
2564
|
...cluster ? { chain: cluster.id } : {}
|
|
2145
2565
|
}), usedFormat = "singular";
|
|
2146
2566
|
} catch (err2) {
|
|
2147
2567
|
let error2 = err2 instanceof Error ? err2 : new Error(String(err2));
|
|
2148
|
-
throw
|
|
2568
|
+
throw logger11.error("Both array and singular formats failed", { error: error2.message }), error2;
|
|
2149
2569
|
}
|
|
2150
2570
|
}
|
|
2151
|
-
|
|
2571
|
+
logger11.debug("Wallet signed successfully", { format: usedFormat });
|
|
2152
2572
|
let signedTx;
|
|
2153
2573
|
if (Array.isArray(result.signedTransactions) && result.signedTransactions[0])
|
|
2154
2574
|
signedTx = result.signedTransactions[0];
|
|
@@ -2160,23 +2580,23 @@ function createTransactionSigner(config) {
|
|
|
2160
2580
|
signedTx = result;
|
|
2161
2581
|
else
|
|
2162
2582
|
throw new Error(`Unexpected wallet response format: ${JSON.stringify(Object.keys(result))}`);
|
|
2163
|
-
if (
|
|
2583
|
+
if (logger11.debug("Extracted signed transaction", {
|
|
2164
2584
|
hasSignedTx: !!signedTx,
|
|
2165
2585
|
signedTxType: signedTx?.constructor?.name,
|
|
2166
2586
|
signedTxLength: signedTx?.length,
|
|
2167
2587
|
isUint8Array: signedTx instanceof Uint8Array,
|
|
2168
2588
|
hasSerialize: typeof signedTx?.serialize == "function"
|
|
2169
2589
|
}), signedTx && typeof signedTx.serialize == "function")
|
|
2170
|
-
return
|
|
2590
|
+
return logger11.debug("Wallet returned web3.js object directly, no conversion needed"), signedTx;
|
|
2171
2591
|
if (signedTx && signedTx.signedTransaction) {
|
|
2172
|
-
|
|
2592
|
+
logger11.debug("Found signedTransaction property");
|
|
2173
2593
|
let bytes = signedTx.signedTransaction;
|
|
2174
2594
|
if (bytes instanceof Uint8Array)
|
|
2175
2595
|
return await convertSignedTransaction(bytes, wasWeb3js);
|
|
2176
2596
|
}
|
|
2177
2597
|
if (signedTx instanceof Uint8Array)
|
|
2178
2598
|
return await convertSignedTransaction(signedTx, wasWeb3js);
|
|
2179
|
-
throw
|
|
2599
|
+
throw logger11.error("Unexpected wallet response format", {
|
|
2180
2600
|
type: typeof signedTx,
|
|
2181
2601
|
constructor: signedTx?.constructor?.name
|
|
2182
2602
|
}), new ValidationError(
|
|
@@ -2196,9 +2616,15 @@ function createTransactionSigner(config) {
|
|
|
2196
2616
|
account,
|
|
2197
2617
|
transactions: serializedTxs,
|
|
2198
2618
|
...cluster ? { chain: cluster.id } : {}
|
|
2199
|
-
});
|
|
2619
|
+
}), signedBytesArray;
|
|
2620
|
+
if (Array.isArray(result))
|
|
2621
|
+
signedBytesArray = result.map((item) => item.signedTransaction);
|
|
2622
|
+
else if ("signedTransactions" in result)
|
|
2623
|
+
signedBytesArray = result.signedTransactions;
|
|
2624
|
+
else
|
|
2625
|
+
throw new Error("Unexpected signAllTransactions response format");
|
|
2200
2626
|
return await Promise.all(
|
|
2201
|
-
|
|
2627
|
+
signedBytesArray.map(
|
|
2202
2628
|
(signedBytes) => convertSignedTransaction(signedBytes, wasWeb3js)
|
|
2203
2629
|
)
|
|
2204
2630
|
);
|
|
@@ -2317,7 +2743,7 @@ var TransactionSignerError = class extends TransactionError {
|
|
|
2317
2743
|
function isTransactionSignerError(error) {
|
|
2318
2744
|
return error instanceof TransactionSignerError || error instanceof TransactionError;
|
|
2319
2745
|
}
|
|
2320
|
-
var
|
|
2746
|
+
var logger12 = createLogger("KitTransactionSigner");
|
|
2321
2747
|
function encodeShortVecLength(value) {
|
|
2322
2748
|
let bytes = [], remaining = value;
|
|
2323
2749
|
for (; remaining >= 128; )
|
|
@@ -2392,7 +2818,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2392
2818
|
async modifyAndSignTransactions(transactions) {
|
|
2393
2819
|
let transactionData = transactions.map((tx) => {
|
|
2394
2820
|
let messageBytes = new Uint8Array(tx.messageBytes), { numSigners } = parseMessageSigners(messageBytes), wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);
|
|
2395
|
-
return
|
|
2821
|
+
return logger12.debug("Preparing wire format for wallet", {
|
|
2396
2822
|
signerAddress,
|
|
2397
2823
|
messageBytesLength: messageBytes.length,
|
|
2398
2824
|
wireFormatLength: wireFormat.length,
|
|
@@ -2421,14 +2847,14 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2421
2847
|
throw new Error("Web3.js transaction without serialize method");
|
|
2422
2848
|
} else
|
|
2423
2849
|
throw new Error("Unknown signed transaction format");
|
|
2424
|
-
if (
|
|
2850
|
+
if (logger12.debug("Wallet returned signed transaction", {
|
|
2425
2851
|
returnedLength: signedTxBytes.length,
|
|
2426
2852
|
sentLength: wireFormat.length,
|
|
2427
2853
|
lengthsMatch: signedTxBytes.length === wireFormat.length,
|
|
2428
2854
|
signedFirstBytes: Array.from(signedTxBytes.slice(0, 20)),
|
|
2429
2855
|
sentFirstBytes: Array.from(wireFormat.slice(0, 20))
|
|
2430
2856
|
}), signedTxBytes.length !== wireFormat.length) {
|
|
2431
|
-
|
|
2857
|
+
logger12.warn("Wallet modified transaction! Using wallet version", {
|
|
2432
2858
|
originalLength: wireFormat.length,
|
|
2433
2859
|
modifiedLength: signedTxBytes.length,
|
|
2434
2860
|
difference: signedTxBytes.length - wireFormat.length
|
|
@@ -2439,13 +2865,13 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2439
2865
|
lifetimeConstraint: originalWithLifetime.lifetimeConstraint
|
|
2440
2866
|
} : {}
|
|
2441
2867
|
};
|
|
2442
|
-
return
|
|
2868
|
+
return logger12.debug("Using modified transaction from wallet", {
|
|
2443
2869
|
modifiedMessageBytesLength: walletTransaction.messageBytes.length,
|
|
2444
2870
|
signatures: Object.keys(walletTransaction.signatures)
|
|
2445
2871
|
}), assertIsTransactionWithinSizeLimit(result), result;
|
|
2446
2872
|
}
|
|
2447
2873
|
let extractedSignatureBytes = extractSignature(signedTxBytes), signatureBase58 = getBase58Decoder().decode(extractedSignatureBytes);
|
|
2448
|
-
|
|
2874
|
+
logger12.debug("Extracted signature from wallet (unmodified)", {
|
|
2449
2875
|
signerAddress,
|
|
2450
2876
|
signatureLength: extractedSignatureBytes.length,
|
|
2451
2877
|
signatureBase58
|
|
@@ -2460,7 +2886,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2460
2886
|
};
|
|
2461
2887
|
return assertIsTransactionWithinSizeLimit(signedTransaction), signedTransaction;
|
|
2462
2888
|
} catch (error) {
|
|
2463
|
-
return
|
|
2889
|
+
return logger12.error("Failed to decode signed transaction", { error }), assertIsTransactionWithinSizeLimit(originalTransaction), originalTransaction;
|
|
2464
2890
|
}
|
|
2465
2891
|
});
|
|
2466
2892
|
}
|
|
@@ -2468,6 +2894,6 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2468
2894
|
}
|
|
2469
2895
|
var createGillTransactionSigner = createKitTransactionSigner;
|
|
2470
2896
|
|
|
2471
|
-
export { ClipboardErrorType, ConnectorClient, ConnectorErrorBoundary,
|
|
2472
|
-
//# sourceMappingURL=chunk-
|
|
2473
|
-
//# sourceMappingURL=chunk-
|
|
2897
|
+
export { ClipboardErrorType, ConnectorClient, ConnectorErrorBoundary, EnhancedStorage, EnhancedStorageAdapter, PUBLIC_RPC_ENDPOINTS, TransactionSignerError, WalletErrorType, copyAddressToClipboard, copySignatureToClipboard, copyToClipboard, createEnhancedStorageAccount, createEnhancedStorageCluster, createEnhancedStorageWallet, createGillTransactionSigner, createKitTransactionSigner, createTransactionSigner, formatAddress, formatBigIntBalance, formatBigIntUsd, formatLamportsToSolSafe, formatNumber, formatSOL, formatTokenAmount, formatTokenBalanceSafe, getAddressUrl, getBlockUrl, getChainIdForWalletStandard, getClusterChainId, getClusterExplorerUrl, getClusterName, getClusterRpcUrl, getClusterType, getDefaultConfig, getDefaultMobileConfig, getDefaultRpcUrl, getNetworkDisplayName, getPolyfillStatus, getTokenUrl, getTransactionUrl, getWalletsRegistry, installPolyfills, isClipboardAvailable, isCryptoAvailable, isDevnet, isDevnetCluster, isLocalCluster, isLocalnet, isMainnet, isMainnetCluster, isPolyfillInstalled, isTestnet, isTestnetCluster, isTransactionSignerError, normalizeNetwork, parseConfigOptions, ready, toClusterId, truncate, validateConfigOptions, withErrorBoundary };
|
|
2898
|
+
//# sourceMappingURL=chunk-QOIQBWMP.mjs.map
|
|
2899
|
+
//# sourceMappingURL=chunk-QOIQBWMP.mjs.map
|