---
title: "USDC on the wrong chain? How to rebalance across networks before a payout"
seoTitle: "How to move USDC between chains before a payout"
description: "Your USDC sits on one network and the payout needs another. How cross-chain USDC transfers work, which routes exist, the cost, and how long they take."
date: "2026-10-09"
updated: "2026-10-09"
category: "payments"
author: "BlindPay Team"
howto:
  name: "How to move USDC to another network before a payout"
  steps:
    - name: "Check the route"
      text: "Confirm the source wallet's network and the destination network are both on the cross-chain route set: Ethereum, Polygon, Base, Arbitrum, and Arc. Cross-chain moves are USDC to USDC only. Any other token stays on its own network."
    - name: "Create a transfer quote"
      text: "Call POST /v1/instances/{instance_id}/transfer-quotes with the managed wallet_id, amount_reference, request_amount in minor units, sender_token and customer_token set to USDC, customer_network set to the destination chain, and customer_wallet_address. The quote expires in 5 minutes."
    - name: "Execute the transfer"
      text: "Call POST /v1/instances/{instance_id}/transfers with the transfer_quote_id and an Idempotency-Key header, so a retry can't start a second move. Executing an expired quote returns quote_expired."
    - name: "Wait for the mint, then quote the payout"
      text: "Watch tracking_bridge_swap for the burn and tracking_complete for the mint. Once the transfer is completed, request the payout quote with network set to the destination chain."
faq:
  - q: "Can I move USDC from one blockchain to another with BlindPay?"
    a: "Yes. A transfer from a managed wallet can deliver USDC to a different network using Circle's Cross-Chain Transfer Protocol v2. The supported networks are Ethereum, Polygon, Base, Arbitrum, and Arc on production. The USDC is burned on the source chain and minted on the destination chain once Circle attests the burn."
  - q: "How long does a cross-chain USDC transfer take?"
    a: "BlindPay's docs put cross-chain transfers at typically 8 to 20 seconds, and transfers sourced from Polygon at around 8 seconds. That's fast enough to rebalance right before a payout run, but still do it before you request payout quotes, since each payout quote expires 5 minutes after creation."
  - q: "Does a cross-chain transfer cost anything?"
    a: "BlindPay adds no fee on a transfer, and the quote stays 1:1, so receiver_amount equals request_amount. Circle's protocol deducts its own small fee from the amount minted on the destination chain, and that fee is not shown in any quote field. Check the destination balance before quoting a payout for the full amount."
  - q: "Can I move USDT across chains the same way?"
    a: "Cross-chain transfers are USDC to USDC. For USDT, sender_token and customer_token must match and the destination network must equal the source wallet's network. To fund a payout on a different network with USDT, hold the float on the network you plan to pay out from."
  - q: "Do I need to bridge before every payout?"
    a: "No. Payout quotes accept USDC from Ethereum, Polygon, Base, Arbitrum, Tempo, Arc, Stellar, and Solana, so most teams quote from wherever the balance already sits. Rebalance when one network's balance runs low, when you consolidate float, or when a specific wallet or rail setup expects funds on a given chain."
---

To move USDC to another chain before a payout, create a transfer quote from a managed wallet with the destination network, execute the transfer, and wait for the mint. BlindPay routes cross-chain USDC through Circle's CCTP v2 across Ethereum, Polygon, Base, Arbitrum, and Arc, typically in 8 to 20 seconds, with no BlindPay fee.

Treasury balances drift. Customers pay you on Base, a partner sends on Polygon, and your payout float ends up split across three networks. This guide covers when rebalancing is worth it, how the transfer works, and the one fee that doesn't show up in the quote.

**Key takeaways**

- Cross-chain moves are USDC only, on Ethereum, Polygon, Base, Arbitrum, and Arc.
- The transfer quote is 1:1. BlindPay adds no fee, and `receiver_amount` equals `request_amount`.
- Circle deducts a small fee from the minted amount. It isn't in any quote field.
- Cross-chain transfers typically settle in 8 to 20 seconds.
- The source is always a managed wallet. The destination can be any address on the target network.

## Why would your USDC be on the wrong chain?

Because every inflow picks its own network. A customer on-ramps to Base, a client pays you on Ethereum, and your payout script was written for Polygon. None of this is wrong. It just fragments the float.

Most of the time you don't need to move anything. A payout quote is priced for the `network` you send from, and BlindPay's [supported chains](/docs/kb/supported-chains) let payouts draw USDC from Ethereum, Polygon, Base, Arbitrum, Tempo, Arc, Stellar, and Solana. [Does the network change your off-ramp quote?](/resources/more/does-network-change-offramp-quote) covers what moves in the quote when you switch.

Rebalancing pays off in three cases:

1. **One network runs dry.** Payouts on Polygon need 50,000 USDC and Polygon holds 12,000.
2. **You consolidate float.** One balance is easier to size and monitor than four. [How much stablecoin float you need](/resources/more/how-much-stablecoin-float-for-payouts) assumes you know where it sits.
3. **Gas and confirmation time.** Some networks cost more to send from or confirm slower. [Which network to off-ramp from](/resources/more/best-network-to-off-ramp-stablecoins) compares them.

## How does a cross-chain USDC transfer work?

It burns USDC on one chain and mints it on another. Circle describes CCTP as natively transferring USDC across blockchains using burn-and-mint ([Circle](https://developers.circle.com/cctp)). No wrapped token, no liquidity pool, no bridge IOU. The USDC on the destination chain is native USDC, issued by Circle, which publishes its contract address on each network ([Circle](https://developers.circle.com/stablecoins/usdc-contract-addresses)).

On BlindPay, you don't call CCTP yourself. You create a transfer quote with a `customer_network` that differs from the source wallet's network, and BlindPay handles the burn, the attestation, and the mint ([transfer quotes](/docs/transfer-quotes)). The transfer object tracks both legs:

| Tracking object | What it tracks on a cross-chain move |
| --- | --- |
| `tracking_transaction_monitoring` | BlindPay's compliance screening of the transfer |
| `tracking_bridge_swap` | The burn on the source chain |
| `tracking_complete` | The mint on the destination chain |
| `tracking_paymaster` | Reserved, stays `on_hold` today |

The transfer `status` moves from `processing` to `completed`, or to `failed` or `refunded` if the send doesn't go through ([transfers](/docs/transfers)).

## Which routes and tokens can you move?

USDC only, between the networks on the CCTP v2 route set. On production that's Ethereum, Polygon, Base, Arbitrum, and Arc. Development instances use the matching testnets with real testnet USDC, not USDB, because CCTP can only move native USDC.

| Move | How it works |
| --- | --- |
| USDC, Base to Polygon | Cross-chain transfer through CCTP v2 |
| USDC, Arbitrum to Arc | Cross-chain transfer through CCTP v2 |
| USDC, same network | Same-network transfer, 1:1, no BlindPay fee |
| USDT | Same-network transfer only: `customer_network` must match the source wallet |

Two errors tell you a route won't work. `cross_chain_transfers_only_support_usdc` means you asked to move a non-USDC token across networks. `cctp_route_not_supported` means the network pair isn't on the route set. Both come back at quote time, before anything moves.

Transfers have to be enabled on your instance, and the caller needs the transaction-create permission: `owner`, `admin`, `finance`, `checker`, or `operations`.

## What does a cross-chain transfer cost?

Nothing from BlindPay. The transfer quote is 1:1: `sender_amount` and `receiver_amount` both equal `request_amount`, and `flat_fee` is `0`. Fun detail: `commercial_quotation` reads `100` on transfers, a fixed placeholder, because there's no FX conversion.

Circle charges separately. Its CCTP fee page says standard transfers are free, fast transfers cost 0 to 13 basis points depending on the source chain, and the fee is deducted from the transferred amount when USDC is minted on the destination blockchain ([Circle](https://developers.circle.com/cctp/concepts/fees)). BlindPay's docs describe the deduction as small, typically a fraction of a cent up to a few cents, and note it does not appear in `receiver_amount` or any other quote field.

That last part is the trap. Your quote says 10,000.00 USDC. The wallet receives a hair less.

## Illustrative example: how much lands after moving 10,000 USDC?

You hold 40,000 USDC on Base and need 10,000 on Polygon for a payout run. Assume an illustrative Circle fee of 1 basis point on this route.

| Line | Value |
| --- | --- |
| `request_amount` | 1000000 (10,000.00 USDC in minor units) |
| `receiver_amount` on the quote | 10,000.00 USDC |
| BlindPay fee | 0.00 USDC |
| Illustrative Circle fee (10,000 x 0.0001) | 1.00 USDC |
| USDC minted on Polygon (10,000.00 - 1.00) | 9,999.00 USDC |
| Base balance after (40,000.00 - 10,000.00) | 30,000.00 USDC |

If your payout batch needs exactly 10,000.00 USDC on Polygon, move a little extra, or read the destination balance after the mint and size the payout quotes from that. Don't size them from the transfer quote.

## How long does it take, and when should you rebalance?

BlindPay's docs say cross-chain transfers typically settle in 8 to 20 seconds, and transfers sourced from Polygon in around 8 seconds either way. Fast, but sequence it right:

1. Rebalance first. Execute the transfer and wait for `completed`.
2. Then quote. Each payout quote expires 5 minutes after creation, so don't burn that window waiting on a mint.
3. Then execute the payouts, one quote per payout, as in [batch payouts with live quotes](/resources/more/batch-stablecoin-payouts-live-quotes).

Transfer quotes also expire in 5 minutes, fixed. Execute right after creating one, and send an `Idempotency-Key` header (up to 255 characters, kept for 24 hours) so a network retry returns the original transfer instead of starting a second one. If you're new to reading quote fields, [how to read an FX quote](/resources/more/how-to-read-an-fx-quote) explains `commercial_quotation` and `blindpay_quotation`.

One more constraint worth knowing: the source of any transfer is a BlindPay managed wallet (`bl_...`). Managed wallets are in beta and custodial. The destination can be any address on the target network, including an external wallet you control.

## What to do next

On a development instance, create a managed wallet on Base Sepolia, fund it with testnet USDC, and request one transfer quote with `customer_network` set to Polygon Amoy. Check `receiver_amount`, then compare it with what actually lands. The [transfer quotes docs](/docs/transfer-quotes) have the request body.
