from and to chains to bridge between EVM chains, or between an EVM chain and Solana.
Choose a route
Para wallets cover the main CCTP chain families. The route you pick determines which Para wallet signs each side and how you submit the transfer.
Bridge Kit’s
BridgeChain enum lists every chain it can route. A route only needs both chains in that list and an adapter for each side.
Each CCTP network has a protocol domain ID, such as
0 for Ethereum, 5 for Solana, 8 for Sui, 26 for Arc, and 27 for Stellar. Domain IDs are not EVM chain IDs. Bridge Kit’s chain definitions carry the domains and CCTP contract addresses, so the example does not hardcode them.Before you start
Start with a Next.js app that hasParaProvider, a login flow, and a wallet for each chain family in your route. These Para guides cover that setup:
The wallet needs native USDC on the source chain and gas on both chains. The source chain pays for the approval and burn, and the destination chain pays for the mint. For Ethereum to Arc, that means ETH on Ethereum and USDC on Arc, since Arc uses USDC as its gas token. A Solana destination needs SOL for fees and for the USDC token account if the wallet does not have one yet. Review the transfer amount and network fees with the user before submitting a mainnet transaction.
Install the bridge packages
From your Para Next.js application, install Bridge Kit, Circle’s viem adapter, and the Para viem integration. The versions below are the ones used for this guide.NEXT_PUBLIC_ETHEREUM_RPC_URL, NEXT_PUBLIC_BASE_RPC_URL, NEXT_PUBLIC_ARC_RPC_URL, and NEXT_PUBLIC_SOLANA_RPC_URL. The values are public browser configuration, so do not put private RPC credentials in them.
Connect Para to Bridge Kit
Use and inside your existingParaProvider to check the signed-in Para wallet. Confirm the session with .
For EVM chains, selects the EVM wallet, and gives Circle’s ViemAdapter a wallet client for each chain. Every EVM chain uses the same Para account. For Solana, signs the transactions Circle’s Solana adapter builds. createAdapter() returns the adapter that matches a chain’s type.
src/hooks/useCctpAdapter.ts
createSolanaAdapter() and the Solana packages. To add another EVM chain, import its definition from @circle-fin/bridge-kit/chains, add it to evmChains, and add its RPC URL to evmRpcUrls.
Bridge USDC
CallbridgeUsdc() in response to a user action. Bridge Kit uses CCTP V2 to burn USDC on the source chain, waits for Circle’s attestation, then mints USDC on the destination chain. Setting useForwarder: false keeps the destination mint signed by Para. The result contains each step and the overall state. amount is a human-readable USDC amount.
src/hooks/useCctpBridge.ts
@circle-fin/bridge-kit/chains:
bridgeUsdc() returns the Bridge Kit result and a summary with status, failedStep, and the burn and mint transaction hashes and explorer links. Show a transfer as complete only when status is complete. For a failed transfer, read failedStep?.name and failedStep?.errorMessage. Handle errors thrown before Bridge Kit returns a result separately. The fetchAttestation event records progress between the burn and mint; it is not itself an onchain transaction.
Change the route
The route is the only part of the call that changes. Each side uses the Para wallet for that chain’s type, so a single signed-in user can bridge in any direction the app supports.Bridge with Sui or Stellar
CCTP also supports Sui and Stellar, and Para signs on both. Bridge Kit does not include Sui or Stellar in its chain list, so these routes use Circle’s chain-specific CCTP integration instead ofbridgeUsdc(). The Para Sui and Stellar signers build and sign those transactions with the user’s Para wallet.
On Stellar, USDC precision and address encoding differ from other CCTP networks. Follow Circle’s Stellar guidance for incoming transfers so the minted USDC reaches the correct recipient.
Resume an interrupted transfer
Ifresult.state is error, inspect result.steps before asking the user to try again. An approved or burned transfer may already have spent gas or destroyed the source USDC. Keep that result and pass it to resumeTransfer(result) from a separate Resume action. The hook reads the source and destination chains from the result, creates fresh authenticated Para adapters for both, and returns the updated result and status summary.
Do not start a second bridge() call to recover a transfer whose burn succeeded. If a retry still fails, keep the burn transaction hash and investigate the failed step before attempting another transaction. A pending result is not a confirmed destination mint.
Check the route
For a production check, record both the source burn transaction and the destination mint transaction from the same Bridge Kit result. The source receipt alone confirms only the burn. The destination explorer receipt confirms the mint. For a testnet trial before using mainnet funds, swap in testnet chain definitions such asEthereumSepolia, BaseSepolia, ArcTestnet, and SolanaDevnet, or follow Circle’s . Circle’s covers fees, supported routes, and recovery behavior.