Why Your Web3 App Feels Slow (And How Modern Architecture Fixes It in 2025)

Maksym Koval
10 min read

The Reality: Your Web3 application takes 8 seconds to load a user's wallet balance. Your competitor's app does it in under 2 seconds. Users complain about multiple wallet approval popups. Your RPC provider sends overage bills every month.

Sound familiar?

The problem isn't your blockchain choice, your smart contracts, or even your gas optimization. It's your Web3 infrastructure stack — and most teams are using technology that became obsolete in 2023.

Why Your Web3 App Feels Slow (And How Modern Architecture Fixes It in 2025)

The Real Performance Problem in Web3 Apps

Let's start with a typical user journey in a Web3 application built with traditional tooling:

User connects wallet:

  • App makes 1 RPC call to get wallet address

  • App makes 1 RPC call to get network/chain ID

  • App makes 1 RPC call to get ETH balance

  • App makes 3 separate RPC calls to get token balances (USDC, USDT, DAI)

  • App makes 1 RPC call to check NFT ownership

Result: 7 separate network requests before the user sees anything useful. Each request takes 200-500ms. Total time: 3-5 seconds of loading spinners.

Now multiply this across every user interaction: checking allowances, fetching transaction history, updating UI state. A typical Web3 dashboard makes 50-100 RPC calls on initial load.


Why This Matters for Your Business

Poor Web3 performance isn't just an engineering problem — it directly impacts your bottom line:

  • User abandonment: 53% of users abandon apps that take longer than 3 seconds to load (Google research)

  • RPC costs: Excessive API calls mean you hit rate limits on free tiers or pay $500-2000/month for dedicated RPC nodes

  • Support burden: Slow apps generate "it's broken" support tickets, even when technically everything works

  • Competitive disadvantage: Users compare your app to Uniswap, Aave, and other polished Web3 products


What's Actually Causing the Slowdown

Problem #1: Legacy Libraries Built for Different Era

Most Web3 apps still use ethers.js, which was released in 2016. It was excellent for its time, but wasn't designed for modern React applications or the current Web3 ecosystem.

Key issues with ethers.js in 2025:

  • No built-in multicall support (every contract read = separate RPC call)

  • No automatic request batching

  • Large bundle size (116 KB minified)

  • Poor TypeScript support

  • No caching layer


Problem #2: No Request Optimization

Traditional Web3 implementations make redundant requests:

  • Fetching the same data multiple times across different components

  • No deduplication of identical requests

  • No intelligent caching (data expires immediately)

  • Every component manages its own blockchain state independently

Real example: A DeFi dashboard showing token prices. With ethers.js, if 5 components need ETH price, you make 5 separate calls. Even if those calls happen within milliseconds of each other.


Problem #3: Missing Multicall Infrastructure

Multicall is a smart contract pattern that batches multiple read operations into a single RPC call.

Approach Method Time Traditional Get USDC balance 300ms Get USDT balance 300ms Get DAI balance 300ms Total 900ms ✅ Multicall Get all 3 balances 350ms (62% faster)

The Problem: Implementing multicall with ethers.js requires manual setup, custom contracts, and significant boilerplate code. Most teams skip it because it's complex.


The Modern Web3 Stack That Actually Performs

At 5hz, we've completely migrated away from ethers.js to a modern stack that solves these problems by default:

Core Technology: viem + wagmi

viem - Modern Ethereum Library

  • Automatic multicall batching (built-in, no configuration)

  • 20 KB bundle size (83% smaller than ethers.js)

  • Exceptional TypeScript support with full type safety

  • Modular architecture (import only what you use)

  • Better tree-shaking = smaller production bundles

wagmi - React Hooks for Ethereum

  • Automatic request deduplication

  • Intelligent caching with configurable TTL

  • Built-in state synchronization across components

  • Automatic refetch on wallet/network changes

  • SSR support out of the box


Real Performance Improvements

Here's what happened when we migrated a client's DeFi dashboard from ethers.js to viem + wagmi:

Metric Before (ethers.js) After (viem + wagmi) Improvement Initial page load 87 RPC calls in 6.2s 23 RPC calls in 1.8s 71% reduction Token balance updates 12 calls per refresh 1 call per refresh 92% reduction Bundle size 380 KB 190 KB 50% smaller Monthly RPC costs $890 $240 73% cost reduction

User impact: Average session duration increased by 34%, bounce rate dropped from 43% to 28%.


How Modern Multicall Actually Works

Let's look at a practical example. Suppose you're building a portfolio tracker that needs to display:

  • ETH balance

  • USDC balance

  • USDT balance

  • User's NFT count

  • Pending rewards in staking contract

Traditional approach (ethers.js):

// 5 separate RPC calls
const ethBalance = await provider.getBalance(address);
const usdcBalance = await usdcContract.balanceOf(address);
const usdtBalance = await usdtContract.balanceOf(address);
const nftCount = await nftContract.balanceOf(address);
const rewards = await stakingContract.pendingRewards(address);

// Total time: ~1500-2000ms
// RPC calls: 5

Modern approach (viem + wagmi):

// Automatically batched into 1 multicall
const { data } = useReadContracts({
  contracts: [
    { address: USDC, abi: erc20ABI, functionName: 'balanceOf', args: [address] },
    { address: USDT, abi: erc20ABI, functionName: 'balanceOf', args: [address] },
    { address: NFT, abi: nftABI, functionName: 'balanceOf', args: [address] },
    { address: STAKING, abi: stakingABI, functionName: 'pendingRewards', args: [address] }
  ]
});

// Total time: ~400ms
// RPC calls: 1 multicall + 1 ETH balance
// Automatic caching: subsequent renders = 0 RPC calls

The difference: 75% fewer RPC calls, 5x faster response time, automatic caching, and it took less code to write.


Beyond Basic Multicall: Advanced Optimizations

1. Smart Cache Management

wagmi includes intelligent caching that understands blockchain data patterns:

Data Type Cache Duration Reason Wallet balances 10 seconds Frequent changes Token metadata 24 hours Rarely changes Historical data Indefinitely Immutable Network switch Auto invalidate Context change

This means: Repeat visits or navigating between pages requires zero additional RPC calls for cached data.


2. Automatic Request Deduplication

If multiple components request the same data simultaneously, wagmi automatically deduplicates:

Scenario:

  • Component A requests USDC balance

  • Component B requests USDC balance 50ms later

  • Component C requests USDC balance 100ms later

Result: Only 1 RPC call is made, and all 3 components receive the result.

With ethers.js: You'd make 3 identical calls.


3. Optimistic Updates

Modern Web3 UX doesn't wait for transaction confirmations to update UI:

const { writeContract } = useWriteContract();

// Update UI immediately
await writeContract({
  address: TOKEN,
  abi: tokenABI,
  functionName: 'transfer',
  args: [recipient, amount]
}, {
  onSuccess: () => {
    // UI already updated optimistically
    // Background: wait for confirmation
  }
});

Result: Users see instant feedback instead of loading spinners, dramatically improving perceived performance.


Implementation Strategy: Migrating Existing Projects

You don't need to rewrite your entire app overnight. Here's the migration strategy we use for client projects:

Phase 1: Foundation (Week 1)

  • Install viem + wagmi alongside existing ethers.js

  • Set up wagmi config with RPC providers

  • Migrate wallet connection logic only

Risk: Low • Impact: Immediate UX improvement

Phase 2: Read Operations (Week 2-3)

  • Replace ethers.js contract reads with useReadContract/useReadContracts

  • Implement multicall for all token balances

  • Add caching configuration

Risk: Medium • Impact: 70-80% RPC reduction

Phase 3: Write Operations (Week 4)

  • Migrate transaction sending to useWriteContract

  • Add optimistic updates

  • Implement proper error handling

Risk: Medium • Impact: Better transaction UX

Phase 4: Cleanup (Week 5)

  • Remove ethers.js dependency

  • Final bundle size optimization

  • Performance testing and monitoring setup

Risk: Low • Impact: Smaller bundles

Total migration time: 4-5 weeks for a medium-sized Web3 application.


Measuring the Impact: Key Metrics

After implementing modern Web3 infrastructure, track these metrics:

Performance Metrics

Metric Target Time to Interactive (TTI) Under 2 seconds RPC calls per session Track reduction over time Bundle size 30-50% reduction Cache hit rate 60-70% for repeat visitors


Business Metrics

Metric Expected Improvement Bounce rate 20-40% improvement Average session duration 25-35% increase Transaction completion rate Fewer abandoned transactions Infrastructure costs 60-75% reduction in RPC expenses


Real Client Results

DeFi Portfolio Tracker (Q3 2024):

Metric Before After Initial load time 6.2s 1.8s Monthly active users Baseline +47% RPC costs $890/mo $240/mo Support tickets (slow loading) Baseline -81%

NFT Marketplace (Q4 2024):

Metric Before After Gallery load time 4.5s 1.2s Transaction completion rate 67% 89% Bundle size Baseline -43% Mobile bounce rate 52% 31%


Common Mistakes to Avoid

1. Over-Caching Blockchain Data

Wrong: Cache everything for 5 minutes

Right: Differentiate between mutable and immutable data

Not all blockchain data should be cached aggressively. User balances and pending transactions need frequent updates, while token metadata can be cached for hours.


2. Ignoring RPC Rate Limits

Even with multicall, you can still hit rate limits if you're not careful with polling intervals and unnecessary refetches.

Solution: Use wagmi's built-in polling configuration and implement exponential backoff for failed requests.


3. Not Testing on Real Networks Early

Testnets behave differently than mainnet. RPC response times, gas costs, and network congestion vary significantly.

Solution: Test on mainnet with small transactions early in development.


4. Neglecting Mobile Performance

Mobile wallet browsers (MetaMask Mobile, Rainbow, Coinbase Wallet) have slower JavaScript execution and network speeds.

Solution: Test extensively on mobile. Prioritize bundle size and minimize JavaScript execution.


The Cost of Doing Nothing

Staying on legacy Web3 infrastructure isn't just a technical debt issue — it's actively costing you:

  • Lost users: 40-50% of potential users abandon slow apps

  • Higher RPC costs: $500-2000/month in unnecessary API expenses

  • Competitive disadvantage: Modern Web3 apps load 3-5x faster

  • Developer productivity: More time debugging instead of building features

Break-even calculation:

Item Amount Migration cost $8,000-15,000 (4-5 weeks) Monthly RPC savings $400-800 Payback period 10-18 months

Plus intangible benefits: better user retention, higher conversion rates, improved brand perception.


Why This Matters More in 2025

The Web3 space is maturing rapidly. Users are no longer willing to tolerate poor UX just because "it's blockchain." They compare your app to:

  • Uniswap's instant swap interface

  • Aave's smooth lending experience

  • OpenSea's fast NFT browsing

The ecosystem is moving:

  • wagmi has 450K+ weekly npm downloads (growing 30% YoY)

  • viem has 300K+ weekly npm downloads

  • Major protocols (Uniswap, ENS, Safe) have migrated to modern tooling

  • New Web3 projects start with viem + wagmi by default

The question isn't "should we migrate?" — it's "how much longer can we afford not to?"


Getting Started: Next Steps

If your Web3 app feels slow, here's what to do:

  1. Audit current performance: Measure RPC calls, load times, and bundle size

  2. Identify quick wins: What can be multicalled? What's being fetched unnecessarily?

  3. Plan migration: Use the phased approach outlined above

  4. Set success metrics: Define targets for load time, RPC reduction, and costs

At 5hz, we've successfully migrated 12+ Web3 applications to modern infrastructure. The average project sees 70-80% RPC reduction, 3-4x faster load times, and significant cost savings.

Want to discuss your Web3 app's performance?

We offer free 30-minute technical audits where we analyze your current infrastructure and provide specific optimization recommendations.

Modern Web3 infrastructure isn't just about faster apps — it's about building products users actually want to use. The technology exists. The benefits are proven. The only question is: when will you make the switch?

Frequently Asked Questions

Quick answers to common questions

Most Web3 apps use outdated libraries like ethers.js that make excessive RPC calls. Modern apps using viem + wagmi reduce RPC requests by 75% through automatic multicall batching, intelligent caching, and request deduplication. A typical Web3 dashboard makes 50-100 RPC calls on load with old tech versus 10-25 with modern infrastructure.

Multicall batches multiple blockchain read operations into a single RPC call. Instead of making 10 separate requests (3 seconds total), multicall retrieves all data in one request (~400ms). Modern libraries like viem include automatic multicall support, while ethers.js requires manual implementation with significant boilerplate code.

For a medium-sized Web3 application, migration typically takes 4-5 weeks and costs $8,000-15,000 in development time. However, most projects see RPC cost savings of $400-800/month, resulting in a payback period of 10-18 months, plus improved user retention and conversion rates.

Yes, viem and wagmi are fully compatible with all Ethereum smart contracts and don't require any changes to your existing contracts. The migration only affects the frontend code that interacts with blockchain. You can migrate gradually, keeping ethers.js alongside viem during the transition period.

Track key metrics: Time to Interactive (target under 2 seconds), RPC calls per session (aim for 70-80% reduction), bundle size (expect 30-50% smaller), and cache hit rate (60-70% for repeat visitors). Business metrics include bounce rate, session duration, transaction completion rate, and monthly RPC costs.

Making redundant RPC calls without caching or batching. For example, fetching the same token balance separately for 5 different components instead of using a shared state management solution. Modern libraries like wagmi automatically deduplicate identical requests and cache results, eliminating this problem entirely.

Written by

Maksym Koval