From aaac8e3ea53b566108a354f31f512ca16584cee7 Mon Sep 17 00:00:00 2001 From: shoom3301 Date: Mon, 18 May 2026 19:36:47 +0500 Subject: [PATCH] fix: reduce load on RPC nodes --- .../hooks/usePendingTransactionsContext.ts | 5 +++-- .../updaters/FinalizeTxUpdater/index.tsx | 2 +- libs/wallet/src/wagmi/config.ts | 22 +++++++++++++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/apps/cowswap-frontend/src/modules/onchainTransactions/updaters/FinalizeTxUpdater/hooks/usePendingTransactionsContext.ts b/apps/cowswap-frontend/src/modules/onchainTransactions/updaters/FinalizeTxUpdater/hooks/usePendingTransactionsContext.ts index 1e54034669b..047570b3426 100644 --- a/apps/cowswap-frontend/src/modules/onchainTransactions/updaters/FinalizeTxUpdater/hooks/usePendingTransactionsContext.ts +++ b/apps/cowswap-frontend/src/modules/onchainTransactions/updaters/FinalizeTxUpdater/hooks/usePendingTransactionsContext.ts @@ -16,7 +16,7 @@ import useNativeCurrency from 'lib/hooks/useNativeCurrency' import { CheckEthereumTransactions } from '../types' -export function usePendingTransactionsContext(): CheckEthereumTransactions | null { +export function usePendingTransactionsContext(hasPendingTxs: boolean): CheckEthereumTransactions | null { const config = useConfig() const { chainId, account } = useWalletInfo() const safeInfo = useGnosisSafeInfo() @@ -32,7 +32,7 @@ export function usePendingTransactionsContext(): CheckEthereumTransactions | nul return useAsyncMemo( async () => { - if (!lastBlockNumber || !account) return null + if (!lastBlockNumber || !account || !hasPendingTxs) return null const transactionsCount = await getTransactionCount(config, { address: account }) @@ -66,6 +66,7 @@ export function usePendingTransactionsContext(): CheckEthereumTransactions | nul cancelOrdersBatch, getTwapOrderById, safeInfo, + hasPendingTxs, ], null, ) diff --git a/apps/cowswap-frontend/src/modules/onchainTransactions/updaters/FinalizeTxUpdater/index.tsx b/apps/cowswap-frontend/src/modules/onchainTransactions/updaters/FinalizeTxUpdater/index.tsx index cf7c1a74c32..f57394bcb32 100644 --- a/apps/cowswap-frontend/src/modules/onchainTransactions/updaters/FinalizeTxUpdater/index.tsx +++ b/apps/cowswap-frontend/src/modules/onchainTransactions/updaters/FinalizeTxUpdater/index.tsx @@ -18,7 +18,7 @@ export function FinalizeTxUpdater() { const transactions = useAllTransactionsDetails(shouldCheckFilter) - const params = usePendingTransactionsContext() + const params = usePendingTransactionsContext(transactions.length > 0) useEffect(() => { if (!params) return diff --git a/libs/wallet/src/wagmi/config.ts b/libs/wallet/src/wagmi/config.ts index d07252907a9..b3bd8b66137 100644 --- a/libs/wallet/src/wagmi/config.ts +++ b/libs/wallet/src/wagmi/config.ts @@ -166,17 +166,35 @@ let wagmiAdapter: WagmiAdapter | null = null let reownAppKit: ReturnType | null = null let config: Config +// `batch.multicall` collapses concurrent single `useReadContract` calls into one +// multicall3 aggregate3 — the dominant savings for our `eth_call` budget (otherwise +// each singular contract read is its own RPC call). +// `pollingInterval` overrides viem's 4s default so block-driven hooks (BlockNumberProvider, +// useReadContracts refetches) poll once per ~mainnet block time. Cowswap's UX tolerates +// the L2 staleness this introduces because trades settle on the protocol's batch cadence. +const VIEM_CLIENT_TUNING = { + batch: { + multicall: { + wait: 130, // coalescing window in ms + batchSize: 30_000, // calldata size ceiling (30kb) + }, + }, + // Frequency (in ms) for polling enabled actions & events. + pollingInterval: 12_000, +} as const + if (isSafeIframe) { // Safe App iframe: no AppKit — use a plain wagmi config with only the Safe connector. config = createConfig({ + ...VIEM_CLIENT_TUNING, connectors, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - chains: SUPPORTED_REOWN_NETWORKS as any, + chains: SUPPORTED_REOWN_NETWORKS, storage, transports: wagmiTransports, }) } else { wagmiAdapter = new WagmiAdapter({ + ...VIEM_CLIENT_TUNING, connectors: connectors as ConstructorParameters[0]['connectors'], customRpcUrls, networks: SUPPORTED_REOWN_NETWORKS,