Skip to main content
Arc is an EVM-compatible blockchain that uses USDC as its native gas token. Signing uses secp256k1, identical to Ethereum; no new cryptographic code is required. USDC exists as a single balance with two interfaces (native and ERC-20), so display one unified balance row. Transactions finalize in under one second with no reorgs.

Prerequisites

Before you begin, ensure that you’ve:
  • Familiarized yourself with EIP-3085 (wallet_addEthereumChain) for adding custom networks
  • Obtained access to the Arc Testnet RPC endpoint
  • Understood ERC-20 event indexing

Step 1. Configure the network

Add Arc using the following EIP-3085 parameters.
Set nativeCurrency.decimals to 18 to match Arc’s native precision. The name and symbol fields drive the “USDC” label in wallet UI. Display scaling to 6 decimals happens in your formatting layer (Step 2), not through this field.

Step 2. Display the balance

Arc’s native balance uses 18 decimals internally (like ETH on Ethereum), but represents USDC which has 6 display decimals. Convert accordingly.

2.1. Fetch the balance

Call eth_getBalance to retrieve the user’s USDC balance in 18-decimal wei:

2.2. Convert to display value

Divide by 10^12 to convert from 18-decimal native wei to 6-decimal USDC:

2.3. Show a single row

USDC on Arc is a single asset with two interfaces (native and ERC-20). Both share the same underlying balance. Display one “USDC” row in the asset list, not separate “native” and “ERC-20” entries.
Do not display a separate ETH balance. Arc has no ETH. The native token label should read “USDC” everywhere in your UI.

2.4. Handle token import

If a user manually imports the linked USDC ERC-20 contract (0x3600000000000000000000000000000000000000), map it to the USDC asset they already hold. Do not create a second entry. Consider surfacing a message such as “This contract represents USDC on Arc (already in your wallet)” so users understand they have not added a new token. For the full list of deployed contracts, see Contract addresses. balanceOf() returns 0 for amounts smaller than 1×10⁻⁶ USDC (the 6-decimal minimum). The native balance can hold amounts smaller than that threshold (dust) that are still spendable as gas. A balanceOf() result of 0 does not prove the address holds no USDC.

Step 3. Index transaction history

Arc emits a standard ERC-20 Transfer log from the system address 0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE for every native USDC movement (Arc’s EIP-7708 implementation). This single stream covers plain native sends and the native leg of ERC-20 transfers, so filtering it gives complete transaction history. The native balance is the source of truth.

3.1. Identify the Transfer event

Topic 0: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef Emitter: 0xffffFFFfFFffffffffffffffFfFFFfffFFFfFFfE (native USDC system emitter, 18 decimals)

3.2. Subscribe to transfers

Use eth_subscribe or poll eth_getLogs filtered by the topic and the user’s address. Scope the block range to avoid scanning from genesis; use the account creation block as startBlock or paginate in fixed-size chunks:

3.3. Parse the value

The value field from the system emitter uses 18 decimals (the native balance). Convert to 6-decimal USDC for display:
Filtering the system emitter covers all USDC movements, native sends and the native leg of ERC-20 transfers, in one stream. Do not filter the ERC-20 contract (0x3600…0000) for history: plain native sends emit no log there. See USDC system events.

Step 4. Handle fees

Gas on Arc is denominated in USDC, not ETH. Arc uses an EIP-1559 fee model with a smoothed base fee. For the full pricing model, see Gas and fees.

4.1. Estimate gas cost

4.2. Apply UI guidance

Arc has no ETH. If your wallet warns “insufficient ETH for gas,” update that message to reference USDC instead.

Step 5. Send transactions

Transaction signing on Arc is identical to Ethereum. Use secp256k1 ECDSA signatures with EIP-155 replay protection. Send USDC with a standard ERC-20 transfer(), the same flow as any ERC-20 token, with no choice of transfer method exposed to the user.

5.1. Handle precision and dust

The ERC-20 interface uses 6 decimals, so an ERC-20 transfer() cannot move “dust” (amounts smaller than 1×10⁻⁶ USDC held in the 18-decimal native balance). Unlike other EVM chains where gas is a separate asset, gas on Arc also draws from the USDC balance. Reserve gas headroom when computing a max-send amount. The native balance can still hold dust, and dust can be spent as gas.

5.2. Handle onchain app interactions

Treat USDC as a standard ERC-20 when users interact with onchain applications: approvals, transferFrom, swaps, and liquidity provision work without special handling. Because USDC is also the native asset, support contract calls that are payable: an app may require USDC sent as msg.value (a native value transfer) alongside calldata, rather than an ERC-20 transfer. Pass the value through as the contract expects; no special UX is required.
ERC-20 approve and allowance govern only the transferFrom path. An ERC-20 allowance is not a cap on total USDC spending: the same balance can also leave as native value (msg.value). For smart contract accounts (embedded wallets, smart wallets, and session-key systems), do not rely on allowance state as a safety guarantee. Any module with execution rights can also transfer native USDC regardless of allowance state.
Contract calls that trigger a transfer to or from a blocklisted address revert at runtime. The transaction is included in a block and gas is consumed, but state changes are rolled back. See Transaction lifecycle for the full set of edge cases and EVM compatibility for other Arc-specific behaviors.

5.3. Handle transaction confirmations

Arc provides deterministic finality. A transaction is either pending (in the mempool) or final (included in a block). There are no intermediate confirmation states and no reorgs. Once a transaction receipt is returned, you can immediately update the UI. No additional confirmations are needed.

5.4. Support account abstraction

Arc supports ERC-4337 account abstraction for smart contract wallets. If your wallet supports AA flows (bundlers, paymasters, session keys), these work on Arc without modification. See Account abstraction providers for compatible infrastructure including Biconomy, Pimlico, ZeroDev, and Circle Wallets.

Step 6. Verify your integration

Use this checklist to confirm your wallet integration is complete:
  • Chain ID 5042002 added with correct RPC and explorer URLs
  • Native currency displays as “USDC” with 6 display decimals
  • eth_getBalance result converted from 18-decimal to 6-decimal for display
  • Single USDC balance row shown (no separate native/ERC-20 entries)
  • Imported USDC ERC-20 contract maps to the existing USDC asset (no duplicate entry)
  • No ETH references in UI labels, error messages, or fee displays
  • Transaction history uses the native Transfer event from the system emitter 0xffff...fffe (18 decimals), not the ERC-20 contract
  • Gas fees displayed in USDC
  • Send amounts validated to 6 decimals; payable contract calls (USDC as msg.value) supported
  • One confirmation treated as final (no “confirming” spinner)
  • ERC-4337 AA flows work if your wallet supports smart accounts