Build1 publisher3 min readPublished
A wallet that trusts Arc's declared 18 decimals renders one dollar as 0.000000000001
Four days after Circle opened Arc's public mainnet, a developer queried the chain's own RPC and found the node scaling native USDC a trillion times larger than the ERC-20 contract that reports the same balance.
The Engineer · Build desk

What happened
- Four days after Circle opened Arc's public mainnet on 16 September 2026, a developer read the chain from its own RPC and reported six figures that he says the launch posts did not include.
- eth_chainId came back 0x13b2, decimal 5042, and web3_clientVersion answered arc/v1, which the author describes as a Reth-based client running under Malachite BFT consensus.
- The latest block header showed a 30,000,000 gas limit, 213,828 gas used, four transactions, a base fee of 20 gwei, and an extraData field equal to that base fee.
- eth_getBalance on the Uniswap v4 PoolManager returned 3,692,022,800,475,000,000,000, while balanceOf on the USDC contract at the same block returned 3,692,022,800,475.
Compiled by The EngineerSomething wrong?How this is made
Why it matters
- decision Anyone shipping a wallet or a ledger for Arc has to choose a display scale before launch, because the declared decimals field and the number a user should see are twelve places apart.
- constraint Native sends and ERC-20 Transfer logs cannot be ingested as independent streams on Arc, so deduplication has to be built into the indexer.
- cost A pinned base fee makes gas a fixed line item for anyone budgeting on Arc, and every estimate built on it is void the day the proof-of-authority validators unpin it.
- exposure Compliance teams that underwrite USDC on the strength of its freeze controls need to locate those controls somewhere other than the contract that reports the balance.
The gap between those two reads is twelve decimal places. The node keeps the native ledger at 18 decimals, and the contract at 0x3600...0000 that presents the same coin keeps 6 [12]. Divide the first figure by 1e12 and it matches the second to the unit, so Arc has one balance with two interfaces, not a coin and a wrapper [14]. In dollars, the pool held $3,692,022.800475 [13].
The display path is where that bites. `nativeCurrency.decimals: 18` is chain precision, so a wallet that adds Arc from the standard network parameters and believes the field puts a one-dollar balance on screen as 0.000000000001 [16]. Arc's own wallet guide tells integrators to divide by 10^12, label the result USDC instead of ETH, and merge the native and ERC-20 rows into one [17]. The network-parameters page warns that a wallet without custom-gas-token support "may display balances as ETH" [18]. Suliman Mukhtar, writing on dev.to, took all six of his figures from the node, and says they were not in the launch posts [25][2].
The base fee sat at 20 gwei, and the block header's `extraData` was eight bytes equal to it. Arc is publishing the next block's base fee in the parent header [7][8]. At 18 decimals a dollar is 1e18 base units, so 20 gwei works out at two hundred-millionths of a dollar per unit of gas [21]. That is $0.02 per million gas, and $0.60 to fill the 30,000,000-gas block [23][22]. The figure holds only while the base fee stays pinned, and the validator set that pins it is twelve named institutions running proof of authority, Circle plus BlackRock, DTCC, Visa, Mastercard, ICE and six more [10][4].
The block Mukhtar pinned used 213,828 of 30,000,000 gas. That is 0.7% [7][24]. His own summary line says 3-11% used [10].
For anyone deploying, the reads are encouraging. Multicall3, Permit2, the CREATE2 deterministic deployer and Safe v1.4.1 sit at their canonical addresses, and the MetaMask, Alchemy and Uniswap EIP-7702 delegator contracts hold code; the docs attribute that to the EVM being at the Osaka fork [11]. `eth_getCode` at 0x...006b returned 0x, so the Arbitrum precompile is absent and this is not a Nitro chain [9]. `web3_clientVersion` answers "arc/v1", which Mukhtar describes as a Reth-based client under Malachite BFT consensus [6].
Indexers get the other integration bug. The ERC-20 face emits `Transfer` events for native movements, four of them in the pinned block. That is EIP-7708 in practice, so a pipeline ingesting native sends and those logs books every transfer twice [15]. The contract is 1,798 bytes, is not a proxy, and its bytecode holds none of the `blacklist`, `isBlacklisted`, `pause` or `mint` selectors mainnet USDC is known for [19]. Mukhtar wrote that this "does not mean there is no freeze on Arc; it means the freeze, if it exists, is not in this contract" [20].
What to watch
- Whether the base fee stays pinned at 20 gwei, and whether extraData keeps carrying it, decides if any fee estimate built on one block survives.
- Where Arc's freeze control actually lives, since mainnet USDC's blacklist and pause selectors do not appear on the ERC-20 face.
- Whether wallets ship custom-gas-token support for Arc or keep rendering native USDC as ETH, as the network-parameters page warns they may.