Base Mainnet will undergo the scheduled Denim hardfork on Thursday, November 5 at 18:00 UTC.
Key changes include:
- Block time reduced from 2s to 200ms
- Flashblocks removed
After the upgrade, Flashblocks subscriptions and the "pending" block tag will no longer provide preconfirmation data on Base Mainnet. Use canonical blocks and state instead. See the migration steps below.
Flashblocks on Base are a transaction preconfirmation feature that provides near-instant transaction feedback by streaming partial block updates every 200 milliseconds. This significantly reduces the effective block time from Base's standard 2 seconds to 200 milliseconds, a 10x improvement.
Flashblocks is great for developers who demand instant UX such as decentralized exchanges, onchain gaming, and other high-frequency applications.
| Network | Flashblocks Availability |
|---|---|
| Base Sepolia | ❌ Denim activated on Base Sepolia on October 21, 2026, replacing Flashblocks with canonical 200ms blocks. |
| Base Mainnet | ✅ Supported until November 5, 2026 at 18:00 UTC. |
| Existing integration to update | Action for Denim |
|---|---|
eth_subscribe("newFlashblocks") | Use eth_subscribe("newHeads"). |
eth_subscribe("pendingLogs") | Use eth_subscribe("logs"). |
eth_subscribe("newFlashblockTransactions") | Use eth_subscribe("newHeads"), then fetch transactions for each canonical block. |
"pending" in eth_getBalance, eth_getTransactionCount, eth_call, eth_estimateGas, eth_simulateV1, eth_getBlockByNumber, eth_getBlockTransactionCountByNumber | Use normal RPC calls to read the "latest" canonical state / blocks. |
eth_getLogs with a range ending at "pending" | Query through "latest" or a specific canonical block number. |
The "pending" block tag and Flashblocks preconfirmation state have no direct equivalent after Denim. The replacements above return canonical data from 200ms blocks, not preconfirmed or pending data.
Check the Base Flashblocks migration guide for more information.
Use the pending tag to retrieve the latest Flashblock:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["pending",true],"id":1}'Example Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"number": "0x1234",
"hash": "0x...",
"transactions": [...]
}
}Use the existing receipt RPC to get preconfirmed receipts:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getTransactionReceipt","params":["0x..."],"id":1}'Example Response
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"transactionHash": "0x...",
"blockNumber": "0x1234",
"status": "0x1"
}
}Use the pending tag to get the address balance in the latest Flashblock:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getBalance","params":["0x...","pending"],"id":1}'Example Response
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x0234"
}Use the pending tag to get the address nonce in the latest Flashblock:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getTransactionCount","params":["0x...","pending"],"id":1}'Example Response
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x1b" // 27 transactions
}Use the existing get transaction by hash RPC to get preconfirmed transactions:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getTransactionByHash","params":["0x..."],"id":1}'Example Response
{
"type": "0x2",
"chainId": "...",
"nonce": "...",
...
}Use the pending tag to execute a smart contract call against the latest Flashblock:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_call","params":[{"to":"0x...","data":"0x..."},"pending"],"id":1}'Example Response
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x0000000000000000000000000000000000000000000000000000000000000001"
}Use the pending tag to simulate transactions against the latest Flashblock:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_simulateV1","params":[{"blockStateCalls":[{"calls":[{"to":"0x...","data":"0x..."}],"stateOverrides":{}}],"traceTransfers":true,"validation":true},"pending"],"id":1}'Example Response
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"calls": [
{
"status": "0x1",
"gasUsed": "0x5208",
"returnData": "0x"
}
]
}
]
}Use the pending tag to estimate gas against the latest Flashblock:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_estimateGas","params":[{"to":"0x...","data":"0x..."},"pending"],"id":1}'Example Response
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x5208"
}Use the pending tag for toBlock to retrieve logs from the latest Flashblock:
curl https://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY> -X POST -H "Content-Type: application/json" -d '{"jsonrpc":"2.0","method":"eth_getLogs","params":[{"fromBlock":"latest","toBlock":"pending","address":"0x...","topics":["0x..."]}],"id":1}'Example Response
{
"jsonrpc": "2.0",
"id": 1,
"result": [
{
"address": "0x...",
"topics": ["0x..."],
"data": "0x...",
"blockNumber": "0x1234",
"transactionHash": "0x...",
"transactionIndex": "0x0",
"blockHash": "0x...",
"logIndex": "0x0",
"removed": false
}
]
}Flashblocks-enabled WebSocket subscriptions stream preconfirmed data at approximately 200ms intervals via eth_subscribe. Standard subscription types (newHeads, logs, newPendingTransactions) are also supported.
Connect using your Base WebSocket endpoint:
wss://base-mainnet.g.alchemy.com/v2/<YOUR_API_KEY>
Flashblocks subscription types
newFlashblockTransactions
Receive each transaction as it becomes preconfirmed into a Flashblock. Pass true as the second parameter to include full transaction objects and associated logs.
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_subscribe",
"params": ["newFlashblockTransactions"]
}With full transaction data:
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_subscribe",
"params": ["newFlashblockTransactions", true]
}pendingLogs
Monitor contract events from preconfirmed transactions with sub-block latency. You can optionally filter by contract address and topics.
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_subscribe",
"params": [
"pendingLogs",
{
"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"topics": [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"
]
}
]
}The address field accepts a single address or an array of addresses, and topics follows the same format as eth_getLogs.
newFlashblocks
Receive full block state updates as each Flashblock is constructed, with accumulated preconfirmed state for the block in progress.
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_subscribe",
"params": ["newFlashblocks"]
}Subscription response
After subscribing, you receive a subscription ID:
{
"jsonrpc": "2.0",
"id": 1,
"result": "0x1887ec8b9589ccad00000000000532da"
}Events are then delivered through eth_subscription notifications:
{
"jsonrpc": "2.0",
"method": "eth_subscription",
"params": {
"subscription": "0x1887ec8b9589ccad00000000000532da",
"result": { ... }
}
}eth_unsubscribe
Cancel any active subscription using the subscription ID:
{
"jsonrpc": "2.0",
"id": 1,
"method": "eth_unsubscribe",
"params": ["0x1887ec8b9589ccad00000000000532da"]
}For more details, see the Base Flashblocks API reference and the Base Flashblocks documentation.