One SDK for USDT0 and USDC.
CCTP rails.Example quote
From
Arbitrum
250.00 USDC
To
Stellar
0.00 USDC
- Fee
- 0.42 USDC
- ETA
- ~2 min
Live demo
See it in the SDK
import { Ferryline } from "@ferryline/sdk";
const ferryline = new Ferryline({ network: "mainnet" });
const quote = await ferryline.quote({
asset: "USDC",
from: { chain: "arbitrum", address: sender },
to: { chain: "stellar", address: recipient },
amount: "250.00",
});Example quote
250.00 USDC
- Route
- Arbitrum → Stellar
- Fee
- 0.42 USDC
- ETA
- ~2 min
Why
Why this exists
USDT0 over LayerZero, and native USDC over Circle's CCTP. Both work, but every team that wants them inside a real product ends up solving the same problems. Stellar uses 7 decimal places; most other chains use 6. A recipient needs a trustline before USDT0 can land, or the transfer fails outright. Inbound CCTP has no automatic delivery on Stellar; something has to watch for the attestation and submit the mint. Ferryline solves each of these once, in the open, so you don't have to solve them again.Without Ferryline
- Convert between Stellar's 7 decimals and everyone else's 6, by hand
- Check for a
USDT0trustline yourself before every send - Run your own watcher for
CCTPattestations landing on Stellar
With Ferryline
quote()returns amounts already scaled correctlybuild()refuses the send until the trustline check passes- The relayer watches attestations and submits the mint for you
Architecture
How it fits together
SDK
One TypeScript interface for both rails: quote, build, sign, track. The entry point most integrations start from.
Relayer
Completes inbound delivery automatically. Self-host it for free.
Router
A Soroban contract for one-call and batch cross-chain payouts from your own contracts.
Widget
A drop-in deposit-and-withdraw panel. Works in React, Vue, or plain HTML.
Verified
Verified, not assumed
Verification log
- 01
CCTP's hook data isn't a 32-byte address the way it looks. It's a length-prefixed string. Assuming otherwise would have permanently stranded funds.
- 02
Stellar's smart contract auth model binds to the exact call, not to general authorization. That detail broke a naive batch-transfer design on real testnet, caught before mainnet.
- 03
A burn from Stellar is two transactions, not one. The published interface doesn't say so; the deployed contract does.
Rails
Two rails, one interface
USDT0 · LayerZero
Mainnet onlyLive on Stellar since September 2026. Mainnet only for now; no Stellar testnet deployment exists yet upstream.
USDC · Circle CCTP
LiveStandard Transfer supported both directions. Fast Transfer works into Stellar, not yet out of it — confirmed against real attestations, not assumed.
Open source
Open source, on purpose
Ferryline is Apache-2.0, and the core SDK and relayer will always be free to self-host. If you want to help close a real gap — smart-account support for USDT0, or better docs — the contributing guide lists exactly where we need it, with the evidence behind each item.
Inbound USDT0 to a smart-account recipient
Needs a mainnet runWhether the OFT can deliver to a Soroban C-address at all is genuinely untested. Blocked on a funded mainnet operator and a smart account to target, not on code.