ArcSuite
ArcSuite is a unified cross-chain operations hub built into UnitFlow. It consolidates four distinct actions (bridge, swap, send, and cross-chain swap) into a single tabbed interface, all powered by Circle's App Kit SDK (@circle-fin/app-kit).
/arcsuite in the UnitFlow app. It operates on Arc Testnet and the other chains supported by Circle's CCTP.Key Highlights
| Feature | Detail |
|---|---|
| Sub-second finality | Arc L1 settles transactions in under 1 second |
| USDC-native gas | Gas fees paid in USDC, no separate native token required |
| CCTP bridging | Circle's Cross-Chain Transfer Protocol for secure USDC transfers |
| Protocol fee | Inclusive fee on every transaction (bridge: min($0.01, 1%); swap: 1 bps) |
Tabs
Bridge
Transfers USDC between any two supported chains via CCTP. The bridge flow executes four on-chain steps:
- Approve USDC - grants the TokenMessenger allowance.
- Burn on source chain - calls
depositForBurnvia the App Kit. - Await CCTP attestation - polls Circle's attestation service until the burn is signed.
- Mint on destination chain - calls
receiveMessageon the destination MessageTransmitter.
Both the source and destination chains are automatically added to the user's wallet if not already present. A step-by-step progress tracker is shown during the transaction.
The fee is inclusive: the protocol deducts min($0.01, 1% of amount) from the entered amount so the user's total wallet debit equals exactly what they typed. The fee is forwarded to the protocol fee recipient via AppKit.bridge({ config: { customFee: { value, recipientAddress } } }).
Swap
Swaps stablecoins on Arc Testnet using the App Kit's kit.swap() method. Currently supports USDC / EURC on Arc Testnet.
Before executing, the UI calls kit.estimateSwap() on blur to show the estimated output, minimum received, and protocol fee breakdown. The swap call is proxied through a local Next.js API route to avoid CORS restrictions on Circle's API.
| Parameter | Value |
|---|---|
| Chain | Arc Testnet (Arc_Testnet) |
| Supported tokens | USDC, EURC |
| Fee | 100 bps (1%) via customFee.percentageBps |
Send
Sends USDC, EURC, or the native token to any wallet address on a supported chain using kit.send(). The recipient address is validated as a checksummed EVM address before submission.
| Field | Detail |
|---|---|
| Supported tokens | USDC, EURC, NATIVE |
| Supported chains | All chains in BRIDGE_TESTNET_CHAINS |
| Address validation | Viem isAddress() check before enabling submit |
Cross-Chain Swap
Combines a swap and a bridge into a single two-step flow:
- Swap on Arc Testnet - swaps the input token (EURC or USDC) to USDC using
kit.swap(). - Bridge to destination - bridges the USDC output from Arc Testnet to the chosen destination chain via CCTP using
kit.bridge().
Both Arc Testnet and the destination chain are added to the wallet automatically before execution begins. The UI shows separate progress trackers for each step. The bridge amount is taken directly from the swap's amountOut, with the inclusive bridge fee deducted before the CCTP call.
Supported Chains
| Chain | Chain ID | Bridge Kit Name | USDC Decimals |
|---|---|---|---|
| Arc Testnet | 5042002 | Arc_Testnet | 18 |
| Ethereum Sepolia | 11155111 | Ethereum_Sepolia | 6 |
| Avalanche Fuji | 43113 | Avalanche_Fuji | 6 |
| Arbitrum Sepolia | 421614 | Arbitrum_Sepolia | 6 |
| Base Sepolia | 84532 | Base_Sepolia | 6 |
| Optimism Sepolia | 11155420 | Optimism_Sepolia | 6 |
| Polygon Amoy | 80002 | Polygon_Amoy_Testnet | 6 |
| Codex Testnet | 80085 | Codex_Testnet | 6 |
| Ink Testnet | 763373 | Ink_Testnet | 6 |
| Linea Sepolia | 59141 | Linea_Sepolia | 6 |
| Plume Testnet | 161221135 | Plume_Testnet | 6 |
| Solana Devnet | n/a | Solana_Devnet | 6 |
SDK Integration
ArcSuite uses two Circle packages:
@circle-fin/app-kit- provides theAppKitclass withbridge(),swap(),estimateSwap(), andsend()methods.@circle-fin/adapter-viem-v2- wraps the connected wallet's EIP-1193 provider into a viem-compatible adapter viacreateViemAdapterFromProvider().
The EIP-1193 provider is obtained from the active wagmi connector using a getEIP1193Provider(connector, walletClient) helper that handles both injected and WalletConnect connectors.
Fee Configuration
| Parameter | Value | Used in |
|---|---|---|
FEE_RECIPIENT | 0x3682652cd0995e6972ccf7245a1caea95c2955b8 | Bridge, Swap, Cross-Chain Swap |
| Bridge fee | min($0.01, 1% of amount) - inclusive flat fee | Bridge, Cross-Chain Swap (bridge leg) |
| Swap fee | 100 bps (1%) via percentageBps | Swap, Cross-Chain Swap (swap leg) |
Component Structure
| File | Purpose |
|---|---|
src/app/arcsuite/page.tsx | Route entry, renders ArcSuiteHub inside a Suspense boundary |
src/components/arcsuite/ArcSuiteHub.tsx | Tab container with feature highlight cards and footer links |
src/components/arcsuite/ArcSuiteBridge.tsx | Bridge tab, CCTP bridge via App Kit |
src/components/arcsuite/ArcSuiteSwap.tsx | Swap tab, stablecoin swap on Arc Testnet |
src/components/arcsuite/ArcSuiteSend.tsx | Send tab, token transfer to any address |
src/components/arcsuite/ArcSuiteCrossChainSwap.tsx | Cross-Chain Swap tab, swap then bridge in one flow |
src/config/appKit.ts | Kit key, fee recipient, and fee constants |
src/config/bridgeKit.ts | Chain registry (BRIDGE_TESTNET_CHAINS) with RPC, explorer, and USDC addresses |