Finality for Exchanges & Bridges
On NetZero Chain a block is final once the following block carries votes from seven of the ten validator seats. That happens about 3 seconds after the block is produced. Nodes never reorganise below a final block, so "final" means final, not "probably final".
The rule
Credit a deposit when finalized.number ≥ deposit.blockNumber. Do not count confirmations.
const receipt = await provider.getTransactionReceipt(txHash);
const finalized = await provider.getBlock("finalized");
if (receipt && receipt.status === 1 && finalized.number >= receipt.blockNumber) {
// safe to credit
}eth_getBlockByNumber("safe") returns the same block as "finalized" on this chain.
What happens if finality stalls
If fewer than seven validators are online, blocks continue but the finalized head stops advancing. Your deposits will simply wait. Monitor nzc_status().finalityLag; a lag above a few blocks is an incident on the validator side, and no amount of waiting makes an unfinalised block safer than the rule above.
Reorgs above finality
Two validators may briefly produce competing blocks at the same height when a seat is late (the out-of-turn mechanism). Those blocks are not final, and the in-turn one wins. If you index blocks as they arrive, expect the occasional non-final block to be replaced; index from the finalized head to avoid it.
Chain identity
Check eth_chainId = 0x5014 and the genesis hash 0x347a85f0…b975 (eth_getBlockByNumber("0x0")) on connect.
Fee handling on withdrawals
Withdrawals are normal transfers: 21,000 gas, about 0.021 USDn at the floor. Since fees are in the same unit as the balance, you can deduct them from the withdrawal amount directly.
