USDC on the wrong chain? How to rebalance across networks before a payout

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.

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 let payouts draw USDC from Ethereum, Polygon, Base, Arbitrum, Tempo, Arc, Stellar, and Solana. Does the network change your off-ramp 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 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 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). 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).

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). The transfer object tracks both legs:

Tracking objectWhat it tracks on a cross-chain move
tracking_transaction_monitoringBlindPay's compliance screening of the transfer
tracking_bridge_swapThe burn on the source chain
tracking_completeThe mint on the destination chain
tracking_paymasterReserved, 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).

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.

MoveHow it works
USDC, Base to PolygonCross-chain transfer through CCTP v2
USDC, Arbitrum to ArcCross-chain transfer through CCTP v2
USDC, same networkSame-network transfer, 1:1, no BlindPay fee
USDTSame-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). 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.

LineValue
request_amount1000000 (10,000.00 USDC in minor units)
receiver_amount on the quote10,000.00 USDC
BlindPay fee0.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.

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 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 have the request body.

FAQ