In this article, we will describe the nuances of processing transactions in the L2 network.
How fast is a transaction, and when is it irreversible?
Blocks arrive every second, and Flashblock preconfirmations arrive about every 200 ms. Those early confirmations are the sequencer's word only. Your transaction becomes "safe" when its batch is confirmed on Ethereum (up to about 30 minutes on Testnet) and "finalized" about 13 minutes after that. Only the finalization state is irreversible.
Confirmation stages
- Preconfirmation — your transaction is included in a partial block (a Flashblock), on the sequencer's word. Typical time: about 200 ms
- Soft confirmation — your transaction is included in an L2 block, on the sequencer's word. Typical time: about 1 second
- Safe — batch is posted to and confirmed on Ethereum. Typical time: up to 30 minutes on Testnet
- Finalized — Backed by finalized Ethereum data. At this stage, your transaction is no longer irreversible. Typical time: about 13 minutes after the batch lands on L1
Ahead of each full one-second block, the sequencer streams Flashblocks: partial blocks published about every 200 ms, powered by Flashbots rollup-boost.
A Flashblock is a preconfirmation – it tells you within about 200 ms that your transaction is included and ordered, carrying the same trust as a soft confirmation (the sequencer's word). Apps that read the Flashblocks stream can show sub-second feedback. The stream is separate from the public RPC. To read it, please request the Flashblocks WebSocket URL from the Whitechain team.
Can an Ethereum reorg roll back the transaction?
A finalized L2 block is protected the same way finalized Ethereum blocks are, so a reorg does not roll it back. A shallow reorg can move the "safe" head: the node re-derives from the canonical Ethereum chain and the affected batch is re-posted. Blocks that reached finality cannot be rolled back.
Fees
Whitechain is configured in OP Stack custom gas token mode, with WBT as the native token instead of ETH. Every fee on the network is paid in WBT, regardless of what you are doing, so you need a WBT balance to send any transaction. Using WBT for gas means one asset covers both on-chain gas and exchange utility.
A fee has two parts: the L2 execution fee (the cost to run your transaction on Whitechain) and the L1 data fee (the cost to publish it to Ethereum).
At the 5 gwei base-fee floor, a plain WBT transfer of 21,000 gas costs about 0.000105 WBT to execute, well under one cent at an illustrative $50 per WBT. Deploying a small contract costs about 0.0006 WBT, roughly three cents at the same illustrative price.
These are the current Testnet fee parameters. Final Mainnet fee parameters are not set yet and are published before the Mainnet launch.
Please note: The explorer may show only the L2 execution fee. The L1 data fee for publishing your transaction to Ethereum is charged on top of it, and the difference between shown fee and your balance amount is that fee. Both parts are always charged.
FAQ
Do I pay for a transaction that fails?
Yes. The network does the work up to the point of failure, so you pay for the gas used, and both fee parts are charged.
How predictable are gas prices?
On the current Testnet configuration, the L2 base fee follows EIP-1559 with elasticity 6 and denominator 250, so it moves by at most 2% per block and never drops below 5 gwei. The variable part is the L1 data fee, which tracks Ethereum's base fee and blob base fee, so your total rises when Ethereum is busy. Mainnet parameters are published before Mainnet launch.
Who receives the fees?
The protocol collects fees into on-chain fee vaults: the base fee, the priority tip, and the L1 data fee each go to a separate vault. The L1 data fee offsets the cost of posting data to Ethereum. Whitechain sets the operator fee to zero, so you pay the L2 execution cost and the L1 settlement cost only, with no extra surcharge.
How do I estimate a fee correctly?
You can use existing tooling. Libraries such as Viem include OP Stack support and return the L1 data fee for you, and they keep working across network upgrades. If you cannot use a library, read the L1 data fee from the “GasPriceOracle” predeploy at 0x420000000000000000000000000000000000000F by calling “getL1Fee” with your serialized, unsigned transaction. Do not implement the fee formula yourself; it changes with upgrades.