JSON-RPC
Arc differences
Read this page before shipping anything that moves money. Every item here is a protocol fact, and every one of them has a standard EVM assumption on the other side of it.
01USDC has two decimal interfaces over one balance
Native USDC is 18 decimals, the ERC-20 interface at 0x3600…0000 is 6. They are the same balance. A zero balanceOf does not mean an empty account, because the ERC-20 view truncates sub-USDC fractions. Mixing them is off by a factor of 10¹².
02The mempool is closed
eth_newPendingTransactionFilter and eth_subscribe("newPendingTransactions") return -32001. eth_getBlockByNumber("pending") and eth_getTransactionBySenderAndNonce return null, which fails quietly. txpool_* still works for pool inspection.
03Transactions under 20 Gwei are dropped silently
A transaction with maxFeePerGas below the base fee floor never enters a block and never produces a receipt or an error. It simply never existed.
04One transfer emits two logs
An ERC-20 transfer() emits a 6 decimal Transfer from the token contract and an 18 decimal EIP-7708 Transfer from the system emitter. A plain native send emits only the system log. Gas deductions emit no log at all.
05Finality is deterministic
A block is either absent or irreversible. There are no reorgs, no confirmation depth and no uncles, so an indexer needs no rollback path and a webhook is safe at one confirmation.
06History starts about a minute behind the tip
At half-second blocks, the usual 127-block archive boundary is roughly sixty seconds old, so almost every historical read is an archive read.
07Timestamps are non-decreasing, not increasing
Sub-second blocks share a block.timestamp. The ordering key is (blockNumber, logIndex), never the timestamp.
08A transfer can revert with a full balance
Transfers to the zero address, burns, transfers to a self-destructed account, transfers to a precompile, and any transfer touching a blocklisted address all revert. The revert still consumes gas.
What we handle for you
Four of these are enforced at our endpoint rather than left in your integration. Balances come back at both scales with a truncation flag, sub-floor transactions are rejected with -32020 instead of dropped, the transfer feed de-duplicates the two emitters, and pre-flight tells you whether a transfer will revert on a blocklist rule before you spend the 20 Gwei.
The other four are yours: order by (blockNumber, logIndex), drop your reorg handling, expect archive reads for anything older than a minute, and do not assume a value transfer to a contract succeeds.