Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.arc.io/llms.txt

Use this file to discover all available pages before exploring further.

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:
  • Familiarity with EIP-3085 (wallet_addEthereumChain) for adding custom networks
  • Access to the Arc Testnet RPC endpoint
  • Understanding of ERC-20 event indexing

Step 1. Configure the network

Add Arc using the EIP-3085 parameters below.
ParameterValue
chainId0x4CF4B2 (5042002)
chainNameArc Testnet
nativeCurrency{ name: "USDC", symbol: "USDC", decimals: 6 }
rpcUrls["https://rpc.testnet.arc.network"]
wsUrls["wss://rpc.testnet.arc.network"]
blockExplorerUrls["https://testnet.arcscan.app"]
Set nativeCurrency.decimals to 6 for display purposes. This tells the wallet UI to show human-readable USDC amounts (for example, “1.50 USDC”) rather than raw wei values.
const arcTestnet = {
  chainId: "0x4CF4B2",
  chainName: "Arc Testnet",
  nativeCurrency: {
    name: "USDC",
    symbol: "USDC",
    decimals: 6,
  },
  rpcUrls: ["https://rpc.testnet.arc.network"],
  blockExplorerUrls: ["https://testnet.arcscan.app"],
};

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.

Fetch the balance

Call eth_getBalance to retrieve the user’s USDC balance in 18-decimal wei:
const balanceWei = await provider.getBalance(address); // 18-decimal BigInt

Convert to display value

Divide by 10^12 to convert from 18-decimal native wei to 6-decimal USDC:
const DECIMALS_OFFSET = 12n;
const displayAmount = balanceWei / 10n ** DECIMALS_OFFSET; // 6-decimal value
const formatted = (Number(displayAmount) / 1e6).toFixed(6); // e.g. "1.500000"

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.

Step 3. Index transaction history

Arc emits a unified Transfer event on the USDC ERC-20 contract for every USDC movement, regardless of whether it originated from a native send or an ERC-20 call.

Event signature

event Transfer(address indexed from, address indexed to, uint256 value);
Topic 0: 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef Contract: 0x3600000000000000000000000000000000000000

Subscribe to transfers

Use eth_subscribe or poll eth_getLogs filtered by the topic and the user’s address:
const USDC_CONTRACT = "0x3600000000000000000000000000000000000000";
const TRANSFER_TOPIC =
  "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef";

// Filter for transfers involving the user (as sender or receiver)
const paddedAddress = "0x" + address.slice(2).padStart(64, "0");

const logs = await provider.getLogs({
  address: USDC_CONTRACT,
  topics: [TRANSFER_TOPIC, [paddedAddress, null], [null, paddedAddress]],
  fromBlock: "earliest",
  toBlock: "latest",
});

Parse the value

The value field in the event uses 6 decimals (the ERC-20 interface), so no additional conversion is needed for display:
import { parseAbi, decodeEventLog } from "viem";

const abi = parseAbi([
  "event Transfer(address indexed from, address indexed to, uint256 value)",
]);

for (const log of logs) {
  const { args } = decodeEventLog({ abi, data: log.data, topics: log.topics });
  const amount = Number(args.value) / 1e6; // Human-readable USDC
}
This single event stream covers all USDC movements. You do not need to separately track native sends and ERC-20 transfers.

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.

Estimate gas cost

const gasPrice = await provider.getGasPrice(); // Returns USDC wei (18 decimals)
const gasLimit = await provider.estimateGas(tx);

const feeWei = gasPrice * gasLimit; // Total fee in 18-decimal USDC wei
const feeUsdc = Number(feeWei) / 1e18; // Human-readable USDC

UI guidance

ElementDisplay
Fee label”Network fee” or “Gas fee”
Fee denominationUSDC (for example, “0.000042 USDC”)
Currency symbolDo not show “ETH” or “Gwei” to users
Insufficient funds”Insufficient USDC for gas”
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.

Confirmation model

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.
StateMeaning
PendingTransaction is in the mempool, not yet mined
FinalIncluded in a block; irreversible
Once a transaction receipt is returned, you can immediately update the UI. No additional confirmations are needed.

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.

Integration checklist

Use this checklist to verify 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)
  • No ETH references in UI labels, error messages, or fee displays
  • Transaction history uses the unified Transfer event on 0x3600...0000
  • Gas fees displayed in USDC
  • One confirmation treated as final (no “confirming” spinner)
  • ERC-4337 AA flows work if your wallet supports smart accounts

See also