bitpro가 원문에서 글자만 모은 내용이에요. 표·그림·수식은 빠지거나 깨질 수 있어요. 전체 75쪽 중 27쪽
on this endpoint, see the
[`GET /v2/burn/USDC/fees` API reference](/api-reference/cctp/all/get-burn-usdc-fees).
<Note>
`includeRecipientSetup` only applies when the destination blockchain is Solana.
It has no effect for EVM destination blockchains.
</Note>
## Supported blockchains
For a full list of supported blockchains, see
[CCTP Supported Blockchains](/cctp/concepts/supported-chains-and-domains).
# How upfront fees work
Source: https://developers.circle.com/cctp/concepts/how-upfront-fees-work
Learn how CCTP collects upfront fees and completes Fast Transfer and Forwarding Service transfers.
Paying fees upfront starts with requesting a signed fee quote from Circle, then
submitting that quote with the burn in a single transaction on the source
blockchain. Circle honors the quoted price, so the recipient receives the full
transferred amount. For a full walkthrough, see
[Transfer USDC with upfront fees](/cctp/howtos/transfer-usdc-with-upfront-fees).
## Transfer flow with upfront fees
```mermaid theme={null}
sequenceDiagram
actor User
participant API as Quote API
participant USDC as USDC token
participant TMWF as TokenMessengerWithFees
participant CCTP as TokenMessengerV2
participant Circle as Circle
User->>API: Request fee quote
API-->>User: Signed, time-bound quote
User->>USDC: approve(TMWF, amount [+ fee])
User->>TMWF: depositForBurnWithFees (quote + fee)
TMWF->>TMWF: Verify quote and collect fee
TMWF->>CCTP: depositForBurn
CCTP-->>Circle: Burn message emitted
Circle-->>User: Full amount minted on destination
```
<Steps>
<Step title="Request a quote">
Request an [upfront fee quote](/cctp/concepts/upfront-fee-quotes) from the
[Quote API](/api-reference/cctp/all/create-usdc-burn-quote) for the fees you
want to pay upfront: the Forwarding Service fee, the Fast Transfer fee, or
both. See [Paying the fee](#paying-the-fee) for the available fee tokens.
</Step>
<Step title="Receive a signed quote">
Circle returns a signed, time-bound quote that prices each fee and includes a
`signedQuote` blob.
</Step>
<Step title="Approve USDC">
Approve
[`TokenMessengerWithFees`](/cctp/references/contract-interfaces#tokenmessengerwithfees)
to spend the USDC amount you're transferring, plus the quoted fee if you're
paying it in USDC. The contract pulls the transfer amount for the burn and, if
applicable, the fee amount.
</Step>
<Step title="Submit the burn">
Call `depositForBurnWithFees` (or `depositForBurnWithHookAndFees`) on
`TokenMessengerWithFees`, passing the signed quote along with the standard
`depositForBurn` parameters, and pay the quoted fee amount: attach it as the
transaction's native value, or rely on the USDC approval from the previous
step.
</Step>
<Step title="Fee is collected and tokens are burned">
The contract verifies the quote, collects the fee, and then delegates to
`TokenMessengerV2` to complete the CCTP burn.
</Step>
<Step title="Full amount is minted">
Circle attests the transfer with no fee deducted at mint, and the full amount
is minted to the recipient.
</Step>
</Steps>
## Paying the fee
The token you selected on the quote request decides where the fee comes from:
* **Native gas token** (default): attach the quoted amount as the transaction's
native value.
* **USDC**: request the quote with `feeToken` set to the USDC address, then
approve `TokenMessengerWithFees` to spend the quoted fee before you submit.
This fee approval is on top of the USDC you're transferring, so approve the
transfer amount plus the quoted fee.
## Forwarding with upfront fees
When a quote includes a `FORWARD` fee, the transfer is forwarded on the
destination blockchain the same way as any other
[Forwarding Service](/cctp/concepts/forwarding-service) transfer, except that
the forwarding fee isn't deducted from the transferred amount. What changes is
how you supply the hook data.
Forwarding requires a valid `cctp-forward` hook in the submitted hook data.
[`depositForBurnWithFees`](/cctp/references/contract-interfaces#depositforburnwithfees)
builds this hook for you automatically, as long as you request the quote without
passing `hookData`. For custom hook data, use
[`depositForBurnWithHookAndFees`](/cctp/references/contract-interfaces#depositforburnwithhookandfees)
and submit the same `hookData` you used to request the quote. For the hook
structure, including how to append your own frame, see
[Forwarding Service hook format](/cctp/concepts/forwarding-service#hook-format).
# Supported blockchains and domains
Source: https://developers.circle.com/cctp/concepts/supported-chains-and-domains
Blockchains and domain identifiers supported by CCTP
CCTP is available on multiple blockchains where USDC is natively issued. Each
blockchain is assigned a unique domain identifier used in
[CCTP contracts](/cctp/references/contract-addresses) and API calls.
## Supported blockchains
CCTP provides
[Standard Transfer](/cctp/concepts/finality-and-block-confirmations#standard-transfer-attestation-times),
[Fast Transfer](/cctp/concepts/finality-and-block-confirmations#fast-transfer-attestation-times),
Hooks, [Forwarding Service](/cctp/concepts/forwarding-service), and
[upfront fees](/cctp/concepts/upfront-fees) capabilities on the following
blockchains. All blockchains listed below are supported as destinations.
<Note>
**Fast Transfer availability:**
[Fast Transfer](/cctp/concepts/fast-transfer-allowance) is available for source
chains only when it provides a meaningful speed improvement over standard burn
attestation times. For blockchains where standard attestation is already fast,
Fast Transfer is not necessary. These chains are marked **N/A** in the Source
(Fast transfer) column in the following table.
</Note>
| Blockchain | Source (Standard transfer) | Source (Fast transfer) | Source (Upfront fees) | Forwarding Service |
| - | - | - | - | - |
| Aptos | ✅ | N/A | ❌ | ❌ |
| Arbitrum | ✅ | ✅ | ✅ | ✅ |
| Arc | ✅ | N/A | ✅ | ✅ |
| Avalanche | ✅ | N/A | ✅ | ✅ |
| Base | ✅ | ✅ | ✅ | ✅ |
| BNB Smart Chain (USYC only) | ✅ | N/A | ❌ | ❌ |
| Codex | ✅ | ✅ | ✅ | ✅ |
| Cronos | ✅ | N/A | ❌ | ❌ |
| EDGE | ✅ | ✅ | ❌ | ✅ |
| Ethereum | ✅ | ✅ | ✅ | ✅ |
| HyperEVM | ✅ | N/A | ✅ | ✅ |
| Injective | ✅ | N/A | ❌ | ❌ |
| Ink | ✅ | ✅ | ✅ | ✅ |
| Linea | ✅ | ✅ | ✅ | ✅ |
| Monad | ✅ | N/A | ✅ | ✅ |
| Morph | ✅ | ✅ | ❌ | ❌ |
| OP Mainnet | ✅ | ✅ | ✅ | ✅ |
| Pharos | ✅ | N/A | ❌ | ❌ |
| Plasma | ✅ | N/A | ❌ | ❌ |
| Plume | ✅ | ✅ | ✅ | ✅ |
| Polygon PoS | ✅ | N/A | ✅ | ✅ |
| Sei | ✅ | N/A | ✅ | ✅ |
| Solana | ✅ | ✅ | ❌ | ✅ |
| Sonic | ✅ | N/A | ✅ | ✅ |
| Starknet | ✅ | ✅ | ❌ | ❌ |
| Stellar | ✅ | N/A | ❌ | ❌ |
| Sui | ✅ | N/A | ❌ | ❌ |
| Unichain | ✅ | ✅ | ✅ | ✅ |
| World Chain | ✅ | ✅ | ✅ | ✅ |
| X Layer | ✅ | ✅ | ❌ | ❌ |
| XDC | ✅ | N/A | ✅ | ✅ |
<Note>
On Stellar, USDC precision and address encoding differ from other CCTP-supported
blockchains. For inbound transfers, use
[`CctpForwarder`](/cctp/references/stellar#use-cctpforwarder-for-stellar-recipients)
so funds reach the correct recipient. See
[CCTP on Stellar](/cctp/references/stellar).
</Note>
<Note>
**Testnet support:**
If a mainnet is listed, its official testnet is also supported. For example,
Ethereum includes both Ethereum Mainnet and Ethereum Sepolia. Monad is the
exception: upfront fees aren't supported on Monad Testnet.
</Note>
### Upfront fees
The column labeled "Source (Upfront fees)" indicates whether you can pay fees
for Forwarding Service and Fast Transfer services
[upfront](/cctp/concepts/upfront-fees) on the source blockchain. The services
you pay for must also be supported on your route: Fast Transfer on the source
blockchain, and the Forwarding Service on the destination. Upfront fees apply to
USDC transfers only; they aren't supported for USYC.
### Forwarding Service
The column labeled "Forwarding Service" indicates whether the blockchain is
available as a destination for the
[Circle Forwarding Service](/cctp/concepts/forwarding-service).
## Domain identifiers
A domain is a Circle-issued identifier for a blockchain where CCTP contracts are
deployed. Domain identifiers don't map to existing public chain IDs.
Use domain identifiers when calling CCTP contracts and API endpoints:
| Domain | Blockchain |
| :- | :- |
| 0 | Ethereum |
| 1 | Avalanche |
| 2 | OP Mainnet |
| 3 | Arbitrum |
| 5 | Solana |
| 6 | Base |
| 7 | Polygon PoS |
| 8 | Sui |
| 9 | Aptos |
| 10 | Unichain |
| 11 | Linea |
| 12 | Codex |
| 13 | Sonic |
| 14 | World Chain |
| 15 | Monad |
| 16 | Sei |
| 17 | BNB Smart Chain |
| 18 | XDC |
| 19 | HyperEVM |
| 21 | Ink |
| 22 | Plume |
| 25 | Starknet |
| 26 | Arc |
| 27 | Stellar |
| 28 | EDGE |
| 29 | Injective |
| 30 | Morph |
| 31 | Pharos |
| 32 | Cronos |
| 33 | Plasma |
| 37 | X Layer |
## Supported tokens
Not all domains support the same tokens:
* [USDC](/stablecoins/what-is-usdc): Supported on all CCTP domains except BNB
Smart Chain
* [USYC](/tokenized/usyc/overview): Supported only on Ethereum and BNB Smart
Chain
## CCTP V1 (Legacy) only
The following blockchains are supported only by CCTP V1 (Legacy). If you are
building on these chains, refer to the [V1 documentation](/cctp/v1) for
integration guides and contract references.
| Blockchain | Domain | Documentation |
| - | - | - |
| Noble | 4 | [Noble Cosmos module](/cctp/v1/noble-cosmos-module) |
# Upfront fee quotes
Source: https://developers.circle.com/cctp/concepts/upfront-fee-quotes
Request a signed quote for CCTP Fast Transfer and Forwarding Service fees and learn how fee types and quote expiry work.
A fee quote is a signed, [time-bound](#quote-expiry) price for the upfront fees
on a specific transfer. Requesting one locks in the Fast Transfer fee, the
Forwarding Service fee, or both, so you know the exact cost before you submit
the transfer. To see where the quote fits in the end-to-end flow, see
[How upfront fees work](/cctp/concepts/how-upfront-fees-work).
## Requesting a quote
Call
[`POST /v2/quote/burn/usdc/{sourceDomainId}/{destDomainId}`](/api-reference/cctp/all/create-usdc-burn-quote)
with these request fields:
* `amount`: the USDC transfer amount, in minor units.
* `feeToken`: the token you want to pay fees in. Use the zero address (the
default) to price the fee in the native gas token, or the source blockchain's
USDC address to price it in USDC.
* `requests`: the fees to price. Include a `FORWARD` request for the Forwarding
Service fee, a `PRE_FINALITY` request for the Fast Transfer fee, or both, with
at most one of each type.
The response includes the `signedQuote` blob you submit onchain, the total fee
and fee token, a per-type breakdown, and the quote's issue time and expiry.
<Note>
A quote is bound to the exact transfer it prices. Request the quote with the
same amount and destination domain you submit onchain. For a `FORWARD` fee, also
match the destination caller and hook data. If any bound value differs when you
submit, the transfer reverts.
</Note>
## Fee types
You can pay two types of fees upfront, one per service.
| Fee type | Service |
| - | - |
| `FORWARD` | [Forwarding Service](/cctp/concepts/forwarding-service) |
| `PRE_FINALITY` | [Fast Transfer](/cctp/concepts/fees) |
A `FORWARD` request requires a destination domain where Forwarding Service is
supported, and a `PRE_FINALITY` request requires a source blockchain available
for Fast Transfers. See
[Supported blockchains](/cctp/concepts/supported-chains-and-domains) for the
blockchains that support each service.
## Quote expiry
Each quote expires after a short, fixed window that depends on the source
blockchain. Submit the transfer before the quote expires; otherwise, request a
new quote. The following table lists the approximate expiry window for each
supported source blockchain. These values are subject to change.
| Source blockchain | Approximate quote expiry |
| - | - |
| Arbitrum | 2 minutes |
| Arc testnet | 2 minutes |
| Avalanche | 2 minutes |
| Base | 2 minutes |
| Codex | 2 minutes |
| Ethereum | 2 minutes 30 seconds |
| HyperEVM | 2 minutes |
| Ink | 2 minutes |
| Linea | 2 minutes |
| Monad | 2 minutes |
| OP Mainnet | 2 minutes |
| Plume | 2 minutes |
| Polygon PoS | 2 minutes |
| Sei | 2 minutes |
| Sonic | 2 minutes |
| Unichain | 2 minutes |
| World Chain | 2 minutes |
| XDC | 2 minutes |
A quote's expiry is either an exact wall-clock time or a source blockchain block
number. For a block-number expiry, translating it into remaining time requires
knowing the source blockchain and its live block height.
# Upfront fees for CCTP
Source: https://developers.circle.com/cctp/concepts/upfront-fees
Quote and pay CCTP Fast Transfer and Forwarding Service fees upfront on the source blockchain so the recipient receives the full transferred USDC amount.
Upfront fees let you pay CCTP Fast Transfer and Forwarding Service fees on the
source blockchain, separately from the USDC transfer, instead of having them
deducted from the transfer amount.
You request a signed quote from Circle, approve the
[`TokenMessengerWithFees`](/cctp/references/contract-interfaces#tokenmessengerwithfees)
contract to spend the USDC transfer amount plus the fee (if you're paying it in
USDC), then pay the quoted fee and submit the burn in one call to that contract
on the source blockchain. Because Circle collects the fee separately from the
USDC transfer, the recipient receives the full transferred amount.
## Benefits of paying fees upfront
By default, CCTP deducts fees from the USDC you move. Both
[Fast Transfer](/cctp/concepts/fees) and
[Forwarding Service](/cctp/concepts/forwarding-service) fees are set through the
`maxFee` parameter on the burn and taken from the transferred amount, so the
amount minted is smaller than the amount burned. The exact fee resolves at
attestation time. To deliver a specific amount, you have to burn that amount
plus the fees and account for fee variability.
Paying fees upfront changes this:
* **Deliver an exact amount without extra math.** You burn exactly the amount
the recipient receives and pay the fees separately, so you don't need to
inflate the burn to cover the Fast Transfer and Forwarding Service fees. The
recipient receives the full amount, whether the transfer uses Fast Transfer,
the Forwarding Service, or both.
* **Pay in the native gas token or USDC.** You choose whether the fee is charged
in the source blockchain's native gas token or in USDC.
* **Predictable pricing.** A signed quote fixes the fee for a short expiry
window, so you know the exact cost before you submit the transfer. Circle
honors the quote and processes the transfer at the quoted price even if fees
rise after you request it, as long as you submit before the quote expires.
# CCTP for non-USDC assets
Source: https://developers.circle.com/cctp/expanded-assets
A permissionless wrapping layer for third-party assets, built on CCTP.
CCTP for non-USDC assets is a smart contract layer built on [CCTP](/cctp) that
enables permissionless crosschain bridging of third-party assets. It reuses
CCTP's message-passing infrastructure and the Iris attestation service to move
assets across blockchains using the same attestation model that powers USDC
crosschain transfers.
<Note>
To transfer USDC across blockchains, use standard [CCTP](/cctp). USDC behavior
is unchanged.
</Note>
## Choose your integration path
The right starting point depends on your relationship to the asset.
* **Transfer a configured token**: The token is already configured (including
pre-configured tokens like EURC). No configuration required on your end.
Typical use cases: wallets, DEXs, bridge aggregators, and any app that moves
non-USDC assets between blockchains. See
[Transfer EURC from Ethereum to Arc](/cctp/expanded-assets/quickstarts/transfer-eurc-ethereum-to-arc).
* **Make your token crosschain**: You issue or control the token. Configure it
as a custom token to retain full ownership of rate limits, denylist, pause,
and upgrades. Circle has no override on custom connections. Typical tokens:
fiat-backed stablecoins, RWAs, cirBTC. See
[Configure a custom token](/cctp/expanded-assets/quickstarts/configure-custom-token).
* **Bridge an unmanaged asset**: You don't own or operate the token. Configure
it as an ownerless connection that starts without an owner and runs on
protocol defaults. Typical tokens: wrapped Ether (WETH), wrapped SOL. See
[Configure an ownerless token](/cctp/expanded-assets/quickstarts/configure-ownerless-token).
* **Issue a new token natively crosschain**: You have no existing token and want
to launch one that is crosschain from day one. The protocol deploys a
`CrossChainToken` ERC-20 and its `TokenManager` at deterministic addresses
through CREATE3, using your deployment wallet and a salt you choose. See
[Deploy a native crosschain token](/cctp/expanded-assets/quickstarts/deploy-native-crosschain-token).
## Comparison with standard CCTP
| Feature | CCTP | CCTP for non-USDC |
| - | - | - |
| Token scope | USDC | EURC and any configured ERC-20 |
| Entry contract | `TokenMessengerV2` | `CrossChainTokenService` |
| Fee model | Fee deducted from the transferred amount | Fee paid in native gas on the source blockchain |
| Forwarding | Compulsory when used | Optional; requested at quote time |
| Attestation | Iris | Iris (shared with CCTP) |
| Hooks | Yes | Yes, with atomic on-arrival execution |
| Audiences | Anyone moving USDC or EURC | Token issuers, RWA platforms, and apps integrating third-party assets |
# CCTP for non-USDC architecture
Source: https://developers.circle.com/cctp/expanded-assets/concepts/architecture
How the CCTP for non-USDC contracts work together to move non-USDC assets across blockchains.
Built on top of CCTP, this layer reuses
[`MessageTransmitterV2`](/cctp/references/contract-interfaces#messagetransmitterv2)
and [Iris](/cctp/references/attestation-verification) (Circle's attestation API)
to move arbitrary ERC-20 tokens across blockchains. Four additional contracts
handle token configuration, balance changes, and the developer-facing API.
## Components
* **`CrossChainTokenService`**: The singleton entry point on each domain.
Configures tokens, deploys remote token contracts, and routes crosschain
transfers.
* **`TokenManager`**: Deployed per token on each domain. Moves tokens (mint,
burn, lock, or unlock) and enforces per-token controls including rate limits,
max transfer amount, and pause.
* **`CrossChainToken`**: An ERC-20 with `ERC20Permit` deployed for tokens that
are natively crosschain. Holders call `crossChainTransfer` directly on the
token.
* **`CrossChainTokenExecutable`**: Optional abstract helper for destination
receivers. Integrators can implement `executeWithCrossChainToken` directly and
return `EXECUTE_SUCCESS`. See [Hooks](/cctp/expanded-assets/concepts/hooks).
## Transfer flow
The following sequence shows a transfer from a source domain to a destination
domain:
```mermaid theme={null}
sequenceDiagram
participant Sender
participant CCTS as CrossChainTokenService<br/>(source)
participant TM_S as TokenManager<br/>(source)
participant MT_S as MessageTransmitterV2<br/>(source)
participant Iris as Iris<br/>(offchain)
participant MT_D as MessageTransmitterV2<br/>(destination)
participant CCTS_D as CrossChainTokenService<br/>(destination)
participant TM_D as TokenManager<br/>(destination)
participant Recipient
Sender->>TM_S: approve(amount)
Sender->>CCTS: crossChainTransfer(tokenId, amount, ...)
CCTS->>TM_S: takeToken(sender, amount)
TM_S->>TM_S: burn or lock
CCTS->>MT_S: sendMessage(...)
MT_S-->>Iris: emit MessageSent
Iris-->>MT_D: deliver attestation
MT_D->>CCTS_D: receiveMessage(...)
CCTS_D->>TM_D: giveToken(recipient, amount)
TM_D->>Recipient: mint or unlock
```
The exact behavior at the source and destination `TokenManager` depends on the
[token's manager type](#token-manager-types).
## Component map
```mermaid theme={null}
graph TD
CCTS["CrossChainTokenServi프로젝트로 돌아가기