diff --git a/apps/desktop/app/app.ts b/apps/desktop/app/app.ts index 8b7a37412e49..27a0aa439eb1 100644 --- a/apps/desktop/app/app.ts +++ b/apps/desktop/app/app.ts @@ -1191,10 +1191,7 @@ app.on('child-process-gone', async (event, details) => { app .getGPUInfo('basic') .then((gpuInfo) => { - logger.error( - '[GPU Crash] GPU Hardware Info:', - JSON.stringify(gpuInfo), - ); + logger.error('[GPU Crash] GPU Hardware Info:', JSON.stringify(gpuInfo)); }) .catch(() => { logger.error('[GPU Crash] Cannot retrieve GPU info after crash'); @@ -1418,15 +1415,12 @@ function startV8HeapMonitoring() { ).toFixed(1); if (Number(usagePercent) > 70) { - logger.warn( - `[V8 Heap] ${usedMB}MB / ${limitMB}MB (${usagePercent}%)`, - { - totalHeapSize: heapStats.total_heap_size, - totalPhysicalSize: heapStats.total_physical_size, - allocatedMemory: heapStats.malloced_memory, - externalMemory: heapStats.external_memory, - }, - ); + logger.warn(`[V8 Heap] ${usedMB}MB / ${limitMB}MB (${usagePercent}%)`, { + totalHeapSize: heapStats.total_heap_size, + totalPhysicalSize: heapStats.total_physical_size, + allocatedMemory: heapStats.malloced_memory, + externalMemory: heapStats.external_memory, + }); } }, MEMORY_CHECK_INTERVAL_MS); } @@ -1446,9 +1440,7 @@ function startWebviewMemoryMonitoring() { const pid = wc.getOSProcessId(); const metric = metricsByPid.get(pid); if (!metric) continue; - const memMB = Math.round( - (metric.memory?.workingSetSize ?? 0) / 1024, - ); + const memMB = Math.round((metric.memory?.workingSetSize ?? 0) / 1024); if (memMB > 300) { logger.warn( `[WebView Memory] pid=${pid} type=${wc.getType()} url=${wc.getURL().substring(0, 100)} memory=${memMB}MB`, diff --git a/packages/components/src/composite/Tabs/TabsDraggableFlatList.tsx b/packages/components/src/composite/Tabs/TabsDraggableFlatList.tsx index e4af49a1efc6..d0fa074ff4df 100644 --- a/packages/components/src/composite/Tabs/TabsDraggableFlatList.tsx +++ b/packages/components/src/composite/Tabs/TabsDraggableFlatList.tsx @@ -95,5 +95,5 @@ function TabsDraggableFlatListImpl( export const TabsDraggableFlatList = React.forwardRef( TabsDraggableFlatListImpl, ) as ( - props: DraggableFlatListProps & { ref?: React.Ref> } + props: DraggableFlatListProps & { ref?: React.Ref> }, ) => React.ReactElement; diff --git a/packages/components/src/layouts/SortableListView/index.native.tsx b/packages/components/src/layouts/SortableListView/index.native.tsx index 8a9b9fe67494..a1e1a74f9dd8 100644 --- a/packages/components/src/layouts/SortableListView/index.native.tsx +++ b/packages/components/src/layouts/SortableListView/index.native.tsx @@ -101,7 +101,9 @@ function BaseSortableListView( [onDragEnd], ); - const ListComponent = tabIntegrated ? TabsDraggableFlatList : DraggableFlatList; + const ListComponent = tabIntegrated + ? TabsDraggableFlatList + : DraggableFlatList; return ( diff --git a/packages/core/src/chains/algo/constants.ts b/packages/core/src/chains/algo/constants.ts new file mode 100644 index 000000000000..c76de2d75a3f --- /dev/null +++ b/packages/core/src/chains/algo/constants.ts @@ -0,0 +1 @@ +export const NETWORK_REQUEST_ERROR_CODE = 40_005; diff --git a/packages/core/src/secret/__tests__/bip32-edge-cases.test.ts b/packages/core/src/secret/__tests__/bip32-edge-cases.test.ts index accaf1b49512..6f8d958ad5a7 100644 --- a/packages/core/src/secret/__tests__/bip32-edge-cases.test.ts +++ b/packages/core/src/secret/__tests__/bip32-edge-cases.test.ts @@ -478,19 +478,15 @@ describe('BIP32 Edge Cases', () => { secp256k1, ); - it( - 'should handle deep derivation tree efficiently', - () => { - const seed = Buffer.from('000102030405060708090a0b0c0d0e0f', 'hex'); - let key = deriver.generateMasterKeyFromSeed(seed); - - for (let i = 0; i < 1000; i++) { - key = deriver.CKDPriv(key, i % 2 === 0 ? 0x80_00_00_00 : 0); - } - - expect(key.key.length).toBe(32); - }, - 60_000, - ); + it('should handle deep derivation tree efficiently', () => { + const seed = Buffer.from('000102030405060708090a0b0c0d0e0f', 'hex'); + let key = deriver.generateMasterKeyFromSeed(seed); + + for (let i = 0; i < 1000; i++) { + key = deriver.CKDPriv(key, i % 2 === 0 ? 0x80_00_00_00 : 0); + } + + expect(key.key.length).toBe(32); + }, 60_000); }); }); diff --git a/packages/kit-bg/src/vaults/impls/algo/Vault.ts b/packages/kit-bg/src/vaults/impls/algo/Vault.ts index 19e031bc77e9..f4ab53b5d32b 100644 --- a/packages/kit-bg/src/vaults/impls/algo/Vault.ts +++ b/packages/kit-bg/src/vaults/impls/algo/Vault.ts @@ -17,6 +17,7 @@ import type { } from '@onekeyhq/core/src/types'; import { ManageTokenInsufficientBalanceError, + type OneKeyError, OneKeyInternalError, OneKeyLocalError, } from '@onekeyhq/shared/src/errors'; @@ -64,6 +65,7 @@ import type { IDBWalletType } from '../../../dbs/local/types'; import type { KeyringBase } from '../../base/KeyringBase'; import type { IBroadcastTransactionByCustomRpcParams, + IBroadcastTransactionParams, IBuildAccountAddressDetailParams, IBuildDecodedTxParams, IBuildEncodedTxParams, @@ -75,6 +77,8 @@ import type { IUpdateUnsignedTxParams, IValidateGeneralInputParams, } from '../../types'; +import type { FailedAttemptError } from 'p-retry'; +import { NETWORK_REQUEST_ERROR_CODE } from '@onekeyhq/core/src/chains/algo/constants'; export default class Vault extends VaultBase { override coreApi = coreChainApi.algo.hd; @@ -646,6 +650,14 @@ export default class Vault extends VaultBase { }; } + override async broadcastTransaction( + params: IBroadcastTransactionParams, + ): Promise { + const result = await super.broadcastTransaction(params); + await this._getSuggestedParams.clear(); + return result; + } + override async broadcastTransactionFromCustomRpc( params: IBroadcastTransactionByCustomRpcParams, ): Promise { @@ -663,9 +675,25 @@ export default class Vault extends VaultBase { txId, rawTx: signedTx.rawTx, }); + await this._getSuggestedParams.clear(); return { ...params.signedTx, txid: txId, }; } + + override async checkShouldRetryBroadcastTx( + error: FailedAttemptError, + ): Promise { + if ( + (error as unknown as OneKeyError)?.code === NETWORK_REQUEST_ERROR_CODE && + (error as unknown as OneKeyError)?.message?.includes( + 'cannot broadcast txns in follower mode', + ) + ) { + await timerUtils.wait((error?.attemptNumber || 1) * 1000); + return true; + } + return false; + } } diff --git a/packages/kit/src/components/Password/components/PasswordVerify.tsx b/packages/kit/src/components/Password/components/PasswordVerify.tsx index b373cbefb2fa..7527dd2109bb 100644 --- a/packages/kit/src/components/Password/components/PasswordVerify.tsx +++ b/packages/kit/src/components/Password/components/PasswordVerify.tsx @@ -303,9 +303,7 @@ function PasswordVerify({ @@ -356,9 +358,7 @@ function PasswordVerify({ onPasswordChange(pin); } }} - editable={ - status.value !== EPasswordVerifyStatus.VERIFYING - } + editable={status.value !== EPasswordVerifyStatus.VERIFYING} onComplete={onPassCodeComplete} clearCode={passCodeClear} disabledComplete={confirmBtnDisabled} diff --git a/packages/kit/src/components/TokenListView/TokenListFooter.tsx b/packages/kit/src/components/TokenListView/TokenListFooter.tsx index 62ff7c7c3a0b..d8928346a42c 100644 --- a/packages/kit/src/components/TokenListView/TokenListFooter.tsx +++ b/packages/kit/src/components/TokenListView/TokenListFooter.tsx @@ -392,12 +392,16 @@ function TokenListFooter(props: IProps) { /> ) : null} - + {smallBalanceTokensFiatValue} diff --git a/packages/kit/src/views/AccountManagerStacks/pages/BatchCreateAccount/BatchCreateAccountPreview.tsx b/packages/kit/src/views/AccountManagerStacks/pages/BatchCreateAccount/BatchCreateAccountPreview.tsx index 43a0147c3341..0a5cfddfa595 100644 --- a/packages/kit/src/views/AccountManagerStacks/pages/BatchCreateAccount/BatchCreateAccountPreview.tsx +++ b/packages/kit/src/views/AccountManagerStacks/pages/BatchCreateAccount/BatchCreateAccountPreview.tsx @@ -910,9 +910,7 @@ function BatchCreateAccountPreviewPage({ let advancedParams: | IBatchBuildAccountsAdvancedFlowParams | undefined; - let normalParams: - | IBatchBuildAccountsNormalFlowParams - | undefined; + let normalParams: IBatchBuildAccountsNormalFlowParams | undefined; if (isAdvancedMode) { advancedParams = { walletId, diff --git a/packages/kit/src/views/AssetSelector/pages/AggregateTokenSelector.tsx b/packages/kit/src/views/AssetSelector/pages/AggregateTokenSelector.tsx index 8607a860a219..c19c4896dd27 100644 --- a/packages/kit/src/views/AssetSelector/pages/AggregateTokenSelector.tsx +++ b/packages/kit/src/views/AssetSelector/pages/AggregateTokenSelector.tsx @@ -437,7 +437,7 @@ function AggregateTokenSelector() { const processingTokenKey = exchangeFilter && processingTokenState.isProcessing - ? processingTokenState.token?.$key ?? null + ? (processingTokenState.token?.$key ?? null) : null; const renderAggregateTokensList = useCallback(() => { diff --git a/packages/kit/src/views/BulkSend/pages/BulkSendAddressesInput/components/UploadCSVDialog.native.tsx b/packages/kit/src/views/BulkSend/pages/BulkSendAddressesInput/components/UploadCSVDialog.native.tsx index 065f95d8c0fb..9173798e2cd9 100644 --- a/packages/kit/src/views/BulkSend/pages/BulkSendAddressesInput/components/UploadCSVDialog.native.tsx +++ b/packages/kit/src/views/BulkSend/pages/BulkSendAddressesInput/components/UploadCSVDialog.native.tsx @@ -132,7 +132,9 @@ function UploadCSVContent({ onUploaded }: IUploadCSVContentProps) { return; } - const filePath = localCopyResult.localUri.replace(/^file:\/\//, ''); + const filePath = decodeURIComponent( + localCopyResult.localUri.replace(/^file:\/\//, ''), + ); // Read MAX_LINES + 1 to detect if file exceeds limit const lines = await readFileStreamingLines(filePath, MAX_LINES); diff --git a/packages/kit/src/views/BulkSend/pages/BulkSendReview/hooks/useBulkSendFeeEstimation.ts b/packages/kit/src/views/BulkSend/pages/BulkSendReview/hooks/useBulkSendFeeEstimation.ts index 4088afaec8f4..dce8875e1518 100644 --- a/packages/kit/src/views/BulkSend/pages/BulkSendReview/hooks/useBulkSendFeeEstimation.ts +++ b/packages/kit/src/views/BulkSend/pages/BulkSendReview/hooks/useBulkSendFeeEstimation.ts @@ -35,7 +35,7 @@ type IUseBulkSendFeeEstimationParams = { }; // Scale gasLimit for bulk transfer txs when batch estimation is not available. -// For transfer txs (non-approve), multiply gasLimit by (transfersInfo.length) +// For transfer txs (non-approve), multiply gasLimit by (transfersInfo.length + 1) // to account for the higher gas consumption of multi-call contracts. function scaleGasLimitForBulkTransfer( feeInfo: IFeeInfoUnit, @@ -275,7 +275,10 @@ export function useBulkSendFeeEstimation({ // Fallback mode: scale gasLimit for transfer txs // Gas scales with the number of transfers in this tx, not the number of txs const transferCount = unsignedTx.transfersInfo?.length ?? 1; - txFeeInfo = scaleGasLimitForBulkTransfer(txFeeInfo, transferCount); + txFeeInfo = scaleGasLimitForBulkTransfer( + txFeeInfo, + transferCount + 1, + ); } const feeResult = calculateFeeForSend({ feeInfo: txFeeInfo, @@ -412,7 +415,10 @@ export function useBulkSendFeeEstimation({ // Fallback mode: scale gasLimit for transfer txs // Gas scales with the number of transfers in this tx, not the number of txs const transferCount = unsignedTx.transfersInfo?.length ?? 1; - txFeeInfo = scaleGasLimitForBulkTransfer(txFeeInfo, transferCount); + txFeeInfo = scaleGasLimitForBulkTransfer( + txFeeInfo, + transferCount + 1, + ); } const feeResult = calculateFeeForSend({ feeInfo: txFeeInfo, diff --git a/packages/kit/src/views/Home/components/NotBakcedUp/ReferralCodeBlock.tsx b/packages/kit/src/views/Home/components/NotBakcedUp/ReferralCodeBlock.tsx index 1d83b8369078..6d0dd325e930 100644 --- a/packages/kit/src/views/Home/components/NotBakcedUp/ReferralCodeBlock.tsx +++ b/packages/kit/src/views/Home/components/NotBakcedUp/ReferralCodeBlock.tsx @@ -1,12 +1,26 @@ import type { ComponentProps } from 'react'; -import { memo, useCallback, useEffect, useState } from 'react'; +import { + memo, + useCallback, + useContext, + useEffect, + useRef, + useState, +} from 'react'; import { isNil } from 'lodash'; import { useIntl } from 'react-intl'; +import { + scrollTo, + useAnimatedReaction, + useSharedValue, +} from 'react-native-reanimated'; + import { Badge, Button, + CollapsibleTabContext, Form, Icon, Input, @@ -17,6 +31,7 @@ import { XStack, YStack, useForm, + useKeyboardEvent, } from '@onekeyhq/components'; import backgroundApiProxy from '@onekeyhq/kit/src/background/instance/backgroundApiProxy'; import { useHelpLink } from '@onekeyhq/kit/src/hooks/useHelpLink'; @@ -181,6 +196,57 @@ function ReferralCodeBlock({ updateWalletStatus, ]); + // Keyboard avoidance: scroll collapsible tab header when input is covered + const inputWrapperRef = useRef(null); + const isInputFocusedRef = useRef(false); + const tabsContext = useContext(CollapsibleTabContext); + const refMap = (tabsContext as any)?.refMap; + const focusedTabShared = (tabsContext as any)?.focusedTab; + const scrollYCurrent = (tabsContext as any)?.scrollYCurrent; + const tabContentInset = ((tabsContext as any)?.contentInset as number) ?? 0; + + const scrollDelta = useSharedValue(0); + + useAnimatedReaction( + () => scrollDelta.value, + (delta, prevDelta) => { + if ( + delta > 0 && + delta !== prevDelta && + refMap && + focusedTabShared && + scrollYCurrent + ) { + const ref = refMap[focusedTabShared.value]; + if (ref) { + const targetScroll = scrollYCurrent.value + delta; + scrollTo(ref, 0, Math.max(0, targetScroll - tabContentInset), true); + } + scrollDelta.value = 0; + } + }, + ); + + useKeyboardEvent( + { + keyboardWillShow: (e) => { + if (!isInputFocusedRef.current || !inputWrapperRef.current || !refMap) { + return; + } + inputWrapperRef.current.measureInWindow( + (_x: number, y: number, _width: number, height: number) => { + const inputBottom = y + height; + const keyboardTop = e.endCoordinates.screenY; + if (inputBottom > keyboardTop - 20) { + scrollDelta.value = inputBottom - keyboardTop + 60; + } + }, + ); + }, + }, + [], + ); + const referralHelpLink = useHelpLink({ path: 'articles/11461266' }); const handleJoinReferral = useCallback(async () => { @@ -229,7 +295,10 @@ function ReferralCodeBlock({ return shouldBoundReferralCode ? ( - + { + isInputFocusedRef.current = true; + }} + onBlur={() => { + isInputFocusedRef.current = false; + }} /> diff --git a/packages/kit/src/views/Home/components/WalletActions/WalletActionBuy.tsx b/packages/kit/src/views/Home/components/WalletActions/WalletActionBuy.tsx index d242409068e3..fe26ce29c035 100644 --- a/packages/kit/src/views/Home/components/WalletActions/WalletActionBuy.tsx +++ b/packages/kit/src/views/Home/components/WalletActions/WalletActionBuy.tsx @@ -45,10 +45,7 @@ export function WalletActionBuy({ accountId: account?.id ?? '', fiatCryptoType: 'buy', }); - const { result: isSellSupported } = useSupportNetworkId( - 'sell', - network?.id, - ); + const { result: isSellSupported } = useSupportNetworkId('sell', network?.id); const intl = useIntl(); diff --git a/packages/kit/src/views/Home/components/WalletActions/WalletActionBuyMain.tsx b/packages/kit/src/views/Home/components/WalletActions/WalletActionBuyMain.tsx index fc41c406f393..8613c6ff8bc6 100644 --- a/packages/kit/src/views/Home/components/WalletActions/WalletActionBuyMain.tsx +++ b/packages/kit/src/views/Home/components/WalletActions/WalletActionBuyMain.tsx @@ -28,10 +28,7 @@ function WalletActionBuyMain({ accountId: account?.id ?? '', fiatCryptoType: 'buy', }); - const { result: isSellSupported } = useSupportNetworkId( - 'sell', - network?.id, - ); + const { result: isSellSupported } = useSupportNetworkId('sell', network?.id); const isBuyDisabled = useMemo(() => { if (wallet?.type === WALLET_TYPE_WATCHING && !platformEnv.isDev) { diff --git a/packages/kit/src/views/Home/components/WalletActions/networkConfigs.ts b/packages/kit/src/views/Home/components/WalletActions/networkConfigs.ts index 8514b61bd5a3..f6492b936f0f 100644 --- a/packages/kit/src/views/Home/components/WalletActions/networkConfigs.ts +++ b/packages/kit/src/views/Home/components/WalletActions/networkConfigs.ts @@ -23,24 +23,8 @@ export const defaultWalletActionsConfig: INetworkWalletActionsConfig = { ? ['send', 'receive', 'swap'] : ['send', 'receive', 'buy'], moreActions: isExtPopupOrSidePanel - ? [ - 'buy', - 'explorer', - 'copy', - 'bulkSend', - 'sign', - 'reward', - 'export', - ] - : [ - 'swap', - 'explorer', - 'copy', - 'bulkSend', - 'sign', - 'reward', - 'export', - ], + ? ['buy', 'explorer', 'copy', 'bulkSend', 'sign', 'reward', 'export'] + : ['swap', 'explorer', 'copy', 'bulkSend', 'sign', 'reward', 'export'], moreActionGroups: [ { type: 'trading', diff --git a/packages/kit/src/views/Home/pages/HomeOverviewContainer.tsx b/packages/kit/src/views/Home/pages/HomeOverviewContainer.tsx index be0819e7807b..e1edc7e4d184 100644 --- a/packages/kit/src/views/Home/pages/HomeOverviewContainer.tsx +++ b/packages/kit/src/views/Home/pages/HomeOverviewContainer.tsx @@ -85,9 +85,16 @@ function HomeOverviewContainer() { }; }, []); + const prevWalletIdRef = useRef(undefined); useEffect(() => { if (account?.id && network?.id && wallet?.id) { + const walletChanged = + prevWalletIdRef.current !== undefined && + prevWalletIdRef.current !== wallet.id; + prevWalletIdRef.current = wallet.id; + if ( + walletChanged || network.isAllNetworks || (wallet.type === WALLET_TYPE_HD && !wallet.backuped) ) { @@ -331,6 +338,18 @@ function HomeOverviewContainer() { }, [account?.id, network?.id]); const balanceString = useMemo(() => { + // Prevent showing stale balance from previous wallet/account. + // useMemo runs synchronously before the reset useEffect, so there's a + // render frame where account has switched but accountWorth still holds + // old data. Return '0' until the atom catches up. + if ( + accountWorth.accountId && + account?.id && + accountWorth.accountId !== account.id && + accountWorth.accountId !== account.indexedAccountId + ) { + return '0'; + } return new BigNumber( calculateAccountTokensValue({ accountId: account?.id ?? '', @@ -343,6 +362,7 @@ function HomeOverviewContainer() { .toFixed(); }, [ account?.id, + account?.indexedAccountId, network?.id, accountWorth, vaultSettings?.mergeDeriveAssetsEnabled, diff --git a/packages/kit/src/views/Home/pages/HomePageView.tsx b/packages/kit/src/views/Home/pages/HomePageView.tsx index e7e6aa13688a..391c1f36fec6 100644 --- a/packages/kit/src/views/Home/pages/HomePageView.tsx +++ b/packages/kit/src/views/Home/pages/HomePageView.tsx @@ -7,6 +7,8 @@ import { useIntl } from 'react-intl'; import type { ITabContainerRef } from '@onekeyhq/components'; import { Icon, + KEYBOARD_AWARE_SCROLL_BOTTOM_OFFSET, + Keyboard, Page, ScrollView, Stack, @@ -426,14 +428,15 @@ export function HomePageView({ const tabs = useMemo(() => { if (isWalletNotBackedUp) { return ( - {renderHeader()} - + ); } const key = `${account?.id ?? ''}-${account?.indexedAccountId ?? ''}-${ diff --git a/packages/kit/src/views/Home/pages/PortfolioContainer.tsx b/packages/kit/src/views/Home/pages/PortfolioContainer.tsx index 4b8a9ea4e4bc..e323c4b3eb32 100644 --- a/packages/kit/src/views/Home/pages/PortfolioContainer.tsx +++ b/packages/kit/src/views/Home/pages/PortfolioContainer.tsx @@ -3,7 +3,6 @@ import { useMemo } from 'react'; import { Stack, Tabs, - XStack, YStack, useMedia, useScrollContentTabBarOffset, @@ -38,40 +37,38 @@ function PortfolioContainer() { [extensionActiveTabDAppInfo?.showFloatingPanel], ); - if (tableLayout) { - return ( - - - - - - - - - - {showRecentHistory ? ( - - - - ) : null} - {addPaddingOnListFooter ? : null} - - ); - } - + // Use a stable tree structure (Stack > YStack > children) regardless of + // layout mode so that TokenListBlock is never unmounted/remounted when the + // viewport crosses the mobile/desktop breakpoint. Remounting resets the + // All-Networks loading state while the page is "unfocused" (modal open), + // which causes the token list to be stuck in a loading state. return ( - - - - - - - + + + + + + + + + + {tableLayout && showRecentHistory ? ( + + + + ) : null} {addPaddingOnListFooter ? : null} - + ); } diff --git a/packages/kit/src/views/Home/pages/referralLanding/ReferralLandingPage.tsx b/packages/kit/src/views/Home/pages/referralLanding/ReferralLandingPage.tsx index e066168a709d..94e34f9ebcce 100644 --- a/packages/kit/src/views/Home/pages/referralLanding/ReferralLandingPage.tsx +++ b/packages/kit/src/views/Home/pages/referralLanding/ReferralLandingPage.tsx @@ -158,10 +158,7 @@ function ReferralLandingPage() { }) : ''; - defaultLogger.referral.page.enterReferralGuide( - code, - 'web_mobile_redirect', - ); + defaultLogger.referral.page.enterReferralGuide(code, 'web_mobile_redirect'); const redirectToStore = () => { if (platformEnv.isWebMobileIOS) { @@ -169,8 +166,7 @@ function ReferralLandingPage() { globalThis.location.href = APP_STORE_DOWNLOAD_LINK; globalThis.setTimeout(() => { const elapsed = Date.now() - storeStartTime; - const isVisible = - globalThis.document?.visibilityState !== 'hidden'; + const isVisible = globalThis.document?.visibilityState !== 'hidden'; if (isVisible && elapsed <= IOS_STORE_ELAPSED_THRESHOLD_MS) { globalThis.location.href = APP_STORE_DOWNLOAD_WEB_LINK; } @@ -194,10 +190,7 @@ function ReferralLandingPage() { try { iframe.remove(); } catch (removeError) { - console.error( - 'Failed to remove deep link iframe:', - removeError, - ); + console.error('Failed to remove deep link iframe:', removeError); } }, IFRAME_CLEANUP_DELAY_MS); return; @@ -219,8 +212,7 @@ function ReferralLandingPage() { const armTime = Date.now(); globalThis.setTimeout(() => { const elapsed = Date.now() - armTime; - const isVisible = - globalThis.document?.visibilityState !== 'hidden'; + const isVisible = globalThis.document?.visibilityState !== 'hidden'; const timerFiredLate = elapsed > DEEP_LINK_FALLBACK_DELAY_MS * 2; if (isVisible && !timerFiredLate) { redirectToStore(); @@ -229,8 +221,7 @@ function ReferralLandingPage() { openDeepLinkSilently(deepLinkUrl); } else { globalThis.setTimeout(() => { - const isVisible = - globalThis.document?.visibilityState !== 'hidden'; + const isVisible = globalThis.document?.visibilityState !== 'hidden'; if (isVisible) { redirectToStore(); } diff --git a/packages/kit/src/views/Market/MarketDetailV2/components/SwapPanel/SwapPanel.tsx b/packages/kit/src/views/Market/MarketDetailV2/components/SwapPanel/SwapPanel.tsx index 26ef977b2f59..d5727f538480 100644 --- a/packages/kit/src/views/Market/MarketDetailV2/components/SwapPanel/SwapPanel.tsx +++ b/packages/kit/src/views/Market/MarketDetailV2/components/SwapPanel/SwapPanel.tsx @@ -150,7 +150,12 @@ export function SwapPanel({ return ( - + {intl.formatMessage({ id: ETranslations.dexmarket_details_myposition, diff --git a/packages/kit/src/views/Market/MarketDetailV2/layouts/DesktopLayout.tsx b/packages/kit/src/views/Market/MarketDetailV2/layouts/DesktopLayout.tsx index 71cb2e5862ad..ad8b3dfeb0cb 100644 --- a/packages/kit/src/views/Market/MarketDetailV2/layouts/DesktopLayout.tsx +++ b/packages/kit/src/views/Market/MarketDetailV2/layouts/DesktopLayout.tsx @@ -1,11 +1,6 @@ import { useMemo } from 'react'; -import { - Divider, - Stack, - XStack, - YStack, -} from '@onekeyhq/components'; +import { Divider, Stack, XStack, YStack } from '@onekeyhq/components'; import platformEnv from '@onekeyhq/shared/src/platformEnv'; import networkUtils from '@onekeyhq/shared/src/utils/networkUtils'; diff --git a/packages/kit/src/views/Perp/components/PerpTips.tsx b/packages/kit/src/views/Perp/components/PerpTips.tsx index 4e5015dcc04f..6c62c8758a56 100644 --- a/packages/kit/src/views/Perp/components/PerpTips.tsx +++ b/packages/kit/src/views/Perp/components/PerpTips.tsx @@ -2,10 +2,7 @@ import { useMemo } from 'react'; import { useIntl } from 'react-intl'; -import { - Alert, - YStack, -} from '@onekeyhq/components'; +import { Alert, YStack } from '@onekeyhq/components'; import { usePerpsCommonConfigPersistAtom } from '@onekeyhq/kit-bg/src/states/jotai/atoms'; import { ETranslations } from '@onekeyhq/shared/src/locale'; import { diff --git a/packages/kit/src/views/Perp/components/TickerBar/PerpTickerBarMobile.tsx b/packages/kit/src/views/Perp/components/TickerBar/PerpTickerBarMobile.tsx index 4b547981b158..c0f9d8f0d883 100644 --- a/packages/kit/src/views/Perp/components/TickerBar/PerpTickerBarMobile.tsx +++ b/packages/kit/src/views/Perp/components/TickerBar/PerpTickerBarMobile.tsx @@ -181,11 +181,9 @@ function PerpBadgesRow() { // Fetch builder fee once on mount (independent of alias state) useEffect(() => { - void backgroundApiProxy.simpleDb.perp - .getPerpData() - .then((config) => { - setBuilderFeeRate(config.hyperliquidMaxBuilderFee); - }); + void backgroundApiProxy.simpleDb.perp.getPerpData().then((config) => { + setBuilderFeeRate(config.hyperliquidMaxBuilderFee); + }); }, []); // Fetch token aliases only when not yet available diff --git a/packages/kit/src/views/Prime/hooks/usePrimePaymentMethods.native.ts b/packages/kit/src/views/Prime/hooks/usePrimePaymentMethods.native.ts index 5a393a5ef5cc..005810eb32a2 100644 --- a/packages/kit/src/views/Prime/hooks/usePrimePaymentMethods.native.ts +++ b/packages/kit/src/views/Prime/hooks/usePrimePaymentMethods.native.ts @@ -160,11 +160,7 @@ export function usePrimePaymentMethods(): IUsePrimePayment { const packages: IPackage[] = []; offerings.current?.availablePackages.forEach((p) => { - let { - subscriptionPeriod, - pricePerYear, - pricePerMonth, - } = p.product; + let { subscriptionPeriod, pricePerYear, pricePerMonth } = p.product; if (platformEnv.isNativeAndroid) { pricePerYear = new BigNumber(pricePerYear || 0) @@ -180,13 +176,13 @@ export function usePrimePaymentMethods(): IUsePrimePayment { packages.push({ subscriptionPeriod: subscriptionPeriod as ISubscriptionPeriod, pricePerYear: pricePerYear || 0, - pricePerYearString: `${new BigNumber( - pricePerYear || 0, - ).toFixed(2)} ${currencyCode}`, + pricePerYearString: `${new BigNumber(pricePerYear || 0).toFixed( + 2, + )} ${currencyCode}`, pricePerMonth: pricePerMonth || 0, - pricePerMonthString: `${new BigNumber( - pricePerMonth || 0, - ).toFixed(2)} ${currencyCode}`, + pricePerMonthString: `${new BigNumber(pricePerMonth || 0).toFixed( + 2, + )} ${currencyCode}`, priceTotalPerYearString: subscriptionPeriod === 'P1M' ? `${new BigNumber(pricePerMonth || 0) diff --git a/packages/kit/src/views/Swap/pages/components/SwapTipsContainer.tsx b/packages/kit/src/views/Swap/pages/components/SwapTipsContainer.tsx index dc9fc4276794..0c8729716386 100644 --- a/packages/kit/src/views/Swap/pages/components/SwapTipsContainer.tsx +++ b/packages/kit/src/views/Swap/pages/components/SwapTipsContainer.tsx @@ -1,10 +1,6 @@ import { useIntl } from 'react-intl'; -import { - Alert, - EPageType, - YStack, -} from '@onekeyhq/components'; +import { Alert, EPageType, YStack } from '@onekeyhq/components'; import backgroundApiProxy from '@onekeyhq/kit/src/background/instance/backgroundApiProxy'; import { useSwapTipsAtom } from '@onekeyhq/kit/src/states/jotai/contexts/swap/atoms'; import { ETranslations } from '@onekeyhq/shared/src/locale'; diff --git a/packages/kit/src/views/UniversalSearch/components/SearchResultItems/UniversalSearchV2MarketTokenItem.tsx b/packages/kit/src/views/UniversalSearch/components/SearchResultItems/UniversalSearchV2MarketTokenItem.tsx index d1056ae11353..9ac285af2d98 100644 --- a/packages/kit/src/views/UniversalSearch/components/SearchResultItems/UniversalSearchV2MarketTokenItem.tsx +++ b/packages/kit/src/views/UniversalSearch/components/SearchResultItems/UniversalSearchV2MarketTokenItem.tsx @@ -31,7 +31,10 @@ import accountUtils from '@onekeyhq/shared/src/utils/accountUtils'; import type { IUniversalSearchV2MarketToken } from '@onekeyhq/shared/types/search'; import { ESearchStatus } from '@onekeyhq/shared/types/search'; -import { MARKET_DATA_COLUMN_WIDTH, MARKET_NAME_COLUMN_WIDTH } from '../MarketTableHeader'; +import { + MARKET_DATA_COLUMN_WIDTH, + MARKET_NAME_COLUMN_WIDTH, +} from '../MarketTableHeader'; import { MarketStarV2 } from '../../../Market/components/MarketStarV2'; import { MarketTokenIcon } from '../../../Market/components/MarketTokenIcon'; import { BaseMarketTokenPrice } from '../../../Market/components/MarketTokenPrice'; @@ -258,11 +261,7 @@ export function UniversalSearchV2MarketTokenItem({ {communityRecognized ? : null} - + {name}