@dynamic-labs/sdk-react-core 0.18.100-viem.1 → 0.18.100-viem.11

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 (108) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/package.cjs +3 -3
  3. package/package.js +3 -3
  4. package/package.json +10 -10
  5. package/src/index.cjs +2 -0
  6. package/src/index.js +1 -0
  7. package/src/lib/components/MenuList/Dropdown/Dropdown.cjs +1 -1
  8. package/src/lib/components/MenuList/Dropdown/Dropdown.js +1 -1
  9. package/src/lib/components/ModalHeaderBanner/ModalHeaderBanner.cjs +6 -2
  10. package/src/lib/components/ModalHeaderBanner/ModalHeaderBanner.d.ts +2 -1
  11. package/src/lib/components/ModalHeaderBanner/ModalHeaderBanner.js +6 -2
  12. package/src/lib/components/OTPVerificationView/OTPVerificationView.cjs +2 -2
  13. package/src/lib/components/OTPVerificationView/OTPVerificationView.d.ts +1 -0
  14. package/src/lib/components/OTPVerificationView/OTPVerificationView.js +2 -2
  15. package/src/lib/components/Typography/Typography.cjs +1 -0
  16. package/src/lib/components/Typography/Typography.js +1 -0
  17. package/src/lib/components/Typography/Typography.types.d.ts +1 -1
  18. package/src/lib/components/UserProfile/UserProfile.cjs +1 -1
  19. package/src/lib/components/UserProfile/UserProfile.js +1 -1
  20. package/src/lib/components/UserProfile/parts/UserProfileSocialAccount/UserProfileSocialAccount.cjs +1 -1
  21. package/src/lib/components/UserProfile/parts/UserProfileSocialAccount/UserProfileSocialAccount.js +1 -1
  22. package/src/lib/context/DynamicContext/DynamicContext.cjs +8 -2
  23. package/src/lib/context/DynamicContext/DynamicContext.js +9 -3
  24. package/src/lib/context/DynamicContext/internalEvents/index.d.ts +2 -0
  25. package/src/lib/context/DynamicContext/internalEvents/internalEvents.cjs +14 -0
  26. package/src/lib/context/DynamicContext/internalEvents/internalEvents.d.ts +8 -0
  27. package/src/lib/context/DynamicContext/internalEvents/internalEvents.js +6 -0
  28. package/src/lib/context/DynamicContext/types/index.d.ts +4 -1
  29. package/src/lib/context/DynamicContext/useDynamicContext.cjs +2 -1
  30. package/src/lib/context/DynamicContext/useDynamicContext.d.ts +1 -1
  31. package/src/lib/context/DynamicContext/useDynamicContext.js +2 -1
  32. package/src/lib/context/ErrorContext/ErrorContext.cjs +1 -0
  33. package/src/lib/context/ErrorContext/ErrorContext.js +1 -0
  34. package/src/lib/context/SocialRedirectContext/SocialRedirectContext.cjs +2 -1
  35. package/src/lib/context/SocialRedirectContext/SocialRedirectContext.js +2 -1
  36. package/src/lib/data/api.cjs +17 -1
  37. package/src/lib/data/api.d.ts +2 -1
  38. package/src/lib/data/api.js +17 -2
  39. package/src/lib/main.global.cjs +1 -1
  40. package/src/lib/main.global.js +1 -1
  41. package/src/lib/modals/TransactionConfirmationModal/TransactionConfirmationModal.cjs +2 -1
  42. package/src/lib/modals/TransactionConfirmationModal/TransactionConfirmationModal.js +2 -1
  43. package/src/lib/shared/utils/hooks/usePreventPageScroll/usePreventPageScroll.cjs +28 -2
  44. package/src/lib/shared/utils/hooks/usePreventPageScroll/usePreventPageScroll.js +28 -2
  45. package/src/lib/styles/index.shadow.cjs +1 -1
  46. package/src/lib/styles/index.shadow.js +1 -1
  47. package/src/lib/utils/functions/createUserProfile/createUserProfile.cjs +1 -1
  48. package/src/lib/utils/functions/createUserProfile/createUserProfile.js +1 -1
  49. package/src/lib/utils/functions/digestSHA256/digestSHA256.cjs +11 -0
  50. package/src/lib/utils/functions/digestSHA256/digestSHA256.d.ts +1 -0
  51. package/src/lib/utils/functions/digestSHA256/digestSHA256.js +7 -0
  52. package/src/lib/utils/functions/digestSHA256/index.d.ts +1 -0
  53. package/src/lib/utils/functions/encodeBase64URL/encodeBase64URL.cjs +14 -0
  54. package/src/lib/utils/functions/encodeBase64URL/encodeBase64URL.d.ts +1 -0
  55. package/src/lib/utils/functions/encodeBase64URL/encodeBase64URL.js +10 -0
  56. package/src/lib/utils/functions/encodeBase64URL/index.d.ts +1 -0
  57. package/src/lib/utils/functions/getRedirectURIOrigin/getRedirectURIOrigin.cjs +33 -0
  58. package/src/lib/utils/functions/getRedirectURIOrigin/getRedirectURIOrigin.d.ts +1 -0
  59. package/src/lib/utils/functions/getRedirectURIOrigin/getRedirectURIOrigin.js +29 -0
  60. package/src/lib/utils/functions/getRedirectURIOrigin/index.d.ts +1 -0
  61. package/src/lib/utils/functions/index.d.ts +6 -0
  62. package/src/lib/utils/functions/randomString/index.d.ts +1 -0
  63. package/src/lib/utils/functions/randomString/randomString.cjs +14 -0
  64. package/src/lib/utils/functions/randomString/randomString.d.ts +1 -0
  65. package/src/lib/utils/functions/randomString/randomString.js +10 -0
  66. package/src/lib/utils/functions/sendTransactionWithAutoNonce/index.d.ts +1 -0
  67. package/src/lib/utils/functions/sendTransactionWithAutoNonce/sendTransactionWithAutoNonce.cjs +48 -0
  68. package/src/lib/utils/functions/sendTransactionWithAutoNonce/sendTransactionWithAutoNonce.d.ts +18 -0
  69. package/src/lib/utils/functions/sendTransactionWithAutoNonce/sendTransactionWithAutoNonce.js +43 -0
  70. package/src/lib/utils/functions/stringifyURIQuery/index.d.ts +1 -0
  71. package/src/lib/utils/functions/stringifyURIQuery/stringifyURIQuery.cjs +13 -0
  72. package/src/lib/utils/functions/stringifyURIQuery/stringifyURIQuery.d.ts +1 -0
  73. package/src/lib/utils/functions/stringifyURIQuery/stringifyURIQuery.js +9 -0
  74. package/src/lib/utils/hooks/authenticationHooks/useConnectAndSign/useConnectAndSign.cjs +32 -11
  75. package/src/lib/utils/hooks/authenticationHooks/useConnectAndSign/useConnectAndSign.js +33 -12
  76. package/src/lib/utils/hooks/multiWallet/useSyncPrimaryWallet/useSyncPrimaryWallet.cjs +4 -0
  77. package/src/lib/utils/hooks/multiWallet/useSyncPrimaryWallet/useSyncPrimaryWallet.js +4 -0
  78. package/src/lib/utils/hooks/useConnectWallet/useConnectWallet.cjs +16 -18
  79. package/src/lib/utils/hooks/useConnectWallet/useConnectWallet.js +17 -19
  80. package/src/lib/utils/hooks/useConnectedWalletsNetworkValidation/useConnectedWalletsNetworkValidation.cjs +7 -6
  81. package/src/lib/utils/hooks/useConnectedWalletsNetworkValidation/useConnectedWalletsNetworkValidation.js +7 -6
  82. package/src/lib/utils/hooks/usePrimaryWalletId/usePrimaryWalletId.cjs +6 -2
  83. package/src/lib/utils/hooks/usePrimaryWalletId/usePrimaryWalletId.d.ts +2 -1
  84. package/src/lib/utils/hooks/usePrimaryWalletId/usePrimaryWalletId.js +6 -2
  85. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.cjs +128 -23
  86. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.d.ts +5 -1
  87. package/src/lib/utils/hooks/useSocialAccounts/useSocialAccounts.js +130 -25
  88. package/src/lib/views/CaptchaVerifyUser/CaptchaVerifyUser.cjs +9 -3
  89. package/src/lib/views/CaptchaVerifyUser/CaptchaVerifyUser.js +9 -3
  90. package/src/lib/views/EmailWalletOTPVerificationView/EmailWalletOTPVerificationView.cjs +1 -1
  91. package/src/lib/views/EmailWalletOTPVerificationView/EmailWalletOTPVerificationView.js +1 -1
  92. package/src/lib/views/NetworkNotSupported/NetworkNotSupported.cjs +3 -2
  93. package/src/lib/views/NetworkNotSupported/NetworkNotSupported.js +3 -2
  94. package/src/lib/views/NetworkNotSupportedSwitchManual/NetworkNotSupportedSwitchManual.cjs +3 -2
  95. package/src/lib/views/NetworkNotSupportedSwitchManual/NetworkNotSupportedSwitchManual.js +3 -2
  96. package/src/lib/views/SendBalanceView/components/TransactionStage/TransactionStage.cjs +4 -10
  97. package/src/lib/views/SendBalanceView/components/TransactionStage/TransactionStage.js +4 -10
  98. package/src/lib/views/WalletGroupView/components/WalletGroupItem/WalletGroupItem.cjs +1 -0
  99. package/src/lib/views/WalletGroupView/components/WalletGroupItem/WalletGroupItem.js +1 -0
  100. package/src/lib/views/WalletList/WalletListItem/WalletListItem.cjs +1 -1
  101. package/src/lib/views/WalletList/WalletListItem/WalletListItem.js +1 -1
  102. package/src/lib/widgets/DynamicWidget/hooks/useFetchCurrency/useFetchCurrency.cjs +4 -1
  103. package/src/lib/widgets/DynamicWidget/hooks/useFetchCurrency/useFetchCurrency.js +4 -1
  104. package/src/lib/widgets/OAuthIFrameContainer/OAuthIFrameContainer.cjs +13 -0
  105. package/src/lib/widgets/OAuthIFrameContainer/OAuthIFrameContainer.d.ts +2 -0
  106. package/src/lib/widgets/OAuthIFrameContainer/OAuthIFrameContainer.js +9 -0
  107. package/src/lib/widgets/OAuthIFrameContainer/index.d.ts +1 -0
  108. package/src/lib/widgets/index.d.ts +1 -0
@@ -0,0 +1,48 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var _tslib = require('../../../../../_virtual/_tslib.cjs');
6
+
7
+ const MAGIC_COULD_NOT_REPLACE_TRANSACTION_ERROR_CODE = -32603;
8
+ /**
9
+ * Sends a transaction with an automatically determined nonce, if not provided.
10
+ *
11
+ * In Ethereum, each transaction sent from a particular address must have a unique nonce.
12
+ * If the transaction does not already have a nonce, this function helps to automatically set it.
13
+ * If a transaction with a particular nonce fails due to a "could not replace transaction" error,
14
+ * this function will automatically retry with the next nonce.
15
+ *
16
+ * @param connector - A Dynamic connector to interact with the Ethereum network.
17
+ * @param transaction - The transaction details.
18
+ * @param sendTransactionHandler - A handler function to send the transaction.
19
+ *
20
+ * @returns A promise that resolves to the transaction response.
21
+ */
22
+ const sendTransactionWithAutoNonce = (connector, transaction, sendTransactionHandler) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
23
+ if (transaction.nonce !== undefined) {
24
+ return sendTransactionHandler(transaction);
25
+ }
26
+ const publicClient = yield connector.getRpcProvider();
27
+ const walletClient = yield connector.getSigner();
28
+ const [address] = yield walletClient.getAddresses();
29
+ const nonce = yield publicClient.getTransactionCount({
30
+ address,
31
+ });
32
+ const transactionWithNonce = Object.assign(Object.assign({}, transaction), { nonce });
33
+ try {
34
+ const response = yield sendTransactionHandler(transactionWithNonce);
35
+ return response;
36
+ }
37
+ catch (err) {
38
+ if (err.code ===
39
+ MAGIC_COULD_NOT_REPLACE_TRANSACTION_ERROR_CODE) {
40
+ const transactionWithNextNonce = Object.assign(Object.assign({}, transaction), { nonce: nonce + 1 });
41
+ return sendTransactionHandler(transactionWithNextNonce);
42
+ }
43
+ throw err;
44
+ }
45
+ });
46
+
47
+ exports.MAGIC_COULD_NOT_REPLACE_TRANSACTION_ERROR_CODE = MAGIC_COULD_NOT_REPLACE_TRANSACTION_ERROR_CODE;
48
+ exports.sendTransactionWithAutoNonce = sendTransactionWithAutoNonce;
@@ -0,0 +1,18 @@
1
+ import { TransactionRequest, Address } from 'viem';
2
+ import { WalletConnector } from '../../../..';
3
+ export declare const MAGIC_COULD_NOT_REPLACE_TRANSACTION_ERROR_CODE = -32603;
4
+ /**
5
+ * Sends a transaction with an automatically determined nonce, if not provided.
6
+ *
7
+ * In Ethereum, each transaction sent from a particular address must have a unique nonce.
8
+ * If the transaction does not already have a nonce, this function helps to automatically set it.
9
+ * If a transaction with a particular nonce fails due to a "could not replace transaction" error,
10
+ * this function will automatically retry with the next nonce.
11
+ *
12
+ * @param connector - A Dynamic connector to interact with the Ethereum network.
13
+ * @param transaction - The transaction details.
14
+ * @param sendTransactionHandler - A handler function to send the transaction.
15
+ *
16
+ * @returns A promise that resolves to the transaction response.
17
+ */
18
+ export declare const sendTransactionWithAutoNonce: (connector: WalletConnector, transaction: TransactionRequest, sendTransactionHandler: (transaction: TransactionRequest) => Promise<Address>) => Promise<`0x${string}`>;
@@ -0,0 +1,43 @@
1
+ import { __awaiter } from '../../../../../_virtual/_tslib.js';
2
+
3
+ const MAGIC_COULD_NOT_REPLACE_TRANSACTION_ERROR_CODE = -32603;
4
+ /**
5
+ * Sends a transaction with an automatically determined nonce, if not provided.
6
+ *
7
+ * In Ethereum, each transaction sent from a particular address must have a unique nonce.
8
+ * If the transaction does not already have a nonce, this function helps to automatically set it.
9
+ * If a transaction with a particular nonce fails due to a "could not replace transaction" error,
10
+ * this function will automatically retry with the next nonce.
11
+ *
12
+ * @param connector - A Dynamic connector to interact with the Ethereum network.
13
+ * @param transaction - The transaction details.
14
+ * @param sendTransactionHandler - A handler function to send the transaction.
15
+ *
16
+ * @returns A promise that resolves to the transaction response.
17
+ */
18
+ const sendTransactionWithAutoNonce = (connector, transaction, sendTransactionHandler) => __awaiter(void 0, void 0, void 0, function* () {
19
+ if (transaction.nonce !== undefined) {
20
+ return sendTransactionHandler(transaction);
21
+ }
22
+ const publicClient = yield connector.getRpcProvider();
23
+ const walletClient = yield connector.getSigner();
24
+ const [address] = yield walletClient.getAddresses();
25
+ const nonce = yield publicClient.getTransactionCount({
26
+ address,
27
+ });
28
+ const transactionWithNonce = Object.assign(Object.assign({}, transaction), { nonce });
29
+ try {
30
+ const response = yield sendTransactionHandler(transactionWithNonce);
31
+ return response;
32
+ }
33
+ catch (err) {
34
+ if (err.code ===
35
+ MAGIC_COULD_NOT_REPLACE_TRANSACTION_ERROR_CODE) {
36
+ const transactionWithNextNonce = Object.assign(Object.assign({}, transaction), { nonce: nonce + 1 });
37
+ return sendTransactionHandler(transactionWithNextNonce);
38
+ }
39
+ throw err;
40
+ }
41
+ });
42
+
43
+ export { MAGIC_COULD_NOT_REPLACE_TRANSACTION_ERROR_CODE, sendTransactionWithAutoNonce };
@@ -0,0 +1 @@
1
+ export { stringifyURIQuery } from './stringifyURIQuery';
@@ -0,0 +1,13 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ const stringifyURIQuery = (obj) => {
6
+ const str = [];
7
+ for (const prop in obj) {
8
+ str.push(encodeURIComponent(prop) + '=' + encodeURIComponent(obj[prop]));
9
+ }
10
+ return str.join('&');
11
+ };
12
+
13
+ exports.stringifyURIQuery = stringifyURIQuery;
@@ -0,0 +1 @@
1
+ export declare const stringifyURIQuery: (obj: any) => string;
@@ -0,0 +1,9 @@
1
+ const stringifyURIQuery = (obj) => {
2
+ const str = [];
3
+ for (const prop in obj) {
4
+ str.push(encodeURIComponent(prop) + '=' + encodeURIComponent(obj[prop]));
5
+ }
6
+ return str.join('&');
7
+ };
8
+
9
+ export { stringifyURIQuery };
@@ -4,6 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var _tslib = require('../../../../../../_virtual/_tslib.cjs');
6
6
  var walletConnectorCore = require('@dynamic-labs/wallet-connector-core');
7
+ var utils = require('@dynamic-labs/utils');
7
8
  var showPendingConnectView = require('../helpers/showPendingConnectView.cjs');
8
9
  var isConnectOnly = require('../helpers/isConnectOnly.cjs');
9
10
  var useInternalDynamicContext = require('../../../../context/DynamicContext/useInternalDynamicContext.cjs');
@@ -15,7 +16,6 @@ require('@dynamic-labs/iconic');
15
16
  require('react/jsx-runtime');
16
17
  require('react');
17
18
  require('@dynamic-labs/wallet-book');
18
- require('@dynamic-labs/utils');
19
19
  var localStorage$1 = require('../../../constants/localStorage.cjs');
20
20
  require('../../../constants/colors.cjs');
21
21
  var localStorage = require('../../../../shared/utils/classes/storage/localStorage.cjs');
@@ -32,7 +32,7 @@ const useConnectAndSign = ({ shouldUpdateWallets = true, shouldCallCallback = tr
32
32
  const { setView, goToInitialView } = ViewContext.useViewContext();
33
33
  const { setErrorMessage } = ErrorContext.useErrorContext();
34
34
  const { captchaToken } = CaptchaContext.useCaptchaContext();
35
- const { authMode, connectWallet, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, user, walletUiUtils, setCallback, setIsVerificationInProgress, isFullyConnected, walletsToConnectByChain, } = useInternalDynamicContext.useInternalDynamicContext();
35
+ const { authMode, connectWallet, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, user, walletUiUtils, setCallback, setIsVerificationInProgress, isFullyConnected, walletsToConnectByChain = [], connectedWallets, isBridgeFlow, selectedWalletConnector, walletsByChain, } = useInternalDynamicContext.useInternalDynamicContext();
36
36
  const { handleWalletsToConnect } = useHandleWalletsToConnect.useHandleWalletsToConnect();
37
37
  const verifyWallet = useVerifyWallet.useVerifyWallet({
38
38
  consumeNonce,
@@ -42,7 +42,7 @@ const useConnectAndSign = ({ shouldUpdateWallets = true, shouldCallCallback = tr
42
42
  setIsSingleWalletAccount,
43
43
  });
44
44
  return ({ walletConnector, fetchPublicAddressOpts = undefined, }) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
45
- var _a, _b;
45
+ var _a, _b, _c;
46
46
  // Raise verification ongoing flag
47
47
  setIsVerificationInProgress(true);
48
48
  try {
@@ -72,16 +72,32 @@ const useConnectAndSign = ({ shouldUpdateWallets = true, shouldCallCallback = tr
72
72
  }
73
73
  if (isConnectOnly.isConnectOnly(user, authMode)) {
74
74
  localStorage.LocalStorage.setToLS(localStorage$1.LAST_USED_WALLET, walletConnector.name);
75
- if (shouldUpdateWallets) {
76
- handleWalletsToConnect();
75
+ if (isBridgeFlow) {
76
+ const didConnectLastWallet = (selectedWalletConnector === null || selectedWalletConnector === void 0 ? void 0 : selectedWalletConnector.connectedChain) ===
77
+ ((_a = utils.last(walletsByChain || [])) === null || _a === void 0 ? void 0 : _a.chain);
78
+ // we don't want to re-calculate wallets to connect state if wallet is already connected.
79
+ // it may happen when user switch network in connect flow on already connected wallet
80
+ const isAlreadyConnected = connectedWallets.find((wallet) => walletConnectorCore.isSameAddress(publicWalletAddress, wallet.address, wallet.chain));
81
+ if (shouldUpdateWallets &&
82
+ (!isAlreadyConnected || didConnectLastWallet)) {
83
+ handleWalletsToConnect();
84
+ }
85
+ if (isAlreadyConnected && !didConnectLastWallet) {
86
+ setView('bridge-next-wallet-connection');
87
+ }
77
88
  }
78
- if (!isFullyConnected || (walletsToConnectByChain === null || walletsToConnectByChain === void 0 ? void 0 : walletsToConnectByChain.length)) {
89
+ else {
90
+ if (shouldUpdateWallets) {
91
+ handleWalletsToConnect();
92
+ }
93
+ }
94
+ if (!isFullyConnected || walletsToConnectByChain.length) {
79
95
  setCallback('connectSuccess');
80
96
  }
81
97
  return;
82
98
  }
83
99
  setCallback('connectSuccess');
84
- if ((_a = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.security.hCaptcha) === null || _a === void 0 ? void 0 : _a.enabled) {
100
+ if ((_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.security.hCaptcha) === null || _b === void 0 ? void 0 : _b.enabled) {
85
101
  setView('captcha');
86
102
  return;
87
103
  }
@@ -99,11 +115,16 @@ const useConnectAndSign = ({ shouldUpdateWallets = true, shouldCallCallback = tr
99
115
  });
100
116
  }
101
117
  catch (err) {
102
- logger.logger.debug(err);
103
- setErrorMessage((_b = err === null || err === void 0 ? void 0 : err.code) === null || _b === void 0 ? void 0 : _b.toString());
118
+ const userCancelled = (err === null || err === void 0 ? void 0 : err.code) === 'user-cancelled';
119
+ if (!userCancelled)
120
+ logger.logger.debug(err);
121
+ setErrorMessage((_c = err === null || err === void 0 ? void 0 : err.code) === null || _c === void 0 ? void 0 : _c.toString());
104
122
  goToInitialView();
105
- // Since auth failed, lower flag
106
- setIsVerificationInProgress(false);
123
+ // Since auth failed, clear verification flag
124
+ // But if user cancelled, clearStatesOnBackClick will have already cleared it. So avoid
125
+ // clearing again since that would trigger a warning
126
+ if (!userCancelled)
127
+ setIsVerificationInProgress(false);
107
128
  return;
108
129
  }
109
130
  });
@@ -1,5 +1,6 @@
1
1
  import { __awaiter } from '../../../../../../_virtual/_tslib.js';
2
- import { isEmailWalletConnector, isEmailOTPWalletConnector, isBloctoConnector } from '@dynamic-labs/wallet-connector-core';
2
+ import { isEmailWalletConnector, isEmailOTPWalletConnector, isBloctoConnector, isSameAddress } from '@dynamic-labs/wallet-connector-core';
3
+ import { last } from '@dynamic-labs/utils';
3
4
  import { showPendingConnectView } from '../helpers/showPendingConnectView.js';
4
5
  import { isConnectOnly } from '../helpers/isConnectOnly.js';
5
6
  import { useInternalDynamicContext } from '../../../../context/DynamicContext/useInternalDynamicContext.js';
@@ -11,7 +12,6 @@ import '@dynamic-labs/iconic';
11
12
  import 'react/jsx-runtime';
12
13
  import 'react';
13
14
  import '@dynamic-labs/wallet-book';
14
- import '@dynamic-labs/utils';
15
15
  import { LAST_USED_WALLET } from '../../../constants/localStorage.js';
16
16
  import '../../../constants/colors.js';
17
17
  import { LocalStorage } from '../../../../shared/utils/classes/storage/localStorage.js';
@@ -28,7 +28,7 @@ const useConnectAndSign = ({ shouldUpdateWallets = true, shouldCallCallback = tr
28
28
  const { setView, goToInitialView } = useViewContext();
29
29
  const { setErrorMessage } = useErrorContext();
30
30
  const { captchaToken } = useCaptchaContext();
31
- const { authMode, connectWallet, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, user, walletUiUtils, setCallback, setIsVerificationInProgress, isFullyConnected, walletsToConnectByChain, } = useInternalDynamicContext();
31
+ const { authMode, connectWallet, consumeNonce, displaySiweStatement, environmentId, projectSettings, setIsSingleWalletAccount, user, walletUiUtils, setCallback, setIsVerificationInProgress, isFullyConnected, walletsToConnectByChain = [], connectedWallets, isBridgeFlow, selectedWalletConnector, walletsByChain, } = useInternalDynamicContext();
32
32
  const { handleWalletsToConnect } = useHandleWalletsToConnect();
33
33
  const verifyWallet = useVerifyWallet({
34
34
  consumeNonce,
@@ -38,7 +38,7 @@ const useConnectAndSign = ({ shouldUpdateWallets = true, shouldCallCallback = tr
38
38
  setIsSingleWalletAccount,
39
39
  });
40
40
  return ({ walletConnector, fetchPublicAddressOpts = undefined, }) => __awaiter(void 0, void 0, void 0, function* () {
41
- var _a, _b;
41
+ var _a, _b, _c;
42
42
  // Raise verification ongoing flag
43
43
  setIsVerificationInProgress(true);
44
44
  try {
@@ -68,16 +68,32 @@ const useConnectAndSign = ({ shouldUpdateWallets = true, shouldCallCallback = tr
68
68
  }
69
69
  if (isConnectOnly(user, authMode)) {
70
70
  LocalStorage.setToLS(LAST_USED_WALLET, walletConnector.name);
71
- if (shouldUpdateWallets) {
72
- handleWalletsToConnect();
71
+ if (isBridgeFlow) {
72
+ const didConnectLastWallet = (selectedWalletConnector === null || selectedWalletConnector === void 0 ? void 0 : selectedWalletConnector.connectedChain) ===
73
+ ((_a = last(walletsByChain || [])) === null || _a === void 0 ? void 0 : _a.chain);
74
+ // we don't want to re-calculate wallets to connect state if wallet is already connected.
75
+ // it may happen when user switch network in connect flow on already connected wallet
76
+ const isAlreadyConnected = connectedWallets.find((wallet) => isSameAddress(publicWalletAddress, wallet.address, wallet.chain));
77
+ if (shouldUpdateWallets &&
78
+ (!isAlreadyConnected || didConnectLastWallet)) {
79
+ handleWalletsToConnect();
80
+ }
81
+ if (isAlreadyConnected && !didConnectLastWallet) {
82
+ setView('bridge-next-wallet-connection');
83
+ }
73
84
  }
74
- if (!isFullyConnected || (walletsToConnectByChain === null || walletsToConnectByChain === void 0 ? void 0 : walletsToConnectByChain.length)) {
85
+ else {
86
+ if (shouldUpdateWallets) {
87
+ handleWalletsToConnect();
88
+ }
89
+ }
90
+ if (!isFullyConnected || walletsToConnectByChain.length) {
75
91
  setCallback('connectSuccess');
76
92
  }
77
93
  return;
78
94
  }
79
95
  setCallback('connectSuccess');
80
- if ((_a = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.security.hCaptcha) === null || _a === void 0 ? void 0 : _a.enabled) {
96
+ if ((_b = projectSettings === null || projectSettings === void 0 ? void 0 : projectSettings.security.hCaptcha) === null || _b === void 0 ? void 0 : _b.enabled) {
81
97
  setView('captcha');
82
98
  return;
83
99
  }
@@ -95,11 +111,16 @@ const useConnectAndSign = ({ shouldUpdateWallets = true, shouldCallCallback = tr
95
111
  });
96
112
  }
97
113
  catch (err) {
98
- logger.debug(err);
99
- setErrorMessage((_b = err === null || err === void 0 ? void 0 : err.code) === null || _b === void 0 ? void 0 : _b.toString());
114
+ const userCancelled = (err === null || err === void 0 ? void 0 : err.code) === 'user-cancelled';
115
+ if (!userCancelled)
116
+ logger.debug(err);
117
+ setErrorMessage((_c = err === null || err === void 0 ? void 0 : err.code) === null || _c === void 0 ? void 0 : _c.toString());
100
118
  goToInitialView();
101
- // Since auth failed, lower flag
102
- setIsVerificationInProgress(false);
119
+ // Since auth failed, clear verification flag
120
+ // But if user cancelled, clearStatesOnBackClick will have already cleared it. So avoid
121
+ // clearing again since that would trigger a warning
122
+ if (!userCancelled)
123
+ setIsVerificationInProgress(false);
103
124
  return;
104
125
  }
105
126
  });
@@ -93,6 +93,10 @@ const useSyncPrimaryWallet = ({ connectWallet, computeConnectedStateForWallets,
93
93
  }
94
94
  // user is logged in (has valid jwt), but no wallet is connected
95
95
  if (isAuthenticated && e.code === errors.MISSING_ADDRESS_ERROR) {
96
+ if (!primaryWallet.connector.isInstalledOnBrowser()) {
97
+ handleLogOut();
98
+ return;
99
+ }
96
100
  setShowAuthFlow(true);
97
101
  setView('wallet-locked-view');
98
102
  }
@@ -89,6 +89,10 @@ const useSyncPrimaryWallet = ({ connectWallet, computeConnectedStateForWallets,
89
89
  }
90
90
  // user is logged in (has valid jwt), but no wallet is connected
91
91
  if (isAuthenticated && e.code === MISSING_ADDRESS_ERROR) {
92
+ if (!primaryWallet.connector.isInstalledOnBrowser()) {
93
+ handleLogOut();
94
+ return;
95
+ }
92
96
  setShowAuthFlow(true);
93
97
  setView('wallet-locked-view');
94
98
  }
@@ -124,14 +124,13 @@ const useConnectWallet = ({ authMode, clearPrimaryWalletId, enableVisitTrackingO
124
124
  walletConnectorCore.logger.error('Could not refresh the wallet. The wallet address is not available');
125
125
  return;
126
126
  }
127
- const currentWalletConnectoNetwork = yield walletConnector.getNetwork();
127
+ const currentWalletConnectorNetwork = yield walletConnector.getNetwork();
128
128
  updateConnectedWalletById(walletId, {
129
129
  address: currentWalletConnectorAddress,
130
- network: currentWalletConnectoNetwork,
130
+ network: currentWalletConnectorNetwork,
131
131
  });
132
132
  });
133
- const shouldSkipCreatingVisit = React.useMemo(() => (authMode === 'connect-only' && !enableVisitTrackingOnConnectOnly) ||
134
- connectedWallet, [authMode, connectedWallet, enableVisitTrackingOnConnectOnly]);
133
+ const shouldSkipCreatingVisit = authMode === 'connect-only' && !enableVisitTrackingOnConnectOnly;
135
134
  const connectWallet = (walletConnector, fetchPublicAddressOpts, shouldCallCallback = true) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
136
135
  const publicWalletAddress = yield walletConnector.fetchPublicAddress(fetchPublicAddressOpts);
137
136
  if (!publicWalletAddress) {
@@ -168,21 +167,20 @@ const useConnectWallet = ({ authMode, clearPrimaryWalletId, enableVisitTrackingO
168
167
  walletConnectorKey: walletConnector.name,
169
168
  walletId,
170
169
  });
170
+ if (!shouldSkipCreatingVisit) {
171
+ // send information to backend to kick off background jobs
172
+ // so verify/sign on the next step could go by more quickly
173
+ // this is async work, but DO NOT AWAIT
174
+ api.createVisit({
175
+ authMode,
176
+ chain: walletChain || '',
177
+ environmentId,
178
+ publicWalletAddress,
179
+ walletName: walletConnector.name,
180
+ walletProvider: getWalletProvider.getWalletProvider(walletConnector),
181
+ });
182
+ }
171
183
  }
172
- if (shouldSkipCreatingVisit) {
173
- return Promise.resolve(publicWalletAddress);
174
- }
175
- // send information to backend to kick off background jobs
176
- // so verify/sign on the next step could go by more quickly
177
- // this is async work, but DO NOT AWAIT
178
- api.createVisit({
179
- authMode,
180
- chain: walletChain || '',
181
- environmentId,
182
- publicWalletAddress,
183
- walletName: walletConnector.name,
184
- walletProvider: getWalletProvider.getWalletProvider(walletConnector),
185
- });
186
184
  return Promise.resolve(publicWalletAddress);
187
185
  });
188
186
  const unlinkConnectedWallet = (walletId) => {
@@ -1,5 +1,5 @@
1
1
  import { __awaiter } from '../../../../../_virtual/_tslib.js';
2
- import { useState, useCallback, useEffect, useMemo } from 'react';
2
+ import { useState, useCallback, useEffect } from 'react';
3
3
  import { getWalletConnectorByName, logger } from '@dynamic-labs/wallet-connector-core';
4
4
  import '@dynamic-labs/sdk-api';
5
5
  import '../../../shared/logger.js';
@@ -120,14 +120,13 @@ const useConnectWallet = ({ authMode, clearPrimaryWalletId, enableVisitTrackingO
120
120
  logger.error('Could not refresh the wallet. The wallet address is not available');
121
121
  return;
122
122
  }
123
- const currentWalletConnectoNetwork = yield walletConnector.getNetwork();
123
+ const currentWalletConnectorNetwork = yield walletConnector.getNetwork();
124
124
  updateConnectedWalletById(walletId, {
125
125
  address: currentWalletConnectorAddress,
126
- network: currentWalletConnectoNetwork,
126
+ network: currentWalletConnectorNetwork,
127
127
  });
128
128
  });
129
- const shouldSkipCreatingVisit = useMemo(() => (authMode === 'connect-only' && !enableVisitTrackingOnConnectOnly) ||
130
- connectedWallet, [authMode, connectedWallet, enableVisitTrackingOnConnectOnly]);
129
+ const shouldSkipCreatingVisit = authMode === 'connect-only' && !enableVisitTrackingOnConnectOnly;
131
130
  const connectWallet = (walletConnector, fetchPublicAddressOpts, shouldCallCallback = true) => __awaiter(void 0, void 0, void 0, function* () {
132
131
  const publicWalletAddress = yield walletConnector.fetchPublicAddress(fetchPublicAddressOpts);
133
132
  if (!publicWalletAddress) {
@@ -164,21 +163,20 @@ const useConnectWallet = ({ authMode, clearPrimaryWalletId, enableVisitTrackingO
164
163
  walletConnectorKey: walletConnector.name,
165
164
  walletId,
166
165
  });
166
+ if (!shouldSkipCreatingVisit) {
167
+ // send information to backend to kick off background jobs
168
+ // so verify/sign on the next step could go by more quickly
169
+ // this is async work, but DO NOT AWAIT
170
+ createVisit({
171
+ authMode,
172
+ chain: walletChain || '',
173
+ environmentId,
174
+ publicWalletAddress,
175
+ walletName: walletConnector.name,
176
+ walletProvider: getWalletProvider(walletConnector),
177
+ });
178
+ }
167
179
  }
168
- if (shouldSkipCreatingVisit) {
169
- return Promise.resolve(publicWalletAddress);
170
- }
171
- // send information to backend to kick off background jobs
172
- // so verify/sign on the next step could go by more quickly
173
- // this is async work, but DO NOT AWAIT
174
- createVisit({
175
- authMode,
176
- chain: walletChain || '',
177
- environmentId,
178
- publicWalletAddress,
179
- walletName: walletConnector.name,
180
- walletProvider: getWalletProvider(walletConnector),
181
- });
182
180
  return Promise.resolve(publicWalletAddress);
183
181
  });
184
182
  const unlinkConnectedWallet = (walletId) => {
@@ -22,7 +22,7 @@ var isProgrammableNetworkSwitchSupported = require('../../functions/isProgrammab
22
22
 
23
23
  const useConnectedWalletsNetworkValidation = () => {
24
24
  const { connectedWallets, selectedWalletConnector, setSelectedWalletConnector, setShowAuthFlow, showAuthFlow, walletsToConnectByChain, isBridgeFlow, } = useInternalDynamicContext.useInternalDynamicContext();
25
- const { view, setView } = ViewContext.useViewContext();
25
+ const { setView } = ViewContext.useViewContext();
26
26
  React.useEffect(() => {
27
27
  if (!isBridgeFlow) {
28
28
  return;
@@ -53,16 +53,17 @@ const useConnectedWalletsNetworkValidation = () => {
53
53
  }
54
54
  setView(networkNotSupportedView);
55
55
  }
56
+ // we need it to remove 'showAuthFlow' property. we don't want to react to it,
57
+ // because closing modal on network switch causes it to re-open
58
+ // eslint-disable-next-line react-hooks/exhaustive-deps
56
59
  }, [
57
- isBridgeFlow,
58
60
  connectedWallets,
59
- view,
61
+ isBridgeFlow,
60
62
  selectedWalletConnector,
61
- walletsToConnectByChain,
62
- showAuthFlow,
63
- setView,
64
63
  setSelectedWalletConnector,
65
64
  setShowAuthFlow,
65
+ setView,
66
+ walletsToConnectByChain,
66
67
  ]);
67
68
  };
68
69
 
@@ -18,7 +18,7 @@ import { isProgrammableNetworkSwitchSupported } from '../../functions/isProgramm
18
18
 
19
19
  const useConnectedWalletsNetworkValidation = () => {
20
20
  const { connectedWallets, selectedWalletConnector, setSelectedWalletConnector, setShowAuthFlow, showAuthFlow, walletsToConnectByChain, isBridgeFlow, } = useInternalDynamicContext();
21
- const { view, setView } = useViewContext();
21
+ const { setView } = useViewContext();
22
22
  useEffect(() => {
23
23
  if (!isBridgeFlow) {
24
24
  return;
@@ -49,16 +49,17 @@ const useConnectedWalletsNetworkValidation = () => {
49
49
  }
50
50
  setView(networkNotSupportedView);
51
51
  }
52
+ // we need it to remove 'showAuthFlow' property. we don't want to react to it,
53
+ // because closing modal on network switch causes it to re-open
54
+ // eslint-disable-next-line react-hooks/exhaustive-deps
52
55
  }, [
53
- isBridgeFlow,
54
56
  connectedWallets,
55
- view,
57
+ isBridgeFlow,
56
58
  selectedWalletConnector,
57
- walletsToConnectByChain,
58
- showAuthFlow,
59
- setView,
60
59
  setSelectedWalletConnector,
61
60
  setShowAuthFlow,
61
+ setView,
62
+ walletsToConnectByChain,
62
63
  ]);
63
64
  };
64
65
 
@@ -20,11 +20,15 @@ require('../../../shared/consts/index.cjs');
20
20
  var primaryWalletIdValidator = require('../useWalletConnectors/utils/primaryWalletIdValidator/primaryWalletIdValidator.cjs');
21
21
  require('@dynamic-labs/multi-wallet');
22
22
 
23
- const usePrimaryWalletId = () => {
24
- const [primaryWalletId, setPrimaryWalletIdState, clearPrimaryWalletId] = useLocalStorage.useLocalStorage(localStorage.PRIMARY_WALLET_ID, undefined, primaryWalletIdValidator.primaryWalletIdValidator);
23
+ const usePrimaryWalletId = (internalEvents) => {
24
+ const [primaryWalletId, setPrimaryWalletIdState, clearPrimaryWalletIdStorage,] = useLocalStorage.useLocalStorage(localStorage.PRIMARY_WALLET_ID, undefined, primaryWalletIdValidator.primaryWalletIdValidator);
25
25
  const setPrimaryWalletId = React.useCallback((walletId) => {
26
26
  setPrimaryWalletIdState(walletId);
27
27
  }, [setPrimaryWalletIdState]);
28
+ const clearPrimaryWalletId = () => {
29
+ clearPrimaryWalletIdStorage();
30
+ internalEvents.emit('clearPrimaryWallet');
31
+ };
28
32
  return {
29
33
  clearPrimaryWalletId,
30
34
  primaryWalletId,
@@ -1,4 +1,5 @@
1
- export declare const usePrimaryWalletId: () => {
1
+ import { InternalEventEmitter } from '../../../context/DynamicContext/internalEvents';
2
+ export declare const usePrimaryWalletId: (internalEvents: InternalEventEmitter) => {
2
3
  clearPrimaryWalletId: () => void;
3
4
  primaryWalletId: string | undefined;
4
5
  setPrimaryWalletId: (walletId: string) => void;
@@ -16,11 +16,15 @@ import '../../../shared/consts/index.js';
16
16
  import { primaryWalletIdValidator } from '../useWalletConnectors/utils/primaryWalletIdValidator/primaryWalletIdValidator.js';
17
17
  import '@dynamic-labs/multi-wallet';
18
18
 
19
- const usePrimaryWalletId = () => {
20
- const [primaryWalletId, setPrimaryWalletIdState, clearPrimaryWalletId] = useLocalStorage(PRIMARY_WALLET_ID, undefined, primaryWalletIdValidator);
19
+ const usePrimaryWalletId = (internalEvents) => {
20
+ const [primaryWalletId, setPrimaryWalletIdState, clearPrimaryWalletIdStorage,] = useLocalStorage(PRIMARY_WALLET_ID, undefined, primaryWalletIdValidator);
21
21
  const setPrimaryWalletId = useCallback((walletId) => {
22
22
  setPrimaryWalletIdState(walletId);
23
23
  }, [setPrimaryWalletIdState]);
24
+ const clearPrimaryWalletId = () => {
25
+ clearPrimaryWalletIdStorage();
26
+ internalEvents.emit('clearPrimaryWallet');
27
+ };
24
28
  return {
25
29
  clearPrimaryWalletId,
26
30
  primaryWalletId,