Polygon zkEVM RPC: A Developer's Guide to the Type 1 ZK Rollup
Polygon zkEVM is the most Ethereum-equivalent zero-knowledge rollup in production. It's a Type 1 zkEVM — meaning it doesn't modify Ethereum's data structures, opcodes, or state representation. Every EVM contract deploys without modification. Every RPC method works the same way it does on Ethereum mainnet. The difference is under the hood: a ZK prover generates a cryptographic proof that every batch of transactions was executed correctly, and Ethereum verifies that proof on-chain.
If you're coming from Ethereum, everything you know transfers directly. Same chain interactions, same tooling, same RPC methods. The differences are in the economics (cheaper gas, different fee token), the finality model (ZK proof verification instead of validator voting), and the bridge architecture.
This is the practical reference for connecting to Polygon zkEVM via JSON-RPC.
The essentials
Polygon zkEVM mainnet has:
- Chain ID: 1101 (0x44d)
- Block time: ~5 seconds (L2 blocks), L1 batch submission every ~20 minutes
- Gas token: ETH (same as Ethereum)
- Consensus: ZK proof generation + Ethereum verification
- Finality: ~30 minutes (proof generated + verified on L1)
- Type: Type 1 zkEVM — full EVM equivalence
The "Type 1" designation matters. Other zkEVMs (like Scroll at Type 2, or zkSync at Type 4) modify some aspect of the EVM — different data structures, missing opcodes, or different state representations. Polygon zkEVM's Type 1 approach means zero migration effort. Your contracts, your tooling, your RPC calls — all identical to Ethereum.
Connecting: the setup
curl
# Chain ID
curl -s -X POST https://rpc.swiftnodes.io/rpc/polygon-zkevm?key=YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'
# -> {"jsonrpc":"2.0","id":1,"result":"0x44d"}
# Latest block
curl -s -X POST https://rpc.swiftnodes.io/rpc/polygon-zkevm?key=YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'
# ETH balance
curl -s -X POST https://rpc.swiftnodes.io/rpc/polygon-zkevm?key=YOUR_API_KEY \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0xADDRESS","latest"],"id":1}'
viem
import { createPublicClient, http } from 'viem';
import { polygonZkEvm } from 'viem/chains';
const client = createPublicClient({
chain: polygonZkEvm,
transport: http('https://rpc.swiftnodes.io/rpc/polygon-zkevm?key=YOUR_API_KEY'),
});
const blockNumber = await client.getBlockNumber();
const balance = await client.getBalance({ address: '0x...' });
ethers v6
import { JsonRpcProvider } from 'ethers';
const provider = new JsonRpcProvider(
'https://rpc.swiftnodes.io/rpc/polygon-zkevm?key=YOUR_API_KEY'
);
const blockNumber = await provider.getBlockNumber();
const balance = await provider.getBalance('0x...');
What's the same as Ethereum
Because Polygon zkEVM is Type 1 (full EVM equivalence), these all work identically to Ethereum mainnet:
| Feature | Status |
|---|---|
| All standard JSON-RPC methods | ✓ Identical |
| Contract deployment (CREATE/CREATE2) | ✓ Identical |
| EVM opcodes (including precompiles) | ✓ Identical |
| ABI encoding/decoding | ✓ Identical |
| Transaction signing (secp256k1) | ✓ Identical |
| Block structure | ✓ Identical |
| Log/event structure | ✓ Identical |
| ERC-20, ERC-721, ERC-1155 | ✓ Deploy without changes |
The only thing that's different is the proving mechanism — instead of validators voting on block validity, a ZK prover generates a cryptographic proof that Ethereum verifies. This gives you mathematical certainty of correctness instead of economic certainty from validator stakes.
What's different from Ethereum
Gas is cheaper but works differently
Polygon zkEVM gas is priced in ETH (same as Ethereum), but the costs are dramatically lower:
| Operation | Ethereum mainnet | Polygon zkEVM |
|---|---|---|
| Simple ETH transfer | ~$0.50-5 | ~$0.001 |
| ERC-20 transfer | ~$1-10 | ~$0.002 |
| Complex DeFi swap | ~$5-50 | ~$0.01-0.05 |
| Contract deployment | ~$50-500 | ~$0.10-2 |
The gas price fluctuates based on L1 ETH gas prices (since batch submission costs L1 gas) and the prover's operating costs. During L1 congestion, Polygon zkEVM gas can spike — but it's always a fraction of mainnet costs.
Finality is proof-based, not time-based
On Ethereum, finality comes from validator voting (~13 minutes for finalized). On Polygon zkEVM, finality comes from ZK proof verification on L1:
- Transactions execute on L2 (~5 second blocks)
- The sequencer batches transactions and submits them to L1 (~every 20 minutes)
- The ZK prover generates a proof of correct execution
- The proof is verified on Ethereum L1
The full cycle takes approximately 30 minutes from L2 transaction to L1-finalized state. For most applications, you can treat L2 confirmations as sufficient (the sequencer is trusted not to reorg). For high-value settlements, wait for the L1 proof verification.
The bridge is asymmetric
Depositing from Ethereum to Polygon zkEVM is fast (~15 minutes, waiting for L1 confirmations). Withdrawing back to Ethereum requires waiting for the ZK proof to be verified on L1 — approximately 30 minutes for the standard bridge.
// Deposit: Ethereum → Polygon zkEVM
// Send ETH to the bridge contract on Ethereum mainnet
// Funds available on Polygon zkEVM after ~15 minutes
// Withdrawal: Polygon zkEVM → Ethereum
// Call the bridge contract on Polygon zkEVM
// Funds available on Ethereum after ~30 minutes (proof verification)
Third-party bridges (Across, Stargate, Hop) offer faster withdrawals by fronting the liquidity — typically 2-5 minutes instead of 30.
The methods you'll actually use
Since Polygon zkEVM is EVM-equivalent, the methods are identical to Ethereum. Here are the ones you'll use most:
| Method | What it does | When you need it |
|---|---|---|
eth_blockNumber |
Latest L2 block height | Health checks, sync monitoring |
eth_getBalance |
ETH balance | Wallet UIs |
eth_call |
Read-only contract call | Reading state |
eth_sendRawTransaction |
Submit signed transaction | Sending transactions |
eth_getTransactionReceipt |
Transaction receipt + status | Confirming transactions |
eth_getLogs |
Event logs for a block range | Indexing, monitoring |
eth_estimateGas |
Gas estimate | Pre-flight checks |
eth_gasPrice |
Current gas price | Fee estimation |
Gas estimation caveat
eth_estimateGas on Polygon zkEVM returns accurate estimates for execution gas, but the actual cost includes a data availability component that isn't captured in the estimate. The L2 gas price includes both execution costs and the cost of posting data to L1.
For accurate cost estimation:
const gasEstimate = await client.estimateGas({
to: '0x...',
data: calldata,
account: '0x...',
});
const gasPrice = await client.getGasPrice(); // Includes DA costs
const totalCost = gasEstimate * gasPrice;
// Add 20% buffer for gas price fluctuations
const bufferedCost = (totalCost * 120n) / 100n;
Archive access
Polygon zkEVM's state grows more slowly than Ethereum's (lower transaction volume), but archive access is still important for:
- Querying historical balances or contract state
- Running
eth_callat historical blocks - Building indexers that backfill from old blocks
- Debugging old transactions
Not all providers offer archive access for Polygon zkEVM. Confirm archive support before choosing an endpoint if your application needs historical state queries.
WebSocket subscriptions
Polygon zkEVM supports WebSocket subscriptions for real-time updates:
import { createPublicClient, webSocket } from 'viem';
import { polygonZkEvm } from 'viem/chains';
const client = createPublicClient({
chain: polygonZkEvm,
transport: webSocket('wss://rpc.swiftnodes.io/ws/polygon-zkevm?key=YOUR_API_KEY'),
});
// Subscribe to new L2 blocks
const unwatch = client.watchBlocks({
onBlock: (block) => {
console.log(`New L2 block: ${block.number}`);
},
});
With ~5 second block times, WebSocket subscriptions are much more efficient than polling. Use eth_subscribe with "newHeads" for block updates and "logs" for event monitoring.
Compared to other Polygon chains
| Feature | Polygon PoS (137) | Polygon zkEVM (1101) |
|---|---|---|
| Type | Sidechain | ZK Rollup (Type 1) |
| Security model | Own validator set | Ethereum (ZK proofs) |
| Block time | ~2 seconds | ~5 seconds |
| Gas token | POL (formerly MATIC) | ETH |
| EVM equivalence | Near-complete | Full (Type 1) |
| Finality | ~2 seconds (soft) | ~30 minutes (L1 proof) |
| Bridge withdrawal | ~30 minutes (checkpoint) | ~30 minutes (proof) |
| Best for | High-frequency, low-value | Ethereum-compatible, higher-value |
Polygon PoS is faster and cheaper for high-frequency transactions. Polygon zkEVM inherits Ethereum's security through ZK proofs and uses ETH for gas — better for applications that need Ethereum-level security guarantees.
Production considerations
Rate limits
Polygon zkEVM RPC providers typically limit:
- Requests per second — usually 10-50 RPS on free tiers
eth_getLogsrange — some providers limit the block range for log queries- WebSocket connections — concurrent connection limits
Gas price volatility
Polygon zkEVM gas prices track L1 Ethereum gas prices (since batch submission costs L1 gas). During L1 congestion:
- L1 gas spikes → Polygon zkEVM gas spikes
- The effect is dampened (L2 batches many txs into one L1 tx) but not eliminated
- Monitor
eth_gasPriceand adjust your fee expectations accordingly
Sequencer downtime
If the Polygon zkEVM sequencer goes down:
- New transactions can't be submitted
- Existing transactions in the mempool are held
- The network resumes when the sequencer comes back
- No transactions are lost (they're held, not dropped)
The sequencer has been highly reliable since mainnet launch, but it's a centralized component. For critical applications, implement retry logic with exponential backoff.
Choosing a Polygon zkEVM RPC endpoint
The decision comes down to three things:
1. Do you need archive access? If your application queries historical state, confirm the provider offers it. Not all do for Polygon zkEVM.
2. What's your request volume? Polygon zkEVM has lower traffic than Ethereum mainnet, but popular dApps can still hit rate limits. Calculate your expected requests and choose accordingly.
3. Do you need WebSocket support? Real-time applications need WebSocket subscriptions. Confirm the provider offers them with reasonable connection limits.
The short version
Polygon zkEVM (chain ID 1101) is a Type 1 ZK rollup — full EVM equivalence, ETH gas, ~5 second blocks. Everything that works on Ethereum works here without modification. Gas is 100-1000x cheaper. Finality takes ~30 minutes (ZK proof verification on L1). Use the same tooling, same contracts, same RPC methods. The only difference is under the hood: ZK proofs instead of validator voting.
For Polygon zkEVM RPC access with archive support and WebSocket subscriptions, grab a free API key and point your app at:
https://rpc.swiftnodes.io/rpc/polygon-zkevm?key=YOUR_API_KEY
John Sullivan covers RPC infrastructure, node operations, and multi-chain development at SwiftNodes — what it actually takes to keep endpoints fast, fresh, and reliable across EVM and non-EVM networks.
Related posts
- Gnosis Chain RPC: A Developer's Guide to the Community-Owned EVM Chain
How to connect to Gnosis Chain via JSON-RPC — the dual-token model (xDAI + GNO), DAI-bridged stablecoin gas, consensus via GPOS, and what makes it different from other EVM chains. Includes production setup and fee optimization.
- Tron RPC: A Developer's Guide to TRC-20 Transfers, Smart Contracts, and Node Setup
How to connect to Tron via JSON-RPC and HTTP — TRC-20 token transfers, smart contract interaction, energy and bandwidth, and how to pick a Tron endpoint for production use.
- Solana RPC: A Developer's Guide to Endpoints, Methods, and Production Setup
How to connect to Solana via JSON-RPC — the methods you'll use daily, commitment levels, WebSocket subscriptions, account parsing, and how to pick an endpoint that handles real traffic.