@solana/connector 0.1.10 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +344 -88
- package/dist/{chunk-MN7XNCYI.js → chunk-BJAVJQLK.js} +6 -6
- package/dist/{chunk-MN7XNCYI.js.map → chunk-BJAVJQLK.js.map} +1 -1
- package/dist/{chunk-6AJJJG5B.js → chunk-BZ2VBJCZ.js} +618 -415
- package/dist/chunk-BZ2VBJCZ.js.map +1 -0
- package/dist/{chunk-ATYK5OKR.js → chunk-EM4KNOKG.js} +614 -194
- package/dist/chunk-EM4KNOKG.js.map +1 -0
- package/dist/{chunk-4JT24DIX.js → chunk-HN5AJF7F.js} +61 -20
- package/dist/chunk-HN5AJF7F.js.map +1 -0
- package/dist/{chunk-FVA4TUI4.mjs → chunk-HPQ5T32K.mjs} +4 -4
- package/dist/{chunk-FVA4TUI4.mjs.map → chunk-HPQ5T32K.mjs.map} +1 -1
- package/dist/{chunk-QOIQBWMP.mjs → chunk-IDTUFDNB.mjs} +531 -339
- package/dist/chunk-IDTUFDNB.mjs.map +1 -0
- package/dist/{chunk-WGZYKDXF.mjs → chunk-RTXUS5KG.mjs} +529 -115
- package/dist/chunk-RTXUS5KG.mjs.map +1 -0
- package/dist/{chunk-64LV76OK.js → chunk-SITQ4JWM.js} +23 -2
- package/dist/chunk-SITQ4JWM.js.map +1 -0
- package/dist/{chunk-7XHVZW2L.mjs → chunk-UCISIAOG.mjs} +60 -19
- package/dist/chunk-UCISIAOG.mjs.map +1 -0
- package/dist/{chunk-DKCZA2QI.mjs → chunk-ZZTY3O4N.mjs} +21 -3
- package/dist/chunk-ZZTY3O4N.mjs.map +1 -0
- package/dist/compat.d.mts +1 -1
- package/dist/compat.d.ts +1 -1
- package/dist/compat.js +2 -2
- package/dist/compat.mjs +1 -1
- package/dist/headless.d.mts +25 -7
- package/dist/headless.d.ts +25 -7
- package/dist/headless.js +196 -132
- package/dist/headless.mjs +4 -4
- package/dist/index.d.mts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +255 -175
- package/dist/index.mjs +5 -5
- package/dist/react.d.mts +230 -8
- package/dist/react.d.ts +230 -8
- package/dist/react.js +78 -42
- package/dist/react.mjs +2 -2
- package/dist/{standard-shim-BTUm7cur.d.mts → standard-shim-CGB88PPO.d.mts} +396 -54
- package/dist/{standard-shim-LsQ97i9T.d.ts → standard-shim-tmnQelaJ.d.ts} +396 -54
- package/dist/{transaction-signer-T-KVQFi8.d.ts → transaction-signer-7NaYmP5w.d.mts} +1 -0
- package/dist/{transaction-signer-T-KVQFi8.d.mts → transaction-signer-7NaYmP5w.d.ts} +1 -0
- package/dist/{walletconnect-D4JN6H2O.js → walletconnect-447EY3OJ.js} +8 -8
- package/dist/{walletconnect-D4JN6H2O.js.map → walletconnect-447EY3OJ.js.map} +1 -1
- package/dist/walletconnect-U455PO4I.mjs +3 -0
- package/dist/{walletconnect-I3PZUBTA.mjs.map → walletconnect-U455PO4I.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/chunk-4JT24DIX.js.map +0 -1
- package/dist/chunk-64LV76OK.js.map +0 -1
- package/dist/chunk-6AJJJG5B.js.map +0 -1
- package/dist/chunk-7XHVZW2L.mjs.map +0 -1
- package/dist/chunk-ATYK5OKR.js.map +0 -1
- package/dist/chunk-DKCZA2QI.mjs.map +0 -1
- package/dist/chunk-QOIQBWMP.mjs.map +0 -1
- package/dist/chunk-WGZYKDXF.mjs.map +0 -1
- package/dist/walletconnect-I3PZUBTA.mjs +0 -3
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { tryCatchSync, isWeb3jsTransaction, prepareTransactionForWallet, convertSignedTransaction } from './chunk-HO6QNKFM.mjs';
|
|
2
|
-
import { createLogger, getPublicSolanaRpcUrl, getExplorerLink, __publicField, TransactionError, Errors, ValidationError
|
|
3
|
-
import { Component, useTransition, useState, useCallback, useMemo } from 'react';
|
|
4
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { createLogger, getPublicSolanaRpcUrl, getExplorerLink, __publicField, TransactionError, Errors, ValidationError } from './chunk-ZZTY3O4N.mjs';
|
|
5
3
|
import { install } from '@solana/webcrypto-ed25519-polyfill';
|
|
6
4
|
import { Storage, createSolanaMainnet, createSolanaDevnet, createSolanaTestnet, createSolanaLocalnet } from '@wallet-ui/core';
|
|
7
5
|
import { isAddress, address } from '@solana/addresses';
|
|
@@ -9,6 +7,49 @@ import { z } from 'zod/v4';
|
|
|
9
7
|
import { getBase58Decoder } from '@solana/codecs';
|
|
10
8
|
import { getTransactionDecoder, assertIsTransactionWithinSizeLimit } from '@solana/transactions';
|
|
11
9
|
|
|
10
|
+
// src/types/session.ts
|
|
11
|
+
function createConnectorId(walletName) {
|
|
12
|
+
return `wallet-standard:${walletName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "")}`;
|
|
13
|
+
}
|
|
14
|
+
function isWalletConnectorId(value) {
|
|
15
|
+
return typeof value == "string" && (value.startsWith("wallet-standard:") || value === "walletconnect" || value.startsWith("mwa:"));
|
|
16
|
+
}
|
|
17
|
+
function getWalletNameFromConnectorId(connectorId) {
|
|
18
|
+
return connectorId === "walletconnect" ? "WalletConnect" : connectorId.startsWith("mwa:") ? connectorId.slice(4) : connectorId.startsWith("wallet-standard:") ? connectorId.slice(16).split("-").map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join(" ") : connectorId;
|
|
19
|
+
}
|
|
20
|
+
function isDisconnected(status) {
|
|
21
|
+
return status.status === "disconnected";
|
|
22
|
+
}
|
|
23
|
+
function isConnecting(status) {
|
|
24
|
+
return status.status === "connecting";
|
|
25
|
+
}
|
|
26
|
+
function isConnected(status) {
|
|
27
|
+
return status.status === "connected";
|
|
28
|
+
}
|
|
29
|
+
function isStatusError(status) {
|
|
30
|
+
return status.status === "error";
|
|
31
|
+
}
|
|
32
|
+
var isWalletStatusError = isStatusError, INITIAL_WALLET_STATUS = {
|
|
33
|
+
status: "disconnected"
|
|
34
|
+
};
|
|
35
|
+
function toLegacyWalletState(wallet) {
|
|
36
|
+
switch (wallet.status) {
|
|
37
|
+
case "disconnected":
|
|
38
|
+
return { connected: false, connecting: false, selectedAccount: null, accounts: [] };
|
|
39
|
+
case "connecting":
|
|
40
|
+
return { connected: false, connecting: true, selectedAccount: null, accounts: [] };
|
|
41
|
+
case "connected":
|
|
42
|
+
return {
|
|
43
|
+
connected: true,
|
|
44
|
+
connecting: false,
|
|
45
|
+
selectedAccount: wallet.session.selectedAccount.address,
|
|
46
|
+
accounts: wallet.session.accounts.map((a) => ({ address: a.address, label: a.label }))
|
|
47
|
+
};
|
|
48
|
+
case "error":
|
|
49
|
+
return { connected: false, connecting: false, selectedAccount: null, accounts: [] };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
12
53
|
// src/lib/wallet/standard-shim.ts
|
|
13
54
|
var registry = null, registryInitPromise = null, registryInitResolve = null, ready = new Promise((resolve, reject) => {
|
|
14
55
|
if (typeof window > "u") {
|
|
@@ -624,7 +665,7 @@ var logger2 = createLogger("WalletAuthenticity"), WalletAuthenticityVerifier = c
|
|
|
624
665
|
};
|
|
625
666
|
|
|
626
667
|
// src/lib/wallet/wallet-icon-overrides.ts
|
|
627
|
-
var PHANTOM_ICON = "data:image/svg+xml;base64,
|
|
668
|
+
var PHANTOM_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjOTc4NkU0Ii8+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF80NF82MTApIj4KPHBhdGggZD0iTTUuNzY1NSAxNS43OTdDNS43NjU1IDE3LjIyMiA2LjQ5ODc5IDE3LjU1IDcuMjYxNDEgMTcuNTVDOC44NzQ2MyAxNy41NSAxMC4wODcgMTYuMDg0MSAxMC44MTA1IDE0LjkyNTZDMTAuNzIyNSAxNS4xODE5IDEwLjY3MzYgMTUuNDM4MiAxMC42NzM2IDE1LjY4NDJDMTAuNjczNiAxNi4zNjA5IDExLjA0NTIgMTYuODQyNyAxMS43Nzg1IDE2Ljg0MjdDMTIuNzg1NSAxNi44NDI3IDEzLjg2MSAxNS45MiAxNC40MTgzIDE0LjkyNTZDMTQuMzc5MiAxNS4wNjkyIDE0LjM1OTYgMTUuMjAyNCAxNC4zNTk2IDE1LjMyNTRDMTQuMzU5NiAxNS43OTcgMTQuNjEzOCAxNi4wOTQzIDE1LjEzMiAxNi4wOTQzQzE2Ljc2NDggMTYuMDk0MyAxOC40MDc0IDEzLjA3MDEgMTguNDA3NCAxMC40MjUyQzE4LjQwNzQgOC4zNjQ1OSAxNy40MTAxIDYuNTUwMDUgMTQuOTA3MSA2LjU1MDA1QzEwLjUwNzQgNi41NTAwNSA1Ljc2NTUgMTIuMTY3OSA1Ljc2NTUgMTUuNzk3Wk0xMy4zOTE3IDEwLjE5OTZDMTMuMzkxNyA5LjY4NzA1IDEzLjY2NTQgOS4zMjgyNSAxNC4wNjYzIDkuMzI4MjVDMTQuNDU3NCA5LjMyODI1IDE0LjczMTIgOS42ODcwNSAxNC43MzEyIDEwLjE5OTZDMTQuNzMxMiAxMC43MTIyIDE0LjQ1NzQgMTEuMDgxMyAxNC4wNjYzIDExLjA4MTNDMTMuNjY1NCAxMS4wODEzIDEzLjM5MTcgMTAuNzEyMiAxMy4zOTE3IDEwLjE5OTZaTTE1LjQ4NCAxMC4xOTk2QzE1LjQ4NCA5LjY4NzA1IDE1Ljc1NzggOS4zMjgyNSAxNi4xNTg2IDkuMzI4MjVDMTYuNTQ5NyA5LjMyODI1IDE2LjgyMzUgOS42ODcwNSAxNi44MjM1IDEwLjE5OTZDMTYuODIzNSAxMC43MTIyIDE2LjU0OTcgMTEuMDgxMyAxNi4xNTg2IDExLjA4MTNDMTUuNzU3OCAxMS4wODEzIDE1LjQ4NCAxMC43MTIyIDE1LjQ4NCAxMC4xOTk2WiIgZmlsbD0iI0ZFRkRGOCIvPgo8L2c+CjxkZWZzPgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzQ0XzYxMCI+CjxyZWN0IHdpZHRoPSIxMi43NiIgaGVpZ2h0PSIxMSIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDUuNzA2NDIgNi41NDk5MykiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4=", SOLFLARE_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjRkZFRjQ2Ii8+CjxwYXRoIGQ9Ik0xMi4xMjg1IDEyLjUyNjZMMTIuOTU1NiAxMS43Mjc2TDE0LjQ5NzYgMTIuMjMyM0MxNS41MDcgMTIuNTY4NyAxNi4wMTE3IDEzLjE4NTUgMTYuMDExNyAxNC4wNTQ3QzE2LjAxMTcgMTQuNzEzNiAxNS43NTkzIDE1LjE0ODIgMTUuMjU0NyAxNS43MDg5TDE1LjEwMDUgMTUuODc3MUwxNS4xNTY1IDE1LjQ4NDZDMTUuMzgwOCAxNC4wNTQ3IDE0Ljk2MDMgMTMuNDM3OSAxMy41NzI0IDEyLjk4OTJMMTIuMTI4NSAxMi41MjY2Wk0xMC4wNTM3IDcuNjM0MTRMMTQuMjU5MyA5LjAzNkwxMy4zNDgxIDkuOTA1MTdMMTEuMTYxMiA5LjE3NjE5QzEwLjQwNDIgOC45MjM4NSAxMC4xNTE4IDguNTE3MzEgMTAuMDUzNyA3LjY2MjE3VjcuNjM0MTRaTTkuODAxMzUgMTQuNzU1NkwxMC43NTQ2IDEzLjg0NDRMMTIuNTQ5MSAxNC40MzMyQzEzLjQ4ODMgMTQuNzQxNiAxMy44MTA3IDE1LjE0ODIgMTMuNzEyNiAxNi4xNzE1TDkuODAxMzUgMTQuNzU1NlpNOC41OTU3NyAxMC42OTAyQzguNTk1NzcgMTAuNDIzOSA4LjczNTk1IDEwLjE3MTUgOC45NzQyNyA5Ljk2MTIyQzkuMjI2NjEgMTAuMzI1NyA5LjY2MTE4IDEwLjY0ODEgMTAuMzQ4MSAxMC44NzI1TDExLjgzNDEgMTEuMzYzMUwxMS4wMDcgMTIuMTYyMkw5LjU0OTAzIDExLjY4NTVDOC44NzYxNCAxMS40NjEyIDguNTk1NzcgMTEuMTI0OCA4LjU5NTc3IDEwLjY5MDJaTTEyLjk5NzYgMTguMDVDMTYuMDgxNyAxNi4wMDMzIDE3LjczNTkgMTQuNjE1NCAxNy43MzU5IDEyLjkwNTJDMTcuNzM1OSAxMS43Njk2IDE3LjA2MyAxMS4xMzg4IDE1LjU3NzEgMTAuNjQ4MUwxNC40NTU2IDEwLjI2OTZMMTcuNTI1NyA3LjMyNTcyTDE2LjkwODggNi42NjY4NEwxNS45OTc2IDcuNDY1OUwxMS42OTM5IDYuMDUwMDJDMTAuMzYyMSA2LjQ4NDYgOC42Nzk4OCA3Ljc2MDMgOC42Nzk4OCA5LjAzNkM4LjY3OTg4IDkuMTc2MTggOC42OTM5IDkuMzE2MzcgOC43MzU5NSA5LjQ3MDU5QzcuNjI4NDcgMTAuMTAxNCA3LjE3OTg4IDEwLjY5MDIgNy4xNzk4OCAxMS40MTkxQzcuMTc5ODggMTIuMTA2MSA3LjU0NDM2IDEyLjc5MyA4LjcwNzkyIDEzLjE3MTVMOS42MzMxNCAxMy40Nzk5TDYuNDM2ODkgMTYuNTVMNy4wNTM3MSAxNy4yMDg5TDguMDQ5MDQgMTYuMjk3N0wxMi45OTc2IDE4LjA1WiIgZmlsbD0iIzAyMDUwQSIvPgo8L3N2Zz4=", BACKPACK_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiBmaWxsPSIjRTMzRTNGIi8+CjxwYXRoIGQ9Ik0xNS41MTg2IDEzLjkyNzJDMTUuOTgxMSAxMy45MjcyIDE2LjIxMjcgMTMuOTI3MSAxNi4zNTY0IDE0LjA3MDhDMTYuNTAwMiAxNC4yMTQ1IDE2LjUgMTQuNDQ2MiAxNi41IDE0LjkwODdWMTUuNTY0QzE2LjUgMTYuNDg5MyAxNi41MDAyIDE2Ljk1MjIgMTYuMjEyOSAxNy4yMzk3QzE1LjkyNTMgMTcuNTI3MyAxNS40NjE4IDE3LjUyNzggMTQuNTM2MSAxNy41Mjc4SDkuNDYzODdDOC41Mzg0MiAxNy41Mjc4IDguMDc1NjcgMTcuNTI3MSA3Ljc4ODA5IDE3LjIzOTdDNy41MDA1NCAxNi45NTIyIDcuNSAxNi40ODk0IDcuNSAxNS41NjRWMTQuOTA4N0M3LjUgMTQuNDQ2MiA3LjQ5OTgyIDE0LjIxNDUgNy42NDM1NSAxNC4wNzA4QzcuNzg3MyAxMy45MjcxIDguMDE4OTEgMTMuOTI3MiA4LjQ4MTQ1IDEzLjkyNzJIMTUuNTE4NlpNMTIgNi4zNTg4OUMxNi41NjUzIDYuMzU4ODkgMTYuNSA5LjQwMjM4IDE2LjUgMTAuODU4OVYxMi40OTU2QzE2LjQ5OTkgMTIuNzY2NyAxNi4yNzk5IDEyLjk4NjggMTYuMDA4OCAxMi45ODY4SDcuOTkxMjFDNy43MjAxMiAxMi45ODY4IDcuNTAwMDYgMTIuNzY2NyA3LjUgMTIuNDk1NkM3LjUgMTIuNDk1NiA3LjUgMTIuMzE1MyA3LjUgMTAuODU4OUM3LjQ5OTk5IDkuNDAyMzkgNy40MzQ3OCA2LjM1ODkzIDEyIDYuMzU4ODlaTTEyIDcuNTE5MDRDMTEuMjMxOSA3LjUxOTEgMTAuNjA5NCA4LjE0MTU1IDEwLjYwOTQgOC45MDk2N0MxMC42MDk0IDkuNjc3NzggMTEuMjMxOSAxMC4zMDAyIDEyIDEwLjMwMDNDMTIuNzY4MiAxMC4zMDAzIDEzLjM5MDYgOS42Nzc4MiAxMy4zOTA2IDguOTA5NjdDMTMuMzkwNiA4LjE0MTUxIDEyLjc2ODIgNy41MTkwNCAxMiA3LjUxOTA0Wk0xMS45OTkgNC40NzIxN0MxMi45ODQxIDQuNDcyMjIgMTMuODQ2MiA0LjgxNjczIDE0LjA3NDIgNS4zNzc0NEMxNC4xMDg1IDUuNDczODcgMTQuMTI1OCA1LjUyMjIyIDE0LjA5NTcgNS41NTgxMUMxNC4wNjUyIDUuNTk0MDIgMTQuMDA1OCA1LjU4MzQyIDEzLjg4NzcgNS41NjIwMUMxMy41ODIyIDUuNTA2NjUgMTMuMTQ5MyA1LjQ2ODc3IDEyLjc2ODYgNS40NTc1MkMxMi41MjU4IDUuNDQ0NDggMTIuMjY5NSA1LjQzNzk5IDEyIDUuNDM3OTlDMTEuNzMwNSA1LjQzNzk5IDExLjQ3NDIgNS40NDQ0OCAxMS4yMzE0IDUuNDU3NTJDMTAuODQ5IDUuNDY4NzcgMTAuNDE0OSA1LjUwNjU4IDEwLjEwODQgNS41NjAwNkM5Ljk5MzM1IDUuNTgwMTMgOS45MzU2NSA1LjU5MDQ3IDkuOTA1MjcgNS41NTUxOEM5Ljg3NDk3IDUuNTE5MzUgOS44OTEyOCA1LjQ3MTQ0IDkuOTI0OCA1LjM3NjQ2QzEwLjE1MSA0LjgxNzQ4IDExLjAxNDIgNC40NzIxNyAxMS45OTkgNC40NzIxN1oiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPg==", WALLET_ICON_OVERRIDES = {
|
|
628
669
|
Phantom: PHANTOM_ICON,
|
|
629
670
|
Solflare: SOLFLARE_ICON,
|
|
630
671
|
Backpack: BACKPACK_ICON
|
|
@@ -657,6 +698,9 @@ function applyWalletIconOverride(wallet) {
|
|
|
657
698
|
|
|
658
699
|
// src/lib/wallet/detector.ts
|
|
659
700
|
var logger3 = createLogger("WalletDetector");
|
|
701
|
+
function isSolanaWallet(wallet) {
|
|
702
|
+
return Array.isArray(wallet.chains) && wallet.chains.some((chain) => typeof chain == "string" && chain.startsWith("solana:"));
|
|
703
|
+
}
|
|
660
704
|
function hasFeature(wallet, featureName) {
|
|
661
705
|
return wallet.features != null && wallet.features[featureName] !== void 0;
|
|
662
706
|
}
|
|
@@ -679,6 +723,8 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
679
723
|
constructor(stateManager, eventEmitter, debug = false) {
|
|
680
724
|
super({ stateManager, eventEmitter, debug }, "WalletDetector");
|
|
681
725
|
__publicField(this, "unsubscribers", []);
|
|
726
|
+
/** Map from stable connector ID to Wallet reference (not stored in state) */
|
|
727
|
+
__publicField(this, "connectorRegistry", /* @__PURE__ */ new Map());
|
|
682
728
|
}
|
|
683
729
|
/**
|
|
684
730
|
* Initialize wallet detection (synchronous)
|
|
@@ -694,11 +740,10 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
694
740
|
if (!(typeof window > "u"))
|
|
695
741
|
try {
|
|
696
742
|
let walletsApi = getWalletsRegistry(), update = () => {
|
|
697
|
-
let
|
|
698
|
-
newCount !== previousCount && this.log("\u{1F50D} WalletDetector: found wallets:", newCount)
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
wallets: unique.map((w) => this.mapToWalletInfo(w))
|
|
743
|
+
let solanaWallets = walletsApi.get().filter(isSolanaWallet), unique = this.deduplicateWallets(solanaWallets), previousCount = this.getState().wallets.length, newCount = unique.length;
|
|
744
|
+
newCount !== previousCount && this.log("\u{1F50D} WalletDetector: found wallets:", newCount), this.updateConnectorRegistry(unique), this.stateManager.updateState({
|
|
745
|
+
wallets: unique.map((w) => this.mapToWalletInfo(w)),
|
|
746
|
+
connectors: unique.map((w) => this.mapToConnectorMetadata(w))
|
|
702
747
|
}), newCount !== previousCount && newCount > 0 && this.eventEmitter.emit({
|
|
703
748
|
type: "wallets:detected",
|
|
704
749
|
count: newCount,
|
|
@@ -776,20 +821,64 @@ var WalletDetector = class extends BaseCollaborator {
|
|
|
776
821
|
return null;
|
|
777
822
|
}
|
|
778
823
|
/**
|
|
779
|
-
* Get currently detected wallets
|
|
824
|
+
* Get currently detected wallets (legacy)
|
|
825
|
+
* @deprecated Use getConnectors() for vNext API
|
|
780
826
|
*/
|
|
781
827
|
getDetectedWallets() {
|
|
782
828
|
return this.getState().wallets;
|
|
783
829
|
}
|
|
784
830
|
/**
|
|
785
|
-
*
|
|
831
|
+
* Get all available connectors (vNext API)
|
|
832
|
+
*/
|
|
833
|
+
getConnectors() {
|
|
834
|
+
return this.getState().connectors;
|
|
835
|
+
}
|
|
836
|
+
/**
|
|
837
|
+
* Get a wallet by its stable connector ID (vNext API)
|
|
838
|
+
* Returns the Wallet reference for connection operations
|
|
839
|
+
*/
|
|
840
|
+
getConnectorById(connectorId) {
|
|
841
|
+
return this.connectorRegistry.get(connectorId);
|
|
842
|
+
}
|
|
843
|
+
/**
|
|
844
|
+
* Get connector metadata by ID
|
|
845
|
+
*/
|
|
846
|
+
getConnectorMetadata(connectorId) {
|
|
847
|
+
return this.getState().connectors.find((c) => c.id === connectorId);
|
|
848
|
+
}
|
|
849
|
+
/**
|
|
850
|
+
* Update the connector registry map
|
|
851
|
+
*/
|
|
852
|
+
updateConnectorRegistry(wallets) {
|
|
853
|
+
this.connectorRegistry.clear();
|
|
854
|
+
for (let wallet of wallets) {
|
|
855
|
+
let connectorId = createConnectorId(wallet.name);
|
|
856
|
+
this.connectorRegistry.set(connectorId, wallet);
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
/**
|
|
860
|
+
* Convert a Wallet Standard wallet to WalletConnectorMetadata (serializable)
|
|
861
|
+
*/
|
|
862
|
+
mapToConnectorMetadata(wallet) {
|
|
863
|
+
let walletWithIcon = applyWalletIconOverride(wallet), hasConnect = hasFeature(walletWithIcon, "standard:connect"), isSolana = isSolanaWallet(walletWithIcon), ready2 = hasConnect && isSolana;
|
|
864
|
+
return {
|
|
865
|
+
id: createConnectorId(wallet.name),
|
|
866
|
+
name: wallet.name,
|
|
867
|
+
icon: typeof walletWithIcon.icon == "string" ? walletWithIcon.icon : "",
|
|
868
|
+
ready: ready2,
|
|
869
|
+
chains: walletWithIcon.chains ?? [],
|
|
870
|
+
features: Object.keys(walletWithIcon.features ?? {})
|
|
871
|
+
};
|
|
872
|
+
}
|
|
873
|
+
/**
|
|
874
|
+
* Convert a Wallet Standard wallet to WalletInfo with capability checks (legacy)
|
|
786
875
|
*/
|
|
787
876
|
mapToWalletInfo(wallet) {
|
|
788
|
-
let walletWithIcon = applyWalletIconOverride(wallet), hasConnect = hasFeature(walletWithIcon, "standard:connect"),
|
|
877
|
+
let walletWithIcon = applyWalletIconOverride(wallet), hasConnect = hasFeature(walletWithIcon, "standard:connect"), isSolana = isSolanaWallet(walletWithIcon);
|
|
789
878
|
return {
|
|
790
879
|
wallet: walletWithIcon,
|
|
791
880
|
installed: true,
|
|
792
|
-
connectable: hasConnect &&
|
|
881
|
+
connectable: hasConnect && isSolana
|
|
793
882
|
};
|
|
794
883
|
}
|
|
795
884
|
/**
|
|
@@ -837,16 +926,232 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
837
926
|
__publicField(this, "pendingWalletName", null);
|
|
838
927
|
this.walletStorage = walletStorage;
|
|
839
928
|
}
|
|
929
|
+
// ========================================================================
|
|
930
|
+
// vNext Connection Methods (connector-id based, silent-first)
|
|
931
|
+
// ========================================================================
|
|
932
|
+
/**
|
|
933
|
+
* Connect to a wallet using the vNext API with silent-first support.
|
|
934
|
+
*
|
|
935
|
+
* @param wallet - Wallet Standard wallet instance
|
|
936
|
+
* @param connectorId - Stable connector identifier
|
|
937
|
+
* @param options - Connection options (silent mode, preferred account, etc.)
|
|
938
|
+
*/
|
|
939
|
+
async connectWallet(wallet, connectorId, options) {
|
|
940
|
+
if (typeof window > "u") return;
|
|
941
|
+
let attemptId = ++this.connectAttemptId;
|
|
942
|
+
this.pendingWallet = wallet, this.pendingWalletName = wallet.name;
|
|
943
|
+
let { silent = false, allowInteractiveFallback = true, preferredAccount } = options ?? {};
|
|
944
|
+
this.updateWalletStatus({
|
|
945
|
+
status: "connecting",
|
|
946
|
+
connectorId
|
|
947
|
+
}), this.stateManager.updateState({ connecting: true }, true), this.eventEmitter.emit({
|
|
948
|
+
type: "connecting",
|
|
949
|
+
wallet: wallet.name,
|
|
950
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
951
|
+
});
|
|
952
|
+
try {
|
|
953
|
+
let connect = getConnectFeature(wallet);
|
|
954
|
+
if (!connect) throw new Error(`Wallet ${wallet.name} does not support standard connect`);
|
|
955
|
+
let result;
|
|
956
|
+
if (silent)
|
|
957
|
+
try {
|
|
958
|
+
if (result = await connect({ silent: true }), attemptId !== this.connectAttemptId) throw new Error("Connection cancelled");
|
|
959
|
+
let hasAccounts = result.accounts.length > 0 || wallet.accounts.length > 0;
|
|
960
|
+
if (!hasAccounts && allowInteractiveFallback)
|
|
961
|
+
this.log("Silent connect returned no accounts, trying interactive..."), result = await connect({ silent: false });
|
|
962
|
+
else if (!hasAccounts)
|
|
963
|
+
throw new Error("Silent connection failed: no accounts returned");
|
|
964
|
+
} catch (silentError) {
|
|
965
|
+
if (attemptId !== this.connectAttemptId) throw new Error("Connection cancelled");
|
|
966
|
+
if (allowInteractiveFallback)
|
|
967
|
+
this.log("Silent connect failed, trying interactive...", silentError), result = await connect({ silent: false });
|
|
968
|
+
else
|
|
969
|
+
throw silentError;
|
|
970
|
+
}
|
|
971
|
+
else
|
|
972
|
+
result = await connect({ silent: false });
|
|
973
|
+
if (attemptId !== this.connectAttemptId) throw new Error("Connection cancelled");
|
|
974
|
+
let walletAccounts = wallet.accounts, accountMap = /* @__PURE__ */ new Map();
|
|
975
|
+
for (let a of [...walletAccounts, ...result.accounts]) accountMap.set(a.address, a);
|
|
976
|
+
let sessionAccounts = Array.from(accountMap.values()).map((a) => ({
|
|
977
|
+
address: a.address,
|
|
978
|
+
label: a.label,
|
|
979
|
+
account: a
|
|
980
|
+
})), legacyAccounts = sessionAccounts.map((a) => this.toAccountInfo(a.account)), selectedAccount = sessionAccounts[0];
|
|
981
|
+
if (preferredAccount) {
|
|
982
|
+
let preferred = sessionAccounts.find((a) => a.address === preferredAccount);
|
|
983
|
+
preferred && (selectedAccount = preferred);
|
|
984
|
+
}
|
|
985
|
+
let session = this.createSession(wallet, connectorId, sessionAccounts, selectedAccount);
|
|
986
|
+
this.updateWalletStatus({
|
|
987
|
+
status: "connected",
|
|
988
|
+
session
|
|
989
|
+
}), this.stateManager.updateState(
|
|
990
|
+
{
|
|
991
|
+
selectedWallet: wallet,
|
|
992
|
+
connected: true,
|
|
993
|
+
connecting: false,
|
|
994
|
+
accounts: legacyAccounts,
|
|
995
|
+
selectedAccount: selectedAccount?.address ?? null
|
|
996
|
+
},
|
|
997
|
+
true
|
|
998
|
+
), this.log("\u2705 Connection successful (vNext)", {
|
|
999
|
+
connectorId,
|
|
1000
|
+
selectedAccount: selectedAccount?.address,
|
|
1001
|
+
accountsCount: sessionAccounts.length
|
|
1002
|
+
}), selectedAccount && this.eventEmitter.emit({
|
|
1003
|
+
type: "wallet:connected",
|
|
1004
|
+
wallet: wallet.name,
|
|
1005
|
+
account: selectedAccount.address,
|
|
1006
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1007
|
+
}), this.walletStorage && (!("isAvailable" in this.walletStorage) || typeof this.walletStorage.isAvailable != "function" || this.walletStorage.isAvailable()) && this.walletStorage.set(wallet.name), this.subscribeToWalletEventsVNext(wallet, connectorId);
|
|
1008
|
+
} catch (e) {
|
|
1009
|
+
if (attemptId !== this.connectAttemptId) throw e;
|
|
1010
|
+
let errorMessage = e instanceof Error ? e.message : String(e), error = e instanceof Error ? e : new Error(errorMessage);
|
|
1011
|
+
throw this.updateWalletStatus({
|
|
1012
|
+
status: "error",
|
|
1013
|
+
error,
|
|
1014
|
+
connectorId,
|
|
1015
|
+
recoverable: this.isRecoverableError(error)
|
|
1016
|
+
}), this.stateManager.updateState(
|
|
1017
|
+
{
|
|
1018
|
+
selectedWallet: null,
|
|
1019
|
+
connected: false,
|
|
1020
|
+
connecting: false,
|
|
1021
|
+
accounts: [],
|
|
1022
|
+
selectedAccount: null
|
|
1023
|
+
},
|
|
1024
|
+
true
|
|
1025
|
+
), this.eventEmitter.emit({
|
|
1026
|
+
type: "connection:failed",
|
|
1027
|
+
wallet: wallet.name,
|
|
1028
|
+
error: errorMessage,
|
|
1029
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1030
|
+
}), e;
|
|
1031
|
+
} finally {
|
|
1032
|
+
this.pendingWallet === wallet && (this.pendingWallet = null, this.pendingWalletName = null);
|
|
1033
|
+
}
|
|
1034
|
+
}
|
|
1035
|
+
/**
|
|
1036
|
+
* Create a WalletSession object
|
|
1037
|
+
*/
|
|
1038
|
+
createSession(wallet, connectorId, accounts, selectedAccount) {
|
|
1039
|
+
let listeners = /* @__PURE__ */ new Set();
|
|
1040
|
+
return {
|
|
1041
|
+
connectorId,
|
|
1042
|
+
accounts,
|
|
1043
|
+
selectedAccount,
|
|
1044
|
+
onAccountsChanged: (listener) => (listeners.add(listener), () => listeners.delete(listener)),
|
|
1045
|
+
selectAccount: async (address) => {
|
|
1046
|
+
if (accounts.find((a) => a.address === address))
|
|
1047
|
+
return this.selectAccount(address);
|
|
1048
|
+
}
|
|
1049
|
+
};
|
|
1050
|
+
}
|
|
840
1051
|
/**
|
|
841
|
-
*
|
|
1052
|
+
* Update wallet status in state
|
|
1053
|
+
*/
|
|
1054
|
+
updateWalletStatus(status) {
|
|
1055
|
+
this.stateManager.updateState({ wallet: status });
|
|
1056
|
+
}
|
|
1057
|
+
/**
|
|
1058
|
+
* Subscribe to wallet events (vNext version with improved account change handling)
|
|
1059
|
+
*/
|
|
1060
|
+
subscribeToWalletEventsVNext(wallet, connectorId) {
|
|
1061
|
+
this.walletChangeUnsub && (this.walletChangeUnsub(), this.walletChangeUnsub = null), this.stopPollingWalletAccounts();
|
|
1062
|
+
let eventsOn = getEventsFeature(wallet);
|
|
1063
|
+
if (!eventsOn) {
|
|
1064
|
+
this.startPollingWalletAccountsVNext(wallet, connectorId);
|
|
1065
|
+
return;
|
|
1066
|
+
}
|
|
1067
|
+
try {
|
|
1068
|
+
this.walletChangeUnsub = eventsOn("change", (properties) => {
|
|
1069
|
+
let changeAccounts = properties?.accounts ?? [];
|
|
1070
|
+
this.handleAccountsChanged(changeAccounts, connectorId, wallet);
|
|
1071
|
+
});
|
|
1072
|
+
} catch {
|
|
1073
|
+
this.startPollingWalletAccountsVNext(wallet, connectorId);
|
|
1074
|
+
}
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* Handle accounts changed event with proper validation
|
|
1078
|
+
*/
|
|
1079
|
+
handleAccountsChanged(newAccounts, connectorId, wallet) {
|
|
1080
|
+
let state = this.getState();
|
|
1081
|
+
if (newAccounts.length === 0) {
|
|
1082
|
+
this.log("No accounts available, disconnecting..."), this.disconnect();
|
|
1083
|
+
return;
|
|
1084
|
+
}
|
|
1085
|
+
let sessionAccounts = newAccounts.map((a) => ({
|
|
1086
|
+
address: a.address,
|
|
1087
|
+
label: a.label,
|
|
1088
|
+
account: a
|
|
1089
|
+
})), legacyAccounts = sessionAccounts.map((a) => this.toAccountInfo(a.account)), currentSelected = state.selectedAccount, selectedAccount = sessionAccounts.find((a) => a.address === currentSelected);
|
|
1090
|
+
if (selectedAccount || (selectedAccount = sessionAccounts[0], this.eventEmitter.emit({
|
|
1091
|
+
type: "account:changed",
|
|
1092
|
+
account: selectedAccount.address,
|
|
1093
|
+
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1094
|
+
})), state.wallet.status === "connected") {
|
|
1095
|
+
let session = this.createSession(wallet, connectorId, sessionAccounts, selectedAccount);
|
|
1096
|
+
this.updateWalletStatus({
|
|
1097
|
+
status: "connected",
|
|
1098
|
+
session
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
this.stateManager.updateState({
|
|
1102
|
+
accounts: legacyAccounts,
|
|
1103
|
+
selectedAccount: selectedAccount.address
|
|
1104
|
+
});
|
|
1105
|
+
}
|
|
1106
|
+
/**
|
|
1107
|
+
* Start polling wallet accounts (vNext version)
|
|
1108
|
+
*/
|
|
1109
|
+
startPollingWalletAccountsVNext(wallet, connectorId) {
|
|
1110
|
+
if (this.pollTimer) return;
|
|
1111
|
+
this.pollAttempts = 0;
|
|
1112
|
+
let poll = () => {
|
|
1113
|
+
if (this.pollAttempts >= 20) {
|
|
1114
|
+
this.stopPollingWalletAccounts(), this.log("Stopped wallet polling after max attempts");
|
|
1115
|
+
return;
|
|
1116
|
+
}
|
|
1117
|
+
try {
|
|
1118
|
+
let walletAccounts = wallet.accounts;
|
|
1119
|
+
walletAccounts.length > 0 && (this.handleAccountsChanged(walletAccounts, connectorId, wallet), this.pollAttempts = 0);
|
|
1120
|
+
} catch (error) {
|
|
1121
|
+
this.log("Wallet polling error:", error);
|
|
1122
|
+
}
|
|
1123
|
+
this.pollAttempts++;
|
|
1124
|
+
let intervalIndex = Math.min(this.pollAttempts, POLL_INTERVALS_MS.length - 1), interval = POLL_INTERVALS_MS[intervalIndex];
|
|
1125
|
+
this.pollTimer = setTimeout(poll, interval);
|
|
1126
|
+
};
|
|
1127
|
+
poll();
|
|
1128
|
+
}
|
|
1129
|
+
/**
|
|
1130
|
+
* Check if an error is recoverable
|
|
1131
|
+
*/
|
|
1132
|
+
isRecoverableError(error) {
|
|
1133
|
+
let message = error.message.toLowerCase();
|
|
1134
|
+
return message.includes("user rejected") || message.includes("user denied") || message.includes("cancelled") || message.includes("canceled");
|
|
1135
|
+
}
|
|
1136
|
+
// ========================================================================
|
|
1137
|
+
// Legacy Connection Methods (kept for backwards compatibility)
|
|
1138
|
+
// ========================================================================
|
|
1139
|
+
/**
|
|
1140
|
+
* Connect to a wallet (legacy API)
|
|
1141
|
+
* @deprecated Use connectWallet() instead
|
|
842
1142
|
*/
|
|
843
1143
|
async connect(wallet, walletName) {
|
|
844
1144
|
if (typeof window > "u") return;
|
|
845
1145
|
let name = walletName || wallet.name, attemptId = ++this.connectAttemptId;
|
|
846
|
-
this.pendingWallet = wallet, this.pendingWalletName = name
|
|
1146
|
+
this.pendingWallet = wallet, this.pendingWalletName = name;
|
|
1147
|
+
let connectorId = createConnectorId(name);
|
|
1148
|
+
this.eventEmitter.emit({
|
|
847
1149
|
type: "connecting",
|
|
848
1150
|
wallet: name,
|
|
849
1151
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1152
|
+
}), this.updateWalletStatus({
|
|
1153
|
+
status: "connecting",
|
|
1154
|
+
connectorId
|
|
850
1155
|
}), this.stateManager.updateState({ connecting: true }, true);
|
|
851
1156
|
try {
|
|
852
1157
|
let connect = getConnectFeature(wallet);
|
|
@@ -856,8 +1161,18 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
856
1161
|
throw new Error("Connection cancelled");
|
|
857
1162
|
let walletAccounts = wallet.accounts, accountMap = /* @__PURE__ */ new Map();
|
|
858
1163
|
for (let a of [...walletAccounts, ...result.accounts]) accountMap.set(a.address, a);
|
|
859
|
-
let
|
|
860
|
-
|
|
1164
|
+
let sessionAccounts = Array.from(accountMap.values()).map((a) => ({
|
|
1165
|
+
address: a.address,
|
|
1166
|
+
label: a.label,
|
|
1167
|
+
account: a
|
|
1168
|
+
}));
|
|
1169
|
+
if (sessionAccounts.length === 0)
|
|
1170
|
+
throw new Error(`Wallet ${name} connected but returned no accounts`);
|
|
1171
|
+
let accounts = sessionAccounts.map((a) => this.toAccountInfo(a.account)), 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, selectedSessionAccount = (selected ? sessionAccounts.find((a) => a.address === selected) : void 0) ?? sessionAccounts[0], session = this.createSession(wallet, connectorId, sessionAccounts, selectedSessionAccount);
|
|
1172
|
+
this.updateWalletStatus({
|
|
1173
|
+
status: "connected",
|
|
1174
|
+
session
|
|
1175
|
+
}), this.stateManager.updateState(
|
|
861
1176
|
{
|
|
862
1177
|
selectedWallet: wallet,
|
|
863
1178
|
connected: true,
|
|
@@ -883,7 +1198,7 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
883
1198
|
} catch (e) {
|
|
884
1199
|
if (attemptId !== this.connectAttemptId)
|
|
885
1200
|
throw e;
|
|
886
|
-
let errorMessage = e instanceof Error ? e.message : String(e);
|
|
1201
|
+
let errorMessage = e instanceof Error ? e.message : String(e), error = e instanceof Error ? e : new Error(errorMessage);
|
|
887
1202
|
throw this.eventEmitter.emit({
|
|
888
1203
|
type: "connection:failed",
|
|
889
1204
|
wallet: name,
|
|
@@ -891,9 +1206,14 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
891
1206
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
892
1207
|
}), this.eventEmitter.emit({
|
|
893
1208
|
type: "error",
|
|
894
|
-
error
|
|
1209
|
+
error,
|
|
895
1210
|
context: "wallet-connection",
|
|
896
1211
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1212
|
+
}), this.updateWalletStatus({
|
|
1213
|
+
status: "error",
|
|
1214
|
+
error,
|
|
1215
|
+
connectorId,
|
|
1216
|
+
recoverable: this.isRecoverableError(error)
|
|
897
1217
|
}), this.stateManager.updateState(
|
|
898
1218
|
{
|
|
899
1219
|
selectedWallet: null,
|
|
@@ -914,7 +1234,7 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
914
1234
|
async disconnect() {
|
|
915
1235
|
this.connectAttemptId++, this.walletChangeUnsub && (this.walletChangeUnsub(), this.walletChangeUnsub = null), this.stopPollingWalletAccounts();
|
|
916
1236
|
let wallet = this.getState().selectedWallet ?? this.pendingWallet;
|
|
917
|
-
if (this.pendingWallet = null, this.pendingWalletName = null, this.stateManager.updateState(
|
|
1237
|
+
if (this.pendingWallet = null, this.pendingWalletName = null, this.updateWalletStatus(INITIAL_WALLET_STATUS), this.stateManager.updateState(
|
|
918
1238
|
{
|
|
919
1239
|
selectedWallet: null,
|
|
920
1240
|
connected: false,
|
|
@@ -1041,16 +1361,49 @@ var ConnectionManager = class extends BaseCollaborator {
|
|
|
1041
1361
|
|
|
1042
1362
|
// src/lib/wallet/auto-connector.ts
|
|
1043
1363
|
var logger4 = createLogger("AutoConnector"), MIN_ADDRESS_LENGTH = 30, AutoConnector = class {
|
|
1044
|
-
constructor(walletDetector, connectionManager, stateManager, walletStorage, debug = false) {
|
|
1364
|
+
constructor(walletDetector, connectionManager, stateManager, walletStorage, debug = false, walletStateStorage) {
|
|
1045
1365
|
__publicField(this, "walletDetector");
|
|
1046
1366
|
__publicField(this, "connectionManager");
|
|
1047
1367
|
__publicField(this, "stateManager");
|
|
1368
|
+
/** Legacy wallet name storage */
|
|
1048
1369
|
__publicField(this, "walletStorage");
|
|
1370
|
+
/** vNext wallet state storage (connector ID + account) */
|
|
1371
|
+
__publicField(this, "walletStateStorage");
|
|
1049
1372
|
__publicField(this, "debug");
|
|
1050
|
-
this.walletDetector = walletDetector, this.connectionManager = connectionManager, this.stateManager = stateManager, this.walletStorage = walletStorage, this.debug = debug;
|
|
1373
|
+
this.walletDetector = walletDetector, this.connectionManager = connectionManager, this.stateManager = stateManager, this.walletStorage = walletStorage, this.walletStateStorage = walletStateStorage, this.debug = debug;
|
|
1051
1374
|
}
|
|
1052
1375
|
async attemptAutoConnect() {
|
|
1053
|
-
return await this.attemptInstantConnect() ? true : (await this.attemptStandardConnect(), this.stateManager.getSnapshot().connected);
|
|
1376
|
+
return this.walletStateStorage && await this.attemptVNextAutoConnect() || await this.attemptInstantConnect() ? true : (await this.attemptStandardConnect(), this.stateManager.getSnapshot().connected);
|
|
1377
|
+
}
|
|
1378
|
+
/**
|
|
1379
|
+
* vNext auto-connect using stored connector ID with silent-first approach.
|
|
1380
|
+
* This won't prompt the user unless they explicitly initiated the connect.
|
|
1381
|
+
*/
|
|
1382
|
+
async attemptVNextAutoConnect() {
|
|
1383
|
+
let walletState = this.walletStateStorage?.get();
|
|
1384
|
+
if (!walletState || !walletState.autoConnect)
|
|
1385
|
+
return this.debug && logger4.debug("vNext auto-connect: No stored wallet state or autoConnect disabled"), false;
|
|
1386
|
+
let { connectorId, lastAccount } = walletState;
|
|
1387
|
+
await ready;
|
|
1388
|
+
let wallet = this.walletDetector.getConnectorById(connectorId);
|
|
1389
|
+
if (!wallet)
|
|
1390
|
+
return this.debug && logger4.debug("vNext auto-connect: Connector not found", { connectorId }), false;
|
|
1391
|
+
try {
|
|
1392
|
+
return this.debug && logger4.info("vNext auto-connect: Attempting silent connect", {
|
|
1393
|
+
connectorId,
|
|
1394
|
+
lastAccount
|
|
1395
|
+
}), await this.connectionManager.connectWallet(wallet, connectorId, {
|
|
1396
|
+
silent: true,
|
|
1397
|
+
allowInteractiveFallback: false,
|
|
1398
|
+
// Don't prompt on auto-connect
|
|
1399
|
+
preferredAccount: lastAccount
|
|
1400
|
+
}), this.debug && logger4.info("vNext auto-connect: Silent connect successful", { connectorId }), true;
|
|
1401
|
+
} catch (error) {
|
|
1402
|
+
return this.debug && logger4.debug("vNext auto-connect: Silent connect failed (expected for first-time or revoked)", {
|
|
1403
|
+
connectorId,
|
|
1404
|
+
error: error instanceof Error ? error.message : error
|
|
1405
|
+
}), false;
|
|
1406
|
+
}
|
|
1054
1407
|
}
|
|
1055
1408
|
async attemptInstantConnect() {
|
|
1056
1409
|
let storedWalletName = this.walletStorage?.get();
|
|
@@ -1371,6 +1724,10 @@ var logger5 = createLogger("ConnectorClient"), ConnectorClient = class {
|
|
|
1371
1724
|
__publicField(this, "walletConnectRegistration", null);
|
|
1372
1725
|
this.config = config;
|
|
1373
1726
|
let initialState = {
|
|
1727
|
+
// vNext wallet status
|
|
1728
|
+
wallet: INITIAL_WALLET_STATUS,
|
|
1729
|
+
connectors: [],
|
|
1730
|
+
// Legacy fields (for backwards compatibility)
|
|
1374
1731
|
wallets: [],
|
|
1375
1732
|
selectedWallet: null,
|
|
1376
1733
|
connected: false,
|
|
@@ -1429,17 +1786,55 @@ var logger5 = createLogger("ConnectorClient"), ConnectorClient = class {
|
|
|
1429
1786
|
async initializeWalletConnect() {
|
|
1430
1787
|
if (this.config.walletConnect?.enabled)
|
|
1431
1788
|
try {
|
|
1432
|
-
let { registerWalletConnectWallet } = await import('./walletconnect-
|
|
1789
|
+
let { registerWalletConnectWallet } = await import('./walletconnect-U455PO4I.mjs');
|
|
1433
1790
|
this.walletConnectRegistration = await registerWalletConnectWallet(this.config.walletConnect), this.config.debug && logger5.info("WalletConnect wallet registered successfully");
|
|
1434
1791
|
} catch (error) {
|
|
1435
1792
|
this.config.debug && logger5.error("Failed to register WalletConnect wallet", { error });
|
|
1436
1793
|
}
|
|
1437
1794
|
}
|
|
1795
|
+
// ========================================================================
|
|
1796
|
+
// vNext Wallet Actions (connector-id based)
|
|
1797
|
+
// ========================================================================
|
|
1798
|
+
/**
|
|
1799
|
+
* Connect to a wallet using its stable connector ID.
|
|
1800
|
+
* This is the recommended way to connect in vNext.
|
|
1801
|
+
*
|
|
1802
|
+
* @param connectorId - Stable connector identifier
|
|
1803
|
+
* @param options - Connection options (silent mode, preferred account, etc.)
|
|
1804
|
+
*/
|
|
1805
|
+
async connectWallet(connectorId, options) {
|
|
1806
|
+
let connector = this.walletDetector.getConnectorById(connectorId);
|
|
1807
|
+
if (!connector)
|
|
1808
|
+
throw new Error(`Connector ${connectorId} not found`);
|
|
1809
|
+
await this.connectionManager.connectWallet(connector, connectorId, options);
|
|
1810
|
+
}
|
|
1811
|
+
/**
|
|
1812
|
+
* Disconnect the current wallet session.
|
|
1813
|
+
* This is the vNext equivalent of disconnect().
|
|
1814
|
+
*/
|
|
1815
|
+
async disconnectWallet() {
|
|
1816
|
+
await this.connectionManager.disconnect();
|
|
1817
|
+
}
|
|
1818
|
+
/**
|
|
1819
|
+
* Get a connector by its ID (for advanced use cases).
|
|
1820
|
+
*/
|
|
1821
|
+
getConnector(connectorId) {
|
|
1822
|
+
return this.walletDetector.getConnectorById(connectorId);
|
|
1823
|
+
}
|
|
1824
|
+
// ========================================================================
|
|
1825
|
+
// Legacy Actions (kept for backwards compatibility)
|
|
1826
|
+
// ========================================================================
|
|
1827
|
+
/**
|
|
1828
|
+
* @deprecated Use `connectWallet(connectorId)` instead.
|
|
1829
|
+
*/
|
|
1438
1830
|
async select(walletName) {
|
|
1439
1831
|
let wallet = this.stateManager.getSnapshot().wallets.find((w) => w.wallet.name === walletName)?.wallet;
|
|
1440
1832
|
if (!wallet) throw new Error(`Wallet ${walletName} not found`);
|
|
1441
1833
|
await this.connectionManager.connect(wallet, walletName);
|
|
1442
1834
|
}
|
|
1835
|
+
/**
|
|
1836
|
+
* @deprecated Use `disconnectWallet()` instead.
|
|
1837
|
+
*/
|
|
1443
1838
|
async disconnect() {
|
|
1444
1839
|
await this.connectionManager.disconnect();
|
|
1445
1840
|
}
|
|
@@ -1537,284 +1932,13 @@ var logger5 = createLogger("ConnectorClient"), ConnectorClient = class {
|
|
|
1537
1932
|
}), this.walletDetector.destroy(), this.eventEmitter.offAll(), this.stateManager.clear();
|
|
1538
1933
|
}
|
|
1539
1934
|
};
|
|
1540
|
-
var logger6 = createLogger("
|
|
1541
|
-
static log(error, errorInfo, context) {
|
|
1542
|
-
if (process.env.NODE_ENV === "development" && logger6.error(error.message, {
|
|
1543
|
-
error,
|
|
1544
|
-
errorInfo,
|
|
1545
|
-
context
|
|
1546
|
-
}), process.env.NODE_ENV === "production" && typeof window < "u")
|
|
1547
|
-
try {
|
|
1548
|
-
let gtag = window.gtag;
|
|
1549
|
-
typeof gtag == "function" && gtag("event", "exception", {
|
|
1550
|
-
description: error.message,
|
|
1551
|
-
fatal: false,
|
|
1552
|
-
custom_map: { error_type: "wallet_error", ...context }
|
|
1553
|
-
});
|
|
1554
|
-
} catch {
|
|
1555
|
-
}
|
|
1556
|
-
}
|
|
1557
|
-
};
|
|
1558
|
-
function classifyError(error) {
|
|
1559
|
-
if (isConnectorError(error))
|
|
1560
|
-
return {
|
|
1561
|
-
...error,
|
|
1562
|
-
type: {
|
|
1563
|
-
WALLET_NOT_CONNECTED: "CONNECTION_FAILED" /* CONNECTION_FAILED */,
|
|
1564
|
-
WALLET_NOT_FOUND: "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */,
|
|
1565
|
-
CONNECTION_FAILED: "CONNECTION_FAILED" /* CONNECTION_FAILED */,
|
|
1566
|
-
USER_REJECTED: "USER_REJECTED" /* USER_REJECTED */,
|
|
1567
|
-
RPC_ERROR: "NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
1568
|
-
NETWORK_TIMEOUT: "NETWORK_ERROR" /* NETWORK_ERROR */,
|
|
1569
|
-
SIGNING_FAILED: "TRANSACTION_FAILED" /* TRANSACTION_FAILED */,
|
|
1570
|
-
SEND_FAILED: "TRANSACTION_FAILED" /* TRANSACTION_FAILED */
|
|
1571
|
-
}[error.code] || "UNKNOWN_ERROR" /* UNKNOWN_ERROR */,
|
|
1572
|
-
recoverable: error.recoverable,
|
|
1573
|
-
context: error.context
|
|
1574
|
-
};
|
|
1575
|
-
let walletError = error;
|
|
1576
|
-
if (walletError.type) return walletError;
|
|
1577
|
-
let type = "UNKNOWN_ERROR" /* UNKNOWN_ERROR */, recoverable = false;
|
|
1578
|
-
return error.message.includes("User rejected") || error.message.includes("User denied") ? (type = "USER_REJECTED" /* USER_REJECTED */, recoverable = true) : error.message.includes("Insufficient funds") ? (type = "INSUFFICIENT_FUNDS" /* INSUFFICIENT_FUNDS */, recoverable = false) : error.message.includes("Network") || error.message.includes("fetch") ? (type = "NETWORK_ERROR" /* NETWORK_ERROR */, recoverable = true) : error.message.includes("Wallet not found") || error.message.includes("not installed") ? (type = "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */, recoverable = true) : (error.message.includes("Failed to connect") || error.message.includes("Connection")) && (type = "CONNECTION_FAILED" /* CONNECTION_FAILED */, recoverable = true), {
|
|
1579
|
-
...error,
|
|
1580
|
-
type,
|
|
1581
|
-
recoverable,
|
|
1582
|
-
context: { originalMessage: error.message }
|
|
1583
|
-
};
|
|
1584
|
-
}
|
|
1585
|
-
var ConnectorErrorBoundary = class extends Component {
|
|
1586
|
-
constructor(props) {
|
|
1587
|
-
super(props);
|
|
1588
|
-
__publicField(this, "retryTimeouts", /* @__PURE__ */ new Set());
|
|
1589
|
-
__publicField(this, "retry", () => {
|
|
1590
|
-
let { maxRetries = 3 } = this.props;
|
|
1591
|
-
this.state.retryCount >= maxRetries || this.setState((prevState) => ({
|
|
1592
|
-
hasError: false,
|
|
1593
|
-
error: null,
|
|
1594
|
-
errorInfo: null,
|
|
1595
|
-
retryCount: prevState.retryCount + 1
|
|
1596
|
-
}));
|
|
1597
|
-
});
|
|
1598
|
-
this.state = {
|
|
1599
|
-
hasError: false,
|
|
1600
|
-
error: null,
|
|
1601
|
-
errorInfo: null,
|
|
1602
|
-
errorId: "",
|
|
1603
|
-
retryCount: 0
|
|
1604
|
-
};
|
|
1605
|
-
}
|
|
1606
|
-
static getDerivedStateFromError(error) {
|
|
1607
|
-
return {
|
|
1608
|
-
hasError: true,
|
|
1609
|
-
error,
|
|
1610
|
-
errorId: `error_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`
|
|
1611
|
-
};
|
|
1612
|
-
}
|
|
1613
|
-
componentDidCatch(error, errorInfo) {
|
|
1614
|
-
this.setState({ errorInfo }), ErrorLogger.log(error, errorInfo, {
|
|
1615
|
-
retryCount: this.state.retryCount,
|
|
1616
|
-
errorId: this.state.errorId,
|
|
1617
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
1618
|
-
}), this.props.onError?.(error, errorInfo);
|
|
1619
|
-
}
|
|
1620
|
-
componentWillUnmount() {
|
|
1621
|
-
this.retryTimeouts.forEach((timeout) => clearTimeout(timeout));
|
|
1622
|
-
}
|
|
1623
|
-
render() {
|
|
1624
|
-
if (this.state.hasError && this.state.error) {
|
|
1625
|
-
let walletError = classifyError(this.state.error);
|
|
1626
|
-
return this.props.fallback ? this.props.fallback(walletError, this.retry) : /* @__PURE__ */ jsx(DefaultErrorFallback, { error: walletError, onRetry: this.retry });
|
|
1627
|
-
}
|
|
1628
|
-
return this.props.children;
|
|
1629
|
-
}
|
|
1630
|
-
};
|
|
1631
|
-
function DefaultErrorFallback({ error, onRetry }) {
|
|
1632
|
-
let [isPending, startTransition] = useTransition(), [isRetrying, setIsRetrying] = useState(false), handleRetry = useCallback(() => {
|
|
1633
|
-
setIsRetrying(true), startTransition(() => {
|
|
1634
|
-
setTimeout(() => {
|
|
1635
|
-
onRetry(), setIsRetrying(false);
|
|
1636
|
-
}, 500);
|
|
1637
|
-
});
|
|
1638
|
-
}, [onRetry]), { title, message, actionText, showRetry } = useMemo(() => {
|
|
1639
|
-
switch (error.type) {
|
|
1640
|
-
case "USER_REJECTED" /* USER_REJECTED */:
|
|
1641
|
-
return {
|
|
1642
|
-
title: "Transaction Cancelled",
|
|
1643
|
-
message: "You cancelled the transaction. No problem!",
|
|
1644
|
-
actionText: "Try Again",
|
|
1645
|
-
showRetry: true
|
|
1646
|
-
};
|
|
1647
|
-
case "WALLET_NOT_FOUND" /* WALLET_NOT_FOUND */:
|
|
1648
|
-
return {
|
|
1649
|
-
title: "Wallet Not Found",
|
|
1650
|
-
message: "Please install a supported Solana wallet to continue.",
|
|
1651
|
-
actionText: "Check Wallets",
|
|
1652
|
-
showRetry: true
|
|
1653
|
-
};
|
|
1654
|
-
case "NETWORK_ERROR" /* NETWORK_ERROR */:
|
|
1655
|
-
return {
|
|
1656
|
-
title: "Network Error",
|
|
1657
|
-
message: "Having trouble connecting. Please check your internet connection.",
|
|
1658
|
-
actionText: "Retry",
|
|
1659
|
-
showRetry: true
|
|
1660
|
-
};
|
|
1661
|
-
case "INSUFFICIENT_FUNDS" /* INSUFFICIENT_FUNDS */:
|
|
1662
|
-
return {
|
|
1663
|
-
title: "Insufficient Funds",
|
|
1664
|
-
message: "You don't have enough SOL for this transaction.",
|
|
1665
|
-
actionText: "Add Funds",
|
|
1666
|
-
showRetry: false
|
|
1667
|
-
};
|
|
1668
|
-
default:
|
|
1669
|
-
return {
|
|
1670
|
-
title: "Something went wrong",
|
|
1671
|
-
message: "An unexpected error occurred. Please try again.",
|
|
1672
|
-
actionText: "Retry",
|
|
1673
|
-
showRetry: error.recoverable
|
|
1674
|
-
};
|
|
1675
|
-
}
|
|
1676
|
-
}, [error.type, error.recoverable]);
|
|
1677
|
-
return /* @__PURE__ */ jsxs(
|
|
1678
|
-
"div",
|
|
1679
|
-
{
|
|
1680
|
-
style: {
|
|
1681
|
-
display: "flex",
|
|
1682
|
-
flexDirection: "column",
|
|
1683
|
-
alignItems: "center",
|
|
1684
|
-
justifyContent: "center",
|
|
1685
|
-
padding: "2rem",
|
|
1686
|
-
textAlign: "center",
|
|
1687
|
-
borderRadius: "12px",
|
|
1688
|
-
border: "1px solid #e5e7eb",
|
|
1689
|
-
backgroundColor: "#fafafa",
|
|
1690
|
-
maxWidth: "400px",
|
|
1691
|
-
margin: "0 auto"
|
|
1692
|
-
},
|
|
1693
|
-
children: [
|
|
1694
|
-
/* @__PURE__ */ jsx(
|
|
1695
|
-
"div",
|
|
1696
|
-
{
|
|
1697
|
-
style: {
|
|
1698
|
-
width: "48px",
|
|
1699
|
-
height: "48px",
|
|
1700
|
-
borderRadius: "50%",
|
|
1701
|
-
backgroundColor: "#fee2e2",
|
|
1702
|
-
display: "flex",
|
|
1703
|
-
alignItems: "center",
|
|
1704
|
-
justifyContent: "center",
|
|
1705
|
-
marginBottom: "1rem"
|
|
1706
|
-
},
|
|
1707
|
-
children: /* @__PURE__ */ jsx("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "#dc2626", children: /* @__PURE__ */ jsx("path", { d: "M12 9v3.75m-9.303 3.376c-.866 1.5.217 3.374 1.948 3.374h14.71c1.73 0 2.813-1.874 1.948-3.374L13.949 3.378c-.866-1.5-3.032-1.5-3.898 0L2.697 16.126zM12 15.75h.007v.008H12v-.008z" }) })
|
|
1708
|
-
}
|
|
1709
|
-
),
|
|
1710
|
-
/* @__PURE__ */ jsx(
|
|
1711
|
-
"h3",
|
|
1712
|
-
{
|
|
1713
|
-
style: {
|
|
1714
|
-
margin: "0 0 0.5rem 0",
|
|
1715
|
-
fontSize: "1.125rem",
|
|
1716
|
-
fontWeight: "600",
|
|
1717
|
-
color: "#111827"
|
|
1718
|
-
},
|
|
1719
|
-
children: title
|
|
1720
|
-
}
|
|
1721
|
-
),
|
|
1722
|
-
/* @__PURE__ */ jsx(
|
|
1723
|
-
"p",
|
|
1724
|
-
{
|
|
1725
|
-
style: {
|
|
1726
|
-
margin: "0 0 1.5rem 0",
|
|
1727
|
-
fontSize: "0.875rem",
|
|
1728
|
-
color: "#6b7280",
|
|
1729
|
-
lineHeight: "1.5"
|
|
1730
|
-
},
|
|
1731
|
-
children: message
|
|
1732
|
-
}
|
|
1733
|
-
),
|
|
1734
|
-
/* @__PURE__ */ jsxs("div", { style: { display: "flex", gap: "0.75rem", flexWrap: "wrap" }, children: [
|
|
1735
|
-
showRetry && /* @__PURE__ */ jsx(
|
|
1736
|
-
"button",
|
|
1737
|
-
{
|
|
1738
|
-
onClick: handleRetry,
|
|
1739
|
-
disabled: isPending || isRetrying,
|
|
1740
|
-
style: {
|
|
1741
|
-
padding: "0.5rem 1rem",
|
|
1742
|
-
backgroundColor: "#3b82f6",
|
|
1743
|
-
color: "white",
|
|
1744
|
-
border: "none",
|
|
1745
|
-
borderRadius: "6px",
|
|
1746
|
-
fontSize: "0.875rem",
|
|
1747
|
-
fontWeight: "500",
|
|
1748
|
-
cursor: isPending || isRetrying ? "wait" : "pointer",
|
|
1749
|
-
opacity: isPending || isRetrying ? 0.7 : 1,
|
|
1750
|
-
transition: "all 0.2s"
|
|
1751
|
-
},
|
|
1752
|
-
children: isRetrying ? "Retrying..." : actionText
|
|
1753
|
-
}
|
|
1754
|
-
),
|
|
1755
|
-
/* @__PURE__ */ jsx(
|
|
1756
|
-
"button",
|
|
1757
|
-
{
|
|
1758
|
-
onClick: () => window.location.reload(),
|
|
1759
|
-
style: {
|
|
1760
|
-
padding: "0.5rem 1rem",
|
|
1761
|
-
backgroundColor: "transparent",
|
|
1762
|
-
color: "#6b7280",
|
|
1763
|
-
border: "1px solid #d1d5db",
|
|
1764
|
-
borderRadius: "6px",
|
|
1765
|
-
fontSize: "0.875rem",
|
|
1766
|
-
fontWeight: "500",
|
|
1767
|
-
cursor: "pointer",
|
|
1768
|
-
transition: "all 0.2s"
|
|
1769
|
-
},
|
|
1770
|
-
children: "Refresh Page"
|
|
1771
|
-
}
|
|
1772
|
-
)
|
|
1773
|
-
] }),
|
|
1774
|
-
process.env.NODE_ENV === "development" && /* @__PURE__ */ jsxs(
|
|
1775
|
-
"details",
|
|
1776
|
-
{
|
|
1777
|
-
style: {
|
|
1778
|
-
marginTop: "1rem",
|
|
1779
|
-
fontSize: "0.75rem",
|
|
1780
|
-
color: "#6b7280",
|
|
1781
|
-
width: "100%"
|
|
1782
|
-
},
|
|
1783
|
-
children: [
|
|
1784
|
-
/* @__PURE__ */ jsx("summary", { style: { cursor: "pointer", marginBottom: "0.5rem" }, children: "Error Details" }),
|
|
1785
|
-
/* @__PURE__ */ jsx(
|
|
1786
|
-
"pre",
|
|
1787
|
-
{
|
|
1788
|
-
style: {
|
|
1789
|
-
whiteSpace: "pre-wrap",
|
|
1790
|
-
wordBreak: "break-all",
|
|
1791
|
-
backgroundColor: "#f3f4f6",
|
|
1792
|
-
padding: "0.5rem",
|
|
1793
|
-
borderRadius: "4px",
|
|
1794
|
-
overflow: "auto",
|
|
1795
|
-
maxHeight: "200px"
|
|
1796
|
-
},
|
|
1797
|
-
children: error.message
|
|
1798
|
-
}
|
|
1799
|
-
)
|
|
1800
|
-
]
|
|
1801
|
-
}
|
|
1802
|
-
)
|
|
1803
|
-
]
|
|
1804
|
-
}
|
|
1805
|
-
);
|
|
1806
|
-
}
|
|
1807
|
-
function withErrorBoundary(Component2, errorBoundaryProps) {
|
|
1808
|
-
let WrappedComponent = (props) => /* @__PURE__ */ jsx(ConnectorErrorBoundary, { ...errorBoundaryProps, children: /* @__PURE__ */ jsx(Component2, { ...props }) });
|
|
1809
|
-
return WrappedComponent.displayName = `withErrorBoundary(${Component2.displayName || Component2.name})`, WrappedComponent;
|
|
1810
|
-
}
|
|
1811
|
-
var logger7 = createLogger("Polyfills"), installed = false;
|
|
1935
|
+
var logger6 = createLogger("Polyfills"), installed = false;
|
|
1812
1936
|
function installPolyfills() {
|
|
1813
1937
|
if (!(installed || typeof window > "u"))
|
|
1814
1938
|
try {
|
|
1815
|
-
install(), installed = true,
|
|
1939
|
+
install(), installed = true, logger6.info("Browser compatibility polyfills installed");
|
|
1816
1940
|
} catch (error) {
|
|
1817
|
-
|
|
1941
|
+
logger6 && logger6.warn("Failed to install polyfills", { error }), installed = true;
|
|
1818
1942
|
}
|
|
1819
1943
|
}
|
|
1820
1944
|
function isPolyfillInstalled() {
|
|
@@ -1835,7 +1959,7 @@ function getPolyfillStatus() {
|
|
|
1835
1959
|
environment: typeof window < "u" ? "browser" : "server"
|
|
1836
1960
|
};
|
|
1837
1961
|
}
|
|
1838
|
-
var
|
|
1962
|
+
var logger7 = createLogger("EnhancedStorage"), STORAGE_VERSION = "v1", EnhancedStorage = class extends Storage {
|
|
1839
1963
|
constructor(key, initial, options) {
|
|
1840
1964
|
super(key, initial);
|
|
1841
1965
|
this.options = options;
|
|
@@ -1846,7 +1970,7 @@ var logger8 = createLogger("EnhancedStorage"), STORAGE_VERSION = "v1", EnhancedS
|
|
|
1846
1970
|
}
|
|
1847
1971
|
set(value) {
|
|
1848
1972
|
try {
|
|
1849
|
-
return this.validate(value) ? (super.set(value), this.memoryFallback = value, true) : (
|
|
1973
|
+
return this.validate(value) ? (super.set(value), this.memoryFallback = value, true) : (logger7.warn("Validation failed", { key: this.key }), false);
|
|
1850
1974
|
} catch (error) {
|
|
1851
1975
|
return this.handleError(error), this.options?.useMemoryFallback ? (this.memoryFallback = value, true) : false;
|
|
1852
1976
|
}
|
|
@@ -1903,11 +2027,11 @@ var logger8 = createLogger("EnhancedStorage"), STORAGE_VERSION = "v1", EnhancedS
|
|
|
1903
2027
|
}
|
|
1904
2028
|
}
|
|
1905
2029
|
handleError(error) {
|
|
1906
|
-
|
|
2030
|
+
logger7.error("Storage error", { key: this.key, error }), this.errorHandlers.forEach((handler) => {
|
|
1907
2031
|
try {
|
|
1908
2032
|
handler(error);
|
|
1909
2033
|
} catch (err) {
|
|
1910
|
-
|
|
2034
|
+
logger7.error("Error in error handler", { error: err });
|
|
1911
2035
|
}
|
|
1912
2036
|
});
|
|
1913
2037
|
}
|
|
@@ -1935,6 +2059,53 @@ function createEnhancedStorageWallet(options) {
|
|
|
1935
2059
|
useMemoryFallback: true
|
|
1936
2060
|
});
|
|
1937
2061
|
}
|
|
2062
|
+
var WALLET_STATE_VERSION = 1;
|
|
2063
|
+
function createEnhancedStorageWalletState(options) {
|
|
2064
|
+
let key = options?.key ?? `connector-kit:${STORAGE_VERSION}:wallet-state`, legacyKey = `connector-kit:${STORAGE_VERSION}:wallet`, storage = new EnhancedStorage(key, options?.initial ?? null, {
|
|
2065
|
+
onError: options?.onError,
|
|
2066
|
+
useMemoryFallback: true
|
|
2067
|
+
});
|
|
2068
|
+
if (typeof window < "u" && storage.isAvailable())
|
|
2069
|
+
try {
|
|
2070
|
+
if (!storage.get()) {
|
|
2071
|
+
let legacyValue = window.localStorage.getItem(legacyKey);
|
|
2072
|
+
if (legacyValue) {
|
|
2073
|
+
let legacyWalletName = JSON.parse(legacyValue);
|
|
2074
|
+
if (legacyWalletName && typeof legacyWalletName == "string") {
|
|
2075
|
+
let connectorId = options?.migrateLegacy ? options.migrateLegacy(legacyWalletName) : createConnectorId(legacyWalletName);
|
|
2076
|
+
if (connectorId) {
|
|
2077
|
+
let migratedState = {
|
|
2078
|
+
version: WALLET_STATE_VERSION,
|
|
2079
|
+
connectorId,
|
|
2080
|
+
autoConnect: true,
|
|
2081
|
+
lastConnected: (/* @__PURE__ */ new Date()).toISOString()
|
|
2082
|
+
};
|
|
2083
|
+
storage.set(migratedState), logger7.info("Migrated legacy wallet storage", {
|
|
2084
|
+
from: legacyWalletName,
|
|
2085
|
+
to: connectorId
|
|
2086
|
+
}), window.localStorage.removeItem(legacyKey);
|
|
2087
|
+
}
|
|
2088
|
+
}
|
|
2089
|
+
}
|
|
2090
|
+
}
|
|
2091
|
+
} catch (error) {
|
|
2092
|
+
logger7.warn("Failed to migrate legacy wallet storage", { error });
|
|
2093
|
+
}
|
|
2094
|
+
return storage;
|
|
2095
|
+
}
|
|
2096
|
+
function saveWalletState(storage, connectorId, account, autoConnect = true) {
|
|
2097
|
+
let state = {
|
|
2098
|
+
version: WALLET_STATE_VERSION,
|
|
2099
|
+
connectorId,
|
|
2100
|
+
lastAccount: account,
|
|
2101
|
+
autoConnect,
|
|
2102
|
+
lastConnected: (/* @__PURE__ */ new Date()).toISOString()
|
|
2103
|
+
};
|
|
2104
|
+
storage.set(state);
|
|
2105
|
+
}
|
|
2106
|
+
function clearWalletState(storage) {
|
|
2107
|
+
storage.set(null);
|
|
2108
|
+
}
|
|
1938
2109
|
var EnhancedStorageAdapter = class {
|
|
1939
2110
|
constructor(storage) {
|
|
1940
2111
|
this.storage = storage;
|
|
@@ -1970,7 +2141,7 @@ var EnhancedStorageAdapter = class {
|
|
|
1970
2141
|
return this.storage.onError(handler), this;
|
|
1971
2142
|
}
|
|
1972
2143
|
};
|
|
1973
|
-
var
|
|
2144
|
+
var logger8 = createLogger("DefaultConfig");
|
|
1974
2145
|
function getDefaultConfig(options) {
|
|
1975
2146
|
let {
|
|
1976
2147
|
appName,
|
|
@@ -2000,7 +2171,7 @@ function getDefaultConfig(options) {
|
|
|
2000
2171
|
], validClusterIds = defaultClusters.map((c) => c.id), accountStorage = createEnhancedStorageAccount({
|
|
2001
2172
|
validator: (address) => address ? isAddress(address) : true,
|
|
2002
2173
|
onError: (error) => {
|
|
2003
|
-
debug &&
|
|
2174
|
+
debug && logger8.error("Account Storage error", { error }), onError && onError(error, {
|
|
2004
2175
|
componentStack: "account-storage"
|
|
2005
2176
|
});
|
|
2006
2177
|
}
|
|
@@ -2009,13 +2180,13 @@ function getDefaultConfig(options) {
|
|
|
2009
2180
|
initial: getInitialCluster(network),
|
|
2010
2181
|
validClusters: persistClusterSelection ? validClusterIds : void 0,
|
|
2011
2182
|
onError: (error) => {
|
|
2012
|
-
debug &&
|
|
2183
|
+
debug && logger8.error("Cluster Storage error", { error }), onError && onError(error, {
|
|
2013
2184
|
componentStack: "cluster-storage"
|
|
2014
2185
|
});
|
|
2015
2186
|
}
|
|
2016
2187
|
}), walletStorage = createEnhancedStorageWallet({
|
|
2017
2188
|
onError: (error) => {
|
|
2018
|
-
debug &&
|
|
2189
|
+
debug && logger8.error("Wallet Storage error", { error }), onError && onError(error, {
|
|
2019
2190
|
componentStack: "wallet-storage"
|
|
2020
2191
|
});
|
|
2021
2192
|
}
|
|
@@ -2057,7 +2228,9 @@ function buildWalletConnectConfig(walletConnect, appName, appUrl, clusterStorage
|
|
|
2057
2228
|
if (!walletConnect) return;
|
|
2058
2229
|
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
2230
|
if (!projectId) {
|
|
2060
|
-
(typeof walletConnect == "object" || walletConnect === true) &&
|
|
2231
|
+
(typeof walletConnect == "object" || walletConnect === true) && logger8.warn(
|
|
2232
|
+
"WalletConnect enabled but no project ID found. Set NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID or provide projectId in config."
|
|
2233
|
+
);
|
|
2061
2234
|
return;
|
|
2062
2235
|
}
|
|
2063
2236
|
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;
|
|
@@ -2395,7 +2568,7 @@ async function copySignatureToClipboard(signature, options) {
|
|
|
2395
2568
|
}
|
|
2396
2569
|
|
|
2397
2570
|
// src/lib/transaction/transaction-validator.ts
|
|
2398
|
-
var
|
|
2571
|
+
var logger9 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232, MIN_TRANSACTION_SIZE = 64, TransactionValidator = class {
|
|
2399
2572
|
/**
|
|
2400
2573
|
* Validate a transaction before signing
|
|
2401
2574
|
*
|
|
@@ -2418,7 +2591,7 @@ var logger10 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232
|
|
|
2418
2591
|
try {
|
|
2419
2592
|
serialized = transaction.serialize();
|
|
2420
2593
|
} catch (serializeError) {
|
|
2421
|
-
|
|
2594
|
+
logger9.debug("Transaction not yet serializable (may need signing)", {
|
|
2422
2595
|
error: serializeError instanceof Error ? serializeError.message : String(serializeError)
|
|
2423
2596
|
});
|
|
2424
2597
|
}
|
|
@@ -2428,10 +2601,10 @@ var logger10 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232
|
|
|
2428
2601
|
return errors.push(
|
|
2429
2602
|
"Transaction type not recognized - must be a Transaction object with serialize() or Uint8Array"
|
|
2430
2603
|
), { valid: false, errors, warnings };
|
|
2431
|
-
serialized && (size = serialized.length, size > maxSize && (errors.push(`Transaction too large: ${size} bytes (max ${maxSize} bytes)`),
|
|
2604
|
+
serialized && (size = serialized.length, size > maxSize && (errors.push(`Transaction too large: ${size} bytes (max ${maxSize} bytes)`), logger9.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"));
|
|
2432
2605
|
} catch (error) {
|
|
2433
2606
|
let errorMessage = error instanceof Error ? error.message : String(error);
|
|
2434
|
-
errors.push(`Transaction validation failed: ${errorMessage}`),
|
|
2607
|
+
errors.push(`Transaction validation failed: ${errorMessage}`), logger9.error("Validation error", { error: errorMessage });
|
|
2435
2608
|
}
|
|
2436
2609
|
if (checkDuplicateSignatures && typeof transaction == "object" && "signatures" in transaction) {
|
|
2437
2610
|
let signatures = transaction.signatures;
|
|
@@ -2444,7 +2617,7 @@ var logger10 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232
|
|
|
2444
2617
|
}
|
|
2445
2618
|
strict && warnings.length > 0 && (errors.push(...warnings.map((w) => `Strict mode: ${w}`)), warnings.length = 0);
|
|
2446
2619
|
let valid = errors.length === 0;
|
|
2447
|
-
return valid ? warnings.length > 0 ?
|
|
2620
|
+
return valid ? warnings.length > 0 ? logger9.debug("Transaction validation passed with warnings", { warnings, size }) : logger9.debug("Transaction validation passed", { size }) : logger9.warn("Transaction validation failed", { errors, size }), {
|
|
2448
2621
|
valid,
|
|
2449
2622
|
errors,
|
|
2450
2623
|
warnings,
|
|
@@ -2484,7 +2657,7 @@ var logger10 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232
|
|
|
2484
2657
|
let result = this.validate(transaction, options);
|
|
2485
2658
|
if (!result.valid)
|
|
2486
2659
|
throw new Error(`Transaction validation failed: ${result.errors.join(", ")}`);
|
|
2487
|
-
result.warnings.length > 0 &&
|
|
2660
|
+
result.warnings.length > 0 && logger9.warn("Transaction validation warnings", { warnings: result.warnings });
|
|
2488
2661
|
}
|
|
2489
2662
|
/**
|
|
2490
2663
|
* Batch validate multiple transactions
|
|
@@ -2495,10 +2668,10 @@ var logger10 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232
|
|
|
2495
2668
|
* @returns Array of validation results
|
|
2496
2669
|
*/
|
|
2497
2670
|
static validateBatch(transactions, options) {
|
|
2498
|
-
return transactions.map((tx, index) => (
|
|
2671
|
+
return transactions.map((tx, index) => (logger9.debug(`Validating transaction ${index + 1}/${transactions.length}`), this.validate(tx, options)));
|
|
2499
2672
|
}
|
|
2500
2673
|
};
|
|
2501
|
-
var
|
|
2674
|
+
var logger10 = createLogger("TransactionSigner");
|
|
2502
2675
|
function signatureBytesToBase58(bytes) {
|
|
2503
2676
|
if (bytes.length !== 64)
|
|
2504
2677
|
throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);
|
|
@@ -2520,6 +2693,24 @@ function extractSignatureString(result) {
|
|
|
2520
2693
|
}
|
|
2521
2694
|
throw new Error("Unexpected wallet response format for signAndSendTransaction");
|
|
2522
2695
|
}
|
|
2696
|
+
function extractSignatureBytes(result) {
|
|
2697
|
+
if (result instanceof Uint8Array)
|
|
2698
|
+
return result;
|
|
2699
|
+
if (Array.isArray(result)) {
|
|
2700
|
+
let [first] = result;
|
|
2701
|
+
if (!first)
|
|
2702
|
+
throw new Error("Wallet returned empty results array");
|
|
2703
|
+
return extractSignatureBytes(first);
|
|
2704
|
+
}
|
|
2705
|
+
if (result && typeof result == "object") {
|
|
2706
|
+
let record = result;
|
|
2707
|
+
if ("signature" in record)
|
|
2708
|
+
return extractSignatureBytes(record.signature);
|
|
2709
|
+
if (Array.isArray(record.signatures) && record.signatures.length > 0)
|
|
2710
|
+
return extractSignatureBytes(record.signatures[0]);
|
|
2711
|
+
}
|
|
2712
|
+
throw new Error("Unexpected wallet response format for signMessage");
|
|
2713
|
+
}
|
|
2523
2714
|
function createTransactionSigner(config) {
|
|
2524
2715
|
let { wallet, account, cluster, eventEmitter } = config;
|
|
2525
2716
|
if (!wallet || !account)
|
|
@@ -2536,11 +2727,11 @@ function createTransactionSigner(config) {
|
|
|
2536
2727
|
throw Errors.featureNotSupported("transaction signing");
|
|
2537
2728
|
let validation = TransactionValidator.validate(transaction);
|
|
2538
2729
|
if (!validation.valid)
|
|
2539
|
-
throw
|
|
2540
|
-
validation.warnings.length > 0 &&
|
|
2730
|
+
throw logger10.error("Transaction validation failed", { errors: validation.errors }), Errors.invalidTransaction(validation.errors.join(", "));
|
|
2731
|
+
validation.warnings.length > 0 && logger10.warn("Transaction validation warnings", { warnings: validation.warnings });
|
|
2541
2732
|
try {
|
|
2542
2733
|
let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } = prepareTransactionForWallet(transaction);
|
|
2543
|
-
|
|
2734
|
+
logger10.debug("Signing transaction", {
|
|
2544
2735
|
wasWeb3js,
|
|
2545
2736
|
serializedLength: serialized.length,
|
|
2546
2737
|
serializedType: serialized.constructor.name,
|
|
@@ -2549,26 +2740,26 @@ function createTransactionSigner(config) {
|
|
|
2549
2740
|
});
|
|
2550
2741
|
let result, usedFormat = "";
|
|
2551
2742
|
try {
|
|
2552
|
-
|
|
2743
|
+
logger10.debug("Trying array format: transactions: [Uint8Array]"), result = await signFeature.signTransaction({
|
|
2553
2744
|
account,
|
|
2554
2745
|
transactions: [serialized],
|
|
2555
2746
|
...cluster ? { chain: cluster.id } : {}
|
|
2556
2747
|
}), usedFormat = "array";
|
|
2557
2748
|
} catch (err1) {
|
|
2558
2749
|
let error1 = err1 instanceof Error ? err1 : new Error(String(err1));
|
|
2559
|
-
|
|
2750
|
+
logger10.debug("Array format failed, trying singular format", { error: error1.message });
|
|
2560
2751
|
try {
|
|
2561
|
-
|
|
2752
|
+
logger10.debug("Trying singular format: transaction: Uint8Array"), result = await signFeature.signTransaction({
|
|
2562
2753
|
account,
|
|
2563
2754
|
transaction: serialized,
|
|
2564
2755
|
...cluster ? { chain: cluster.id } : {}
|
|
2565
2756
|
}), usedFormat = "singular";
|
|
2566
2757
|
} catch (err2) {
|
|
2567
2758
|
let error2 = err2 instanceof Error ? err2 : new Error(String(err2));
|
|
2568
|
-
throw
|
|
2759
|
+
throw logger10.error("Both array and singular formats failed", { error: error2.message }), error2;
|
|
2569
2760
|
}
|
|
2570
2761
|
}
|
|
2571
|
-
|
|
2762
|
+
logger10.debug("Wallet signed successfully", { format: usedFormat });
|
|
2572
2763
|
let signedTx;
|
|
2573
2764
|
if (Array.isArray(result.signedTransactions) && result.signedTransactions[0])
|
|
2574
2765
|
signedTx = result.signedTransactions[0];
|
|
@@ -2580,23 +2771,23 @@ function createTransactionSigner(config) {
|
|
|
2580
2771
|
signedTx = result;
|
|
2581
2772
|
else
|
|
2582
2773
|
throw new Error(`Unexpected wallet response format: ${JSON.stringify(Object.keys(result))}`);
|
|
2583
|
-
if (
|
|
2774
|
+
if (logger10.debug("Extracted signed transaction", {
|
|
2584
2775
|
hasSignedTx: !!signedTx,
|
|
2585
2776
|
signedTxType: signedTx?.constructor?.name,
|
|
2586
2777
|
signedTxLength: signedTx?.length,
|
|
2587
2778
|
isUint8Array: signedTx instanceof Uint8Array,
|
|
2588
2779
|
hasSerialize: typeof signedTx?.serialize == "function"
|
|
2589
2780
|
}), signedTx && typeof signedTx.serialize == "function")
|
|
2590
|
-
return
|
|
2781
|
+
return logger10.debug("Wallet returned web3.js object directly, no conversion needed"), signedTx;
|
|
2591
2782
|
if (signedTx && signedTx.signedTransaction) {
|
|
2592
|
-
|
|
2783
|
+
logger10.debug("Found signedTransaction property");
|
|
2593
2784
|
let bytes = signedTx.signedTransaction;
|
|
2594
2785
|
if (bytes instanceof Uint8Array)
|
|
2595
2786
|
return await convertSignedTransaction(bytes, wasWeb3js);
|
|
2596
2787
|
}
|
|
2597
2788
|
if (signedTx instanceof Uint8Array)
|
|
2598
2789
|
return await convertSignedTransaction(signedTx, wasWeb3js);
|
|
2599
|
-
throw
|
|
2790
|
+
throw logger10.error("Unexpected wallet response format", {
|
|
2600
2791
|
type: typeof signedTx,
|
|
2601
2792
|
constructor: signedTx?.constructor?.name
|
|
2602
2793
|
}), new ValidationError(
|
|
@@ -2718,11 +2909,12 @@ function createTransactionSigner(config) {
|
|
|
2718
2909
|
...capabilities.canSignMessage && {
|
|
2719
2910
|
async signMessage(message) {
|
|
2720
2911
|
try {
|
|
2721
|
-
|
|
2912
|
+
let result = await features["solana:signMessage"].signMessage({
|
|
2722
2913
|
account,
|
|
2723
2914
|
message,
|
|
2724
2915
|
...cluster ? { chain: cluster.id } : {}
|
|
2725
|
-
})
|
|
2916
|
+
});
|
|
2917
|
+
return extractSignatureBytes(result);
|
|
2726
2918
|
} catch (error) {
|
|
2727
2919
|
throw new TransactionError("SIGNING_FAILED", "Failed to sign message", void 0, error);
|
|
2728
2920
|
}
|
|
@@ -2743,7 +2935,7 @@ var TransactionSignerError = class extends TransactionError {
|
|
|
2743
2935
|
function isTransactionSignerError(error) {
|
|
2744
2936
|
return error instanceof TransactionSignerError || error instanceof TransactionError;
|
|
2745
2937
|
}
|
|
2746
|
-
var
|
|
2938
|
+
var logger11 = createLogger("KitTransactionSigner");
|
|
2747
2939
|
function encodeShortVecLength(value) {
|
|
2748
2940
|
let bytes = [], remaining = value;
|
|
2749
2941
|
for (; remaining >= 128; )
|
|
@@ -2818,7 +3010,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2818
3010
|
async modifyAndSignTransactions(transactions) {
|
|
2819
3011
|
let transactionData = transactions.map((tx) => {
|
|
2820
3012
|
let messageBytes = new Uint8Array(tx.messageBytes), { numSigners } = parseMessageSigners(messageBytes), wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);
|
|
2821
|
-
return
|
|
3013
|
+
return logger11.debug("Preparing wire format for wallet", {
|
|
2822
3014
|
signerAddress,
|
|
2823
3015
|
messageBytesLength: messageBytes.length,
|
|
2824
3016
|
wireFormatLength: wireFormat.length,
|
|
@@ -2847,14 +3039,14 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2847
3039
|
throw new Error("Web3.js transaction without serialize method");
|
|
2848
3040
|
} else
|
|
2849
3041
|
throw new Error("Unknown signed transaction format");
|
|
2850
|
-
if (
|
|
3042
|
+
if (logger11.debug("Wallet returned signed transaction", {
|
|
2851
3043
|
returnedLength: signedTxBytes.length,
|
|
2852
3044
|
sentLength: wireFormat.length,
|
|
2853
3045
|
lengthsMatch: signedTxBytes.length === wireFormat.length,
|
|
2854
3046
|
signedFirstBytes: Array.from(signedTxBytes.slice(0, 20)),
|
|
2855
3047
|
sentFirstBytes: Array.from(wireFormat.slice(0, 20))
|
|
2856
3048
|
}), signedTxBytes.length !== wireFormat.length) {
|
|
2857
|
-
|
|
3049
|
+
logger11.warn("Wallet modified transaction! Using wallet version", {
|
|
2858
3050
|
originalLength: wireFormat.length,
|
|
2859
3051
|
modifiedLength: signedTxBytes.length,
|
|
2860
3052
|
difference: signedTxBytes.length - wireFormat.length
|
|
@@ -2865,13 +3057,13 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2865
3057
|
lifetimeConstraint: originalWithLifetime.lifetimeConstraint
|
|
2866
3058
|
} : {}
|
|
2867
3059
|
};
|
|
2868
|
-
return
|
|
3060
|
+
return logger11.debug("Using modified transaction from wallet", {
|
|
2869
3061
|
modifiedMessageBytesLength: walletTransaction.messageBytes.length,
|
|
2870
3062
|
signatures: Object.keys(walletTransaction.signatures)
|
|
2871
3063
|
}), assertIsTransactionWithinSizeLimit(result), result;
|
|
2872
3064
|
}
|
|
2873
3065
|
let extractedSignatureBytes = extractSignature(signedTxBytes), signatureBase58 = getBase58Decoder().decode(extractedSignatureBytes);
|
|
2874
|
-
|
|
3066
|
+
logger11.debug("Extracted signature from wallet (unmodified)", {
|
|
2875
3067
|
signerAddress,
|
|
2876
3068
|
signatureLength: extractedSignatureBytes.length,
|
|
2877
3069
|
signatureBase58
|
|
@@ -2886,7 +3078,7 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2886
3078
|
};
|
|
2887
3079
|
return assertIsTransactionWithinSizeLimit(signedTransaction), signedTransaction;
|
|
2888
3080
|
} catch (error) {
|
|
2889
|
-
return
|
|
3081
|
+
return logger11.error("Failed to decode signed transaction", { error }), assertIsTransactionWithinSizeLimit(originalTransaction), originalTransaction;
|
|
2890
3082
|
}
|
|
2891
3083
|
});
|
|
2892
3084
|
}
|
|
@@ -2894,6 +3086,6 @@ function createKitTransactionSigner(connectorSigner) {
|
|
|
2894
3086
|
}
|
|
2895
3087
|
var createGillTransactionSigner = createKitTransactionSigner;
|
|
2896
3088
|
|
|
2897
|
-
export { ClipboardErrorType, ConnectorClient,
|
|
2898
|
-
//# sourceMappingURL=chunk-
|
|
2899
|
-
//# sourceMappingURL=chunk-
|
|
3089
|
+
export { ClipboardErrorType, ConnectorClient, EnhancedStorage, EnhancedStorageAdapter, INITIAL_WALLET_STATUS, PUBLIC_RPC_ENDPOINTS, TransactionSignerError, WALLET_STATE_VERSION, clearWalletState, copyAddressToClipboard, copySignatureToClipboard, copyToClipboard, createConnectorId, createEnhancedStorageAccount, createEnhancedStorageCluster, createEnhancedStorageWallet, createEnhancedStorageWalletState, 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, getWalletNameFromConnectorId, getWalletsRegistry, installPolyfills, isClipboardAvailable, isConnected, isConnecting, isCryptoAvailable, isDevnet, isDevnetCluster, isDisconnected, isLocalCluster, isLocalnet, isMainnet, isMainnetCluster, isPolyfillInstalled, isStatusError, isTestnet, isTestnetCluster, isTransactionSignerError, isWalletConnectorId, isWalletStatusError, normalizeNetwork, parseConfigOptions, ready, saveWalletState, toClusterId, toLegacyWalletState, truncate, validateConfigOptions };
|
|
3090
|
+
//# sourceMappingURL=chunk-IDTUFDNB.mjs.map
|
|
3091
|
+
//# sourceMappingURL=chunk-IDTUFDNB.mjs.map
|