Skip to main content

Arc network

CrackPay runs on Arc, Circle's Layer 1 blockchain where USDC is the gas token.

CrackPay runs on Arc mainnet at www.crackpay.xyz, with real USDC. Each CrackPay deployment is on exactly one network, and your app runs on whichever network opened it, so read the chain from the provider rather than hardcoding it (see Choosing the network).

Arc mainnet​

Chain ID5042 (0x13b2)
viem / wagmiarc from viem/chains / wagmi/chains; arcMainnet in the SDK
RPChttps://rpc.mainnet.arc.io
Explorerhttps://explorer.arc.io
FaucetNone. Real USDC.

Arc Testnet​

Chain ID5042002 (0x4cef52)
viem / wagmiarcTestnet from viem/chains / wagmi/chains and the SDK
RPChttps://rpc.testnet.arc.network
Explorerhttps://explorer.testnet.arc.io
Faucetfaucet.circle.com, choose Arc Testnet

Tokens​

TokenMainnetTestnetDecimals
USDC (ERC-20 interface)0x36000000000000000000000000000000000000000x36000000000000000000000000000000000000006
EURC0xbEf5f6d51CB62b58e6A8f77868681825C6fe21c10x89B50855Aa3bE2F677cD6303Cec089B5F319D72a6

EURC's address differs between the networks. Look tokens up with getTokens(chainId) from the SDK. The older tokens export is testnet only.

Choosing the network​

import { connectCrackPay } from "@crackpay/miniapp-sdk/viem";
import { getTokens } from "@crackpay/miniapp-sdk";

const crackpay = await connectCrackPay();
if (!crackpay) throw new Error("Open this app in CrackPay.");

crackpay.chain.id; // 5042 on mainnet, 5042002 on testnet
const tokens = getTokens(crackpay.chain.id)!;

With the bare provider, call eth_chainId and pass the result to getArcChain(). Keep your own contract addresses per chain ID, and deploy and list them on every network you support.

USDC has two scales​

USDC is Arc's native token and an ERC-20 token. They are the same balance, seen through two interfaces:

InterfaceDecimalsWhere you meet it
Native18A transaction's value, eth_getBalance, msg.value
ERC-206balanceOf, transfer, approve

One dollar is parseEther("1") as a native value and parseUnits("1", 6) through the token contract.

  • Never add the two, and never show both. They are one balance.
  • For display, read balanceOf and format with 6 decimals.
  • Never pass a 6-decimal amount as a value: it would send a trillionth of what you meant.

No gas token​

Gas is paid in USDC, and CrackPay handles it. Users never need anything else, and your app never sets gas fields.

Finality​

Blocks are final in under a second. There are no confirmations to wait for.

Further reading​