Katana RPC: A Developer's Guide to the DeFi-First L2
Katana looks like every other OP Stack chain from the RPC side: the same eth_* methods, the same predeploys at 0x4200…, the same L1 fee fields on receipts. Two things underneath are different, and both change how you write code against it. Blocks come every second, not every two. And Katana settles with ZK validity proofs instead of a seven-day fraud-proof window, so "finalized" arrives in minutes rather than a week.
Katana is a DeFi-focused Ethereum L2 incubated by Polygon Labs and GSR. It opened its public mainnet in June 2025. Per L2BEAT, it runs the Agglayer CDK in its OP Stack configuration: an OP Stack chain proven with OP Succinct (SP1 validity proofs), using Agglayer as its canonical bridge. Bridged assets go through VaultBridge, which puts deposits into yield-generating vaults on Ethereum and routes the yield back into Katana's ecosystem.
This guide covers what we measured through our endpoint on 2026-09-27, and what it means for your code.
The essentials
| Katana mainnet | |
|---|---|
| Chain ID | 747474 (0xb67d2) |
| Gas token | ETH |
| Block time | 1.00 s (1,000 blocks in 1,000 s; 20 newHeads in 20 s, no gaps) |
| Gas limit | 120,000,000 per block |
| Base fee | 0.001 gwei |
safe head |
341 blocks (about 5.7 minutes) behind latest |
finalized head |
1,589 blocks (about 26.5 minutes) behind latest |
| Node client | conduit-op-reth/v2.3.0 |
eth_getLogs range |
up to 30,000 blocks per request |
| Historical state | full archive, back to block 1 |
| Tracing | debug_* and trace_* (block and transaction), plus eth_getBlockReceipts |
It is EVM-equivalent: Foundry, Hardhat, viem and ethers all work unchanged. Point them at the RPC and set the chain ID.
One block per second
A 1-second block time is twice as fast as Base or Optimism, and it changes a few habits:
- Polling is expensive. A loop that calls
eth_getBlockByNumber("latest")every block makes 86,400 requests a day. Use a WebSocketnewHeadssubscription instead, or better, subscribe to exactly thelogsyou care about. Theeth_subscribelogs guide shows the pattern. - Block ranges are shorter in time. The 30,000-block
eth_getLogslimit covers about 8.3 hours of Katana history. A backfill over one month is about 87 requests, not one. The general approach for ranges is in eth_getLogs range caps. - Confirmation counts mean less. "Wait 12 blocks" is 12 seconds on Katana. Count confirmations with block tags, not block numbers.
Finality: latest, safe, finalized
OP Stack chains expose three levels through standard block tags, and Katana's numbers are unusual:
| Tag | Lag behind latest (measured) |
Meaning |
|---|---|---|
latest |
0 | Produced by the sequencer, not yet on L1 |
safe |
about 5.7 minutes | Batch data posted to Ethereum |
finalized |
about 26.5 minutes | Batch data in a finalized Ethereum block |
On an optimistic rollup, a withdrawal to L1 still waits seven days after finalized for the fraud-proof window. Katana has no such window: its state transitions are proven with validity proofs, and Succinct puts Katana's finality at "under an hour" (case study). For anything that moves value off-chain, such as crediting a deposit or releasing funds, wait for finalized:
import { createPublicClient, http, defineChain } from "viem";
import { chainConfig } from "viem/op-stack";
export const katana = defineChain({
...chainConfig,
id: 747474,
name: "Katana",
nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
rpcUrls: { default: { http: ["https://rpc.swiftnodes.io/rpc/katana?key=YOUR_API_KEY"] } },
});
const client = createPublicClient({ chain: katana, transport: http() });
const finalized = await client.getBlock({ blockTag: "finalized" });
const isFinal = (txBlock) => txBlock <= finalized.number;
viem does ship a katana chain in viem/chains, but as of viem 2.47 it is a plain chain definition without the OP Stack formatters, so receipt fields like l1Fee come back as raw hex strings. Spreading chainConfig from viem/op-stack, as above, adds them.
The soft/hard distinction is covered in general terms in L2 finality: soft vs hard.
Fees: almost all execution, almost no L1
Katana receipts carry the standard OP Stack L1 fee fields: l1Fee, l1GasPrice, l1GasUsed, l1BlobBaseFee, l1BaseFeeScalar, l1BlobBaseFeeScalar. On most OP Stack chains the L1 data fee is a large part of what a user pays. On Katana it isn't. Across 12 recent user transactions:
| Total | |
|---|---|
L2 execution fee (gasUsed × effectiveGasPrice) |
35,373,690,000,000 wei |
L1 data fee (l1Fee) |
62,987,722,419 wei |
| L1 share of the total | 0.2% |
That sample averaged about 0.000003 ETH per transaction, under a cent at current ETH prices. The practical upshot: on Katana, eth_estimateGas × eth_gasPrice is a good estimate of the full cost. If you want the L1 part anyway, the chainConfig formatters above parse the receipt fields into bigints:
const receipt = await client.getTransactionReceipt({ hash: "0x..." });
const total = receipt.gasUsed * receipt.effectiveGasPrice + (receipt.l1Fee ?? 0n);
Or ask the GasPriceOracle predeploy (0x420000000000000000000000000000000000000F) with getL1Fee(bytes) before sending. For 100 bytes of calldata it returned 420,810,233 wei, a fraction of a millionth of an ETH.
Archive and tracing
The node behind our Katana endpoint is op-reth, and it serves full history: eth_getBalance worked 128, 10,000 and 1,000,000 blocks back and at block 1. The Reth tracing APIs are there too:
debug_traceBlockByNumberanddebug_traceTransactionwithcallTracertrace_blockandtrace_transactioneth_getBlockReceiptsfor all receipts in one call
With a block every second, eth_getBlockReceipts matters: indexing a day of Katana receipts is 86,400 calls with it, and one call per transaction without it. For internal calls and value transfers, see trace_filter and trace_transaction.
Trust model, briefly
Katana is Stage 0 on L2BEAT. Validity proofs protect state transitions, but the sequencer and proposer are centralized. Users can force a transaction through L1 with a delay of up to 12 hours if the sequencer censors them. Contract upgrades have no exit window. None of that changes how you call the RPC, but it belongs in the risk section of anything that holds user funds on the chain. The sequencer's role in general is explained in what is a sequencer.
The short version
- Chain ID 747474, ETH for gas, standard OP Stack JSON-RPC.
- 1-second blocks: subscribe instead of polling; 30,000-block
eth_getLogswindows cover about 8 hours. finalizedis about 26 minutes behindlatest, and there is no seven-day withdrawal window: validity proofs settle it.- Fees are almost entirely L2 execution; the L1 data fee was 0.2% in our sample.
- Full archive,
debug_*andtrace_*are available.
Katana HTTP and WebSocket endpoints, with the live block height and WebSocket status, are on our Katana RPC page. The same key works across 83 chains, and SwiftNodes has a free tier to start with.
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
- Ronin RPC After the Move to Ethereum L2: A Developer's Guide (Chain ID 2020)
Ronin became an OP Stack layer 2 in May 2026. Measured: 2 s blocks, a fixed 20 gwei base fee, a 200-block getLogs cap, ~23 min to finalized, and no pre-migration history.
- opBNB RPC: A Developer's Guide (Chain ID 204)
opBNB is an OP Stack L2 settling to BNB Smart Chain, with 250 ms blocks. Measured finality, fees, the 50,000-block getLogs cap and a stale-finality trap.
- Arbitrum RPC: A Developer's Guide
How to connect to Arbitrum One over JSON-RPC — chain ID 42161, why the block gas limit is a sentinel value, what safe and finalized actually mean here, zero priority fees, and where archive reads stop working.