> ## Documentation Index
> Fetch the complete documentation index at: https://developers.circle.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Before reading these docs, install the relevant Circle Skill to get pre-loaded context — skills are LLM-optimized and cover architecture decisions, correct flows, and common pitfalls. In Claude Code: run /plugin marketplace add circlefin/skills then /plugin install circle-skills@circle. With Vercel Skills CLI: run npx skills add circlefin/skills. Available skills: use-usdc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-usdc/SKILL.md (balances, transfers, approvals on EVM and Solana); EURC has no skill — see https://developers.circle.com/stablecoins/what-is-eurc.md; bridge-stablecoin https://github.com/circlefin/skills/blob/master/plugins/circle/skills/bridge-stablecoin/SKILL.md (crosschain transfers via CCTP, USDC, EURC, and third-party assets); use-arc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-arc/SKILL.md (Arc chain config, contract deployment, USDC bridging — Arc docs: https://docs.arc.io/llms.txt); use-circle-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-circle-wallets/SKILL.md (choose wallet type); use-developer-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-developer-controlled-wallets/SKILL.md (custodial wallets for payouts and treasury); use-user-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-user-controlled-wallets/SKILL.md (embedded wallets with Web2 login); use-modular-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-modular-wallets/SKILL.md (smart contract wallets with passkeys and ERC-4337); use-gateway https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-gateway/SKILL.md (unified USDC balance, nanopayments); use-smart-contract-platform https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-smart-contract-platform/SKILL.md (deploy, interact, monitor contracts). Pair any skill with the Circle MCP server for live SDK signatures, contract addresses, and chain IDs: {"mcpServers":{"circle":{"url":"https://api.circle.com/v1/codegen/mcp"}}}.
> Read the product overview first. Each product has an overview explaining when and why to use it. Read it before quickstarts.
> Pick the right wallet type. Developer-controlled (you hold keys), user-controlled (end user holds keys via PIN/social login), or modular (smart contract wallets with passkeys). See https://developers.circle.com/wallets.md.
> Use CCTP V2 for crosschain transfers. CCTP natively transfers USDC and EURC via burn-and-mint, and supports permissionless wrapping of third-party assets via lock-and-mint. V1 is legacy; always use V2 unless V1 is specified or the chain requires it (Noble, Sui, and Aptos still require V1). Migration guide: https://developers.circle.com/cctp/migration-from-v1-to-v2.md.
> Use Bridge Kit for frontend bridging. Wraps CCTP with a simpler SDK for user-facing apps. Use CCTP directly for backend transfers.
> Gas Station vs Paymaster. Gas Station sponsors gas for Circle Wallet transactions. Paymaster lets users pay gas in USDC. Different use cases — read both overviews.
> Gateway Nanopayments for sub-cent payments. Gasless USDC micropayments down to $0.000001 via x402 and batched settlement. For pay-per-request APIs, AI agent payments, streaming.
> Look up USDC addresses per chain. Never hardcode — use https://developers.circle.com/stablecoins/usdc-contract-addresses.md.
> Prefer SDKs over raw API calls. Node.js and Python SDKs handle auth, retries, and errors.
> API key required. Bearer token in Authorization header. Testnet and mainnet use separate keys and may use different base URLs depending on the product.
> Set up webhooks when available. Most operations are async. Webhooks deliver transaction confirmations and state changes.
> When calling list endpoints, paginate using pageSize and pageAfter until no nextPageAfter cursor is returned—stopping at the first page silently misses records.
> Building an AI agent? Start with the Agent Stack—Circle CLI, agent wallets, and nanopayments built for autonomous use cases: https://developers.circle.com/agent-stack.md.

# EVM contract interfaces

> Public methods and events for CCTP smart contracts on EVM-compatible blockchains

This page documents the public methods and events exposed by CCTP smart
contracts on EVM-compatible blockchains.

## Contract responsibilities

* **TokenMessengerV2**: Entrypoint for crosschain USDC transfer. Routes messages
  to burn USDC on a source blockchain and mint USDC on a destination blockchain.
* **TokenMessengerWithFees**: Wrapper over `TokenMessengerV2` that collects the
  fee upfront from a signed quote on the source blockchain, enabling
  [upfront fees](/cctp/concepts/upfront-fees) so the full amount mints on the
  destination blockchain.
* **MessageTransmitterV2**: Generic message passing. Sends all messages on the
  source blockchain and receives all messages on the destination blockchain.
* **TokenMinterV2**: Responsible for minting and burning USDC. Contains
  blockchain-specific settings used by burners and minters.
* **MessageV2**: Provides helper functions for crosschain transfers, such as
  `bytes32ToAddress` and `addressToBytes32`, which are commonly used when
  bridging between EVM and non-EVM blockchains.

<Note>
  **Gas optimization tip:** If you're writing your own integration, it's more
  gas-efficient to
  [include address conversion logic directly in your contract](https://github.com/circlefin/evm-cctp-contracts/blob/5f1901a9791b18204e8556bb53fb0dfcb05a832a/src/messages/Message.sol#L146)
  rather than calling an external contract.
</Note>

Full contract source code is
[available on GitHub](https://github.com/circlefin/evm-cctp-contracts).

## TokenMessengerV2

### depositForBurn

Deposits and burns tokens from sender to be minted on destination domain. Minted
tokens will be transferred to `mintRecipient`.

<Note>
  **Note:** There is a \$10 million limit on the amount of USDC that can be burned
  in a single CCTP transaction. If the amount exceeds this limit, the transaction
  will revert. If you need to transfer more than this limit, break up your
  transfers into multiple transactions.

  For Fast Transfers, you should always
  [check the remaining allowance](/api-reference/cctp/all/get-fast-burn-usdc-allowance)
  before initiating a transfer to ensure there is enough to complete your
  transfer.
</Note>

**Parameters**

| Field | Type | Description |
| - | - | - |
| `amount` | `uint256` | Amount of tokens to deposit and burn |
| `destinationDomain` | `uint32` | Destination [domain ID](/cctp/concepts/supported-chains-and-domains#domain-identifiers) to send the message to |
| `mintRecipient` | `bytes32` | Address of mint recipient on destination domain (must be converted to 32 byte array, that is, prefix with zeros if needed) |
| `burnToken` | `address` | Address of contract to burn deposited tokens on local domain |
| `destinationCaller` | `bytes32` | Address as `bytes32` which can call `receiveMessage` on destination domain. If set to `bytes32(0)`, any address can call `receiveMessage` |
| `maxFee` | `uint256` | Maximum [fee](/cctp/concepts/fees) paid for transfer, specified in units of `burnToken` |
| `minFinalityThreshold` | `uint32` | Minimum [finality threshold](/cctp/concepts/finality-and-block-confirmations) at which burn will be attested |

**Example**

```solidity Solidity theme={null}
// Burn 100 USDC on Ethereum for minting on Avalanche
uint256 amount = 100 * 10**6; // 100 USDC
uint32 destinationDomain = 1; // Avalanche
bytes32 mintRecipient = bytes32(uint256(uint160(recipientAddress)));
address burnToken = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; // USDC on Ethereum
bytes32 destinationCaller = bytes32(0); // Anyone can call receiveMessage
uint256 maxFee = 1000; // 0.001 USDC max fee
uint32 minFinalityThreshold = 1000; // Fast Transfer

tokenMessenger.depositForBurn(
  amount,
  destinationDomain,
  mintRecipient,
  burnToken,
  destinationCaller,
  maxFee,
  minFinalityThreshold
);
```

### depositForBurnWithHook

Deposits and burns tokens from sender to be minted on destination domain, and
emits a crosschain message with additional hook data appended. In addition to
the standard `depositForBurn` parameters, `depositForBurnWithHook` accepts a
dynamic-length `hookData` parameter, allowing you to include additional metadata
that can trigger custom logic on the destination blockchain.

<Note>
  **Note:** There is a \$10 million limit on the amount of USDC that can be burned
  in a single CCTP transaction. If the amount exceeds this limit, the transaction
  will revert. If you need to transfer more than this limit, break up your
  transfers into multiple transactions.

  For Fast Transfers, you should always
  [check the remaining allowance](/api-reference/cctp/all/get-fast-burn-usdc-allowance)
  before initiating a transfer to ensure there is enough to complete your
  transfer.
</Note>

**Parameters**

| Field | Type | Description |
| - | - | - |
| `amount` | `uint256` | Amount of tokens to burn |
| `destinationDomain` | `uint32` | Destination domain to send the message to |
| `mintRecipient` | `bytes32` | Address of mint recipient on destination domain (must be converted to 32 byte array, that is, prefix with zeros if needed) |
| `burnToken` | `address` | Address of contract to burn deposited tokens on local domain |
| `destinationCaller` | `bytes32` | Address as `bytes32` which can call `receiveMessage` on destination domain. If set to `bytes32(0)`, any address can call `receiveMessage` |
| `maxFee` | `uint256` | Maximum fee paid for transfer, specified in units of `burnToken` |
| `minFinalityThreshold` | `uint32` | Minimum finality threshold at which burn will be attested |
| `hookData` | `bytes` | Additional metadata attached to the attested message, used to trigger custom logic on the destination blockchain |

### getMinFeeAmount

Calculates and returns the minimum fee required for a given amount in a Standard
Transfer. If the minimum fee (per unit of `burnToken`) is non-zero, the
specified `maxFee` must be at least the returned minimum fee. Otherwise, the
burn will revert onchain.

**Parameters**

| Field | Type | Description |
| - | - | - |
| `amount` | `uint256` | The amount used to compute the minimum fee. Must be greater than `1` if standard fee is applied |

### handleReceiveFinalizedMessage

Handles incoming message received by the local MessageTransmitter. For a burn
message, mints the associated token to the requested recipient on the local
domain. Validates the function sender is the local MessageTransmitter, and the
remote sender is a registered remote TokenMessenger for `remoteDomain`.

This method is called for messages where `finalityThresholdExecuted` ≥ 2000
(Standard Transfer).

**Parameters**

| Field | Type | Description |
| - | - | - |
| `remoteDomain` | `uint32` | The domain where the message originated from |
| `sender` | `bytes32` | The sender of the message (remote TokenMessenger) |
| `finalityThresholdExecuted` | `uint32` | Specifies the level of finality Circle signed the message with |
| `messageBody` | `bytes` (dynamic length) | The message body bytes |

### handleReceiveUnfinalizedMessage

Handles incoming message received by the local MessageTransmitter. For a burn
message, mints the associated token to the requested recipient on the local
domain. Similar to `handleReceiveFinalizedMessage`, but is called for messages
which are not finalized (`finalityThresholdExecuted` \< 2000) such as Fast
Transfers.

Unlike `handleReceiveFinalizedMessage`, `handleReceiveUnfinalizedMessage`
processes messages with:

* **`expirationBlock`**: If `expirationBlock` ≤ `blockNumber` on the destination
  domain, the message will revert and must be re-signed without the expiration
  block.
* **`feeExecuted`**: If nonzero, the `feeExecuted` amount is minted to the
  `feeRecipient`.

**Parameters**

| Field | Type | Description |
| - | - | - |
| `remoteDomain` | `uint32` | The domain where the message originated from |
| `sender` | `bytes32` | The sender of the message (remote TokenMessenger) |
| `finalityThresholdExecuted` | `uint32` | Specifies the level of finality Circle signed the message with |
| `messageBody` | `bytes` (dynamic length) | The message body bytes (see [Message format](/cctp/references/technical-guide#message-body)) |

## MessageTransmitterV2

### `receiveMessage`

Receives message on destination blockchain by passing message and attestation.
Emits `MessageReceived` event. Messages with a given nonce can only be broadcast
successfully once for a pair of domains. The message body of a valid message is
passed to the specified recipient for further processing.

**Parameters**

| Field | Type | Description |
| - | - | - |
| `message` | `bytes` | Encoded message (see [Message format](/cctp/references/technical-guide#message-body)) |
| `attestation` | `bytes` | Signed attestation received from Circle's attestation service |

**Example**

```solidity Solidity theme={null}
// Mint USDC on destination chain
bytes memory message = attestationData.message;
bytes memory attestation = attestationData.attestation;

messageTransmitter.receiveMessage(message, attestation);
```

### `sendMessage`

Sends a message to the recipient on the destination domain. Emits a
`MessageSent` event which will be attested by Circle's attestation service.

**Parameters**

| Field | Type | Description |
| - | - | - |
| `destinationDomain` | `uint32` | Destination domain ID to send the message to |
| `recipient` | `bytes32` | Address of recipient on destination domain |
| `destinationCaller` | `bytes32` | Address as `bytes32` which can call `receiveMessage` on destination domain. If set to `bytes32(0)`, any address can call `receiveMessage` |
| `minFinalityThreshold` | `uint32` | Minimum finality threshold requested. A value greater than 2000 is interpreted as 2000 (finalized). Thresholds: 1000 for Fast Transfer (confirmed), 2000 for Standard Transfer (finalized) |
| `messageBody` | `bytes` | application-specific message to be handled by recipient |

## TokenMessengerWithFees

### `depositForBurnWithFees`

Collects the upfront fee from a signed quote, then burns tokens to be minted on
the destination domain. Pay the quoted fee as native currency (attach it as
`msg.value`) or in USDC (approve the contract to spend the quoted fee first).

Unlike `TokenMessengerV2.depositForBurn`, this method has no `maxFee` or
`minFinalityThreshold` parameter: fees are paid upfront, and the finality
threshold is inferred from whether the quote includes a `PRE_FINALITY` fee. If
the quote includes a `FORWARD` fee, a default `cctp-forward` hook is added
automatically.

The quote binds to the call parameters, so request it with the same `amount`,
`destinationDomain`, and `burnToken` you submit here, and without custom hook
data (this method applies the default hook). Otherwise the call reverts. To
submit custom hook data, use
[`depositForBurnWithHookAndFees`](#depositforburnwithhookandfees) instead.

**Parameters**

| Field | Type | Description |
| - | - | - |
| `amount` | `uint256` | Amount of tokens to deposit and burn |
| `destinationDomain` | `uint32` | Destination [domain ID](/cctp/concepts/supported-chains-and-domains#domain-identifiers) to send the message to |
| `mintRecipient` | `bytes32` | Address of mint recipient on destination domain (must be converted to 32 byte array, that is, prefix with zeros if needed) |
| `burnToken` | `address` | Address of contract to burn deposited tokens on local domain |
| `destinationCaller` | `bytes32` | Address as `bytes32` which can call `receiveMessage` on destination domain. If set to `bytes32(0)`, any address can call `receiveMessage` |
| `claim` | `QuoteClaim` | Signed quote plus a per-call `refundAddress`. See [Input types](#input-types) |

**Example**

```solidity Solidity theme={null}
// Upfront-fee CCTP burn on Ethereum, minting the full amount on Base
uint256 amount = 100 * 10**6; // 100 USDC
uint32 destinationDomain = 6; // Base
bytes32 mintRecipient = bytes32(uint256(uint160(recipientAddress)));
address burnToken = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; // USDC on Ethereum
bytes32 destinationCaller = bytes32(0); // Anyone can call receiveMessage

// signedQuote and quotedFee come from the Quote API
// Replace refundAddress with your own address (see Input types)
address payable refundAddress = payable(0x1234567890AbcdEF1234567890aBcdef12345678);
IFeeManager.QuoteClaim memory claim = IFeeManager.QuoteClaim({
  signedQuote: signedQuote,
  refundAddress: refundAddress
});

// Pay the quoted fee in the native gas token
tokenMessengerWithFees.depositForBurnWithFees{value: quotedFee}(
  amount,
  destinationDomain,
  mintRecipient,
  burnToken,
  destinationCaller,
  claim
);
```

### `depositForBurnWithHookAndFees`

Same as `depositForBurnWithFees`, but you supply custom `hookData`. When the
quote includes a `FORWARD` fee, `hookData` must contain a valid `cctp-forward`
hook; when it doesn't include a `FORWARD` fee, `hookData` must not contain a
`cctp-forward` hook. For the hook structure, see
[Forwarding Service hook format](/cctp/concepts/forwarding-service#hook-format).

The quote binds to the call parameters, including the hook data, so request it
with the same `hookData` (and the same `amount`, `destinationDomain`,
`burnToken`, and `destinationCaller`) you submit here. A quote requested without
custom hook data is rejected by this method.

**Parameters**

| Field | Type | Description |
| - | - | - |
| `amount` | `uint256` | Amount of tokens to deposit and burn |
| `destinationDomain` | `uint32` | Destination domain to send the message to |
| `mintRecipient` | `bytes32` | Address of mint recipient on destination domain (must be converted to 32 byte array, that is, prefix with zeros if needed) |
| `burnToken` | `address` | Address of contract to burn deposited tokens on local domain |
| `destinationCaller` | `bytes32` | Address as `bytes32` which can call `receiveMessage` on destination domain. If set to `bytes32(0)`, any address can call `receiveMessage` |
| `hookData` | `bytes` | Hook data attached to the message. Must not be empty |
| `claim` | `QuoteClaim` | Signed quote plus a per-call `refundAddress`. See [Input types](#input-types) |

### `getFee`

Reads the total fee and fee token from a signed quote for the fee types this
wrapper supports (`FORWARD` and `PRE_FINALITY`). Use it to determine the amount
to attach or approve before you submit. This is a lightweight, type-based query;
signature, expiry, and payment are validated only during collection.

**Parameters**

| Field | Type | Description |
| - | - | - |
| `signedQuote` | `bytes` | Version-prefixed, ABI-encoded quote returned by the Quote API |

**Returns**

| Field | Type | Description |
| - | - | - |
| `totalFee` | `uint256` | Sum of the supported fee amounts |
| `feeToken` | `address` | Token the fees are denominated in; zero address for native currency |

### Input types

The `claim` parameter bundles a signed quote with a per-call `refundAddress`,
the address to attribute any fee refund to.

`QuoteClaim`:

| Field | Type | Description |
| - | - | - |
| `signedQuote` | `bytes` | Version-prefixed, ABI-encoded quote returned by the Quote API |
| `refundAddress` | `address` | Address to attribute any fee refund to |

<Note>
  Upfront fees aren't refunded today; the `refundAddress` field is reserved for
  potential future use. Pass an address you control so that it's already in place
  if the field is used later.
</Note>

### ABI

<Accordion title="TokenMessengerWithFees ABI">
  ```json theme={null}
  [
    {
      "type": "constructor",
      "inputs": [
        {
          "name": "tokenMessenger_",
          "type": "address",
          "internalType": "address"
        },
        { "name": "feeManager_", "type": "address", "internalType": "address" }
      ],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "UPGRADE_INTERFACE_VERSION",
      "inputs": [],
      "outputs": [{ "name": "", "type": "string", "internalType": "string" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "acceptOwnership",
      "inputs": [],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "depositForBurnWithFees",
      "inputs": [
        { "name": "amount", "type": "uint256", "internalType": "uint256" },
        {
          "name": "destinationDomain",
          "type": "uint32",
          "internalType": "uint32"
        },
        { "name": "mintRecipient", "type": "bytes32", "internalType": "bytes32" },
        { "name": "burnToken", "type": "address", "internalType": "address" },
        {
          "name": "destinationCaller",
          "type": "bytes32",
          "internalType": "bytes32"
        },
        {
          "name": "claim",
          "type": "tuple",
          "internalType": "struct IFeeManager.DecodedQuoteClaim",
          "components": [
            {
              "name": "decodedQuote",
              "type": "tuple",
              "internalType": "struct IFeeManager.Quote",
              "components": [
                {
                  "name": "items",
                  "type": "tuple[]",
                  "internalType": "struct IFeeManager.QuoteItem[]",
                  "components": [
                    {
                      "name": "quoteType",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "quoteArgsHash",
                      "type": "bytes32",
                      "internalType": "bytes32"
                    },
                    {
                      "name": "amount",
                      "type": "uint256",
                      "internalType": "uint256"
                    }
                  ]
                },
                {
                  "name": "expiry",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "feeToken",
                  "type": "address",
                  "internalType": "address"
                },
                { "name": "nonce", "type": "uint256", "internalType": "uint256" },
                { "name": "signature", "type": "bytes", "internalType": "bytes" }
              ]
            },
            {
              "name": "refundAddress",
              "type": "address",
              "internalType": "address payable"
            }
          ]
        }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "depositForBurnWithFees",
      "inputs": [
        { "name": "amount", "type": "uint256", "internalType": "uint256" },
        {
          "name": "destinationDomain",
          "type": "uint32",
          "internalType": "uint32"
        },
        { "name": "mintRecipient", "type": "bytes32", "internalType": "bytes32" },
        { "name": "burnToken", "type": "address", "internalType": "address" },
        {
          "name": "destinationCaller",
          "type": "bytes32",
          "internalType": "bytes32"
        },
        {
          "name": "claim",
          "type": "tuple",
          "internalType": "struct IFeeManager.QuoteClaim",
          "components": [
            { "name": "signedQuote", "type": "bytes", "internalType": "bytes" },
            {
              "name": "refundAddress",
              "type": "address",
              "internalType": "address payable"
            }
          ]
        }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "depositForBurnWithHookAndFees",
      "inputs": [
        { "name": "amount", "type": "uint256", "internalType": "uint256" },
        {
          "name": "destinationDomain",
          "type": "uint32",
          "internalType": "uint32"
        },
        { "name": "mintRecipient", "type": "bytes32", "internalType": "bytes32" },
        { "name": "burnToken", "type": "address", "internalType": "address" },
        {
          "name": "destinationCaller",
          "type": "bytes32",
          "internalType": "bytes32"
        },
        { "name": "hookData", "type": "bytes", "internalType": "bytes" },
        {
          "name": "claim",
          "type": "tuple",
          "internalType": "struct IFeeManager.DecodedQuoteClaim",
          "components": [
            {
              "name": "decodedQuote",
              "type": "tuple",
              "internalType": "struct IFeeManager.Quote",
              "components": [
                {
                  "name": "items",
                  "type": "tuple[]",
                  "internalType": "struct IFeeManager.QuoteItem[]",
                  "components": [
                    {
                      "name": "quoteType",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "quoteArgsHash",
                      "type": "bytes32",
                      "internalType": "bytes32"
                    },
                    {
                      "name": "amount",
                      "type": "uint256",
                      "internalType": "uint256"
                    }
                  ]
                },
                {
                  "name": "expiry",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "feeToken",
                  "type": "address",
                  "internalType": "address"
                },
                { "name": "nonce", "type": "uint256", "internalType": "uint256" },
                { "name": "signature", "type": "bytes", "internalType": "bytes" }
              ]
            },
            {
              "name": "refundAddress",
              "type": "address",
              "internalType": "address payable"
            }
          ]
        }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "depositForBurnWithHookAndFees",
      "inputs": [
        { "name": "amount", "type": "uint256", "internalType": "uint256" },
        {
          "name": "destinationDomain",
          "type": "uint32",
          "internalType": "uint32"
        },
        { "name": "mintRecipient", "type": "bytes32", "internalType": "bytes32" },
        { "name": "burnToken", "type": "address", "internalType": "address" },
        {
          "name": "destinationCaller",
          "type": "bytes32",
          "internalType": "bytes32"
        },
        { "name": "hookData", "type": "bytes", "internalType": "bytes" },
        {
          "name": "claim",
          "type": "tuple",
          "internalType": "struct IFeeManager.QuoteClaim",
          "components": [
            { "name": "signedQuote", "type": "bytes", "internalType": "bytes" },
            {
              "name": "refundAddress",
              "type": "address",
              "internalType": "address payable"
            }
          ]
        }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "function",
      "name": "feeManager",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "getFee",
      "inputs": [
        { "name": "signedQuote", "type": "bytes", "internalType": "bytes" }
      ],
      "outputs": [
        { "name": "totalFee", "type": "uint256", "internalType": "uint256" },
        { "name": "feeToken", "type": "address", "internalType": "address" }
      ],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "getFee",
      "inputs": [
        {
          "name": "decodedQuote",
          "type": "tuple",
          "internalType": "struct IFeeManager.Quote",
          "components": [
            {
              "name": "items",
              "type": "tuple[]",
              "internalType": "struct IFeeManager.QuoteItem[]",
              "components": [
                {
                  "name": "quoteType",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "quoteArgsHash",
                  "type": "bytes32",
                  "internalType": "bytes32"
                },
                { "name": "amount", "type": "uint256", "internalType": "uint256" }
              ]
            },
            { "name": "expiry", "type": "uint256", "internalType": "uint256" },
            { "name": "feeToken", "type": "address", "internalType": "address" },
            { "name": "nonce", "type": "uint256", "internalType": "uint256" },
            { "name": "signature", "type": "bytes", "internalType": "bytes" }
          ]
        }
      ],
      "outputs": [
        { "name": "totalFee", "type": "uint256", "internalType": "uint256" },
        { "name": "feeToken", "type": "address", "internalType": "address" }
      ],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "initialize",
      "inputs": [
        { "name": "owner_", "type": "address", "internalType": "address" }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "owner",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "pendingOwner",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "proxiableUUID",
      "inputs": [],
      "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "renounceOwnership",
      "inputs": [],
      "outputs": [],
      "stateMutability": "pure"
    },
    {
      "type": "function",
      "name": "tokenMessenger",
      "inputs": [],
      "outputs": [{ "name": "", "type": "address", "internalType": "address" }],
      "stateMutability": "view"
    },
    {
      "type": "function",
      "name": "transferOwnership",
      "inputs": [
        { "name": "newOwner", "type": "address", "internalType": "address" }
      ],
      "outputs": [],
      "stateMutability": "nonpayable"
    },
    {
      "type": "function",
      "name": "upgradeToAndCall",
      "inputs": [
        {
          "name": "newImplementation",
          "type": "address",
          "internalType": "address"
        },
        { "name": "data", "type": "bytes", "internalType": "bytes" }
      ],
      "outputs": [],
      "stateMutability": "payable"
    },
    {
      "type": "event",
      "name": "Initialized",
      "inputs": [
        {
          "name": "version",
          "type": "uint64",
          "indexed": false,
          "internalType": "uint64"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "OwnershipTransferStarted",
      "inputs": [
        {
          "name": "previousOwner",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "newOwner",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "OwnershipTransferred",
      "inputs": [
        {
          "name": "previousOwner",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        },
        {
          "name": "newOwner",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        }
      ],
      "anonymous": false
    },
    {
      "type": "event",
      "name": "Upgraded",
      "inputs": [
        {
          "name": "implementation",
          "type": "address",
          "indexed": true,
          "internalType": "address"
        }
      ],
      "anonymous": false
    },
    {
      "type": "error",
      "name": "AddressEmptyCode",
      "inputs": [
        { "name": "target", "type": "address", "internalType": "address" }
      ]
    },
    {
      "type": "error",
      "name": "DenylistedCaller",
      "inputs": [
        { "name": "caller", "type": "address", "internalType": "address" }
      ]
    },
    {
      "type": "error",
      "name": "ERC1967InvalidImplementation",
      "inputs": [
        { "name": "implementation", "type": "address", "internalType": "address" }
      ]
    },
    { "type": "error", "name": "ERC1967NonPayable", "inputs": [] },
    { "type": "error", "name": "EmptyHookData", "inputs": [] },
    { "type": "error", "name": "FailedCall", "inputs": [] },
    { "type": "error", "name": "ForwardFeeWithoutHook", "inputs": [] },
    { "type": "error", "name": "ForwardHookWithoutFee", "inputs": [] },
    { "type": "error", "name": "InvalidInitialization", "inputs": [] },
    { "type": "error", "name": "NotInitializing", "inputs": [] },
    {
      "type": "error",
      "name": "OwnableInvalidOwner",
      "inputs": [
        { "name": "owner", "type": "address", "internalType": "address" }
      ]
    },
    {
      "type": "error",
      "name": "OwnableUnauthorizedAccount",
      "inputs": [
        { "name": "account", "type": "address", "internalType": "address" }
      ]
    },
    {
      "type": "error",
      "name": "RemoteTokenMessengerNotSet",
      "inputs": [
        {
          "name": "destinationDomain",
          "type": "uint32",
          "internalType": "uint32"
        }
      ]
    },
    { "type": "error", "name": "RenounceDisabled", "inputs": [] },
    {
      "type": "error",
      "name": "SafeERC20FailedOperation",
      "inputs": [
        { "name": "token", "type": "address", "internalType": "address" }
      ]
    },
    { "type": "error", "name": "SignedQuoteDecodeFailed", "inputs": [] },
    {
      "type": "error",
      "name": "StringsInsufficientHexLength",
      "inputs": [
        { "name": "value", "type": "uint256", "internalType": "uint256" },
        { "name": "length", "type": "uint256", "internalType": "uint256" }
      ]
    },
    {
      "type": "error",
      "name": "TooManyQuoteItems",
      "inputs": [
        { "name": "length", "type": "uint256", "internalType": "uint256" }
      ]
    },
    { "type": "error", "name": "UUPSUnauthorizedCallContext", "inputs": [] },
    {
      "type": "error",
      "name": "UUPSUnsupportedProxiableUUID",
      "inputs": [{ "name": "slot", "type": "bytes32", "internalType": "bytes32" }]
    },
    {
      "type": "error",
      "name": "UnsupportedQuoteVersion",
      "inputs": [{ "name": "version", "type": "uint8", "internalType": "uint8" }]
    },
    { "type": "error", "name": "ZeroFeeManagerAddress", "inputs": [] },
    { "type": "error", "name": "ZeroTokenMessengerAddress", "inputs": [] }
  ]
  ```
</Accordion>

Burns through `TokenMessengerWithFees` emit the standard
[`DepositForBurn`](#depositforburn-event) and [`MessageSent`](#messagesent)
events from the underlying contracts.

## Events

<h3 id="depositforburn-event">
  DepositForBurn
</h3>

Emitted when USDC is burned on the source blockchain.

**Parameters**

| Field | Type | Indexed | Description |
| - | - | - | - |
| `nonce` | `uint64` | Yes | Unique message identifier |
| `burnToken` | `address` | Yes | Address of token burned |
| `amount` | `uint256` | No | Burn amount |
| `depositor` | `address` | Yes | Address of depositor |
| `mintRecipient` | `bytes32` | No | Mint recipient address on destination domain |
| `destinationDomain` | `uint32` | No | Destination domain identifier |
| `destinationTokenMessenger` | `bytes32` | No | Address of TokenMessenger contract on destination domain |
| `destinationCaller` | `bytes32` | No | Authorized caller of `receiveMessage` on destination domain |
| `maxFee` | `uint256` | No | Maximum fee for the transfer |
| `minFinalityThreshold` | `uint32` | No | Minimum finality threshold at which burn will be attested |

### MessageSent

Emitted when a message is sent from the source blockchain.

**Parameters**

| Field | Type | Indexed | Description |
| - | - | - | - |
| `message` | `bytes` | No | Raw bytes of message |

### MessageReceived

Emitted when a message is received on the destination blockchain.

**Parameters**

| Field | Type | Indexed | Description |
| - | - | - | - |
| `caller` | `address` | Yes | Address that called `receiveMessage` |
| `sourceDomain` | `uint32` | Yes | Source domain identifier |
| `nonce` | `uint64` | Yes | Unique message identifier |
| `sender` | `bytes32` | No | Address of message sender on source domain |
| `messageBody` | `bytes` | No | Message body |

### MintAndWithdraw

Emitted when USDC is minted on the destination blockchain.

**Parameters**

| Field | Type | Indexed | Description |
| - | - | - | - |
| `mintRecipient` | `address` | Yes | Address receiving minted USDC |
| `amount` | `uint256` | No | Amount minted |
| `mintToken` | `address` | Yes | Address of token minted |
