@solana/connector 0.1.8 → 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.
Files changed (58) hide show
  1. package/README.md +97 -0
  2. package/dist/chunk-4JT24DIX.js +466 -0
  3. package/dist/chunk-4JT24DIX.js.map +1 -0
  4. package/dist/chunk-4KD6HQQG.js +69 -0
  5. package/dist/chunk-4KD6HQQG.js.map +1 -0
  6. package/dist/{chunk-DSUCH44G.js → chunk-64LV76OK.js} +2 -67
  7. package/dist/chunk-64LV76OK.js.map +1 -0
  8. package/dist/{chunk-FTXIXM43.js → chunk-6AJJJG5B.js} +614 -138
  9. package/dist/chunk-6AJJJG5B.js.map +1 -0
  10. package/dist/chunk-7XHVZW2L.mjs +460 -0
  11. package/dist/chunk-7XHVZW2L.mjs.map +1 -0
  12. package/dist/{chunk-K3BNIGPX.js → chunk-ATYK5OKR.js} +81 -33
  13. package/dist/chunk-ATYK5OKR.js.map +1 -0
  14. package/dist/{chunk-J7DHGLW6.mjs → chunk-DKCZA2QI.mjs} +3 -61
  15. package/dist/chunk-DKCZA2QI.mjs.map +1 -0
  16. package/dist/chunk-FVA4TUI4.mjs +178 -0
  17. package/dist/chunk-FVA4TUI4.mjs.map +1 -0
  18. package/dist/chunk-HO6QNKFM.mjs +61 -0
  19. package/dist/chunk-HO6QNKFM.mjs.map +1 -0
  20. package/dist/chunk-MN7XNCYI.js +230 -0
  21. package/dist/chunk-MN7XNCYI.js.map +1 -0
  22. package/dist/{chunk-6F6M6L7R.mjs → chunk-QOIQBWMP.mjs} +524 -56
  23. package/dist/chunk-QOIQBWMP.mjs.map +1 -0
  24. package/dist/{chunk-TTOKQAPX.mjs → chunk-WGZYKDXF.mjs} +57 -11
  25. package/dist/chunk-WGZYKDXF.mjs.map +1 -0
  26. package/dist/compat.js +10 -9
  27. package/dist/compat.js.map +1 -1
  28. package/dist/compat.mjs +2 -1
  29. package/dist/compat.mjs.map +1 -1
  30. package/dist/headless.d.mts +217 -100
  31. package/dist/headless.d.ts +217 -100
  32. package/dist/headless.js +190 -168
  33. package/dist/headless.mjs +5 -3
  34. package/dist/index.d.mts +3 -3
  35. package/dist/index.d.ts +3 -3
  36. package/dist/index.js +233 -203
  37. package/dist/index.mjs +6 -4
  38. package/dist/react.d.mts +72 -4
  39. package/dist/react.d.ts +72 -4
  40. package/dist/react.js +52 -36
  41. package/dist/react.mjs +2 -2
  42. package/dist/{standard-shim-CT49DM5l.d.mts → standard-shim-BTUm7cur.d.mts} +280 -1
  43. package/dist/{standard-shim-D9guL5fz.d.ts → standard-shim-LsQ97i9T.d.ts} +280 -1
  44. package/dist/walletconnect-D4JN6H2O.js +28 -0
  45. package/dist/walletconnect-D4JN6H2O.js.map +1 -0
  46. package/dist/walletconnect-I3PZUBTA.mjs +3 -0
  47. package/dist/walletconnect-I3PZUBTA.mjs.map +1 -0
  48. package/package.json +6 -2
  49. package/dist/chunk-6F6M6L7R.mjs.map +0 -1
  50. package/dist/chunk-AOIXHVRH.js +0 -535
  51. package/dist/chunk-AOIXHVRH.js.map +0 -1
  52. package/dist/chunk-DSUCH44G.js.map +0 -1
  53. package/dist/chunk-FTXIXM43.js.map +0 -1
  54. package/dist/chunk-G575OAT4.mjs +0 -476
  55. package/dist/chunk-G575OAT4.mjs.map +0 -1
  56. package/dist/chunk-J7DHGLW6.mjs.map +0 -1
  57. package/dist/chunk-K3BNIGPX.js.map +0 -1
  58. package/dist/chunk-TTOKQAPX.mjs.map +0 -1
@@ -1,10 +1,13 @@
1
- import { createLogger, getPublicSolanaRpcUrl, getExplorerLink, __publicField, tryCatchSync, TransactionError, isWeb3jsTransaction, Errors, prepareTransactionForWallet, convertSignedTransaction, ValidationError, isConnectorError } from './chunk-J7DHGLW6.mjs';
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 { address, isAddress } from '@solana/addresses';
6
- import { getTransactionDecoder, assertIsTransactionWithinSizeLimit } from '@solana/transactions';
6
+ import { Storage, createSolanaMainnet, createSolanaDevnet, createSolanaTestnet, createSolanaLocalnet } from '@wallet-ui/core';
7
+ import { isAddress, address } from '@solana/addresses';
8
+ import { z } from 'zod/v4';
7
9
  import { getBase58Decoder } from '@solana/codecs';
10
+ import { getTransactionDecoder, assertIsTransactionWithinSizeLimit } from '@solana/transactions';
8
11
 
9
12
  // src/lib/wallet/standard-shim.ts
10
13
  var registry = null, registryInitPromise = null, registryInitResolve = null, ready = new Promise((resolve, reject) => {
@@ -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(wallet, "standard:connect"), hasDisconnect = hasFeature(wallet, "standard:disconnect"), isSolana = Array.isArray(wallet.chains) && wallet.chains.some((c) => typeof c == "string" && c.includes("solana"));
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 }), walletAccounts = wallet.accounts, accountMap = /* @__PURE__ */ new Map();
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 (wallet) {
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 || wallet;
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.autoConnect && setTimeout(() => {
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 logger8 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232, MIN_TRANSACTION_SIZE = 64, TransactionValidator = class {
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
- logger8.debug("Transaction not yet serializable (may need signing)", {
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)`), logger8.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"));
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}`), logger8.error("Validation error", { error: 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 ? logger8.debug("Transaction validation passed with warnings", { warnings, size }) : logger8.debug("Transaction validation passed", { size }) : logger8.warn("Transaction validation failed", { errors, size }), {
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 && logger8.warn("Transaction validation warnings", { warnings: result.warnings });
2487
+ result.warnings.length > 0 && logger10.warn("Transaction validation warnings", { warnings: result.warnings });
2068
2488
  }
2069
2489
  /**
2070
2490
  * Batch validate multiple transactions
@@ -2075,12 +2495,31 @@ 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) => (logger8.debug(`Validating transaction ${index + 1}/${transactions.length}`), this.validate(tx, options)));
2498
+ return transactions.map((tx, index) => (logger10.debug(`Validating transaction ${index + 1}/${transactions.length}`), this.validate(tx, options)));
2079
2499
  }
2080
2500
  };
2081
-
2082
- // src/lib/transaction/transaction-signer.ts
2083
- var logger9 = createLogger("TransactionSigner");
2501
+ var logger11 = createLogger("TransactionSigner");
2502
+ function signatureBytesToBase58(bytes) {
2503
+ if (bytes.length !== 64)
2504
+ throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);
2505
+ return getBase58Decoder().decode(bytes);
2506
+ }
2507
+ function extractSignatureString(result) {
2508
+ if (typeof result == "string")
2509
+ return result;
2510
+ if (result instanceof Uint8Array)
2511
+ return signatureBytesToBase58(result);
2512
+ if (Array.isArray(result) && result.length > 0)
2513
+ return extractSignatureString(result[0]);
2514
+ if (result && typeof result == "object") {
2515
+ let record = result;
2516
+ if ("signature" in record)
2517
+ return extractSignatureString(record.signature);
2518
+ if (Array.isArray(record.signatures) && record.signatures.length > 0)
2519
+ return extractSignatureString(record.signatures[0]);
2520
+ }
2521
+ throw new Error("Unexpected wallet response format for signAndSendTransaction");
2522
+ }
2084
2523
  function createTransactionSigner(config) {
2085
2524
  let { wallet, account, cluster, eventEmitter } = config;
2086
2525
  if (!wallet || !account)
@@ -2097,11 +2536,11 @@ function createTransactionSigner(config) {
2097
2536
  throw Errors.featureNotSupported("transaction signing");
2098
2537
  let validation = TransactionValidator.validate(transaction);
2099
2538
  if (!validation.valid)
2100
- throw logger9.error("Transaction validation failed", { errors: validation.errors }), Errors.invalidTransaction(validation.errors.join(", "));
2101
- validation.warnings.length > 0 && logger9.warn("Transaction validation warnings", { warnings: validation.warnings });
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 });
2102
2541
  try {
2103
2542
  let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } = prepareTransactionForWallet(transaction);
2104
- logger9.debug("Signing transaction", {
2543
+ logger11.debug("Signing transaction", {
2105
2544
  wasWeb3js,
2106
2545
  serializedLength: serialized.length,
2107
2546
  serializedType: serialized.constructor.name,
@@ -2110,26 +2549,26 @@ function createTransactionSigner(config) {
2110
2549
  });
2111
2550
  let result, usedFormat = "";
2112
2551
  try {
2113
- logger9.debug("Trying array format: transactions: [Uint8Array]"), result = await signFeature.signTransaction({
2552
+ logger11.debug("Trying array format: transactions: [Uint8Array]"), result = await signFeature.signTransaction({
2114
2553
  account,
2115
2554
  transactions: [serialized],
2116
2555
  ...cluster ? { chain: cluster.id } : {}
2117
2556
  }), usedFormat = "array";
2118
2557
  } catch (err1) {
2119
2558
  let error1 = err1 instanceof Error ? err1 : new Error(String(err1));
2120
- logger9.debug("Array format failed, trying singular format", { error: error1.message });
2559
+ logger11.debug("Array format failed, trying singular format", { error: error1.message });
2121
2560
  try {
2122
- logger9.debug("Trying singular format: transaction: Uint8Array"), result = await signFeature.signTransaction({
2561
+ logger11.debug("Trying singular format: transaction: Uint8Array"), result = await signFeature.signTransaction({
2123
2562
  account,
2124
2563
  transaction: serialized,
2125
2564
  ...cluster ? { chain: cluster.id } : {}
2126
2565
  }), usedFormat = "singular";
2127
2566
  } catch (err2) {
2128
2567
  let error2 = err2 instanceof Error ? err2 : new Error(String(err2));
2129
- throw logger9.error("Both array and singular formats failed", { error: error2.message }), error2;
2568
+ throw logger11.error("Both array and singular formats failed", { error: error2.message }), error2;
2130
2569
  }
2131
2570
  }
2132
- logger9.debug("Wallet signed successfully", { format: usedFormat });
2571
+ logger11.debug("Wallet signed successfully", { format: usedFormat });
2133
2572
  let signedTx;
2134
2573
  if (Array.isArray(result.signedTransactions) && result.signedTransactions[0])
2135
2574
  signedTx = result.signedTransactions[0];
@@ -2141,23 +2580,23 @@ function createTransactionSigner(config) {
2141
2580
  signedTx = result;
2142
2581
  else
2143
2582
  throw new Error(`Unexpected wallet response format: ${JSON.stringify(Object.keys(result))}`);
2144
- if (logger9.debug("Extracted signed transaction", {
2583
+ if (logger11.debug("Extracted signed transaction", {
2145
2584
  hasSignedTx: !!signedTx,
2146
2585
  signedTxType: signedTx?.constructor?.name,
2147
2586
  signedTxLength: signedTx?.length,
2148
2587
  isUint8Array: signedTx instanceof Uint8Array,
2149
2588
  hasSerialize: typeof signedTx?.serialize == "function"
2150
2589
  }), signedTx && typeof signedTx.serialize == "function")
2151
- return logger9.debug("Wallet returned web3.js object directly, no conversion needed"), signedTx;
2590
+ return logger11.debug("Wallet returned web3.js object directly, no conversion needed"), signedTx;
2152
2591
  if (signedTx && signedTx.signedTransaction) {
2153
- logger9.debug("Found signedTransaction property");
2592
+ logger11.debug("Found signedTransaction property");
2154
2593
  let bytes = signedTx.signedTransaction;
2155
2594
  if (bytes instanceof Uint8Array)
2156
2595
  return await convertSignedTransaction(bytes, wasWeb3js);
2157
2596
  }
2158
2597
  if (signedTx instanceof Uint8Array)
2159
2598
  return await convertSignedTransaction(signedTx, wasWeb3js);
2160
- throw logger9.error("Unexpected wallet response format", {
2599
+ throw logger11.error("Unexpected wallet response format", {
2161
2600
  type: typeof signedTx,
2162
2601
  constructor: signedTx?.constructor?.name
2163
2602
  }), new ValidationError(
@@ -2177,9 +2616,15 @@ function createTransactionSigner(config) {
2177
2616
  account,
2178
2617
  transactions: serializedTxs,
2179
2618
  ...cluster ? { chain: cluster.id } : {}
2180
- });
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");
2181
2626
  return await Promise.all(
2182
- result.signedTransactions.map(
2627
+ signedBytesArray.map(
2183
2628
  (signedBytes) => convertSignedTransaction(signedBytes, wasWeb3js)
2184
2629
  )
2185
2630
  );
@@ -2240,7 +2685,7 @@ function createTransactionSigner(config) {
2240
2685
  transaction: serialized
2241
2686
  });
2242
2687
  }
2243
- let signature = typeof result == "object" && result.signature ? result.signature : String(result);
2688
+ let signature = extractSignatureString(result);
2244
2689
  return eventEmitter && eventEmitter.emit({
2245
2690
  type: "transaction:sent",
2246
2691
  signature,
@@ -2298,7 +2743,7 @@ var TransactionSignerError = class extends TransactionError {
2298
2743
  function isTransactionSignerError(error) {
2299
2744
  return error instanceof TransactionSignerError || error instanceof TransactionError;
2300
2745
  }
2301
- var logger10 = createLogger("KitTransactionSigner");
2746
+ var logger12 = createLogger("KitTransactionSigner");
2302
2747
  function encodeShortVecLength(value) {
2303
2748
  let bytes = [], remaining = value;
2304
2749
  for (; remaining >= 128; )
@@ -2318,6 +2763,29 @@ function decodeShortVecLength(data) {
2318
2763
  }
2319
2764
  return { length, bytesConsumed: size };
2320
2765
  }
2766
+ function parseMessageSigners(messageBytes) {
2767
+ let offset = 0;
2768
+ if (messageBytes.length < 4)
2769
+ throw new Error("Invalid message: too short for header");
2770
+ if (messageBytes[0] === 128 && (offset = 1), offset + 3 > messageBytes.length)
2771
+ throw new Error("Invalid message: incomplete header");
2772
+ let numSignerAccounts = messageBytes[offset];
2773
+ if (offset += 3, offset >= messageBytes.length)
2774
+ throw new Error("Invalid message: no static accounts section");
2775
+ let { length: numStaticAccounts, bytesConsumed } = decodeShortVecLength(messageBytes.subarray(offset));
2776
+ offset += bytesConsumed;
2777
+ let staticAccounts = [], base58Decoder = getBase58Decoder();
2778
+ for (let i = 0; i < numStaticAccounts && i < numSignerAccounts; i++) {
2779
+ if (offset + 32 > messageBytes.length)
2780
+ throw new Error(`Invalid message: incomplete account ${i}`);
2781
+ let accountBytes = messageBytes.subarray(offset, offset + 32), accountAddress = base58Decoder.decode(accountBytes);
2782
+ staticAccounts.push(accountAddress), offset += 32;
2783
+ }
2784
+ return {
2785
+ numSigners: numSignerAccounts,
2786
+ staticAccounts
2787
+ };
2788
+ }
2321
2789
  function createTransactionBytesForSigning(messageBytes, numSigners) {
2322
2790
  let numSignaturesBytes = encodeShortVecLength(numSigners), signatureSlots = new Uint8Array(numSigners * 64), totalLength = numSignaturesBytes.length + signatureSlots.length + messageBytes.length, transactionBytes = new Uint8Array(totalLength), offset = 0;
2323
2791
  return transactionBytes.set(numSignaturesBytes, offset), offset += numSignaturesBytes.length, transactionBytes.set(signatureSlots, offset), offset += signatureSlots.length, transactionBytes.set(messageBytes, offset), transactionBytes;
@@ -2349,8 +2817,8 @@ function createKitTransactionSigner(connectorSigner) {
2349
2817
  address: signerAddress,
2350
2818
  async modifyAndSignTransactions(transactions) {
2351
2819
  let transactionData = transactions.map((tx) => {
2352
- let messageBytes = new Uint8Array(tx.messageBytes), numSigners = Object.keys(tx.signatures).length, wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);
2353
- return logger10.debug("Preparing wire format for wallet", {
2820
+ let messageBytes = new Uint8Array(tx.messageBytes), { numSigners } = parseMessageSigners(messageBytes), wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);
2821
+ return logger12.debug("Preparing wire format for wallet", {
2354
2822
  signerAddress,
2355
2823
  messageBytesLength: messageBytes.length,
2356
2824
  wireFormatLength: wireFormat.length,
@@ -2379,14 +2847,14 @@ function createKitTransactionSigner(connectorSigner) {
2379
2847
  throw new Error("Web3.js transaction without serialize method");
2380
2848
  } else
2381
2849
  throw new Error("Unknown signed transaction format");
2382
- if (logger10.debug("Wallet returned signed transaction", {
2850
+ if (logger12.debug("Wallet returned signed transaction", {
2383
2851
  returnedLength: signedTxBytes.length,
2384
2852
  sentLength: wireFormat.length,
2385
2853
  lengthsMatch: signedTxBytes.length === wireFormat.length,
2386
2854
  signedFirstBytes: Array.from(signedTxBytes.slice(0, 20)),
2387
2855
  sentFirstBytes: Array.from(wireFormat.slice(0, 20))
2388
2856
  }), signedTxBytes.length !== wireFormat.length) {
2389
- logger10.warn("Wallet modified transaction! Using wallet version", {
2857
+ logger12.warn("Wallet modified transaction! Using wallet version", {
2390
2858
  originalLength: wireFormat.length,
2391
2859
  modifiedLength: signedTxBytes.length,
2392
2860
  difference: signedTxBytes.length - wireFormat.length
@@ -2397,13 +2865,13 @@ function createKitTransactionSigner(connectorSigner) {
2397
2865
  lifetimeConstraint: originalWithLifetime.lifetimeConstraint
2398
2866
  } : {}
2399
2867
  };
2400
- return logger10.debug("Using modified transaction from wallet", {
2868
+ return logger12.debug("Using modified transaction from wallet", {
2401
2869
  modifiedMessageBytesLength: walletTransaction.messageBytes.length,
2402
2870
  signatures: Object.keys(walletTransaction.signatures)
2403
2871
  }), assertIsTransactionWithinSizeLimit(result), result;
2404
2872
  }
2405
2873
  let extractedSignatureBytes = extractSignature(signedTxBytes), signatureBase58 = getBase58Decoder().decode(extractedSignatureBytes);
2406
- logger10.debug("Extracted signature from wallet (unmodified)", {
2874
+ logger12.debug("Extracted signature from wallet (unmodified)", {
2407
2875
  signerAddress,
2408
2876
  signatureLength: extractedSignatureBytes.length,
2409
2877
  signatureBase58
@@ -2418,7 +2886,7 @@ function createKitTransactionSigner(connectorSigner) {
2418
2886
  };
2419
2887
  return assertIsTransactionWithinSizeLimit(signedTransaction), signedTransaction;
2420
2888
  } catch (error) {
2421
- return logger10.error("Failed to decode signed transaction", { error }), assertIsTransactionWithinSizeLimit(originalTransaction), originalTransaction;
2889
+ return logger12.error("Failed to decode signed transaction", { error }), assertIsTransactionWithinSizeLimit(originalTransaction), originalTransaction;
2422
2890
  }
2423
2891
  });
2424
2892
  }
@@ -2426,6 +2894,6 @@ function createKitTransactionSigner(connectorSigner) {
2426
2894
  }
2427
2895
  var createGillTransactionSigner = createKitTransactionSigner;
2428
2896
 
2429
- export { ClipboardErrorType, ConnectorClient, ConnectorErrorBoundary, DEFAULT_MAX_RETRIES, PUBLIC_RPC_ENDPOINTS, TransactionSignerError, WalletErrorType, copyAddressToClipboard, copySignatureToClipboard, copyToClipboard, createGillTransactionSigner, createKitTransactionSigner, createTransactionSigner, formatAddress, formatBigIntBalance, formatBigIntUsd, formatLamportsToSolSafe, formatNumber, formatSOL, formatTokenAmount, formatTokenBalanceSafe, getAddressUrl, getBlockUrl, getChainIdForWalletStandard, getClusterChainId, getClusterExplorerUrl, getClusterName, getClusterRpcUrl, getClusterType, getDefaultRpcUrl, getNetworkDisplayName, getPolyfillStatus, getTokenUrl, getTransactionUrl, getWalletsRegistry, installPolyfills, isClipboardAvailable, isCryptoAvailable, isDevnet, isDevnetCluster, isLocalCluster, isLocalnet, isMainnet, isMainnetCluster, isPolyfillInstalled, isTestnet, isTestnetCluster, isTransactionSignerError, normalizeNetwork, ready, toClusterId, truncate, withErrorBoundary };
2430
- //# sourceMappingURL=chunk-6F6M6L7R.mjs.map
2431
- //# sourceMappingURL=chunk-6F6M6L7R.mjs.map
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