@dynamic-labs-sdk/solana 0.14.0 → 0.16.1

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 (57) hide show
  1. package/dist/{addSolanaWalletStandardExtension-Bv39eDZc.cjs.js → addSolanaWalletStandardExtension-0JyyakfO.cjs.js} +6 -4
  2. package/dist/addSolanaWalletStandardExtension-0JyyakfO.cjs.js.map +1 -0
  3. package/dist/{addSolanaWalletStandardExtension-B7GpGFx3.esm.js → addSolanaWalletStandardExtension-CPT-KI29.esm.js} +4 -2
  4. package/dist/addSolanaWalletStandardExtension-CPT-KI29.esm.js.map +1 -0
  5. package/dist/{addWaasSolanaExtension-ofYQDYyc.esm.js → addWaasSolanaExtension-CLhieXpF.esm.js} +8 -29
  6. package/dist/addWaasSolanaExtension-CLhieXpF.esm.js.map +1 -0
  7. package/dist/{addWaasSolanaExtension-BaxzWnYL.cjs.js → addWaasSolanaExtension-s5RmA285.cjs.js} +12 -39
  8. package/dist/addWaasSolanaExtension-s5RmA285.cjs.js.map +1 -0
  9. package/dist/checkoutTransaction.types.d.ts +6 -0
  10. package/dist/checkoutTransaction.types.d.ts.map +1 -0
  11. package/dist/exports/index.d.ts +2 -1
  12. package/dist/exports/index.d.ts.map +1 -1
  13. package/dist/index.cjs.js +75 -92
  14. package/dist/index.cjs.js.map +1 -1
  15. package/dist/index.esm.js +61 -79
  16. package/dist/index.esm.js.map +1 -1
  17. package/dist/isSolanaGasSponsorshipEnabled/index.d.ts +2 -0
  18. package/dist/isSolanaGasSponsorshipEnabled/index.d.ts.map +1 -0
  19. package/dist/isSolanaGasSponsorshipEnabled/isSolanaGasSponsorshipEnabled.d.ts +8 -0
  20. package/dist/isSolanaGasSponsorshipEnabled/isSolanaGasSponsorshipEnabled.d.ts.map +1 -0
  21. package/dist/phantomRedirect/addPhantomRedirectSolanaExtension/addPhantomRedirectSolanaExtension.d.ts.map +1 -1
  22. package/dist/phantomRedirect/completePhantomRedirect/completePhantomRedirect.d.ts.map +1 -1
  23. package/dist/phantomRedirect/createPhantomRedirectWalletProvider/createPhantomRedirectWalletProvider.d.ts.map +1 -1
  24. package/dist/phantomRedirect/detectPhantomRedirect/detectPhantomRedirect.d.ts +10 -0
  25. package/dist/phantomRedirect/detectPhantomRedirect/detectPhantomRedirect.d.ts.map +1 -1
  26. package/dist/phantomRedirect/utils/getPhantomCluster/getPhantomCluster.d.ts.map +1 -1
  27. package/dist/solanaTransferAmount-Bd39IUO-.esm.js +221 -0
  28. package/dist/solanaTransferAmount-Bd39IUO-.esm.js.map +1 -0
  29. package/dist/solanaTransferAmount-DQusACZn.cjs.js +287 -0
  30. package/dist/solanaTransferAmount-DQusACZn.cjs.js.map +1 -0
  31. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  32. package/dist/utils/solanaExecuteCheckoutTransaction/index.d.ts +2 -0
  33. package/dist/utils/solanaExecuteCheckoutTransaction/index.d.ts.map +1 -0
  34. package/dist/utils/solanaExecuteCheckoutTransaction/solanaExecuteCheckoutTransaction.d.ts +19 -0
  35. package/dist/utils/solanaExecuteCheckoutTransaction/solanaExecuteCheckoutTransaction.d.ts.map +1 -0
  36. package/dist/utils/solanaTransferAmount/index.d.ts +2 -0
  37. package/dist/utils/solanaTransferAmount/index.d.ts.map +1 -0
  38. package/dist/utils/solanaTransferAmount/solanaTransferAmount.d.ts +14 -0
  39. package/dist/utils/solanaTransferAmount/solanaTransferAmount.d.ts.map +1 -0
  40. package/dist/waas/utils/createWalletProviderForWaasSolana/createWalletProviderForWaasSolana.d.ts.map +1 -1
  41. package/dist/waas.cjs.js +4 -4
  42. package/dist/waas.cjs.js.map +1 -1
  43. package/dist/waas.esm.js +2 -2
  44. package/dist/walletConnect/createWalletProviderFromWalletConnectSolanaSession/createWalletProviderFromWalletConnectSolanaSession.d.ts.map +1 -1
  45. package/dist/walletStandard/utils/createWalletProviderFromSolanaStandardWallet/createWalletProviderFromSolanaStandardWallet.d.ts.map +1 -1
  46. package/dist/walletStandard.cjs.js +3 -3
  47. package/dist/walletStandard.cjs.js.map +1 -1
  48. package/dist/walletStandard.esm.js +2 -2
  49. package/package.json +6 -5
  50. package/dist/addSolanaWalletStandardExtension-B7GpGFx3.esm.js.map +0 -1
  51. package/dist/addSolanaWalletStandardExtension-Bv39eDZc.cjs.js.map +0 -1
  52. package/dist/addWaasSolanaExtension-BaxzWnYL.cjs.js.map +0 -1
  53. package/dist/addWaasSolanaExtension-ofYQDYyc.esm.js.map +0 -1
  54. package/dist/isVersionedTransaction-CecentWi.esm.js +0 -48
  55. package/dist/isVersionedTransaction-CecentWi.esm.js.map +0 -1
  56. package/dist/isVersionedTransaction-DW-V1tUS.cjs.js +0 -72
  57. package/dist/isVersionedTransaction-DW-V1tUS.cjs.js.map +0 -1
package/dist/index.esm.js CHANGED
@@ -1,10 +1,10 @@
1
- import { i as version, n as registerSolanaNetworkProviderBuilder, r as name, t as isVersionedTransaction } from "./isVersionedTransaction-CecentWi.esm.js";
2
- import { n as SponsorTransactionError, r as getSolanaConnection, t as addWaasSolanaExtension } from "./addWaasSolanaExtension-ofYQDYyc.esm.js";
3
- import { t as addSolanaWalletStandardExtension } from "./addSolanaWalletStandardExtension-B7GpGFx3.esm.js";
1
+ import { a as isSolanaWalletProvider, c as getSolanaConnection, d as version, i as solanaExecuteCheckoutTransaction, l as registerSolanaNetworkProviderBuilder, n as isSolanaGasSponsorshipEnabled, o as isSolanaWalletAccount, r as NotSolanaProviderError, s as isVersionedTransaction, t as solanaTransferAmount, u as name } from "./solanaTransferAmount-Bd39IUO-.esm.js";
2
+ import { n as SponsorTransactionError, t as addWaasSolanaExtension } from "./addWaasSolanaExtension-CLhieXpF.esm.js";
3
+ import { t as addSolanaWalletStandardExtension } from "./addSolanaWalletStandardExtension-CPT-KI29.esm.js";
4
4
  import { assertPackageVersion } from "@dynamic-labs-sdk/assert-package-version";
5
- import { MethodNotImplementedError, WalletProviderPriority, assertDefined, createApiClient, createDeferredPromise, createRuntimeServiceAccessKey, createStorageKeySchema, emitEvent, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getBuffer, getCore, getDefaultClient, getNetworkProviders, getWalletProviderFromWalletAccount, getWalletProviderRegistry, hasExtension, registerExtension } from "@dynamic-labs-sdk/client/core";
5
+ import { MethodNotImplementedError, WalletProviderPriority, assertDefined, createApiClient, createDeferredPromise, createRuntimeServiceAccessKey, createStorageKeySchema, emitEvent, formatWalletProviderGroupKey, formatWalletProviderKey, getActiveNetworkIdFromLastKnownRegistry, getBuffer, getCore, getDefaultClient, getNetworkProviders, getWalletProviderFromWalletAccount, getWalletProviderRegistry, hasExtension, randomString, registerExtension } from "@dynamic-labs-sdk/client/core";
6
6
  import { Connection, LAMPORTS_PER_SOL, PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
7
- import { BaseError, FeeEstimationFailedError, InvalidParamError, SimulationFailedError, getActiveNetworkData, getDefaultClient as getDefaultClient$1, onceEvent } from "@dynamic-labs-sdk/client";
7
+ import { BaseError, FeeEstimationFailedError, InvalidParamError, SimulationFailedError, getActiveNetworkData, getDefaultClient as getDefaultClient$1, onEvent, onceEvent } from "@dynamic-labs-sdk/client";
8
8
  import { WalletProviderEnum } from "@dynamic-labs/sdk-api-core";
9
9
  import bs58 from "bs58";
10
10
  import * as z from "zod/mini";
@@ -25,22 +25,6 @@ const addSolanaExtension = (client = getDefaultClient()) => {
25
25
  addWaasSolanaExtension(client);
26
26
  };
27
27
 
28
- //#endregion
29
- //#region src/errors/NotSolanaProviderError/NotSolanaProviderError.ts
30
- var NotSolanaProviderError = class extends BaseError {
31
- providerKey;
32
- constructor(params) {
33
- super({
34
- cause: null,
35
- code: "not_solana_provider_error",
36
- docsUrl: null,
37
- name: "NotSolanaProviderError",
38
- shortMessage: "Provider is not a Solana wallet provider"
39
- });
40
- this.providerKey = params.providerKey;
41
- }
42
- };
43
-
44
28
  //#endregion
45
29
  //#region src/isSolanaNetworkProvider/isSolanaNetworkProvider.ts
46
30
  /**
@@ -51,16 +35,6 @@ var NotSolanaProviderError = class extends BaseError {
51
35
  */
52
36
  const isSolanaNetworkProvider = (networkProvider) => networkProvider.chain === "SOL";
53
37
 
54
- //#endregion
55
- //#region src/isSolanaWalletAccount/isSolanaWalletAccount.ts
56
- /**
57
- * Type guard function to check if a wallet account is a Solana wallet account.
58
- *
59
- * @param walletAccount - The wallet account to check.
60
- * @returns True if the wallet account is a Solana wallet account, false otherwise.
61
- */
62
- const isSolanaWalletAccount = (walletAccount) => walletAccount.chain === "SOL";
63
-
64
38
  //#endregion
65
39
  //#region src/utils/calculateSolanaTransactionFee/calculateSolanaTransactionFee.ts
66
40
  const MAX_RETRIES = 5;
@@ -485,12 +459,7 @@ const isCloneTab = (client) => !getPhantomOriginTab(client).isOriginTab;
485
459
  const completeAndEmitPhantomRedirectEvent = async ({ args, event }, client) => {
486
460
  const core = getCore(client);
487
461
  const cloneTab = isCloneTab(client);
488
- core.logger.debug("[PHANTOM] completeAndEmitPhantomRedirectEvent: start", {
489
- event,
490
- isCloneTab: cloneTab
491
- });
492
462
  await core.storage.removeItem(pendingRequestStorageKeySchema);
493
- core.logger.debug("[PHANTOM] completeAndEmitPhantomRedirectEvent: emitting event locally", { event });
494
463
  emitEvent({
495
464
  args,
496
465
  event
@@ -536,13 +505,8 @@ const completeAndEmitPhantomRedirectEvent = async ({ args, event }, client) => {
536
505
  */
537
506
  const completePhantomRedirect = async ({ url }, client = getDefaultClient()) => {
538
507
  const core = getCore(client);
539
- core.logger.debug("[PHANTOM] completePhantomRedirect: start", { search: url.search });
540
508
  const params = parsePhantomRedirectParams({ url });
541
509
  const pendingRequest = await core.storage.getItem(pendingRequestStorageKeySchema);
542
- core.logger.debug("[PHANTOM] completePhantomRedirect: pendingRequest", {
543
- found: !!pendingRequest,
544
- method: pendingRequest?.method
545
- });
546
510
  if (!pendingRequest) throw new NoPendingPhantomRequestError();
547
511
  if (params.errorCode) {
548
512
  const error = new PhantomRedirectRejectedError({
@@ -687,6 +651,14 @@ const generateNaClKeyPair = () => {
687
651
  //#endregion
688
652
  //#region src/phantomRedirect/utils/getPhantomCluster/getPhantomCluster.ts
689
653
  /**
654
+ * Normalizes a cluster string to the value expected by Phantom's deep link protocol.
655
+ * Our API returns "mainnet" but Phantom expects "mainnet-beta".
656
+ */
657
+ const normalizeCluster = (cluster) => {
658
+ if (cluster === "mainnet") return "mainnet-beta";
659
+ return cluster;
660
+ };
661
+ /**
690
662
  * Returns the Solana cluster name expected by Phantom's deep link protocol
691
663
  * (e.g. "mainnet-beta", "devnet", "testnet").
692
664
  *
@@ -701,9 +673,9 @@ const generateNaClKeyPair = () => {
701
673
  const getPhantomCluster = async ({ dynamicClient, walletAccount }) => {
702
674
  if (walletAccount) {
703
675
  const { networkData } = await getActiveNetworkData({ walletAccount }, dynamicClient);
704
- return networkData?.cluster ?? void 0;
676
+ return normalizeCluster(networkData?.cluster);
705
677
  }
706
- return getNetworkProviders(dynamicClient).find((p) => p.chain === "SOL")?.cluster ?? void 0;
678
+ return normalizeCluster(getNetworkProviders(dynamicClient).find((p) => p.chain === "SOL")?.cluster);
707
679
  };
708
680
 
709
681
  //#endregion
@@ -741,14 +713,6 @@ const listenForPhantomBroadcast = (listeners, client) => {
741
713
  //#endregion
742
714
  //#region src/phantomRedirect/createPhantomRedirectWalletProvider/createPhantomRedirectWalletProvider.ts
743
715
  /**
744
- * Generates a random alphanumeric string of specified length.
745
- */
746
- const randomString = (length) => {
747
- const chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
748
- const bytes = crypto.getRandomValues(new Uint8Array(length));
749
- return Array.from(bytes, (byte) => chars[byte % 62]).join("");
750
- };
751
- /**
752
716
  * Extracts the dApp URL from a redirect URL.
753
717
  */
754
718
  const extractDappUrl = (redirectUrl) => {
@@ -775,7 +739,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
775
739
  const groupKey = formatWalletProviderGroupKey("Phantom");
776
740
  const metadata = {
777
741
  displayName: "Phantom",
778
- icon: "https://phantom.app/img/phantom-logo.svg"
742
+ icon: "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMDgiIGhlaWdodD0iMTA4IiB2aWV3Qm94PSIwIDAgMTA4IDEwOCIgZmlsbD0ibm9uZSI+CjxyZWN0IHdpZHRoPSIxMDgiIGhlaWdodD0iMTA4IiByeD0iMjYiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00Ni41MjY3IDY5LjkyMjlDNDIuMDA1NCA3Ni44NTA5IDM0LjQyOTIgODUuNjE4MiAyNC4zNDggODUuNjE4MkMxOS41ODI0IDg1LjYxODIgMTUgODMuNjU2MyAxNSA3NS4xMzQyQzE1IDUzLjQzMDUgNDQuNjMyNiAxOS44MzI3IDcyLjEyNjggMTkuODMyN0M4Ny43NjggMTkuODMyNyA5NCAzMC42ODQ2IDk0IDQzLjAwNzlDOTQgNTguODI1OCA4My43MzU1IDc2LjkxMjIgNzMuNTMyMSA3Ni45MTIyQzcwLjI5MzkgNzYuOTEyMiA2OC43MDUzIDc1LjEzNDIgNjguNzA1MyA3Mi4zMTRDNjguNzA1MyA3MS41NzgzIDY4LjgyNzUgNzAuNzgxMiA2OS4wNzE5IDY5LjkyMjlDNjUuNTg5MyA3NS44Njk5IDU4Ljg2ODUgODEuMzg3OCA1Mi41NzU0IDgxLjM4NzhDNDcuOTkzIDgxLjM4NzggNDUuNjcxMyA3OC41MDYzIDQ1LjY3MTMgNzQuNDU5OEM0NS42NzEzIDcyLjk4ODQgNDUuOTc2OCA3MS40NTU2IDQ2LjUyNjcgNjkuOTIyOVpNODMuNjc2MSA0Mi41Nzk0QzgzLjY3NjEgNDYuMTcwNCA4MS41NTc1IDQ3Ljk2NTggNzkuMTg3NSA0Ny45NjU4Qzc2Ljc4MTYgNDcuOTY1OCA3NC42OTg5IDQ2LjE3MDQgNzQuNjk4OSA0Mi41Nzk0Qzc0LjY5ODkgMzguOTg4NSA3Ni43ODE2IDM3LjE5MzEgNzkuMTg3NSAzNy4xOTMxQzgxLjU1NzUgMzcuMTkzMSA4My42NzYxIDM4Ljk4ODUgODMuNjc2MSA0Mi41Nzk0Wk03MC4yMTAzIDQyLjU3OTVDNzAuMjEwMyA0Ni4xNzA0IDY4LjA5MTYgNDcuOTY1OCA2NS43MjE2IDQ3Ljk2NThDNjMuMzE1NyA0Ny45NjU4IDYxLjIzMyA0Ni4xNzA0IDYxLjIzMyA0Mi41Nzk1QzYxLjIzMyAzOC45ODg1IDYzLjMxNTcgMzcuMTkzMSA2NS43MjE2IDM3LjE5MzFDNjguMDkxNiAzNy4xOTMxIDcwLjIxMDMgMzguOTg4NSA3MC4yMTAzIDQyLjU3OTVaIiBmaWxsPSIjRkZGREY4Ii8+Cjwvc3ZnPg=="
779
743
  };
780
744
  const getSession = async () => {
781
745
  const session = await core.storage.getItem(phantomSessionStorageKeySchema);
@@ -795,10 +759,6 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
795
759
  */
796
760
  const setupPhantomListeners = ({ completeEvent, deferredPromise, errorEvent, onComplete, onError }) => {
797
761
  getPhantomOriginTab(dynamicClient).isOriginTab = true;
798
- core.logger.debug("[PHANTOM] setupPhantomListeners: isOriginTab=true, registering listeners", {
799
- completeEvent,
800
- errorEvent
801
- });
802
762
  onceEvent({
803
763
  event: completeEvent,
804
764
  listener: onComplete
@@ -817,17 +777,15 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
817
777
  }).catch(() => {});
818
778
  };
819
779
  const connect = async () => {
820
- core.logger.debug("[PHANTOM] connect: start");
821
780
  const redirectUrl = baseRedirectUrl;
822
781
  const { publicKey: dappPublicKey, secretKey: dappSecretKey } = generateNaClKeyPair();
823
782
  await setPendingRequest({
824
783
  dappPublicKey,
825
784
  dappSecretKey,
826
785
  method: "connect",
827
- requestId: randomString(32),
786
+ requestId: randomString({ length: 32 }),
828
787
  timestamp: Date.now()
829
788
  });
830
- core.logger.debug("[PHANTOM] connect: pending request stored, setting up listeners");
831
789
  const deferredPromise = createDeferredPromise();
832
790
  setupPhantomListeners({
833
791
  completeEvent: "phantomRedirectConnectionComplete",
@@ -855,7 +813,6 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
855
813
  });
856
814
  core.logger.debug("[PHANTOM] connect: opening deeplink", { redirectUrl });
857
815
  await core.openDeeplink(deepLinkUrl.toString());
858
- core.logger.debug("[PHANTOM] connect: deeplink opened, awaiting deferred promise");
859
816
  return deferredPromise.promise;
860
817
  };
861
818
  const disconnect = async () => {
@@ -865,7 +822,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
865
822
  payload: { session: session.sessionToken },
866
823
  sharedSecret: session.sharedSecret
867
824
  });
868
- const requestId = randomString(32);
825
+ const requestId = randomString({ length: 32 });
869
826
  await setPendingRequest({
870
827
  dappPublicKey: session.dappPublicKey,
871
828
  dappSecretKey: session.dappSecretKey,
@@ -915,7 +872,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
915
872
  },
916
873
  sharedSecret: session.sharedSecret
917
874
  });
918
- const requestId = randomString(32);
875
+ const requestId = randomString({ length: 32 });
919
876
  await setPendingRequest({
920
877
  dappPublicKey: session.dappPublicKey,
921
878
  dappSecretKey: session.dappSecretKey,
@@ -969,7 +926,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
969
926
  },
970
927
  sharedSecret: session.sharedSecret
971
928
  });
972
- const requestId = randomString(32);
929
+ const requestId = randomString({ length: 32 });
973
930
  await setPendingRequest({
974
931
  dappPublicKey: session.dappPublicKey,
975
932
  dappSecretKey: session.dappSecretKey,
@@ -1024,7 +981,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
1024
981
  },
1025
982
  sharedSecret: session.sharedSecret
1026
983
  });
1027
- const requestId = randomString(32);
984
+ const requestId = randomString({ length: 32 });
1028
985
  await setPendingRequest({
1029
986
  dappPublicKey: session.dappPublicKey,
1030
987
  dappSecretKey: session.dappSecretKey,
@@ -1081,6 +1038,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
1081
1038
  chain: "SOL",
1082
1039
  connect,
1083
1040
  disconnect,
1041
+ executeCheckoutTransaction: (args) => solanaExecuteCheckoutTransaction(args, dynamicClient),
1084
1042
  getActiveNetworkId,
1085
1043
  getConnectedAddresses,
1086
1044
  groupKey,
@@ -1090,6 +1048,7 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
1090
1048
  signAndSendTransaction: signAndSendTransaction$1,
1091
1049
  signMessage,
1092
1050
  signTransaction: signTransaction$1,
1051
+ transferAmount: (args) => solanaTransferAmount(args, dynamicClient),
1093
1052
  walletProviderType
1094
1053
  };
1095
1054
  };
@@ -1103,16 +1062,28 @@ const createPhantomRedirectWalletProvider = ({ baseRedirectUrl, dynamicClient })
1103
1062
  * redirect data from a Phantom wallet deep link operation, and validates
1104
1063
  * that there is a corresponding pending request in storage.
1105
1064
  *
1065
+ * Most Phantom callbacks include recognizable query parameters:
1066
+ * - **Connect**: `phantom_encryption_public_key`
1067
+ * - **Sign** (signMessage, signTransaction, etc.): `nonce` + `data`
1068
+ * - **Error** (any method): `errorCode`
1069
+ *
1070
+ * **Disconnect is the exception**: on success, Phantom redirects back to the
1071
+ * bare `redirect_link` with NO query parameters at all. To detect this case,
1072
+ * we fall back to checking whether a pending disconnect request exists in
1073
+ * storage.
1074
+ *
1106
1075
  * @param params.url - The URL to check for Phantom redirect parameters
1107
1076
  * @param client - The Dynamic client instance
1108
1077
  * @returns A promise that resolves to true if the URL is a valid Phantom redirect, false otherwise
1109
1078
  */
1110
1079
  const detectPhantomRedirect = async ({ url }, client = getDefaultClient()) => {
1111
1080
  const core = getCore(client);
1112
- if (!(url.searchParams.has("phantom_encryption_public_key") || url.searchParams.has("errorCode"))) return false;
1081
+ const hasPhantomParams = url.searchParams.has("phantom_encryption_public_key") || url.searchParams.has("errorCode") || url.searchParams.has("nonce") && url.searchParams.has("data");
1113
1082
  await core.initTrack.waitForAll();
1114
1083
  const pendingRequest = await core.storage.getItem(pendingRequestStorageKeySchema);
1115
- return Boolean(pendingRequest);
1084
+ if (!pendingRequest) return false;
1085
+ if (hasPhantomParams) return true;
1086
+ return pendingRequest.method === "disconnect";
1116
1087
  };
1117
1088
 
1118
1089
  //#endregion
@@ -1162,15 +1133,15 @@ const PHANTOM_REDIRECT_SOLANA_EXTENSION_KEY = "phantomRedirectSolana";
1162
1133
  * @param [client] - The Dynamic client. Only required for multiple clients.
1163
1134
  */
1164
1135
  const addPhantomRedirectSolanaExtension = async ({ disableAutoRedirectCompletion, onCloseTab, url }, client = getDefaultClient()) => {
1165
- if (hasExtension({ extensionKey: PHANTOM_REDIRECT_SOLANA_EXTENSION_KEY }, client)) return;
1136
+ if (hasExtension({ extensionKey: PHANTOM_REDIRECT_SOLANA_EXTENSION_KEY }, client)) {
1137
+ getCore(client).logger.debug("[PHANTOM] addPhantomRedirectSolanaExtension: already registered, skipping");
1138
+ return;
1139
+ }
1166
1140
  registerExtension({ extensionKey: PHANTOM_REDIRECT_SOLANA_EXTENSION_KEY }, client);
1167
1141
  registerSolanaNetworkProviderBuilder(client);
1168
1142
  const core = getCore(client);
1169
1143
  if (!disableAutoRedirectCompletion) {
1170
- core.logger.debug("[PHANTOM] addPhantomRedirectSolanaExtension: detecting redirect", { search: url.search });
1171
- const isRedirect = await detectPhantomRedirect({ url }, client);
1172
- core.logger.debug("[PHANTOM] addPhantomRedirectSolanaExtension: isRedirect", { isRedirect });
1173
- if (isRedirect) {
1144
+ if (await detectPhantomRedirect({ url }, client)) {
1174
1145
  onceEvent({
1175
1146
  event: "phantomRedirectCloseTab",
1176
1147
  listener: onCloseTab
@@ -1188,16 +1159,27 @@ const addPhantomRedirectSolanaExtension = async ({ disableAutoRedirectCompletion
1188
1159
  baseRedirectUrl: `${url.protocol}//${url.host}${url.pathname}`,
1189
1160
  dynamicClient: client
1190
1161
  });
1191
- getWalletProviderRegistry(client).register({
1162
+ const walletProviderRegistry = getWalletProviderRegistry(client);
1163
+ const isConflictingProvider = (provider) => provider.chain === walletProvider.chain && provider.groupKey === walletProvider.groupKey && provider.key !== walletProvider.key;
1164
+ const existingConflict = walletProviderRegistry.listProviders().find(isConflictingProvider);
1165
+ if (existingConflict) {
1166
+ core.logger.debug("[PHANTOM] addPhantomRedirectSolanaExtension: skipping registration, conflicting provider exists", { conflictingKey: existingConflict.key });
1167
+ return;
1168
+ }
1169
+ walletProviderRegistry.register({
1192
1170
  priority: WalletProviderPriority.WINDOW_INJECT,
1193
1171
  walletProvider
1194
1172
  });
1195
- };
1196
-
1197
- //#endregion
1198
- //#region src/isSolanaWalletProvider/isSolanaWalletProvider.ts
1199
- const isSolanaWalletProvider = (provider) => {
1200
- return provider.chain === "SOL";
1173
+ const removeListener = onEvent({
1174
+ event: "walletProviderRegistered",
1175
+ listener: ({ walletProvider: newProvider }) => {
1176
+ if (isConflictingProvider(newProvider)) {
1177
+ core.logger.debug("[PHANTOM] addPhantomRedirectSolanaExtension: unregistering, conflicting provider registered", { conflictingKey: newProvider.key });
1178
+ walletProviderRegistry.unregister(walletProvider.key);
1179
+ removeListener();
1180
+ }
1181
+ }
1182
+ }, client);
1201
1183
  };
1202
1184
 
1203
1185
  //#endregion
@@ -1284,5 +1266,5 @@ const signTransaction = async ({ walletAccount, transaction }, client = getDefau
1284
1266
  assertPackageVersion(name, version);
1285
1267
 
1286
1268
  //#endregion
1287
- export { NotSolanaProviderError, SponsorTransactionError, addPhantomRedirectSolanaExtension, addSolanaExtension, calculateSolanaTransactionFee, completePhantomRedirect, detectPhantomRedirect, getSolanaConnection, isSolanaNetworkProvider, isSolanaWalletAccount, signAllTransactions, signAndSendSponsoredTransaction, signAndSendTransaction, signTransaction, simulateSolanaTransaction };
1269
+ export { NotSolanaProviderError, SponsorTransactionError, addPhantomRedirectSolanaExtension, addSolanaExtension, calculateSolanaTransactionFee, completePhantomRedirect, detectPhantomRedirect, getSolanaConnection, isSolanaGasSponsorshipEnabled, isSolanaNetworkProvider, isSolanaWalletAccount, signAllTransactions, signAndSendSponsoredTransaction, signAndSendTransaction, signTransaction, simulateSolanaTransaction };
1288
1270
  //# sourceMappingURL=index.esm.js.map