A USDC cross-chain bridge built on Arc Network using Circle's Cross-Chain Transfer Protocol (CCTP) — the burn-and-mint protocol for native USDC transfers.
Live App: https://arc-bridge.replit.app
Arc Bridge lets users move native USDC between blockchains without wrapped tokens or liquidity pools. USDC is burned on the source chain, attested by Circle, and minted natively on the destination chain.
| Chain | CCTP Domain | Status |
|---|---|---|
| Ethereum Sepolia | 0 | Live |
| Avalanche Fuji | 1 | Live |
| Arbitrum Sepolia | 3 | Live |
| Base Sepolia | 6 | Live |
| Arc Testnet | 9 | Coming Soon |
- Native USDC bridging — no wrapped assets, no liquidity pools
- 0.1% protocol fee — collected at bridge time, sent to treasury wallet
- Transaction recovery tool — resume interrupted bridges by pasting the burn tx hash
- WalletConnect + MetaMask — 350+ wallets supported via RainbowKit
- Wallet-signed transactions — no private keys in the app, your wallet stays in control
1. User approves USDC to TokenMessenger on source chain
2. TokenMessenger burns USDC and emits MessageSent event
3. Circle's Iris API attests the burn (signs the message)
4. MessageTransmitter on destination chain verifies attestation and mints USDC
- Node.js 20+
- pnpm 9+
- A browser wallet (MetaMask recommended)
- Testnet USDC from faucet.circle.com
git clone https://github.com/osr21/arc-bridge.git
cd arc-bridge
pnpm installVITE_WALLETCONNECT_PROJECT_ID=your_project_id_from_cloud_reown_comGet a free WalletConnect project ID at cloud.reown.com.
pnpm --filter @workspace/cctp-bridge run devartifacts/
└── cctp-bridge/
└── src/
├── lib/
│ ├── cctp-config.ts # Chain configs, contract addresses, ABIs
│ ├── cctp-bridge.ts # Core bridge logic (approve/burn/attest/mint)
│ └── wagmi-config.ts # Wagmi + RainbowKit configuration
└── pages/
├── bridge/ # Main bridge UI
└── recover/ # Transaction recovery tool
A 0.1% protocol fee is collected on each bridge before the USDC burn:
User sends: 1,000 USDC
Protocol fee: 1 USDC → treasury wallet
Bridged: 999 USDC → burned via CCTP → minted on destination
Minimum fee: 0.01 USDC. If 0.1% of the amount is less than the minimum, the minimum is charged instead.
If a bridge is interrupted after the burn (e.g. browser closed), USDC is not lost. Use the recovery tool at /recover:
- Select source and destination chains
- Paste the burn transaction hash
- The app fetches Circle's attestation and completes the mint
- React + Vite — frontend
- wagmi v2 + viem v2 — Ethereum interactions
- RainbowKit v2 — wallet connection UI
- TanStack Query — async state management
- shadcn/ui + Tailwind CSS — UI components
- pnpm workspaces — monorepo
| Contract | Address |
|---|---|
| USDC | 0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238 |
| TokenMessenger | 0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5 |
| MessageTransmitter | 0x7865fAfC2db2093669d92c0197Ab6dd7d88d3E8 |
| Contract | Address |
|---|---|
| USDC | 0x5425890298aed601595a70AB815c96711a31Bc65 |
| TokenMessenger | 0xeb08f243E5d3FCFF26A9E38Ae5520A669f4019d |
| MessageTransmitter | 0xa9fB1b3009DCb79E2fe346c16a604B8Fa8aE0a79 |
| Contract | Address |
|---|---|
| USDC | 0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d |
| TokenMessenger | 0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5 |
| MessageTransmitter | 0xaCF1ceeF35caAc005e15888dDb8A3515C41B4872 |
| Contract | Address |
|---|---|
| USDC | 0x036CbD53842c5426634e7929541eC2318f3dCF7e |
| TokenMessenger | 0x9f3B8679c73C2Fef8b59B4f3444d4e156fb70AA5 |
| MessageTransmitter | 0x7865fAfC2db2093669d92c0197Ab6dd7d88d3E8 |
- No private keys stored in the app — all transactions signed by user's wallet at runtime
- Recipient address validated with
isAddress()before any transaction - Coming-soon chains blocked at both UI and logic level
- Minimum bridge amount enforced (1 USDC)
- Same-chain bridging blocked
- Arc Testnet support (pending Circle CCTP deployment)
- On-chain fee contract (Option 2 — institutional-grade)
- Revenue dashboard
- CCTP v2 fast finality support
- Mainnet deployment
MIT