@dynamic-labs/sdk-react-core 4.12.1 → 4.12.2-preview.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,16 @@
1
1
 
2
+ ### [4.12.2-preview.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.12.1...v4.12.2-preview.0) (2025-04-15)
3
+
4
+
5
+ ### Features
6
+
7
+ * add zksync smart accounts to global wallets ([cbbdec1](https://github.com/dynamic-labs/dynamic-auth/commit/cbbdec1f74fb19dcf739e10fdff5c4cfde28cfc6))
8
+
9
+
10
+ ### Bug Fixes
11
+
12
+ * **bridge:** wrong wallet/chain displaying when switching bridge chains ([#8541](https://github.com/dynamic-labs/dynamic-auth/issues/8541)) ([c9915d2](https://github.com/dynamic-labs/dynamic-auth/commit/c9915d2ede29aac0063ff89539a44e626285d8d0))
13
+
2
14
  ### [4.12.1](https://github.com/dynamic-labs/dynamic-auth/compare/v4.12.0...v4.12.1) (2025-04-15)
3
15
 
4
16
 
package/package.cjs CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
- var version = "4.12.1";
6
+ var version = "4.12.2-preview.0";
7
7
  var dependencies = {
8
8
  "@dynamic-labs/sdk-api-core": "0.0.658",
9
9
  "@hcaptcha/react-hcaptcha": "1.4.4",
package/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  'use client'
2
- var version = "4.12.1";
2
+ var version = "4.12.2-preview.0";
3
3
  var dependencies = {
4
4
  "@dynamic-labs/sdk-api-core": "0.0.658",
5
5
  "@hcaptcha/react-hcaptcha": "1.4.4",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dynamic-labs/sdk-react-core",
3
- "version": "4.12.1",
3
+ "version": "4.12.2-preview.0",
4
4
  "dependencies": {
5
5
  "@dynamic-labs/sdk-api-core": "0.0.658",
6
6
  "@hcaptcha/react-hcaptcha": "1.4.4",
@@ -14,16 +14,16 @@
14
14
  "yup": "0.32.11",
15
15
  "react-international-phone": "4.2.5",
16
16
  "bs58": "5.0.0",
17
- "@dynamic-labs/assert-package-version": "4.12.1",
18
- "@dynamic-labs/iconic": "4.12.1",
19
- "@dynamic-labs/logger": "4.12.1",
20
- "@dynamic-labs/multi-wallet": "4.12.1",
21
- "@dynamic-labs/rpc-providers": "4.12.1",
22
- "@dynamic-labs/store": "4.12.1",
23
- "@dynamic-labs/types": "4.12.1",
24
- "@dynamic-labs/utils": "4.12.1",
25
- "@dynamic-labs/wallet-book": "4.12.1",
26
- "@dynamic-labs/wallet-connector-core": "4.12.1",
17
+ "@dynamic-labs/assert-package-version": "4.12.2-preview.0",
18
+ "@dynamic-labs/iconic": "4.12.2-preview.0",
19
+ "@dynamic-labs/logger": "4.12.2-preview.0",
20
+ "@dynamic-labs/multi-wallet": "4.12.2-preview.0",
21
+ "@dynamic-labs/rpc-providers": "4.12.2-preview.0",
22
+ "@dynamic-labs/store": "4.12.2-preview.0",
23
+ "@dynamic-labs/types": "4.12.2-preview.0",
24
+ "@dynamic-labs/utils": "4.12.2-preview.0",
25
+ "@dynamic-labs/wallet-book": "4.12.2-preview.0",
26
+ "@dynamic-labs/wallet-connector-core": "4.12.2-preview.0",
27
27
  "eventemitter3": "5.0.1"
28
28
  },
29
29
  "devDependencies": {
@@ -25,7 +25,11 @@ const SignMessagePreview = ({ message, }) => {
25
25
  }, [message]);
26
26
  const messageText = React.useMemo(() => {
27
27
  const text = isRawMessage.isRawMessage(jsonMessage) ? jsonMessage.raw : message;
28
- const readableText = utils.isHex(text) ? utils.hexToString(text) : text;
28
+ let readableText = utils.isHex(text) ? utils.hexToString(text) : text;
29
+ // If the text is still hex, try to convert it to a string
30
+ if (utils.isHex(readableText)) {
31
+ readableText = utils.hexToString(readableText);
32
+ }
29
33
  return !containsSpecialCharacters.containsSpecialCharacters(readableText) ? readableText : text;
30
34
  }, [jsonMessage, message]);
31
35
  if (isSignTypedData.isSignTypedData(jsonMessage)) {
@@ -21,7 +21,11 @@ const SignMessagePreview = ({ message, }) => {
21
21
  }, [message]);
22
22
  const messageText = useMemo(() => {
23
23
  const text = isRawMessage(jsonMessage) ? jsonMessage.raw : message;
24
- const readableText = isHex(text) ? hexToString(text) : text;
24
+ let readableText = isHex(text) ? hexToString(text) : text;
25
+ // If the text is still hex, try to convert it to a string
26
+ if (isHex(readableText)) {
27
+ readableText = hexToString(readableText);
28
+ }
25
29
  return !containsSpecialCharacters(readableText) ? readableText : text;
26
30
  }, [jsonMessage, message]);
27
31
  if (isSignTypedData(jsonMessage)) {
@@ -15,7 +15,7 @@ require('../../../../_virtual/_tslib.cjs');
15
15
  require('../../context/DynamicContext/DynamicContext.cjs');
16
16
  require('../../store/state/loadingAndLifecycle/loadingAndLifecycle.cjs');
17
17
  require('@dynamic-labs/sdk-api-core');
18
- require('../../shared/logger.cjs');
18
+ var logger = require('../../shared/logger.cjs');
19
19
  var getChainIcon = require('../../shared/utils/functions/chain/getChainIcon.cjs');
20
20
  require('@dynamic-labs/wallet-connector-core');
21
21
  var shortenWalletAddress = require('../../shared/utils/functions/shortenWalletAddress/shortenWalletAddress.cjs');
@@ -103,7 +103,7 @@ var DynamicBridgeUserProfile = require('./components/DynamicBridgeUserProfile/Dy
103
103
  var DynamicBridgeWidgetContext = require('./context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.cjs');
104
104
 
105
105
  const DynamicBridgeWidget = ({ className, variant = 'modal', iconVariant = 'chain', }) => {
106
- const { showAuthFlow, setShowBridgeWidget, bridgeChains, setShowAuthFlow, connectedWallets, sdkHasLoaded, } = useInternalDynamicContext.useInternalDynamicContext();
106
+ const { showAuthFlow, setShowBridgeWidget, bridgeChains, setShowAuthFlow, connectedWallets, sdkHasLoaded, primaryWallet, setPrimaryWallet, } = useInternalDynamicContext.useInternalDynamicContext();
107
107
  const { widgetRef, inlineControlsRef } = DynamicBridgeWidgetContext.useDynamicBridgeWidgetContext();
108
108
  const { t } = reactI18next.useTranslation();
109
109
  const closeOnOutsideClick = React.useCallback((e) => {
@@ -116,6 +116,39 @@ const DynamicBridgeWidget = ({ className, variant = 'modal', iconVariant = 'chai
116
116
  }
117
117
  }, [inlineControlsRef, variant, showAuthFlow, setShowBridgeWidget]);
118
118
  index.useOnClickOutside(widgetRef, closeOnOutsideClick);
119
+ React.useEffect(() => {
120
+ // no need to update primary wallet if it's already set to the correct chain
121
+ if (!primaryWallet ||
122
+ !bridgeChains ||
123
+ connectedWallets.length <= 1 ||
124
+ primaryWallet.chain === bridgeChains[0].chain) {
125
+ return;
126
+ }
127
+ // find a connected wallet that matches the primary bridge chain
128
+ const newPrimaryWallet = connectedWallets.find((wallet) => wallet.chain === bridgeChains[0].chain);
129
+ // if a new primary wallet is found, update the primary wallet
130
+ if (newPrimaryWallet) {
131
+ logger.logger.debug('[DynamicBridgeWidget] bridgeChains changed - updating primary wallet', {
132
+ bridgeChains,
133
+ connectedWallets: connectedWallets.map((wallet) => ({
134
+ address: wallet.address,
135
+ chain: wallet.chain,
136
+ id: wallet.id,
137
+ })),
138
+ newPrimaryWallet: {
139
+ address: newPrimaryWallet.address,
140
+ chain: newPrimaryWallet.chain,
141
+ id: newPrimaryWallet.id,
142
+ },
143
+ oldPrimaryWallet: {
144
+ address: primaryWallet.address,
145
+ chain: primaryWallet.chain,
146
+ id: primaryWallet.id,
147
+ },
148
+ });
149
+ setPrimaryWallet(newPrimaryWallet.id);
150
+ }
151
+ }, [bridgeChains, primaryWallet, connectedWallets, setPrimaryWallet]);
119
152
  return (jsxRuntime.jsxs(ShadowDOM.ShadowDOM, { id: 'dynamic-bridge-widget', className: 'dynamic-widget__container', children: [jsxRuntime.jsx(InlineWidget.InlineWidget, { ref: inlineControlsRef, className: className, dataTestId: 'BridgeWidgetNav', children: bridgeChains === null || bridgeChains === void 0 ? void 0 : bridgeChains.map(({ chain }) => {
120
153
  const ChainIcon = getChainIcon.getChainIcon(chain);
121
154
  if (!sdkHasLoaded) {
@@ -1,6 +1,6 @@
1
1
  'use client'
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { useCallback } from 'react';
3
+ import { useCallback, useEffect } from 'react';
4
4
  import { useTranslation } from 'react-i18next';
5
5
  import { WalletIcon } from '@dynamic-labs/wallet-book';
6
6
  import '@dynamic-labs/utils';
@@ -11,7 +11,7 @@ import '../../../../_virtual/_tslib.js';
11
11
  import '../../context/DynamicContext/DynamicContext.js';
12
12
  import '../../store/state/loadingAndLifecycle/loadingAndLifecycle.js';
13
13
  import '@dynamic-labs/sdk-api-core';
14
- import '../../shared/logger.js';
14
+ import { logger } from '../../shared/logger.js';
15
15
  import { getChainIcon } from '../../shared/utils/functions/chain/getChainIcon.js';
16
16
  import '@dynamic-labs/wallet-connector-core';
17
17
  import { shortenWalletAddress } from '../../shared/utils/functions/shortenWalletAddress/shortenWalletAddress.js';
@@ -99,7 +99,7 @@ import { DynamicBridgeUserProfile } from './components/DynamicBridgeUserProfile/
99
99
  import { useDynamicBridgeWidgetContext } from './context/DynamicBridgeWidgetContext/DynamicBridgeWidgetContext.js';
100
100
 
101
101
  const DynamicBridgeWidget = ({ className, variant = 'modal', iconVariant = 'chain', }) => {
102
- const { showAuthFlow, setShowBridgeWidget, bridgeChains, setShowAuthFlow, connectedWallets, sdkHasLoaded, } = useInternalDynamicContext();
102
+ const { showAuthFlow, setShowBridgeWidget, bridgeChains, setShowAuthFlow, connectedWallets, sdkHasLoaded, primaryWallet, setPrimaryWallet, } = useInternalDynamicContext();
103
103
  const { widgetRef, inlineControlsRef } = useDynamicBridgeWidgetContext();
104
104
  const { t } = useTranslation();
105
105
  const closeOnOutsideClick = useCallback((e) => {
@@ -112,6 +112,39 @@ const DynamicBridgeWidget = ({ className, variant = 'modal', iconVariant = 'chai
112
112
  }
113
113
  }, [inlineControlsRef, variant, showAuthFlow, setShowBridgeWidget]);
114
114
  useOnClickOutside(widgetRef, closeOnOutsideClick);
115
+ useEffect(() => {
116
+ // no need to update primary wallet if it's already set to the correct chain
117
+ if (!primaryWallet ||
118
+ !bridgeChains ||
119
+ connectedWallets.length <= 1 ||
120
+ primaryWallet.chain === bridgeChains[0].chain) {
121
+ return;
122
+ }
123
+ // find a connected wallet that matches the primary bridge chain
124
+ const newPrimaryWallet = connectedWallets.find((wallet) => wallet.chain === bridgeChains[0].chain);
125
+ // if a new primary wallet is found, update the primary wallet
126
+ if (newPrimaryWallet) {
127
+ logger.debug('[DynamicBridgeWidget] bridgeChains changed - updating primary wallet', {
128
+ bridgeChains,
129
+ connectedWallets: connectedWallets.map((wallet) => ({
130
+ address: wallet.address,
131
+ chain: wallet.chain,
132
+ id: wallet.id,
133
+ })),
134
+ newPrimaryWallet: {
135
+ address: newPrimaryWallet.address,
136
+ chain: newPrimaryWallet.chain,
137
+ id: newPrimaryWallet.id,
138
+ },
139
+ oldPrimaryWallet: {
140
+ address: primaryWallet.address,
141
+ chain: primaryWallet.chain,
142
+ id: primaryWallet.id,
143
+ },
144
+ });
145
+ setPrimaryWallet(newPrimaryWallet.id);
146
+ }
147
+ }, [bridgeChains, primaryWallet, connectedWallets, setPrimaryWallet]);
115
148
  return (jsxs(ShadowDOM, { id: 'dynamic-bridge-widget', className: 'dynamic-widget__container', children: [jsx(InlineWidget, { ref: inlineControlsRef, className: className, dataTestId: 'BridgeWidgetNav', children: bridgeChains === null || bridgeChains === void 0 ? void 0 : bridgeChains.map(({ chain }) => {
116
149
  const ChainIcon = getChainIcon(chain);
117
150
  if (!sdkHasLoaded) {
@@ -105,7 +105,7 @@ const DynamicBridgeWidgetEmptyCard = ({ chain }) => {
105
105
  }
106
106
  const chainInfo = walletConnectorCore.getChainInfoWithOverrides(chain);
107
107
  const ChainIcon = getChainIcon.getChainIcon(chain);
108
- return (jsxRuntime.jsxs("div", { role: 'button', className: 'dynamic-bridge-widget-empty-card', onClick: () => {
108
+ return (jsxRuntime.jsxs("div", { role: 'button', className: 'dynamic-bridge-widget-empty-card', "data-testid": 'dynamic-bridge-widget-empty-card', onClick: () => {
109
109
  setShowBridgeWidget(false);
110
110
  setShowAuthFlow(true);
111
111
  }, children: [jsxRuntime.jsx(ChainIcon, { className: 'dynamic-bridge-widget-empty-card__icon' }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', weight: 'medium', as: 'span', color: 'primary', className: 'dynamic-bridge-widget-empty-card__text', copykey: 'dyn_bridge.widget.connect_with_network', children: t('dyn_bridge.widget.connect_with_network', {
@@ -101,7 +101,7 @@ const DynamicBridgeWidgetEmptyCard = ({ chain }) => {
101
101
  }
102
102
  const chainInfo = getChainInfoWithOverrides(chain);
103
103
  const ChainIcon = getChainIcon(chain);
104
- return (jsxs("div", { role: 'button', className: 'dynamic-bridge-widget-empty-card', onClick: () => {
104
+ return (jsxs("div", { role: 'button', className: 'dynamic-bridge-widget-empty-card', "data-testid": 'dynamic-bridge-widget-empty-card', onClick: () => {
105
105
  setShowBridgeWidget(false);
106
106
  setShowAuthFlow(true);
107
107
  }, children: [jsx(ChainIcon, { className: 'dynamic-bridge-widget-empty-card__icon' }), jsx(Typography, { variant: 'body_normal', weight: 'medium', as: 'span', color: 'primary', className: 'dynamic-bridge-widget-empty-card__text', copykey: 'dyn_bridge.widget.connect_with_network', children: t('dyn_bridge.widget.connect_with_network', {
@@ -105,10 +105,11 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
105
105
 
106
106
  const SecondaryWallets = ({ hideUnlinkAction = false }) => {
107
107
  const { disconnectWallet, bridgeChains, connectedWallets, primaryWalletId } = useInternalDynamicContext.useInternalDynamicContext();
108
- const secondaryWallet = connectedWallets.find((wallet) => wallet.id !== primaryWalletId);
108
+ const secondaryChain = React.useMemo(() => { var _a; return (_a = bridgeChains === null || bridgeChains === void 0 ? void 0 : bridgeChains[1]) === null || _a === void 0 ? void 0 : _a.chain; }, [bridgeChains]);
109
+ const secondaryWallet = React.useMemo(() => connectedWallets.find((wallet) => wallet.id !== primaryWalletId && wallet.chain === secondaryChain), [connectedWallets, primaryWalletId, secondaryChain]);
109
110
  const NetworkIcon = secondaryWallet && getChainIcon.getChainIcon(secondaryWallet === null || secondaryWallet === void 0 ? void 0 : secondaryWallet.chain);
110
111
  const networkInfo = secondaryWallet && walletConnectorCore.getChainInfoWithOverrides(secondaryWallet === null || secondaryWallet === void 0 ? void 0 : secondaryWallet.chain);
111
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!secondaryWallet && (jsxRuntime.jsx(DynamicBridgeWidgetEmptyCard.DynamicBridgeWidgetEmptyCard, { chain: bridgeChains === null || bridgeChains === void 0 ? void 0 : bridgeChains[1].chain })), secondaryWallet && NetworkIcon && (jsxRuntime.jsx(DynamicBridgeWalletCard.DynamicBridgeWalletCard, { networkIcon: jsxRuntime.jsx(NetworkIcon, {}), networkName: networkInfo === null || networkInfo === void 0 ? void 0 : networkInfo.displayName, children: jsxRuntime.jsx(DynamicBridgeWalletCardBody.DynamicBridgeWalletCardBody, { walletKey: secondaryWallet.connector.key, walletAddress: secondaryWallet.address, walletBalance:
112
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [!secondaryWallet && (jsxRuntime.jsx(DynamicBridgeWidgetEmptyCard.DynamicBridgeWidgetEmptyCard, { chain: secondaryChain })), secondaryWallet && NetworkIcon && (jsxRuntime.jsx(DynamicBridgeWalletCard.DynamicBridgeWalletCard, { networkIcon: jsxRuntime.jsx(NetworkIcon, {}), networkName: networkInfo === null || networkInfo === void 0 ? void 0 : networkInfo.displayName, children: jsxRuntime.jsx(DynamicBridgeWalletCardBody.DynamicBridgeWalletCardBody, { walletKey: secondaryWallet.connector.key, walletAddress: secondaryWallet.address, walletBalance:
112
113
  // eslint-disable-next-line react/jsx-wrap-multilines
113
114
  jsxRuntime.jsx(Balance.Balance, { wallet: secondaryWallet, network: secondaryWallet.chain }), onDisconnectClick: !hideUnlinkAction
114
115
  ? () => disconnectWallet(secondaryWallet.id)
@@ -1,6 +1,6 @@
1
1
  'use client'
2
2
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
- import React__default from 'react';
3
+ import React__default, { useMemo } from 'react';
4
4
  import { getChainInfoWithOverrides } from '@dynamic-labs/wallet-connector-core';
5
5
  import '@dynamic-labs/sdk-api-core';
6
6
  import '../../../../../../shared/logger.js';
@@ -97,10 +97,11 @@ import { DynamicBridgeWidgetEmptyCard } from '../../../../components/DynamicBrid
97
97
 
98
98
  const SecondaryWallets = ({ hideUnlinkAction = false }) => {
99
99
  const { disconnectWallet, bridgeChains, connectedWallets, primaryWalletId } = useInternalDynamicContext();
100
- const secondaryWallet = connectedWallets.find((wallet) => wallet.id !== primaryWalletId);
100
+ const secondaryChain = useMemo(() => { var _a; return (_a = bridgeChains === null || bridgeChains === void 0 ? void 0 : bridgeChains[1]) === null || _a === void 0 ? void 0 : _a.chain; }, [bridgeChains]);
101
+ const secondaryWallet = useMemo(() => connectedWallets.find((wallet) => wallet.id !== primaryWalletId && wallet.chain === secondaryChain), [connectedWallets, primaryWalletId, secondaryChain]);
101
102
  const NetworkIcon = secondaryWallet && getChainIcon(secondaryWallet === null || secondaryWallet === void 0 ? void 0 : secondaryWallet.chain);
102
103
  const networkInfo = secondaryWallet && getChainInfoWithOverrides(secondaryWallet === null || secondaryWallet === void 0 ? void 0 : secondaryWallet.chain);
103
- return (jsxs(Fragment, { children: [!secondaryWallet && (jsx(DynamicBridgeWidgetEmptyCard, { chain: bridgeChains === null || bridgeChains === void 0 ? void 0 : bridgeChains[1].chain })), secondaryWallet && NetworkIcon && (jsx(DynamicBridgeWalletCard, { networkIcon: jsx(NetworkIcon, {}), networkName: networkInfo === null || networkInfo === void 0 ? void 0 : networkInfo.displayName, children: jsx(DynamicBridgeWalletCardBody, { walletKey: secondaryWallet.connector.key, walletAddress: secondaryWallet.address, walletBalance:
104
+ return (jsxs(Fragment, { children: [!secondaryWallet && (jsx(DynamicBridgeWidgetEmptyCard, { chain: secondaryChain })), secondaryWallet && NetworkIcon && (jsx(DynamicBridgeWalletCard, { networkIcon: jsx(NetworkIcon, {}), networkName: networkInfo === null || networkInfo === void 0 ? void 0 : networkInfo.displayName, children: jsx(DynamicBridgeWalletCardBody, { walletKey: secondaryWallet.connector.key, walletAddress: secondaryWallet.address, walletBalance:
104
105
  // eslint-disable-next-line react/jsx-wrap-multilines
105
106
  jsx(Balance, { wallet: secondaryWallet, network: secondaryWallet.chain }), onDisconnectClick: !hideUnlinkAction
106
107
  ? () => disconnectWallet(secondaryWallet.id)