Cross-chain transfers (CCTP)
How USDC moves between Base and other networks, what your deposit address is, and what MozaikPay can and cannot do with a deposit.
Your wallet lives on Base, but your USDC can come from other places. An exchange can pay out only on Polygon, or a friend can hold USDC on Solana. This page explains how USDC moves between networks in MozaikPay, and why no bridge and no company holds it on the way.
The problem with bridges
A token cannot move from one network to another by itself. Each network keeps its own records, and no network can read the records of another. The usual solution is a bridge. A bridge locks your tokens on the first network and gives you a copy on the second network.
The copy is a different token, and it is only as safe as the bridge. If an attacker breaks into the bridge, the copies can lose all their value, and bridge attacks caused some of the largest losses in crypto. USDC.e, which you still find on Arbitrum and Polygon, is a copy of this kind.
What CCTP does instead
Circle issues USDC on each network itself, so it does not need a copy. Circle's Cross-Chain Transfer Protocol (CCTP) moves USDC in three steps.
- A contract burns the USDC on the first network. The burn records the amount and the recipient on the second network.
- Circle's attestation service sees the burn and signs a message that confirms it.
- Anyone can submit that message on the second network. Circle's contract there checks the signature and mints the same amount of USDC to the recipient.
No pool and no company holds the USDC between the burn and the mint. The USDC that arrives is native USDC, the same token as all other USDC on that network.
CCTP has two speeds. A Standard transfer waits until the first network makes the burn final. It is free, but on Ethereum and Arbitrum the wait is about 15 to 20 minutes. A Fast transfer does not wait, because Circle takes the risk of the wait and charges a small fee for it, about 0.01%. MozaikPay uses Fast transfers from Ethereum and Arbitrum. From Polygon and Solana, a Standard transfer is free and takes only seconds, so MozaikPay uses Standard there.
How a deposit reaches your wallet
Your deposit address on Ethereum, Arbitrum and Polygon is a small contract. Its address comes from your wallet address, with the same formula on every network, so it is one address on the three networks. The contract contains your wallet address, and it can send USDC only to that wallet. The contract has no owner, and nobody can change its code.
When USDC arrives at your deposit address, these steps follow.
- MozaikPay sees the transfer on that network.
- MozaikPay tells the deposit address to forward the USDC. The contract burns it through CCTP, with your wallet on Base as the recipient.
- Circle attests the burn.
- MozaikPay submits the attestation on Base, and Circle's contract mints the USDC into your wallet.
MozaikPay pays the network fees on both networks. That is why each network has a minimum. Below the minimum, the network fee is too large for the amount, so the USDC waits until more arrives. Network fees on Ethereum sometimes rise for a short time. When a forward costs more than 2% of the amount, MozaikPay waits for lower fees.
Deposits from Solana
Many exchanges accept only a normal Solana wallet address as a destination. So your Solana deposit address is a normal Solana wallet address, which your phone derives from your spending key.
When you set up the address, your phone signs one transaction. That transaction lets a MozaikPay program on Solana move USDC out of the address. The program can do only one thing with that USDC. It burns the USDC through CCTP, with your wallet on Base as the recipient. The app sets up an address only when nobody can change that program anymore. MozaikPay pays for the setup.
A restore gives your account a new spending key, so the new phone sets up a new Solana address. The old address keeps its permission, so USDC sent to the old address still reaches your wallet.
Withdrawals to other networks
A withdrawal to another network does the same steps in the opposite direction. Your wallet burns the USDC on Base through CCTP, and the recipient is the address that you entered. Circle's Forwarding Service then submits the message on the other network and pays the network fee there.
The bridge fee is the Fast transfer fee plus the fee of the Forwarding Service. Both go to Circle. MozaikPay takes no part of the bridge fee, and it pays the network fee on Base, as for every transfer.
What MozaikPay can and cannot do
Your deposit address follows the same rules as your wallet. The points below come from public code, not from a policy.
- MozaikPay cannot redirect a deposit. The deposit address and the Solana program can send USDC only to your wallet on Base.
- MozaikPay cannot keep a deposit. Neither the deposit address nor the Solana program has an owner, an admin or a way to change its code.
- MozaikPay is not necessary for delivery. Anyone can tell a deposit address to forward, and anyone can submit Circle's attestation on Base. If MozaikPay stops, the USDC waits at your deposit address until someone does these steps.
- MozaikPay can delay a deposit. MozaikPay usually starts each forward, so a problem on our side delays it.
CCTP moves only USDC. USDC.e or another token at your deposit address stays there. Only your wallet can authorize a transfer of that token out of the deposit address, and the app does not offer this yet.
Circle also has real power here. Circle runs the attestation service, so a pause at Circle pauses all transfers. Circle can also block an address from CCTP when the law requires it. What are digital dollars? explains the role of Circle.