@dynamic-labs/sdk-react-core 4.70.0 → 4.71.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/package.cjs +3 -3
  3. package/package.js +3 -3
  4. package/package.json +14 -14
  5. package/src/lib/client/extension/deprecated/mfa/verifyTotpMfaDevice/verifyTotpMfaDevice.d.ts +1 -1
  6. package/src/lib/client/extension/hooks/useInitializeSdkClient/syncEvents/syncEvents.cjs +12 -0
  7. package/src/lib/client/extension/hooks/useInitializeSdkClient/syncEvents/syncEvents.js +12 -0
  8. package/src/lib/components/SendBalanceForm/SendBalanceForm.cjs +15 -2
  9. package/src/lib/components/SendBalanceForm/SendBalanceForm.d.ts +4 -0
  10. package/src/lib/components/SendBalanceForm/SendBalanceForm.js +15 -2
  11. package/src/lib/components/SendBalancePageLayout/SendBalancePageLayout.cjs +25 -3
  12. package/src/lib/components/SendBalancePageLayout/SendBalancePageLayout.js +26 -4
  13. package/src/lib/components/SendBalancePageLayout/components/TokensBalanceDropdown/TokensBalanceDropdown.cjs +4 -1
  14. package/src/lib/components/SendBalancePageLayout/components/TokensBalanceDropdown/TokensBalanceDropdown.js +4 -1
  15. package/src/lib/components/TransactionCard/SendBalanceTransactionCard.cjs +9 -5
  16. package/src/lib/components/TransactionCard/SendBalanceTransactionCard.js +9 -5
  17. package/src/lib/events/deviceRegistration.d.ts +4 -0
  18. package/src/lib/events/dynamicEvents.cjs +2 -0
  19. package/src/lib/events/dynamicEvents.d.ts +3 -2
  20. package/src/lib/events/dynamicEvents.js +2 -0
  21. package/src/lib/shared/utils/functions/chain/getChainIcon.cjs +1 -0
  22. package/src/lib/shared/utils/functions/chain/getChainIcon.js +2 -1
  23. package/src/lib/styles/index.shadow.cjs +1 -1
  24. package/src/lib/styles/index.shadow.js +1 -1
  25. package/src/lib/utils/functions/compareChains/compareChains.cjs +1 -0
  26. package/src/lib/utils/functions/compareChains/compareChains.js +1 -0
  27. package/src/lib/utils/hooks/events/useDynamicEvents/useDynamicEvents.d.ts +2 -2
  28. package/src/lib/utils/hooks/useExternalAuth/useExternalAuth.cjs +26 -34
  29. package/src/lib/utils/hooks/useExternalAuth/useExternalAuth.d.ts +5 -2
  30. package/src/lib/utils/hooks/useExternalAuth/useExternalAuth.js +27 -35
  31. package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.cjs +7 -2
  32. package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.d.ts +2 -1
  33. package/src/lib/utils/hooks/useNetworkConfigurationsFromProjectSettings/useNetworkConfigurationsFromProjectSettings.js +7 -2
  34. package/src/lib/views/WalletList/data.cjs +1 -0
  35. package/src/lib/views/WalletList/data.d.ts +1 -1
  36. package/src/lib/views/WalletList/data.js +1 -0
  37. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/ActiveWalletBalance.cjs +9 -1
  38. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/ActiveWalletBalance.js +9 -1
  39. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceItem/TokenBalanceItem.cjs +2 -1
  40. package/src/lib/widgets/DynamicWidget/components/ActiveWalletBalance/TokenBalanceItem/TokenBalanceItem.js +2 -1
  41. package/src/lib/widgets/DynamicWidget/helpers/helpers.cjs +22 -0
  42. package/src/lib/widgets/DynamicWidget/helpers/helpers.js +22 -0
  43. package/src/lib/data/api/externalAuth/externalAuth.cjs +0 -66
  44. package/src/lib/data/api/externalAuth/externalAuth.js +0 -62
package/CHANGELOG.md CHANGED
@@ -1,4 +1,17 @@
1
1
 
2
+ ## [4.71.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.70.0...v4.71.0) (2026-03-24)
3
+
4
+
5
+ ### Features
6
+
7
+ * add Tempo chain connector and core type definitions ([#10672](https://github.com/dynamic-labs/dynamic-auth/issues/10672)) ([0439c15](https://github.com/dynamic-labs/dynamic-auth/commit/0439c153238359083b9f226dcd2ebf6d83e26519))
8
+ * add verifySocial method to demo site step-up auth methods ([#10721](https://github.com/dynamic-labs/dynamic-auth/issues/10721)) ([b9ef517](https://github.com/dynamic-labs/dynamic-auth/commit/b9ef5173df3e3ed08f718de49b036ea899dc1832))
9
+ * **demo:** add Tempo chain support to demo app ([#10674](https://github.com/dynamic-labs/dynamic-auth/issues/10674)) ([a5918fc](https://github.com/dynamic-labs/dynamic-auth/commit/a5918fc2ab0821e7f025aa470573129f71de33cc))
10
+ * repurpose verifyWithExternalJwt for elevated access token requests ([#10743](https://github.com/dynamic-labs/dynamic-auth/issues/10743)) ([d1abda0](https://github.com/dynamic-labs/dynamic-auth/commit/d1abda0111d68c78226d30bd0630e6e341dedad9))
11
+ * **sdk:** add Tempo chain support to UI components ([#10673](https://github.com/dynamic-labs/dynamic-auth/issues/10673)) ([aec9fbb](https://github.com/dynamic-labs/dynamic-auth/commit/aec9fbb20754a2935bffe106e7e8715f46be3de7))
12
+ * support multi-chain wallet creation in createWallet ([#10694](https://github.com/dynamic-labs/dynamic-auth/issues/10694)) ([0b6b57f](https://github.com/dynamic-labs/dynamic-auth/commit/0b6b57f4179c35d1f86d1c8c9c40f52cb307c849))
13
+ * wire up elevatedAccessToken for sign, reshare, and refresh operations ([#10737](https://github.com/dynamic-labs/dynamic-auth/issues/10737)) ([f9d5c76](https://github.com/dynamic-labs/dynamic-auth/commit/f9d5c768037aff4f5d7994b6bc6c338621a6ee6b))
14
+
2
15
  ## [4.70.0](https://github.com/dynamic-labs/dynamic-auth/compare/v4.69.0...v4.70.0) (2026-03-23)
3
16
 
4
17
 
package/package.cjs CHANGED
@@ -3,11 +3,11 @@
3
3
 
4
4
  Object.defineProperty(exports, '__esModule', { value: true });
5
5
 
6
- var version = "4.70.0";
6
+ var version = "4.71.0";
7
7
  var dependencies = {
8
8
  "@dynamic-labs/sdk-api-core": "0.0.909",
9
- "@dynamic-labs-sdk/client": "0.17.4",
10
- "@dynamic-labs-wallet/browser-wallet-client": "0.0.309",
9
+ "@dynamic-labs-sdk/client": "0.18.0",
10
+ "@dynamic-labs-wallet/browser-wallet-client": "0.0.314",
11
11
  "@hcaptcha/react-hcaptcha": "1.4.4",
12
12
  "@thumbmarkjs/thumbmarkjs": "0.16.0",
13
13
  "country-list": "2.3.0",
package/package.js CHANGED
@@ -1,9 +1,9 @@
1
1
  'use client'
2
- var version = "4.70.0";
2
+ var version = "4.71.0";
3
3
  var dependencies = {
4
4
  "@dynamic-labs/sdk-api-core": "0.0.909",
5
- "@dynamic-labs-sdk/client": "0.17.4",
6
- "@dynamic-labs-wallet/browser-wallet-client": "0.0.309",
5
+ "@dynamic-labs-sdk/client": "0.18.0",
6
+ "@dynamic-labs-wallet/browser-wallet-client": "0.0.314",
7
7
  "@hcaptcha/react-hcaptcha": "1.4.4",
8
8
  "@thumbmarkjs/thumbmarkjs": "0.16.0",
9
9
  "country-list": "2.3.0",
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@dynamic-labs/sdk-react-core",
3
- "version": "4.70.0",
3
+ "version": "4.71.0",
4
4
  "dependencies": {
5
5
  "@dynamic-labs/sdk-api-core": "0.0.909",
6
- "@dynamic-labs-sdk/client": "0.17.4",
7
- "@dynamic-labs-wallet/browser-wallet-client": "0.0.309",
6
+ "@dynamic-labs-sdk/client": "0.18.0",
7
+ "@dynamic-labs-wallet/browser-wallet-client": "0.0.314",
8
8
  "@hcaptcha/react-hcaptcha": "1.4.4",
9
9
  "@thumbmarkjs/thumbmarkjs": "0.16.0",
10
10
  "country-list": "2.3.0",
@@ -16,17 +16,17 @@
16
16
  "yup": "0.32.11",
17
17
  "react-international-phone": "4.5.0",
18
18
  "bs58": "5.0.0",
19
- "@dynamic-labs/assert-package-version": "4.70.0",
20
- "@dynamic-labs/iconic": "4.70.0",
21
- "@dynamic-labs/locale": "4.70.0",
22
- "@dynamic-labs/logger": "4.70.0",
23
- "@dynamic-labs/multi-wallet": "4.70.0",
24
- "@dynamic-labs/rpc-providers": "4.70.0",
25
- "@dynamic-labs/store": "4.70.0",
26
- "@dynamic-labs/types": "4.70.0",
27
- "@dynamic-labs/utils": "4.70.0",
28
- "@dynamic-labs/wallet-book": "4.70.0",
29
- "@dynamic-labs/wallet-connector-core": "4.70.0",
19
+ "@dynamic-labs/assert-package-version": "4.71.0",
20
+ "@dynamic-labs/iconic": "4.71.0",
21
+ "@dynamic-labs/locale": "4.71.0",
22
+ "@dynamic-labs/logger": "4.71.0",
23
+ "@dynamic-labs/multi-wallet": "4.71.0",
24
+ "@dynamic-labs/rpc-providers": "4.71.0",
25
+ "@dynamic-labs/store": "4.71.0",
26
+ "@dynamic-labs/types": "4.71.0",
27
+ "@dynamic-labs/utils": "4.71.0",
28
+ "@dynamic-labs/wallet-book": "4.71.0",
29
+ "@dynamic-labs/wallet-connector-core": "4.71.0",
30
30
  "eventemitter3": "5.0.1"
31
31
  },
32
32
  "devDependencies": {
@@ -1,3 +1,3 @@
1
1
  export declare const verifyTotpMfaDevice: ({ code }: {
2
2
  code: string;
3
- }) => Promise<import("@dynamic-labs/sdk-api-core").MFADevice>;
3
+ }) => Promise<import("@dynamic-labs-sdk/client").MFADevice>;
@@ -25,6 +25,18 @@ const syncEvents = (client$1) => {
25
25
  dynamicEvents.dynamicEvents.emit('logout');
26
26
  },
27
27
  }, client$1);
28
+ client.onEvent({
29
+ event: 'deviceRegistrationCompleted',
30
+ listener: () => {
31
+ dynamicEvents.dynamicEvents.emit('deviceRegistrationCompleted');
32
+ },
33
+ }, client$1);
34
+ client.onEvent({
35
+ event: 'deviceRegistrationCompletedInAnotherTab',
36
+ listener: () => {
37
+ dynamicEvents.dynamicEvents.emit('deviceRegistrationCompletedInAnotherTab');
38
+ },
39
+ }, client$1);
28
40
  };
29
41
 
30
42
  exports.syncEvents = syncEvents;
@@ -21,6 +21,18 @@ const syncEvents = (client) => {
21
21
  dynamicEvents.emit('logout');
22
22
  },
23
23
  }, client);
24
+ onEvent({
25
+ event: 'deviceRegistrationCompleted',
26
+ listener: () => {
27
+ dynamicEvents.emit('deviceRegistrationCompleted');
28
+ },
29
+ }, client);
30
+ onEvent({
31
+ event: 'deviceRegistrationCompletedInAnotherTab',
32
+ listener: () => {
33
+ dynamicEvents.emit('deviceRegistrationCompletedInAnotherTab');
34
+ },
35
+ }, client);
24
36
  };
25
37
 
26
38
  export { syncEvents };
@@ -139,7 +139,9 @@ const getDisplayErrorMessage = (errors, t, field, decimals) => {
139
139
  }
140
140
  return '';
141
141
  };
142
- const SendBalanceForm = ({ initialValues, onSubmit, decimals = 18, validateAddress = () => true, validateAmount = () => true, currentToken, transaction, tokenBalances, setCurrentToken, isLoading, }) => {
142
+ const SendBalanceForm = ({ initialValues, onSubmit, decimals = 18, validateAddress = () => true, validateAmount = () => true, currentToken, transaction, tokenBalances, setCurrentToken, isLoading,
143
+ // Tempo-specific props
144
+ isTempo = false, feeTokenOptions, currentFeeToken, setCurrentFeeToken, }) => {
143
145
  const { t } = reactI18next.useTranslation();
144
146
  const { showFiat } = useInternalDynamicContext.useInternalDynamicContext();
145
147
  const floatingValueRef = React.useRef(null);
@@ -194,7 +196,18 @@ const SendBalanceForm = ({ initialValues, onSubmit, decimals = 18, validateAddre
194
196
  paddingLeft: `${leftSymbolPadding}px`,
195
197
  } }), jsxRuntime.jsx("div", { className: 'send-balance-form__amount-container__floating_value', ref: floatingValueRef, children: jsxRuntime.jsx(Typography.Typography, { variant: 'title', weight: 'regular', color: 'secondary', children: currentToken === null || currentToken === void 0 ? void 0 : currentToken.symbol }) }), jsxRuntime.jsx("div", { className: 'send-balance-form__amount-container__balance', children: showFiat && !Number.isNaN(amount) && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_mini', weight: 'bold', color: 'secondary', children: "$" }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_mini', weight: 'regular', color: 'secondary', children: utils.getDisplayFiatPrice(amount, currentToken) })] })) })] }), jsxRuntime.jsx(Typography.Typography, { className: 'send-balance-form__amount_available', variant: 'body_small', weight: 'regular', color: 'secondary', as: 'div', children: jsxRuntime.jsxs("div", { style: { display: 'flex', gap: '0.225rem' }, children: [jsxRuntime.jsx(Typography.Typography, { className: 'send-balance-form__amount_available__line', variant: 'body_small', weight: 'bold', color: 'primary', as: 'div', children: (_a = currentToken === null || currentToken === void 0 ? void 0 : currentToken.balance) !== null && _a !== void 0 ? _a : 0 }), t('dyn_send_transaction.data.symbol_available', {
196
198
  symbol: currentToken === null || currentToken === void 0 ? void 0 : currentToken.symbol,
197
- })] }) }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_small', weight: 'regular', color: 'secondary', copykey: 'dyn_send_transaction.data.recipient.label', children: "Recipient Address" }), jsxRuntime.jsx(formik.Field, { className: 'send-balance-form__field', placeholder: t('dyn_send_transaction.data.recipient.placeholder'), label: t('dyn_send_transaction.data.recipient.label'), id: 'recipient', name: 'recipient', as: Input.Input, error: errors['recipient'], copykey: 'dyn_send_transaction.data.recipient.label', message: touched['recipient'] &&
199
+ })] }) }), isTempo &&
200
+ feeTokenOptions &&
201
+ feeTokenOptions.length > 0 &&
202
+ setCurrentFeeToken && (jsxRuntime.jsxs("div", { className: 'send-balance-form__fee-token-container', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_small', weight: 'regular', color: 'secondary', style: { marginBottom: '8px' }, children: t('dyn_send_transaction.data.fee_token_label') }), jsxRuntime.jsx("select", { className: 'send-balance-form__fee-token-select', value: (currentFeeToken === null || currentFeeToken === void 0 ? void 0 : currentFeeToken.address) || '', onChange: ({ target: { value } }) => {
203
+ const selected = feeTokenOptions.find((token) => token.address === value);
204
+ if (selected) {
205
+ setCurrentFeeToken(selected);
206
+ }
207
+ }, children: feeTokenOptions.map((token) => {
208
+ var _a;
209
+ return (jsxRuntime.jsxs("option", { value: token.address, children: [token.symbol, " (", ((_a = token.balance) === null || _a === void 0 ? void 0 : _a.toLocaleString()) || 0, ' ', "available)"] }, token.address));
210
+ }) })] })), jsxRuntime.jsx(Typography.Typography, { variant: 'body_small', weight: 'regular', color: 'secondary', copykey: 'dyn_send_transaction.data.recipient.label', children: "Recipient Address" }), jsxRuntime.jsx(formik.Field, { className: 'send-balance-form__field', placeholder: t('dyn_send_transaction.data.recipient.placeholder'), label: t('dyn_send_transaction.data.recipient.label'), id: 'recipient', name: 'recipient', as: Input.Input, error: errors['recipient'], copykey: 'dyn_send_transaction.data.recipient.label', message: touched['recipient'] &&
198
211
  getDisplayErrorMessage(errors, t, 'recipient') }), jsxRuntime.jsx(TypographyButton.TypographyButton, { dataTestId: 'sendBalanceFormSubmitButton', expanded: true, type: 'submit', buttonVariant: 'primary', buttonPadding: 'small', buttonClassName: 'send-balance-form__button', copykey: 'dyn_send_transaction.preview_transaction', children: t('dyn_send_transaction.preview_transaction') })] }));
199
212
  } }));
200
213
  };
@@ -16,5 +16,9 @@ export type Props = {
16
16
  setCurrentToken: Dispatch<SetStateAction<TokenBalance | undefined>>;
17
17
  isLoading?: boolean;
18
18
  transaction: IUITransaction;
19
+ isTempo?: boolean;
20
+ feeTokenOptions?: TokenBalance[];
21
+ currentFeeToken?: TokenBalance;
22
+ setCurrentFeeToken?: Dispatch<SetStateAction<TokenBalance | undefined>>;
19
23
  };
20
24
  export declare const SendBalanceForm: FC<Props>;
@@ -135,7 +135,9 @@ const getDisplayErrorMessage = (errors, t, field, decimals) => {
135
135
  }
136
136
  return '';
137
137
  };
138
- const SendBalanceForm = ({ initialValues, onSubmit, decimals = 18, validateAddress = () => true, validateAmount = () => true, currentToken, transaction, tokenBalances, setCurrentToken, isLoading, }) => {
138
+ const SendBalanceForm = ({ initialValues, onSubmit, decimals = 18, validateAddress = () => true, validateAmount = () => true, currentToken, transaction, tokenBalances, setCurrentToken, isLoading,
139
+ // Tempo-specific props
140
+ isTempo = false, feeTokenOptions, currentFeeToken, setCurrentFeeToken, }) => {
139
141
  const { t } = useTranslation();
140
142
  const { showFiat } = useInternalDynamicContext();
141
143
  const floatingValueRef = useRef(null);
@@ -190,7 +192,18 @@ const SendBalanceForm = ({ initialValues, onSubmit, decimals = 18, validateAddre
190
192
  paddingLeft: `${leftSymbolPadding}px`,
191
193
  } }), jsx("div", { className: 'send-balance-form__amount-container__floating_value', ref: floatingValueRef, children: jsx(Typography, { variant: 'title', weight: 'regular', color: 'secondary', children: currentToken === null || currentToken === void 0 ? void 0 : currentToken.symbol }) }), jsx("div", { className: 'send-balance-form__amount-container__balance', children: showFiat && !Number.isNaN(amount) && (jsxs(Fragment, { children: [jsx(Typography, { variant: 'body_mini', weight: 'bold', color: 'secondary', children: "$" }), jsx(Typography, { variant: 'body_mini', weight: 'regular', color: 'secondary', children: getDisplayFiatPrice(amount, currentToken) })] })) })] }), jsx(Typography, { className: 'send-balance-form__amount_available', variant: 'body_small', weight: 'regular', color: 'secondary', as: 'div', children: jsxs("div", { style: { display: 'flex', gap: '0.225rem' }, children: [jsx(Typography, { className: 'send-balance-form__amount_available__line', variant: 'body_small', weight: 'bold', color: 'primary', as: 'div', children: (_a = currentToken === null || currentToken === void 0 ? void 0 : currentToken.balance) !== null && _a !== void 0 ? _a : 0 }), t('dyn_send_transaction.data.symbol_available', {
192
194
  symbol: currentToken === null || currentToken === void 0 ? void 0 : currentToken.symbol,
193
- })] }) }), jsx(Typography, { variant: 'body_small', weight: 'regular', color: 'secondary', copykey: 'dyn_send_transaction.data.recipient.label', children: "Recipient Address" }), jsx(Field, { className: 'send-balance-form__field', placeholder: t('dyn_send_transaction.data.recipient.placeholder'), label: t('dyn_send_transaction.data.recipient.label'), id: 'recipient', name: 'recipient', as: Input, error: errors['recipient'], copykey: 'dyn_send_transaction.data.recipient.label', message: touched['recipient'] &&
195
+ })] }) }), isTempo &&
196
+ feeTokenOptions &&
197
+ feeTokenOptions.length > 0 &&
198
+ setCurrentFeeToken && (jsxs("div", { className: 'send-balance-form__fee-token-container', children: [jsx(Typography, { variant: 'body_small', weight: 'regular', color: 'secondary', style: { marginBottom: '8px' }, children: t('dyn_send_transaction.data.fee_token_label') }), jsx("select", { className: 'send-balance-form__fee-token-select', value: (currentFeeToken === null || currentFeeToken === void 0 ? void 0 : currentFeeToken.address) || '', onChange: ({ target: { value } }) => {
199
+ const selected = feeTokenOptions.find((token) => token.address === value);
200
+ if (selected) {
201
+ setCurrentFeeToken(selected);
202
+ }
203
+ }, children: feeTokenOptions.map((token) => {
204
+ var _a;
205
+ return (jsxs("option", { value: token.address, children: [token.symbol, " (", ((_a = token.balance) === null || _a === void 0 ? void 0 : _a.toLocaleString()) || 0, ' ', "available)"] }, token.address));
206
+ }) })] })), jsx(Typography, { variant: 'body_small', weight: 'regular', color: 'secondary', copykey: 'dyn_send_transaction.data.recipient.label', children: "Recipient Address" }), jsx(Field, { className: 'send-balance-form__field', placeholder: t('dyn_send_transaction.data.recipient.placeholder'), label: t('dyn_send_transaction.data.recipient.label'), id: 'recipient', name: 'recipient', as: Input, error: errors['recipient'], copykey: 'dyn_send_transaction.data.recipient.label', message: touched['recipient'] &&
194
207
  getDisplayErrorMessage(errors, t, 'recipient') }), jsx(TypographyButton, { dataTestId: 'sendBalanceFormSubmitButton', expanded: true, type: 'submit', buttonVariant: 'primary', buttonPadding: 'small', buttonClassName: 'send-balance-form__button', copykey: 'dyn_send_transaction.preview_transaction', children: t('dyn_send_transaction.preview_transaction') })] }));
195
208
  } }));
196
209
  };
@@ -123,7 +123,7 @@ require('../../shared/utils/functions/getInitialUrl/getInitialUrl.cjs');
123
123
  var useInternalDynamicContext = require('../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.cjs');
124
124
 
125
125
  const SendBalancePageLayout = ({ error, onClickClose, onClickBack, onSubmit, displayPoweredByDynamicFooter = false, transaction, networkCurrencyDecimals, tokenBalances, currentToken, setCurrentToken, isLoading, isNativeToken, }) => {
126
- var _a;
126
+ var _a, _b;
127
127
  const { t } = reactI18next.useTranslation();
128
128
  const { primaryWallet, projectSettings, overrides } = useInternalDynamicContext.useInternalDynamicContext();
129
129
  const networkInfo = useNetworkConfigurationsFromProjectSettings.useNetworkConfigurationsFromProjectSettings({
@@ -132,6 +132,21 @@ const SendBalancePageLayout = ({ error, onClickClose, onClickBack, onSubmit, dis
132
132
  });
133
133
  const walletConnector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
134
134
  const { chain } = useFetchChain.useFetchChain(walletConnector);
135
+ // Tempo-specific: detect Tempo chain and manage fee token state
136
+ const isTempo = ((_a = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) === null || _a === void 0 ? void 0 : _a.connectedChain) === 'TEMPO';
137
+ const [currentFeeToken, setCurrentFeeToken] = React.useState(undefined);
138
+ // Initialize fee token to first available token for Tempo
139
+ // Also reset if current token is no longer in the list (stale after refresh)
140
+ React.useEffect(() => {
141
+ if (isTempo && tokenBalances && tokenBalances.length > 0) {
142
+ const currentTokenStillExists = currentFeeToken
143
+ ? tokenBalances.some((token) => token.address === currentFeeToken.address)
144
+ : false;
145
+ if (!currentFeeToken || !currentTokenStillExists) {
146
+ setCurrentFeeToken(tokenBalances[0]);
147
+ }
148
+ }
149
+ }, [isTempo, tokenBalances, currentFeeToken]);
135
150
  const closeButton = onClickClose && (jsxRuntime.jsx(IconButton.IconButton, { type: 'button', onClick: onClickClose, "data-testid": 'close-button', children: jsxRuntime.jsx(close.ReactComponent, {}) }));
136
151
  const backButton = onClickBack && (jsxRuntime.jsx(IconButton.IconButton, { type: 'button', onClick: onClickBack, "data-testid": 'back-button', children: jsxRuntime.jsx(arrowLeft.ReactComponent, {}) }));
137
152
  const { data: balance } = usePromise.usePromise(() => transaction.getBalance(), {
@@ -191,7 +206,9 @@ const SendBalancePageLayout = ({ error, onClickClose, onClickBack, onSubmit, dis
191
206
  ? transaction.formatNonNativeToken(transaction.nonNativeValue, transaction.nonNativeDecimal)
192
207
  : '';
193
208
  };
194
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ModalHeader.ModalHeader, { leading: backButton, trailing: closeButton, alignContent: 'bottom', children: jsxRuntime.jsx("div", { className: 'send-balance-page-layout__header-content', children: jsxRuntime.jsx(Typography.Typography, { variant: 'title', color: 'primary', copykey: 'dyn_send_transaction.data.send', children: t('dyn_send_transaction.data.send') }) }) }), jsxRuntime.jsxs("div", { className: 'send-balance-page-layout__body', children: [jsxRuntime.jsx(AnimatePresence.AnimatePresence, { animationComponent: jsxRuntime.jsx(VerticalDrawerTransition.VerticalDrawerTransition, {}), children: error && (jsxRuntime.jsx("div", { className: 'send-balance-page-layout__error', children: jsxRuntime.jsx(Alert.Alert, { icon: 'error', variant: 'error', children: error }) })) }), jsxRuntime.jsx(SendBalanceForm.SendBalanceForm, { tokenBalances: tokenBalances, setCurrentToken: setCurrentToken, isLoading: isLoading, onSubmit: ({ amount, recipient }) => {
209
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ModalHeader.ModalHeader, { leading: backButton, trailing: closeButton, alignContent: 'bottom', children: jsxRuntime.jsx("div", { className: 'send-balance-page-layout__header-content', children: jsxRuntime.jsx(Typography.Typography, { variant: 'title', color: 'primary', copykey: 'dyn_send_transaction.data.send', children: t('dyn_send_transaction.data.send') }) }) }), jsxRuntime.jsxs("div", { className: 'send-balance-page-layout__body', children: [jsxRuntime.jsx(AnimatePresence.AnimatePresence, { animationComponent: jsxRuntime.jsx(VerticalDrawerTransition.VerticalDrawerTransition, {}), children: error && (jsxRuntime.jsx("div", { className: 'send-balance-page-layout__error', children: jsxRuntime.jsx(Alert.Alert, { icon: 'error', variant: 'error', children: error }) })) }), jsxRuntime.jsx(SendBalanceForm.SendBalanceForm, { tokenBalances: tokenBalances, setCurrentToken: setCurrentToken, isLoading: isLoading,
210
+ // Tempo-specific props
211
+ isTempo: isTempo, feeTokenOptions: isTempo ? tokenBalances : undefined, currentFeeToken: currentFeeToken, setCurrentFeeToken: setCurrentFeeToken, onSubmit: ({ amount, recipient }) => {
195
212
  if (isNativeToken) {
196
213
  transaction.value = transaction.parse(amount);
197
214
  }
@@ -202,10 +219,15 @@ const SendBalancePageLayout = ({ error, onClickClose, onClickBack, onSubmit, dis
202
219
  transaction.nonNativeDecimal = currentToken === null || currentToken === void 0 ? void 0 : currentToken.decimals;
203
220
  }
204
221
  transaction.to = recipient;
222
+ // Tempo-specific: set fee token address and symbol
223
+ if (isTempo && (currentFeeToken === null || currentFeeToken === void 0 ? void 0 : currentFeeToken.address)) {
224
+ transaction.feeTokenAddress = currentFeeToken.address;
225
+ transaction.feeTokenSymbol = currentFeeToken.symbol;
226
+ }
205
227
  onSubmit();
206
228
  }, initialValues: {
207
229
  amount: getAmount(),
208
- recipient: (_a = transaction.to) !== null && _a !== void 0 ? _a : '',
230
+ recipient: (_b = transaction.to) !== null && _b !== void 0 ? _b : '',
209
231
  }, decimals: isNativeToken ? networkCurrencyDecimals : currentToken === null || currentToken === void 0 ? void 0 : currentToken.decimals, validateAddress: (value) => {
210
232
  if (!value)
211
233
  return true;
@@ -1,7 +1,7 @@
1
1
  'use client'
2
2
  import { __awaiter } from '../../../../_virtual/_tslib.js';
3
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
4
- import { useEffect } from 'react';
4
+ import { useState, useEffect } from 'react';
5
5
  import { useTranslation } from 'react-i18next';
6
6
  import '../../context/DynamicContext/DynamicContext.js';
7
7
  import '../../store/state/loadingAndLifecycle/loadingAndLifecycle.js';
@@ -119,7 +119,7 @@ import '../../shared/utils/functions/getInitialUrl/getInitialUrl.js';
119
119
  import { useInternalDynamicContext } from '../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.js';
120
120
 
121
121
  const SendBalancePageLayout = ({ error, onClickClose, onClickBack, onSubmit, displayPoweredByDynamicFooter = false, transaction, networkCurrencyDecimals, tokenBalances, currentToken, setCurrentToken, isLoading, isNativeToken, }) => {
122
- var _a;
122
+ var _a, _b;
123
123
  const { t } = useTranslation();
124
124
  const { primaryWallet, projectSettings, overrides } = useInternalDynamicContext();
125
125
  const networkInfo = useNetworkConfigurationsFromProjectSettings({
@@ -128,6 +128,21 @@ const SendBalancePageLayout = ({ error, onClickClose, onClickBack, onSubmit, dis
128
128
  });
129
129
  const walletConnector = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector;
130
130
  const { chain } = useFetchChain(walletConnector);
131
+ // Tempo-specific: detect Tempo chain and manage fee token state
132
+ const isTempo = ((_a = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) === null || _a === void 0 ? void 0 : _a.connectedChain) === 'TEMPO';
133
+ const [currentFeeToken, setCurrentFeeToken] = useState(undefined);
134
+ // Initialize fee token to first available token for Tempo
135
+ // Also reset if current token is no longer in the list (stale after refresh)
136
+ useEffect(() => {
137
+ if (isTempo && tokenBalances && tokenBalances.length > 0) {
138
+ const currentTokenStillExists = currentFeeToken
139
+ ? tokenBalances.some((token) => token.address === currentFeeToken.address)
140
+ : false;
141
+ if (!currentFeeToken || !currentTokenStillExists) {
142
+ setCurrentFeeToken(tokenBalances[0]);
143
+ }
144
+ }
145
+ }, [isTempo, tokenBalances, currentFeeToken]);
131
146
  const closeButton = onClickClose && (jsx(IconButton, { type: 'button', onClick: onClickClose, "data-testid": 'close-button', children: jsx(SvgClose, {}) }));
132
147
  const backButton = onClickBack && (jsx(IconButton, { type: 'button', onClick: onClickBack, "data-testid": 'back-button', children: jsx(SvgArrowLeft, {}) }));
133
148
  const { data: balance } = usePromise(() => transaction.getBalance(), {
@@ -187,7 +202,9 @@ const SendBalancePageLayout = ({ error, onClickClose, onClickBack, onSubmit, dis
187
202
  ? transaction.formatNonNativeToken(transaction.nonNativeValue, transaction.nonNativeDecimal)
188
203
  : '';
189
204
  };
190
- return (jsxs(Fragment, { children: [jsx(ModalHeader, { leading: backButton, trailing: closeButton, alignContent: 'bottom', children: jsx("div", { className: 'send-balance-page-layout__header-content', children: jsx(Typography, { variant: 'title', color: 'primary', copykey: 'dyn_send_transaction.data.send', children: t('dyn_send_transaction.data.send') }) }) }), jsxs("div", { className: 'send-balance-page-layout__body', children: [jsx(AnimatePresence, { animationComponent: jsx(VerticalDrawerTransition, {}), children: error && (jsx("div", { className: 'send-balance-page-layout__error', children: jsx(Alert, { icon: 'error', variant: 'error', children: error }) })) }), jsx(SendBalanceForm, { tokenBalances: tokenBalances, setCurrentToken: setCurrentToken, isLoading: isLoading, onSubmit: ({ amount, recipient }) => {
205
+ return (jsxs(Fragment, { children: [jsx(ModalHeader, { leading: backButton, trailing: closeButton, alignContent: 'bottom', children: jsx("div", { className: 'send-balance-page-layout__header-content', children: jsx(Typography, { variant: 'title', color: 'primary', copykey: 'dyn_send_transaction.data.send', children: t('dyn_send_transaction.data.send') }) }) }), jsxs("div", { className: 'send-balance-page-layout__body', children: [jsx(AnimatePresence, { animationComponent: jsx(VerticalDrawerTransition, {}), children: error && (jsx("div", { className: 'send-balance-page-layout__error', children: jsx(Alert, { icon: 'error', variant: 'error', children: error }) })) }), jsx(SendBalanceForm, { tokenBalances: tokenBalances, setCurrentToken: setCurrentToken, isLoading: isLoading,
206
+ // Tempo-specific props
207
+ isTempo: isTempo, feeTokenOptions: isTempo ? tokenBalances : undefined, currentFeeToken: currentFeeToken, setCurrentFeeToken: setCurrentFeeToken, onSubmit: ({ amount, recipient }) => {
191
208
  if (isNativeToken) {
192
209
  transaction.value = transaction.parse(amount);
193
210
  }
@@ -198,10 +215,15 @@ const SendBalancePageLayout = ({ error, onClickClose, onClickBack, onSubmit, dis
198
215
  transaction.nonNativeDecimal = currentToken === null || currentToken === void 0 ? void 0 : currentToken.decimals;
199
216
  }
200
217
  transaction.to = recipient;
218
+ // Tempo-specific: set fee token address and symbol
219
+ if (isTempo && (currentFeeToken === null || currentFeeToken === void 0 ? void 0 : currentFeeToken.address)) {
220
+ transaction.feeTokenAddress = currentFeeToken.address;
221
+ transaction.feeTokenSymbol = currentFeeToken.symbol;
222
+ }
201
223
  onSubmit();
202
224
  }, initialValues: {
203
225
  amount: getAmount(),
204
- recipient: (_a = transaction.to) !== null && _a !== void 0 ? _a : '',
226
+ recipient: (_b = transaction.to) !== null && _b !== void 0 ? _b : '',
205
227
  }, decimals: isNativeToken ? networkCurrencyDecimals : currentToken === null || currentToken === void 0 ? void 0 : currentToken.decimals, validateAddress: (value) => {
206
228
  if (!value)
207
229
  return true;
@@ -78,6 +78,7 @@ require('../../../../widgets/DynamicWidget/context/DynamicWidgetContext.cjs');
78
78
  require('../../../IconButton/IconButton.cjs');
79
79
  require('../../../../utils/hooks/useGetMfaToken/useGetMfaToken.cjs');
80
80
  require('../../../MenuList/Dropdown/Dropdown.cjs');
81
+ var Image = require('../../../Image/Image.cjs');
81
82
  require('formik');
82
83
  require('../../../../utils/hooks/useSubdomainCheck/useSubdomainCheck.cjs');
83
84
  var sendBalances = require('../../../../store/state/sendBalances.cjs');
@@ -192,7 +193,9 @@ const TokensBalanceDropdown = ({ tokenBalances, currentToken, setCurrentToken, i
192
193
  if (isLoading) {
193
194
  return jsxRuntime.jsx(Skeleton.Skeleton, {});
194
195
  }
195
- const tokenLogo = (token, size) => (token === null || token === void 0 ? void 0 : token.logoURI) ? (jsxRuntime.jsx("img", { src: token.logoURI, alt: token === null || token === void 0 ? void 0 : token.name, width: size, height: size })) : (jsxRuntime.jsx("div", { className: 'token-balance-item__skeleton-icon', "data-testid": 'token-balance-item__skeleton-icon' }));
196
+ const tokenLogo = (token, size) => (jsxRuntime.jsx(Image.Image, { src: token === null || token === void 0 ? void 0 : token.logoURI, alt: token === null || token === void 0 ? void 0 : token.name, className: 'token-balance-item__icon', dataTestId: 'token-balance-item-icon', fallback:
197
+ // eslint-disable-next-line react/jsx-wrap-multilines
198
+ jsxRuntime.jsx("div", { className: 'token-balance-item__skeleton-icon', "data-testid": 'token-balance-item__skeleton-icon', style: { height: `${size}px`, width: `${size}px` } }) }));
196
199
  return (jsxRuntime.jsxs("div", { className: 'tokens-balance-dropdown', ref: anchorRef, onClick: () => setIsDropdownOpen(!isDropdownOpen), "data-testid": 'tokens-balance-dropdown', children: [!isLoading && (jsxRuntime.jsxs("div", { className: 'tokens-balance-dropdown__selected', children: [tokenLogo(currentToken, '20'), jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'primary', children: currentToken === null || currentToken === void 0 ? void 0 : currentToken.name }), jsxRuntime.jsx(Icon.Icon, { color: 'text-primary', size: 'small', className: classNames.classNames('evm-network-control__arrow-icon', {
197
200
  'evm-network-control__arrow-icon--active': isDropdownOpen,
198
201
  }), children: jsxRuntime.jsx(stroke.ReactComponent, {}) })] })), jsxRuntime.jsx(MenuList.MenuList, { className: 'tokens-balance-dropdown__menu_list', isOpen: isDropdownOpen, popperProps: {
@@ -74,6 +74,7 @@ import '../../../../widgets/DynamicWidget/context/DynamicWidgetContext.js';
74
74
  import '../../../IconButton/IconButton.js';
75
75
  import '../../../../utils/hooks/useGetMfaToken/useGetMfaToken.js';
76
76
  import '../../../MenuList/Dropdown/Dropdown.js';
77
+ import { Image } from '../../../Image/Image.js';
77
78
  import 'formik';
78
79
  import '../../../../utils/hooks/useSubdomainCheck/useSubdomainCheck.js';
79
80
  import { setSendBalanceVariable } from '../../../../store/state/sendBalances.js';
@@ -188,7 +189,9 @@ const TokensBalanceDropdown = ({ tokenBalances, currentToken, setCurrentToken, i
188
189
  if (isLoading) {
189
190
  return jsx(Skeleton, {});
190
191
  }
191
- const tokenLogo = (token, size) => (token === null || token === void 0 ? void 0 : token.logoURI) ? (jsx("img", { src: token.logoURI, alt: token === null || token === void 0 ? void 0 : token.name, width: size, height: size })) : (jsx("div", { className: 'token-balance-item__skeleton-icon', "data-testid": 'token-balance-item__skeleton-icon' }));
192
+ const tokenLogo = (token, size) => (jsx(Image, { src: token === null || token === void 0 ? void 0 : token.logoURI, alt: token === null || token === void 0 ? void 0 : token.name, className: 'token-balance-item__icon', dataTestId: 'token-balance-item-icon', fallback:
193
+ // eslint-disable-next-line react/jsx-wrap-multilines
194
+ jsx("div", { className: 'token-balance-item__skeleton-icon', "data-testid": 'token-balance-item__skeleton-icon', style: { height: `${size}px`, width: `${size}px` } }) }));
192
195
  return (jsxs("div", { className: 'tokens-balance-dropdown', ref: anchorRef, onClick: () => setIsDropdownOpen(!isDropdownOpen), "data-testid": 'tokens-balance-dropdown', children: [!isLoading && (jsxs("div", { className: 'tokens-balance-dropdown__selected', children: [tokenLogo(currentToken, '20'), jsx(Typography, { variant: 'body_normal', color: 'primary', children: currentToken === null || currentToken === void 0 ? void 0 : currentToken.name }), jsx(Icon, { color: 'text-primary', size: 'small', className: classNames('evm-network-control__arrow-icon', {
193
196
  'evm-network-control__arrow-icon--active': isDropdownOpen,
194
197
  }), children: jsx(SvgStroke, {}) })] })), jsx(MenuList, { className: 'tokens-balance-dropdown__menu_list', isOpen: isDropdownOpen, popperProps: {
@@ -120,7 +120,7 @@ require('../../shared/utils/functions/getInitialUrl/getInitialUrl.cjs');
120
120
  var useInternalDynamicContext = require('../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.cjs');
121
121
 
122
122
  const SendBalanceTransactionCard = ({ transaction, currentToken, currencySymbol, valueRounded, transactionValue, isGasSponsored, gasFiatValue, totalGasFiatValue, currency, total, t, onFeeUpdate, }) => {
123
- var _a, _b;
123
+ var _a, _b, _c;
124
124
  const { primaryWallet, projectSettings, overrides } = useInternalDynamicContext.useInternalDynamicContext();
125
125
  const networkInfo = useNetworkConfigurationsFromProjectSettings.useNetworkConfigurationsFromProjectSettings({
126
126
  evmNetworksOverrides: overrides === null || overrides === void 0 ? void 0 : overrides.evmNetworks,
@@ -136,15 +136,17 @@ const SendBalanceTransactionCard = ({ transaction, currentToken, currencySymbol,
136
136
  const isBitcoinTransaction = transaction.chain === 'BTC' ||
137
137
  ((_b = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) === null || _b === void 0 ? void 0 : _b.connectedChain) === 'BTC' ||
138
138
  ((primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) && walletConnectorCore.isBitcoinConnector(primaryWallet.connector));
139
+ // Check if this is a Tempo transaction (for fee token display)
140
+ const isTempoTransaction = ((_c = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) === null || _c === void 0 ? void 0 : _c.connectedChain) === 'TEMPO';
139
141
  const bitcoinTransaction = transaction;
140
142
  const [feePriority, setFeePriority] = React.useState((bitcoinTransaction === null || bitcoinTransaction === void 0 ? void 0 : bitcoinTransaction.feePriority) || 'medium');
141
143
  const handleFeePriorityChange = React.useCallback((newPriority) => _tslib.__awaiter(void 0, void 0, void 0, function* () {
142
- var _c;
144
+ var _d;
143
145
  if (!isBitcoinTransaction || feePriority === newPriority) {
144
146
  return;
145
147
  }
146
148
  setFeePriority(newPriority);
147
- yield ((_c = bitcoinTransaction.updateFeePriority) === null || _c === void 0 ? void 0 : _c.call(bitcoinTransaction, newPriority));
149
+ yield ((_d = bitcoinTransaction.updateFeePriority) === null || _d === void 0 ? void 0 : _d.call(bitcoinTransaction, newPriority));
148
150
  onFeeUpdate === null || onFeeUpdate === void 0 ? void 0 : onFeeUpdate();
149
151
  }), [isBitcoinTransaction, feePriority, bitcoinTransaction, onFeeUpdate]);
150
152
  const renderTransferDetails = () => (jsxRuntime.jsx("div", { className: 'transaction-card', children: jsxRuntime.jsx("div", { className: 'transaction-card__assets-container', children: jsxRuntime.jsx("div", { className: 'transaction-card__out', children: jsxRuntime.jsxs("div", { className: 'transaction-card__info-container', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', children: t('dyn_send_transaction.confirmation.data.transfer.send') }), jsxRuntime.jsxs("div", { className: 'transaction-card__amount-symbol', children: [jsxRuntime.jsxs("div", { className: 'transaction-card__token-info', children: [jsxRuntime.jsxs("div", { className: 'transaction-card__token-row', children: [jsxRuntime.jsxs(Typography.Typography, { variant: 'body_normal', color: 'error-1', "data-testid": 'transaction-transfer-amount', children: ["-", valueRounded ||
@@ -154,7 +156,7 @@ const SendBalanceTransactionCard = ({ transaction, currentToken, currencySymbol,
154
156
  })
155
157
  : '')] }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', children: currencySymbol })] }), transactionValue && (jsxRuntime.jsxs(Typography.Typography, { variant: 'body_small', color: 'error-1', "data-testid": 'transaction-transfer-amount-fiat', children: ["$", utils.getDisplayFiatPrice(Number(transactionValue) || Number(valueRounded) || 0, currentToken)] }))] }), jsxRuntime.jsx("div", { className: 'transaction-card__icon', children: jsxRuntime.jsx("div", { className: 'transaction-card__icon__container', children: jsxRuntime.jsx("img", { src: (currentToken === null || currentToken === void 0 ? void 0 : currentToken.logoURI) ||
156
158
  (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.nativeCurrency.iconUrl), alt: currencySymbol, width: 32, height: 32, className: 'transaction-card__icon__container__main' }) }) })] })] }) }) }) }));
157
- const renderTransactionDetails = () => (jsxRuntime.jsx("div", { className: 'transaction-card', children: jsxRuntime.jsxs("div", { className: 'transaction-card__details', children: [jsxRuntime.jsxs("div", { className: 'transaction-card__row', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.destination', children: t('dyn_send_transaction.confirmation.data.destination') }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-destination', children: shortenWalletAddress.shortenWalletAddress(transaction.to) })] }), !isGasSponsored && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: 'transaction-card__divider' }), jsxRuntime.jsxs("div", { className: 'transaction-card__row', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', "data-testid": 'transaction-network', copykey: 'dyn_send_transaction.confirmation.data.network', children: t('dyn_send_transaction.confirmation.data.network') }), jsxRuntime.jsxs("div", { className: 'transaction-card__network-info', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'primary', children: (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.name) ||
159
+ const renderTransactionDetails = () => (jsxRuntime.jsx("div", { className: 'transaction-card', children: jsxRuntime.jsxs("div", { className: 'transaction-card__details', children: [jsxRuntime.jsxs("div", { className: 'transaction-card__row', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.destination', children: t('dyn_send_transaction.confirmation.data.destination') }), jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-destination', children: shortenWalletAddress.shortenWalletAddress(transaction.to) })] }), (!isGasSponsored || isTempoTransaction) && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: 'transaction-card__divider' }), jsxRuntime.jsxs("div", { className: 'transaction-card__row', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', "data-testid": 'transaction-network', copykey: 'dyn_send_transaction.confirmation.data.network', children: t('dyn_send_transaction.confirmation.data.network') }), jsxRuntime.jsxs("div", { className: 'transaction-card__network-info', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'primary', children: (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.name) ||
158
160
  (isBitcoinTransaction ? 'Bitcoin' : 'Ethereum') }), jsxRuntime.jsx("img", { src: (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.iconUrls[0]) || (chain === null || chain === void 0 ? void 0 : chain.icon), alt: (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.name) ||
159
161
  (isBitcoinTransaction ? 'Bitcoin' : 'Network icon'), width: 16, height: 16, className: 'transaction-card__network-icon' })] })] }), isBitcoinTransaction && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: 'transaction-card__divider' }), jsxRuntime.jsxs("div", { className: 'transaction-card__row', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.fee_priority', children: "Fee Priority" }), jsxRuntime.jsxs("div", { className: 'transaction-card__value', style: {
160
162
  alignItems: 'center',
@@ -180,7 +182,9 @@ const SendBalanceTransactionCard = ({ transaction, currentToken, currencySymbol,
180
182
  pointerEvents: 'none',
181
183
  position: 'absolute',
182
184
  right: 0,
183
- }, children: jsxRuntime.jsx(Icon.Icon, { size: 'small', children: jsxRuntime.jsx(chevronDown.ReactComponent, {}) }) })] })] })] })), jsxRuntime.jsx("div", { className: 'transaction-card__divider' }), jsxRuntime.jsxs("div", { className: 'transaction-card__row', children: [jsxRuntime.jsxs("div", { className: 'transaction-card__label-with-tooltip', children: [jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.gas_estimate', children: t('dyn_send_transaction.confirmation.data.gas_estimate') }), jsxRuntime.jsx(Tooltip.Tooltip, { content: 'Network fees are paid to process your transaction', className: 'transaction-confirmation', children: jsxRuntime.jsx(Icon.Icon, { size: 'small', className: 'fee-tooltip', children: jsxRuntime.jsx(tooltip.ReactComponent, {}) }) })] }), jsxRuntime.jsx("div", { className: 'transaction-card__value', children: (currentToken === null || currentToken === void 0 ? void 0 : currentToken.price) ? (jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-estimated-gas-fee', children: Number(gasFiatValue) <= 0.01
185
+ }, children: jsxRuntime.jsx(Icon.Icon, { size: 'small', children: jsxRuntime.jsx(chevronDown.ReactComponent, {}) }) })] })] })] })), jsxRuntime.jsx("div", { className: 'transaction-card__divider' }), jsxRuntime.jsxs("div", { className: 'transaction-card__row', children: [jsxRuntime.jsxs("div", { className: 'transaction-card__label-with-tooltip', children: [jsxRuntime.jsxs(Typography.Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.gas_estimate', children: [t('dyn_send_transaction.confirmation.data.gas_estimate'), isTempoTransaction && transaction.feeTokenSymbol && (jsxRuntime.jsxs("span", { style: { fontWeight: 'normal' }, children: [' ', "(in ", transaction.feeTokenSymbol, ")"] }))] }), jsxRuntime.jsx(Tooltip.Tooltip, { content: isTempoTransaction && transaction.feeTokenSymbol
186
+ ? `Network fees paid in ${transaction.feeTokenSymbol}`
187
+ : 'Network fees are paid to process your transaction', className: 'transaction-confirmation', children: jsxRuntime.jsx(Icon.Icon, { size: 'small', className: 'fee-tooltip', children: jsxRuntime.jsx(tooltip.ReactComponent, {}) }) })] }), jsxRuntime.jsx("div", { className: 'transaction-card__value', children: (currentToken === null || currentToken === void 0 ? void 0 : currentToken.price) ? (jsxRuntime.jsx(Typography.Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-estimated-gas-fee', children: Number(gasFiatValue) <= 0.01
184
188
  ? '<$0.01'
185
189
  : `$${gasFiatValue}` })) : (jsxRuntime.jsxs(Typography.Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-estimated-gas-fee', children: [transaction.fee.gas
186
190
  ? transaction.format(transaction.fee.gas, {
@@ -116,7 +116,7 @@ import '../../shared/utils/functions/getInitialUrl/getInitialUrl.js';
116
116
  import { useInternalDynamicContext } from '../../context/DynamicContext/useDynamicContext/useInternalDynamicContext/useInternalDynamicContext.js';
117
117
 
118
118
  const SendBalanceTransactionCard = ({ transaction, currentToken, currencySymbol, valueRounded, transactionValue, isGasSponsored, gasFiatValue, totalGasFiatValue, currency, total, t, onFeeUpdate, }) => {
119
- var _a, _b;
119
+ var _a, _b, _c;
120
120
  const { primaryWallet, projectSettings, overrides } = useInternalDynamicContext();
121
121
  const networkInfo = useNetworkConfigurationsFromProjectSettings({
122
122
  evmNetworksOverrides: overrides === null || overrides === void 0 ? void 0 : overrides.evmNetworks,
@@ -132,15 +132,17 @@ const SendBalanceTransactionCard = ({ transaction, currentToken, currencySymbol,
132
132
  const isBitcoinTransaction = transaction.chain === 'BTC' ||
133
133
  ((_b = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) === null || _b === void 0 ? void 0 : _b.connectedChain) === 'BTC' ||
134
134
  ((primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) && isBitcoinConnector(primaryWallet.connector));
135
+ // Check if this is a Tempo transaction (for fee token display)
136
+ const isTempoTransaction = ((_c = primaryWallet === null || primaryWallet === void 0 ? void 0 : primaryWallet.connector) === null || _c === void 0 ? void 0 : _c.connectedChain) === 'TEMPO';
135
137
  const bitcoinTransaction = transaction;
136
138
  const [feePriority, setFeePriority] = useState((bitcoinTransaction === null || bitcoinTransaction === void 0 ? void 0 : bitcoinTransaction.feePriority) || 'medium');
137
139
  const handleFeePriorityChange = useCallback((newPriority) => __awaiter(void 0, void 0, void 0, function* () {
138
- var _c;
140
+ var _d;
139
141
  if (!isBitcoinTransaction || feePriority === newPriority) {
140
142
  return;
141
143
  }
142
144
  setFeePriority(newPriority);
143
- yield ((_c = bitcoinTransaction.updateFeePriority) === null || _c === void 0 ? void 0 : _c.call(bitcoinTransaction, newPriority));
145
+ yield ((_d = bitcoinTransaction.updateFeePriority) === null || _d === void 0 ? void 0 : _d.call(bitcoinTransaction, newPriority));
144
146
  onFeeUpdate === null || onFeeUpdate === void 0 ? void 0 : onFeeUpdate();
145
147
  }), [isBitcoinTransaction, feePriority, bitcoinTransaction, onFeeUpdate]);
146
148
  const renderTransferDetails = () => (jsx("div", { className: 'transaction-card', children: jsx("div", { className: 'transaction-card__assets-container', children: jsx("div", { className: 'transaction-card__out', children: jsxs("div", { className: 'transaction-card__info-container', children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', children: t('dyn_send_transaction.confirmation.data.transfer.send') }), jsxs("div", { className: 'transaction-card__amount-symbol', children: [jsxs("div", { className: 'transaction-card__token-info', children: [jsxs("div", { className: 'transaction-card__token-row', children: [jsxs(Typography, { variant: 'body_normal', color: 'error-1', "data-testid": 'transaction-transfer-amount', children: ["-", valueRounded ||
@@ -150,7 +152,7 @@ const SendBalanceTransactionCard = ({ transaction, currentToken, currencySymbol,
150
152
  })
151
153
  : '')] }), jsx(Typography, { variant: 'body_normal', color: 'secondary', children: currencySymbol })] }), transactionValue && (jsxs(Typography, { variant: 'body_small', color: 'error-1', "data-testid": 'transaction-transfer-amount-fiat', children: ["$", getDisplayFiatPrice(Number(transactionValue) || Number(valueRounded) || 0, currentToken)] }))] }), jsx("div", { className: 'transaction-card__icon', children: jsx("div", { className: 'transaction-card__icon__container', children: jsx("img", { src: (currentToken === null || currentToken === void 0 ? void 0 : currentToken.logoURI) ||
152
154
  (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.nativeCurrency.iconUrl), alt: currencySymbol, width: 32, height: 32, className: 'transaction-card__icon__container__main' }) }) })] })] }) }) }) }));
153
- const renderTransactionDetails = () => (jsx("div", { className: 'transaction-card', children: jsxs("div", { className: 'transaction-card__details', children: [jsxs("div", { className: 'transaction-card__row', children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.destination', children: t('dyn_send_transaction.confirmation.data.destination') }), jsx(Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-destination', children: shortenWalletAddress(transaction.to) })] }), !isGasSponsored && (jsxs(Fragment, { children: [jsx("div", { className: 'transaction-card__divider' }), jsxs("div", { className: 'transaction-card__row', children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', "data-testid": 'transaction-network', copykey: 'dyn_send_transaction.confirmation.data.network', children: t('dyn_send_transaction.confirmation.data.network') }), jsxs("div", { className: 'transaction-card__network-info', children: [jsx(Typography, { variant: 'body_normal', color: 'primary', children: (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.name) ||
155
+ const renderTransactionDetails = () => (jsx("div", { className: 'transaction-card', children: jsxs("div", { className: 'transaction-card__details', children: [jsxs("div", { className: 'transaction-card__row', children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.destination', children: t('dyn_send_transaction.confirmation.data.destination') }), jsx(Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-destination', children: shortenWalletAddress(transaction.to) })] }), (!isGasSponsored || isTempoTransaction) && (jsxs(Fragment, { children: [jsx("div", { className: 'transaction-card__divider' }), jsxs("div", { className: 'transaction-card__row', children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', "data-testid": 'transaction-network', copykey: 'dyn_send_transaction.confirmation.data.network', children: t('dyn_send_transaction.confirmation.data.network') }), jsxs("div", { className: 'transaction-card__network-info', children: [jsx(Typography, { variant: 'body_normal', color: 'primary', children: (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.name) ||
154
156
  (isBitcoinTransaction ? 'Bitcoin' : 'Ethereum') }), jsx("img", { src: (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.iconUrls[0]) || (chain === null || chain === void 0 ? void 0 : chain.icon), alt: (networkInfoEntry === null || networkInfoEntry === void 0 ? void 0 : networkInfoEntry.name) ||
155
157
  (isBitcoinTransaction ? 'Bitcoin' : 'Network icon'), width: 16, height: 16, className: 'transaction-card__network-icon' })] })] }), isBitcoinTransaction && (jsxs(Fragment, { children: [jsx("div", { className: 'transaction-card__divider' }), jsxs("div", { className: 'transaction-card__row', children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.fee_priority', children: "Fee Priority" }), jsxs("div", { className: 'transaction-card__value', style: {
156
158
  alignItems: 'center',
@@ -176,7 +178,9 @@ const SendBalanceTransactionCard = ({ transaction, currentToken, currencySymbol,
176
178
  pointerEvents: 'none',
177
179
  position: 'absolute',
178
180
  right: 0,
179
- }, children: jsx(Icon, { size: 'small', children: jsx(SvgChevronDown, {}) }) })] })] })] })), jsx("div", { className: 'transaction-card__divider' }), jsxs("div", { className: 'transaction-card__row', children: [jsxs("div", { className: 'transaction-card__label-with-tooltip', children: [jsx(Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.gas_estimate', children: t('dyn_send_transaction.confirmation.data.gas_estimate') }), jsx(Tooltip, { content: 'Network fees are paid to process your transaction', className: 'transaction-confirmation', children: jsx(Icon, { size: 'small', className: 'fee-tooltip', children: jsx(SvgTooltip, {}) }) })] }), jsx("div", { className: 'transaction-card__value', children: (currentToken === null || currentToken === void 0 ? void 0 : currentToken.price) ? (jsx(Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-estimated-gas-fee', children: Number(gasFiatValue) <= 0.01
181
+ }, children: jsx(Icon, { size: 'small', children: jsx(SvgChevronDown, {}) }) })] })] })] })), jsx("div", { className: 'transaction-card__divider' }), jsxs("div", { className: 'transaction-card__row', children: [jsxs("div", { className: 'transaction-card__label-with-tooltip', children: [jsxs(Typography, { variant: 'body_normal', color: 'secondary', copykey: 'dyn_send_transaction.confirmation.data.gas_estimate', children: [t('dyn_send_transaction.confirmation.data.gas_estimate'), isTempoTransaction && transaction.feeTokenSymbol && (jsxs("span", { style: { fontWeight: 'normal' }, children: [' ', "(in ", transaction.feeTokenSymbol, ")"] }))] }), jsx(Tooltip, { content: isTempoTransaction && transaction.feeTokenSymbol
182
+ ? `Network fees paid in ${transaction.feeTokenSymbol}`
183
+ : 'Network fees are paid to process your transaction', className: 'transaction-confirmation', children: jsx(Icon, { size: 'small', className: 'fee-tooltip', children: jsx(SvgTooltip, {}) }) })] }), jsx("div", { className: 'transaction-card__value', children: (currentToken === null || currentToken === void 0 ? void 0 : currentToken.price) ? (jsx(Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-estimated-gas-fee', children: Number(gasFiatValue) <= 0.01
180
184
  ? '<$0.01'
181
185
  : `$${gasFiatValue}` })) : (jsxs(Typography, { variant: 'body_normal', color: 'primary', "data-testid": 'transaction-estimated-gas-fee', children: [transaction.fee.gas
182
186
  ? transaction.format(transaction.fee.gas, {
@@ -0,0 +1,4 @@
1
+ export type DeviceRegistrationEvents = {
2
+ deviceRegistrationCompleted: () => void;
3
+ deviceRegistrationCompletedInAnotherTab: () => void;
4
+ };
@@ -34,6 +34,8 @@ const externalEvents = [
34
34
  'embeddedWalletRevealCompleted',
35
35
  'embeddedWalletRevealFailed',
36
36
  'walletReturnFromDeepLink',
37
+ 'deviceRegistrationCompleted',
38
+ 'deviceRegistrationCompletedInAnotherTab',
37
39
  ];
38
40
  // Full internal event emitter
39
41
  const dynamicEvents = new EventEmitter__default["default"]();
@@ -1,5 +1,6 @@
1
1
  import EventEmitter from 'eventemitter3';
2
2
  import { AuthEvents } from './auth';
3
+ import { DeviceRegistrationEvents } from './deviceRegistration';
3
4
  import { EmbeddedWalletEvents } from './embeddedWallet';
4
5
  import { FundingEvents } from './funding';
5
6
  import { MultiWalletInternalEvents } from './multiWallet';
@@ -11,10 +12,10 @@ import { UIEvents } from './ui';
11
12
  import { UserEvents } from './user';
12
13
  import { WalletEvents } from './wallets';
13
14
  /** Maps internal event names to their listeners */
14
- export type DynamicEvents = AuthEvents & UIEvents & OTPEvents & WalletEvents & PasskeyEvents & SocialEvents & EmbeddedWalletEvents & MultiWalletInternalEvents & TokenBalancesEvents & UserEvents & FundingEvents;
15
+ export type DynamicEvents = AuthEvents & DeviceRegistrationEvents & UIEvents & OTPEvents & WalletEvents & PasskeyEvents & SocialEvents & EmbeddedWalletEvents & MultiWalletInternalEvents & TokenBalancesEvents & UserEvents & FundingEvents;
15
16
  type PublicDynamicEvents = Pick<DynamicEvents, typeof externalEvents[number]>;
16
17
  /** Which events are accessible by our clients */
17
- export declare const externalEvents: ("authFailure" | "authInit" | "logout" | "mfaCompletionSuccess" | "mfaCompletionFailure" | "authFlowOpen" | "authFlowClose" | "authFlowCancelled" | "walletTabSelected" | "emailVerificationResult" | "smsVerificationResult" | "walletAdded" | "walletRemoved" | "primaryWalletChanged" | "primaryWalletNetworkChanged" | "userWalletsChanged" | "walletConnectionFailed" | "walletConnectionQrCodeReady" | "walletReturnFromDeepLink" | "embeddedWalletCreated" | "embeddedWalletRevealCompleted" | "embeddedWalletRevealFailed" | "walletConnectedForFunding")[];
18
+ export declare const externalEvents: ("authFailure" | "authInit" | "logout" | "mfaCompletionSuccess" | "mfaCompletionFailure" | "deviceRegistrationCompleted" | "deviceRegistrationCompletedInAnotherTab" | "authFlowOpen" | "authFlowClose" | "authFlowCancelled" | "walletTabSelected" | "emailVerificationResult" | "smsVerificationResult" | "walletAdded" | "walletRemoved" | "primaryWalletChanged" | "primaryWalletNetworkChanged" | "userWalletsChanged" | "walletConnectionFailed" | "walletConnectionQrCodeReady" | "walletReturnFromDeepLink" | "embeddedWalletCreated" | "embeddedWalletRevealCompleted" | "embeddedWalletRevealFailed" | "walletConnectedForFunding")[];
18
19
  export declare const dynamicEvents: EventEmitter<DynamicEvents, any>;
19
20
  export declare const publicDynamicEvents: EventEmitter<PublicDynamicEvents, any>;
20
21
  export type DynamicEventEmitter = typeof dynamicEvents;
@@ -26,6 +26,8 @@ const externalEvents = [
26
26
  'embeddedWalletRevealCompleted',
27
27
  'embeddedWalletRevealFailed',
28
28
  'walletReturnFromDeepLink',
29
+ 'deviceRegistrationCompleted',
30
+ 'deviceRegistrationCompletedInAnotherTab',
29
31
  ];
30
32
  // Full internal event emitter
31
33
  const dynamicEvents = new EventEmitter();
@@ -24,6 +24,7 @@ const chainIconMap = {
24
24
  starknet: iconic.StarknetIcon,
25
25
  stellar: iconic.StellarIcon,
26
26
  sui: iconic.SuiIcon,
27
+ tempo: iconic.TempoIcon,
27
28
  ton: iconic.TonIcon,
28
29
  tron: iconic.TronIcon,
29
30
  };