@solana/connector 0.1.9 → 0.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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-5HRJKCIL.js → chunk-6AJJJG5B.js} +567 -133
  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-WDXEP4AJ.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-MAXA3HEP.mjs → chunk-QOIQBWMP.mjs} +477 -51
  23. package/dist/chunk-QOIQBWMP.mjs.map +1 -0
  24. package/dist/{chunk-P5LXUDP6.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-5HRJKCIL.js.map +0 -1
  50. package/dist/chunk-DSUCH44G.js.map +0 -1
  51. package/dist/chunk-I6TJLYNA.js +0 -535
  52. package/dist/chunk-I6TJLYNA.js.map +0 -1
  53. package/dist/chunk-J7DHGLW6.mjs.map +0 -1
  54. package/dist/chunk-JOBLG62A.mjs +0 -476
  55. package/dist/chunk-JOBLG62A.mjs.map +0 -1
  56. package/dist/chunk-MAXA3HEP.mjs.map +0 -1
  57. package/dist/chunk-P5LXUDP6.mjs.map +0 -1
  58. package/dist/chunk-WDXEP4AJ.js.map +0 -1
@@ -1,8 +1,11 @@
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 { Storage, createSolanaMainnet, createSolanaDevnet, createSolanaTestnet, createSolanaLocalnet } from '@wallet-ui/core';
7
+ import { isAddress, address } from '@solana/addresses';
8
+ import { z } from 'zod/v4';
6
9
  import { getBase58Decoder } from '@solana/codecs';
7
10
  import { getTransactionDecoder, assertIsTransactionWithinSizeLimit } from '@solana/transactions';
8
11
 
@@ -620,6 +623,38 @@ var logger2 = createLogger("WalletAuthenticity"), WalletAuthenticityVerifier = c
620
623
  }
621
624
  };
622
625
 
626
+ // src/lib/wallet/wallet-icon-overrides.ts
627
+ var PHANTOM_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSIxMiIgZmlsbD0iIzk3ODZFNCIvPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF80NF82MTApIj48cGF0aCBkPSJNNS43NjU1IDE1Ljc5N0M1Ljc2NTUgMTcuMjIyIDYuNDk4NzkgMTcuNTUgNy4yNjE0MSAxNy41NUM4Ljg3NDYzIDE3LjU1IDEwLjA4NyAxNi4wODQxIDEwLjgxMDUgMTQuOTI1NkMxMC43MjI1IDE1LjE4MTkgMTAuNjczNiAxNS40MzgyIDEwLjY3MzYgMTUuNjg0MkMxMC42NzM2IDE2LjM2MDkgMTEuMDQ1MiAxNi44NDI3IDExLjc3ODUgMTYuODQyN0MxMi43ODU1IDE2Ljg0MjcgMTMuODYxIDE1LjkyIDE0LjQxODMgMTQuOTI1NkMxNC4zNzkyIDE1LjA2OTIgMTQuMzU5NiAxNS4yMDI0IDE0LjM1OTYgMTUuMzI1NEMxNC4zNTk2IDE1Ljc5NyAxNC42MTM4IDE2LjA5NDMgMTUuMTMyIDE2LjA5NDNDMTYuNzY0OCAxNi4wOTQzIDE4LjQwNzQgMTMuMDcwMSAxOC40MDc0IDEwLjQyNTJDMTguNDA3NCA4LjM2NDU5IDE3LjQxMDEgNi41NTAwNSAxNC45MDcxIDYuNTUwMDVDMTAuNTA3NCA2LjU1MDA1IDUuNzY1NSAxMi4xNjc5IDUuNzY1NSAxNS43OTdaTTEzLjM5MTcgMTAuMTk5NkMxMy4zOTE3IDkuNjg3MDUgMTMuNjY1NCA5LjMyODI1IDE0LjA2NjMgOS4zMjgyNUMxNC40NTc0IDkuMzI4MjUgMTQuNzMxMiA5LjY4NzA1IDE0LjczMTIgMTAuMTk5NkMxNC43MzEyIDEwLjcxMjIgMTQuNDU3NCAxMS4wODEzIDE0LjA2NjMgMTEuMDgxM0MxMy42NjU0IDExLjA4MTMgMTMuMzkxNyAxMC43MTIyIDEzLjM5MTcgMTAuMTk5NlpNMTUuNDg0IDEwLjE5OTZDMTUuNDg0IDkuNjg3MDUgMTUuNzU3OCA5LjMyODI1IDE2LjE1ODYgOS4zMjgyNUMxNi41NDk3IDkuMzI4MjUgMTYuODIzNSA5LjY4NzA1IDE2LjgyMzUgMTAuMTk5NkMxNi44MjM1IDEwLjcxMjIgMTYuNTQ5NyAxMS4wODEzIDE2LjE1ODYgMTEuMDgxM0MxNS43NTc4IDExLjA4MTMgMTUuNDg0IDEwLjcxMjIgMTUuNDg0IDEwLjE5OTZaIiBmaWxsPSIjRkVGREY4Ii8+PC9nPjxkZWZzPjxjbGlwUGF0aCBpZD0iY2xpcDBfNDRfNjEwIj48cmVjdCB3aWR0aD0iMTIuNzYiIGhlaWdodD0iMTEiIGZpbGw9IndoaXRlIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSg1LjcwNjQyIDYuNTQ5OTMpIi8+PC9jbGlwUGF0aD48L2RlZnM+PC9zdmc+", SOLFLARE_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSIxMiIgZmlsbD0iI0ZGRUY0NiIvPjxwYXRoIGQ9Ik0xMi4xMjg1IDEyLjUyNjZMMTIuOTU1NiAxMS43Mjc2TDE0LjQ5NzYgMTIuMjMyM0MxNS41MDcgMTIuNTY4NyAxNi4wMTE3IDEzLjE4NTUgMTYuMDExNyAxNC4wNTQ3QzE2LjAxMTcgMTQuNzEzNiAxNS43NTkzIDE1LjE0ODIgMTUuMjU0NyAxNS43MDg5TDE1LjEwMDUgMTUuODc3MUwxNS4xNTY1IDE1LjQ4NDZDMTUuMzgwOCAxNC4wNTQ3IDE0Ljk2MDMgMTMuNDM3OSAxMy41NzI0IDEyLjk4OTJMMTIuMTI4NSAxMi41MjY2Wk0xMC4wNTM3IDcuNjM0MTRMMTQuMjU5MyA5LjAzNkwxMy4zNDgxIDkuOTA1MTdMMTEuMTYxMiA5LjE3NjE5QzEwLjQwNDIgOC45MjM4NSAxMC4xNTE4IDguNTE3MzEgMTAuMDUzNyA3LjY2MjE3VjcuNjM0MTRaTTkuODAxMzUgMTQuNzU1NkwxMC43NTQ2IDEzLjg0NDRMMTIuNTQ5MSAxNC40MzMyQzEzLjQ4ODMgMTQuNzQxNiAxMy44MTA3IDE1LjE0ODIgMTMuNzEyNiAxNi4xNzE1TDkuODAxMzUgMTQuNzU1NlpNOC41OTU3NyAxMC42OTAyQzguNTk1NzcgMTAuNDIzOSA4LjczNTk1IDEwLjE3MTUgOC45NzQyNyA5Ljk2MTIyQzkuMjI2NjEgMTAuMzI1NyA5LjY2MTE4IDEwLjY0ODEgMTAuMzQ4MSAxMC44NzI1TDExLjgzNDEgMTEuMzYzMUwxMS4wMDcgMTIuMTYyMkw5LjU0OTAzIDExLjY4NTVDOC44NzYxNCAxMS40NjEyIDguNTk1NzcgMTEuMTI0OCA4LjU5NTc3IDEwLjY5MDJaTTEyLjk5NzYgMTguMDVDMTYuMDgxNyAxNi4wMDMzIDE3LjczNTkgMTQuNjE1NCAxNy43MzU5IDEyLjkwNTJDMTcuNzM1OSAxMS43Njk2IDE3LjA2MyAxMS4xMzg4IDE1LjU3NzEgMTAuNjQ4MUwxNC40NTU2IDEwLjI2OTZMMTcuNTI1NyA3LjMyNTcyTDE2LjkwODggNi42NjY4NEwxNS45OTc2IDcuNDY1OUwxMS42OTM5IDYuMDUwMDJDMTAuMzYyMSA2LjQ4NDYgOC42Nzk4OCA3Ljc2MDMgOC42Nzk4OCA5LjAzNkM4LjY3OTg4IDkuMTc2MTggOC42OTM5IDkuMzE2MzcgOC43MzU5NSA5LjQ3MDU5QzcuNjI4NDcgMTAuMTAxNCA3LjE3OTg4IDEwLjY5MDIgNy4xNzk4OCAxMS40MTkxQzcuMTc5ODggMTIuMTA2MSA3LjU0NDM2IDEyLjc5MyA4LjcwNzkyIDEzLjE3MTVMOS42MzMxNCAxMy40Nzk5TDYuNDM2ODkgMTYuNTVMNy4wNTM3MSAxNy4yMDg5TDguMDQ5MDQgMTYuMjk3N0wxMi45OTc2IDE4LjA1WiIgZmlsbD0iIzAyMDUwQSIvPjwvc3ZnPg==", BACKPACK_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHJ4PSIxMiIgZmlsbD0iI0UzM0UzRiIvPjxwYXRoIGQ9Ik0xNS41MTg2IDEzLjkyNzJDMTUuOTgxMSAxMy45MjcyIDE2LjIxMjcgMTMuOTI3MSAxNi4zNTY0IDE0LjA3MDhDMTYuNTAwMiAxNC4yMTQ1IDE2LjUgMTQuNDQ2MiAxNi41IDE0LjkwODdWMTUuNTY0QzE2LjUgMTYuNDg5MyAxNi41MDAyIDE2Ljk1MjIgMTYuMjEyOSAxNy4yMzk3QzE1LjkyNTMgMTcuNTI3MyAxNS40NjE4IDE3LjUyNzggMTQuNTM2MSAxNy41Mjc4SDkuNDYzODdDOC41Mzg0MiAxNy41Mjc4IDguMDc1NjcgMTcuNTI3MSA3Ljc4ODA5IDE3LjIzOTdDNy41MDA1NCAxNi45NTIyIDcuNSAxNi40ODk0IDcuNSAxNS41NjRWMTQuOTA4N0M3LjUgMTQuNDQ2MiA3LjQ5OTgyIDE0LjIxNDUgNy42NDM1NSAxNC4wNzA4QzcuNzg3MyAxMy45MjcxIDguMDE4OTEgMTMuOTI3MiA4LjQ4MTQ1IDEzLjkyNzJIMTUuNTE4NlpNMTIgNi4zNTg4OUMxNi41NjUzIDYuMzU4ODkgMTYuNSA5LjQwMjM4IDE2LjUgMTAuODU4OVYxMi40OTU2QzE2LjQ5OTkgMTIuNzY2NyAxNi4yNzk5IDEyLjk4NjggMTYuMDA4OCAxMi45ODY4SDcuOTkxMjFDNy43MjAxMiAxMi45ODY4IDcuNTAwMDYgMTIuNzY2NyA3LjUgMTIuNDk1NkM3LjUgMTIuNDk1NiA3LjUgMTIuMzE1MyA3LjUgMTAuODU4OUM3LjQ5OTk5IDkuNDAyMzkgNy40MzQ3OCA2LjM1ODkzIDEyIDYuMzU4ODlaTTEyIDcuNTE5MDRDMTEuMjMxOSA3LjUxOTEgMTAuNjA5NCA4LjE0MTU1IDEwLjYwOTQgOC45MDk2N0MxMC42MDk0IDkuNjc3NzggMTEuMjMxOSAxMC4zMDAyIDEyIDEwLjMwMDNDMTIuNzY4MiAxMC4zMDAzIDEzLjM5MDYgOS42Nzc4MiAxMy4zOTA2IDguOTA5NjdDMTMuMzkwNiA4LjE0MTUxIDEyLjc2ODIgNy41MTkwNCAxMiA3LjUxOTA0Wk0xMS45OTkgNC40NzIxN0MxMi45ODQxIDQuNDcyMjIgMTMuODQ2MiA0LjgxNjczIDE0LjA3NDIgNS4zNzc0NEMxNC4xMDg1IDUuNDczODcgMTQuMTI1OCA1LjUyMjIyIDE0LjA5NTcgNS41NTgxMUMxNC4wNjUyIDUuNTk0MDIgMTQuMDA1OCA1LjU4MzQyIDEzLjg4NzcgNS41NjIwMUMxMy41ODIyIDUuNTA2NjUgMTMuMTQ5MyA1LjQ2ODc3IDEyLjc2ODYgNS40NTc1MkMxMi41MjU4IDUuNDQ0NDggMTIuMjY5NSA1LjQzNzk5IDEyIDUuNDM3OTlDMTEuNzMwNSA1LjQzNzk5IDExLjQ3NDIgNS40NDQ0OCAxMS4yMzE0IDUuNDU3NTJDMTAuODQ5IDUuNDY4NzcgMTAuNDE0OSA1LjUwNjU4IDEwLjEwODQgNS41NjAwNkM5Ljk5MzM1IDUuNTgwMTMgOS45MzU2NSA1LjU5MDQ3IDkuOTA1MjcgNS41NTUxOEM5Ljg3NDk3IDUuNTE5MzUgOS44OTEyOCA1LjQ3MTQ0IDkuOTI0OCA1LjM3NjQ2QzEwLjE1MSA0LjgxNzQ4IDExLjAxNDIgNC40NzIxNyAxMS45OTkgNC40NzIxN1oiIGZpbGw9IndoaXRlIi8+PC9zdmc+", WALLET_ICON_OVERRIDES = {
628
+ Phantom: PHANTOM_ICON,
629
+ Solflare: SOLFLARE_ICON,
630
+ Backpack: BACKPACK_ICON
631
+ }, ICON_PROXY_CACHE = /* @__PURE__ */ new WeakMap();
632
+ function getWalletIconOverride(walletName) {
633
+ return WALLET_ICON_OVERRIDES[walletName];
634
+ }
635
+ function createIconProxy(wallet, icon) {
636
+ let cached = ICON_PROXY_CACHE.get(wallet);
637
+ if (cached) return cached;
638
+ let proxy = new Proxy(wallet, {
639
+ get(target, prop) {
640
+ if (prop === "icon") return icon;
641
+ let value = Reflect.get(target, prop, target);
642
+ return typeof value == "function" ? value.bind(target) : value;
643
+ }
644
+ });
645
+ return ICON_PROXY_CACHE.set(wallet, proxy), proxy;
646
+ }
647
+ function applyWalletIconOverride(wallet) {
648
+ let override = getWalletIconOverride(wallet.name);
649
+ if (!override || wallet.icon === override) return wallet;
650
+ if (Object.isExtensible(wallet))
651
+ try {
652
+ return wallet.icon = override, wallet;
653
+ } catch {
654
+ }
655
+ return createIconProxy(wallet, override);
656
+ }
657
+
623
658
  // src/lib/wallet/detector.ts
624
659
  var logger3 = createLogger("WalletDetector");
625
660
  function hasFeature(wallet, featureName) {
@@ -750,9 +785,9 @@ var WalletDetector = class extends BaseCollaborator {
750
785
  * Convert a Wallet Standard wallet to WalletInfo with capability checks
751
786
  */
752
787
  mapToWalletInfo(wallet) {
753
- let hasConnect = hasFeature(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,10 +2495,10 @@ var logger8 = createLogger("TransactionValidator"), MAX_TRANSACTION_SIZE = 1232,
2075
2495
  * @returns Array of validation results
2076
2496
  */
2077
2497
  static validateBatch(transactions, options) {
2078
- return transactions.map((tx, index) => (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
- var logger9 = createLogger("TransactionSigner");
2501
+ var logger11 = createLogger("TransactionSigner");
2082
2502
  function signatureBytesToBase58(bytes) {
2083
2503
  if (bytes.length !== 64)
2084
2504
  throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`);
@@ -2116,11 +2536,11 @@ function createTransactionSigner(config) {
2116
2536
  throw Errors.featureNotSupported("transaction signing");
2117
2537
  let validation = TransactionValidator.validate(transaction);
2118
2538
  if (!validation.valid)
2119
- throw logger9.error("Transaction validation failed", { errors: validation.errors }), Errors.invalidTransaction(validation.errors.join(", "));
2120
- 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 });
2121
2541
  try {
2122
2542
  let signFeature = features["solana:signTransaction"], { serialized, wasWeb3js } = prepareTransactionForWallet(transaction);
2123
- logger9.debug("Signing transaction", {
2543
+ logger11.debug("Signing transaction", {
2124
2544
  wasWeb3js,
2125
2545
  serializedLength: serialized.length,
2126
2546
  serializedType: serialized.constructor.name,
@@ -2129,26 +2549,26 @@ function createTransactionSigner(config) {
2129
2549
  });
2130
2550
  let result, usedFormat = "";
2131
2551
  try {
2132
- logger9.debug("Trying array format: transactions: [Uint8Array]"), result = await signFeature.signTransaction({
2552
+ logger11.debug("Trying array format: transactions: [Uint8Array]"), result = await signFeature.signTransaction({
2133
2553
  account,
2134
2554
  transactions: [serialized],
2135
2555
  ...cluster ? { chain: cluster.id } : {}
2136
2556
  }), usedFormat = "array";
2137
2557
  } catch (err1) {
2138
2558
  let error1 = err1 instanceof Error ? err1 : new Error(String(err1));
2139
- logger9.debug("Array format failed, trying singular format", { error: error1.message });
2559
+ logger11.debug("Array format failed, trying singular format", { error: error1.message });
2140
2560
  try {
2141
- logger9.debug("Trying singular format: transaction: Uint8Array"), result = await signFeature.signTransaction({
2561
+ logger11.debug("Trying singular format: transaction: Uint8Array"), result = await signFeature.signTransaction({
2142
2562
  account,
2143
2563
  transaction: serialized,
2144
2564
  ...cluster ? { chain: cluster.id } : {}
2145
2565
  }), usedFormat = "singular";
2146
2566
  } catch (err2) {
2147
2567
  let error2 = err2 instanceof Error ? err2 : new Error(String(err2));
2148
- throw 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;
2149
2569
  }
2150
2570
  }
2151
- logger9.debug("Wallet signed successfully", { format: usedFormat });
2571
+ logger11.debug("Wallet signed successfully", { format: usedFormat });
2152
2572
  let signedTx;
2153
2573
  if (Array.isArray(result.signedTransactions) && result.signedTransactions[0])
2154
2574
  signedTx = result.signedTransactions[0];
@@ -2160,23 +2580,23 @@ function createTransactionSigner(config) {
2160
2580
  signedTx = result;
2161
2581
  else
2162
2582
  throw new Error(`Unexpected wallet response format: ${JSON.stringify(Object.keys(result))}`);
2163
- if (logger9.debug("Extracted signed transaction", {
2583
+ if (logger11.debug("Extracted signed transaction", {
2164
2584
  hasSignedTx: !!signedTx,
2165
2585
  signedTxType: signedTx?.constructor?.name,
2166
2586
  signedTxLength: signedTx?.length,
2167
2587
  isUint8Array: signedTx instanceof Uint8Array,
2168
2588
  hasSerialize: typeof signedTx?.serialize == "function"
2169
2589
  }), signedTx && typeof signedTx.serialize == "function")
2170
- return 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;
2171
2591
  if (signedTx && signedTx.signedTransaction) {
2172
- logger9.debug("Found signedTransaction property");
2592
+ logger11.debug("Found signedTransaction property");
2173
2593
  let bytes = signedTx.signedTransaction;
2174
2594
  if (bytes instanceof Uint8Array)
2175
2595
  return await convertSignedTransaction(bytes, wasWeb3js);
2176
2596
  }
2177
2597
  if (signedTx instanceof Uint8Array)
2178
2598
  return await convertSignedTransaction(signedTx, wasWeb3js);
2179
- throw logger9.error("Unexpected wallet response format", {
2599
+ throw logger11.error("Unexpected wallet response format", {
2180
2600
  type: typeof signedTx,
2181
2601
  constructor: signedTx?.constructor?.name
2182
2602
  }), new ValidationError(
@@ -2196,9 +2616,15 @@ function createTransactionSigner(config) {
2196
2616
  account,
2197
2617
  transactions: serializedTxs,
2198
2618
  ...cluster ? { chain: cluster.id } : {}
2199
- });
2619
+ }), signedBytesArray;
2620
+ if (Array.isArray(result))
2621
+ signedBytesArray = result.map((item) => item.signedTransaction);
2622
+ else if ("signedTransactions" in result)
2623
+ signedBytesArray = result.signedTransactions;
2624
+ else
2625
+ throw new Error("Unexpected signAllTransactions response format");
2200
2626
  return await Promise.all(
2201
- result.signedTransactions.map(
2627
+ signedBytesArray.map(
2202
2628
  (signedBytes) => convertSignedTransaction(signedBytes, wasWeb3js)
2203
2629
  )
2204
2630
  );
@@ -2317,7 +2743,7 @@ var TransactionSignerError = class extends TransactionError {
2317
2743
  function isTransactionSignerError(error) {
2318
2744
  return error instanceof TransactionSignerError || error instanceof TransactionError;
2319
2745
  }
2320
- var logger10 = createLogger("KitTransactionSigner");
2746
+ var logger12 = createLogger("KitTransactionSigner");
2321
2747
  function encodeShortVecLength(value) {
2322
2748
  let bytes = [], remaining = value;
2323
2749
  for (; remaining >= 128; )
@@ -2392,7 +2818,7 @@ function createKitTransactionSigner(connectorSigner) {
2392
2818
  async modifyAndSignTransactions(transactions) {
2393
2819
  let transactionData = transactions.map((tx) => {
2394
2820
  let messageBytes = new Uint8Array(tx.messageBytes), { numSigners } = parseMessageSigners(messageBytes), wireFormat = createTransactionBytesForSigning(messageBytes, numSigners);
2395
- return logger10.debug("Preparing wire format for wallet", {
2821
+ return logger12.debug("Preparing wire format for wallet", {
2396
2822
  signerAddress,
2397
2823
  messageBytesLength: messageBytes.length,
2398
2824
  wireFormatLength: wireFormat.length,
@@ -2421,14 +2847,14 @@ function createKitTransactionSigner(connectorSigner) {
2421
2847
  throw new Error("Web3.js transaction without serialize method");
2422
2848
  } else
2423
2849
  throw new Error("Unknown signed transaction format");
2424
- if (logger10.debug("Wallet returned signed transaction", {
2850
+ if (logger12.debug("Wallet returned signed transaction", {
2425
2851
  returnedLength: signedTxBytes.length,
2426
2852
  sentLength: wireFormat.length,
2427
2853
  lengthsMatch: signedTxBytes.length === wireFormat.length,
2428
2854
  signedFirstBytes: Array.from(signedTxBytes.slice(0, 20)),
2429
2855
  sentFirstBytes: Array.from(wireFormat.slice(0, 20))
2430
2856
  }), signedTxBytes.length !== wireFormat.length) {
2431
- logger10.warn("Wallet modified transaction! Using wallet version", {
2857
+ logger12.warn("Wallet modified transaction! Using wallet version", {
2432
2858
  originalLength: wireFormat.length,
2433
2859
  modifiedLength: signedTxBytes.length,
2434
2860
  difference: signedTxBytes.length - wireFormat.length
@@ -2439,13 +2865,13 @@ function createKitTransactionSigner(connectorSigner) {
2439
2865
  lifetimeConstraint: originalWithLifetime.lifetimeConstraint
2440
2866
  } : {}
2441
2867
  };
2442
- return logger10.debug("Using modified transaction from wallet", {
2868
+ return logger12.debug("Using modified transaction from wallet", {
2443
2869
  modifiedMessageBytesLength: walletTransaction.messageBytes.length,
2444
2870
  signatures: Object.keys(walletTransaction.signatures)
2445
2871
  }), assertIsTransactionWithinSizeLimit(result), result;
2446
2872
  }
2447
2873
  let extractedSignatureBytes = extractSignature(signedTxBytes), signatureBase58 = getBase58Decoder().decode(extractedSignatureBytes);
2448
- logger10.debug("Extracted signature from wallet (unmodified)", {
2874
+ logger12.debug("Extracted signature from wallet (unmodified)", {
2449
2875
  signerAddress,
2450
2876
  signatureLength: extractedSignatureBytes.length,
2451
2877
  signatureBase58
@@ -2460,7 +2886,7 @@ function createKitTransactionSigner(connectorSigner) {
2460
2886
  };
2461
2887
  return assertIsTransactionWithinSizeLimit(signedTransaction), signedTransaction;
2462
2888
  } catch (error) {
2463
- return logger10.error("Failed to decode signed transaction", { error }), assertIsTransactionWithinSizeLimit(originalTransaction), originalTransaction;
2889
+ return logger12.error("Failed to decode signed transaction", { error }), assertIsTransactionWithinSizeLimit(originalTransaction), originalTransaction;
2464
2890
  }
2465
2891
  });
2466
2892
  }
@@ -2468,6 +2894,6 @@ function createKitTransactionSigner(connectorSigner) {
2468
2894
  }
2469
2895
  var createGillTransactionSigner = createKitTransactionSigner;
2470
2896
 
2471
- export { ClipboardErrorType, ConnectorClient, ConnectorErrorBoundary, 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 };
2472
- //# sourceMappingURL=chunk-MAXA3HEP.mjs.map
2473
- //# sourceMappingURL=chunk-MAXA3HEP.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