> ## 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.

# How-to: Transfer USDC from Arbitrum to HyperCore with CctpExtensionV2

> Submit a gas-sponsored CCTP deposit to HyperCore using EIP-3009 and a relayer.

Submit a gas-sponsored CCTP deposit from Arbitrum to HyperCore using the
`CctpExtensionV2` contract. This workflow suits users who hold USDC on Arbitrum
but lack native gas tokens. A relayer submits the Arbitrum transaction on their
behalf.

For self-custody integrators who pay their own gas, use
[Transfer USDC from Arbitrum to HyperCore](/cctp/howtos/transfer-usdc-from-arbitrum-to-hypercore)
with `CctpExtension` instead.

For background on the contract, see
[CctpExtensionV2 Contract Interface](/cctp/references/cctp-extension-v2-contract-interface).

## Prerequisites

Before you begin, ensure that you've:

* Deployed or operate a relayer that can submit transactions on Arbitrum and pay
  ETH gas
* Collected an EIP-3009 `ReceiveWithAuthorization` signature from each depositor
* Identified the `CctpExtensionV2` proxy address for your environment (see
  [HyperCore contract addresses](/cctp/references/hypercore-contract-addresses))
* Configured CCTP deposit parameters for HyperCore (HyperEVM domain `19`,
  `CctpForwarder` as `mintRecipient` / `destinationCaller`, and forwarder hook
  data for the HyperCore recipient)

## Steps

### Step 1. Collect the user's EIP-3009 signature

The user signs `ReceiveWithAuthorization` with:

* `from`: depositor address
* `to`: `CctpExtensionV2` proxy address
* `value`: total USDC amount covered by this authorization
* `validAfter` / `validBefore`: authorization time window
* `nonce`: deterministic value equal to
  `keccak256(abi.encode(from, amount, validAfter, validBefore, depositData))`,
  where `depositData` is the ABI-encoded `SponsoredDepositForBurnData` struct
  for this deposit

Binding the nonce to `depositData` prevents a relayer from redirecting funds to
a different destination or fee configuration than the user signed.

### Step 2. Submit the deposit via your relayer

Call `batchSponsorDepositForBurn` on the `CctpExtensionV2` proxy with:

* `_authData`: `ReceiveWithAuthorizationDataWithFrom[]` (includes explicit
  `from`)
* `_depositData`: `SponsoredDepositForBurnData[]` with CCTP fields aligned to
  your HyperCore destination

Use the same forwarder hook encoding as
[Transfer USDC from Arbitrum to HyperCore](/cctp/howtos/transfer-usdc-from-arbitrum-to-hypercore).

You may batch multiple users in one transaction. Entries with an
already-consumed nonce or insufficient balance are skipped
(`SponsoredDepositForBurnSkipped` event) without reverting the whole batch.

### Step 3. Monitor the crosschain transfer

After the Arbitrum transaction confirms, Circle's attestation service picks up
the burn event. The `CctpForwarder` on HyperEVM receives the minted USDC and
routes it to the HyperCore recipient via the forwarder hook.

No special handling is required beyond standard CCTP and forwarder monitoring.
For details, see [CCTP on HyperCore](/cctp/concepts/cctp-on-hypercore).
