ArcrossDocumentation

Arcross

A self-custodial bridge for native USDC between Solana and Arc, built on Circle Gateway. You sign every transaction. The app holds no keys and never takes custody of your funds.

01

Overview

Arcross moves USDC between Solana mainnet and Arc, Circle's USDC-native L1, in either direction. It is a thin, self-custodial interface over Circle Gateway: the app prepares transactions and messages, your wallet signs them, and Circle's contracts settle them.

What arrives is native USDC, not a wrapped or bridge-issued representation. There is no wrapper token, no synthetic claim and no third-party liquidity pool in the path. The USDC you hold on the destination chain is the same asset Circle issues everywhere else, and it is redeemable and composable exactly like any other native USDC.

The app is non-custodial in the strict sense: at no point does it hold a key, an approval over your balance, or a position from which it could move your funds. Every movement is authorized by a signature you produce in your own wallet, over a payload shown to you first.

AssetNative USDCBoth sides. 6 decimals. Not wrapped.
CustodyYoursNo app custody, no app keys, no admin key over funds.
TransportCircle GatewayCircle attests the transfer and mints on the destination.
Service fee2.00%Shown in full before you sign. Plus Gateway's own fee.
02

How it works

A transfer is four steps. Two of them are on-chain transactions, one is a signature over a message, and one is a request to Circle. The app shows each step as it completes, with a link to the resulting transaction.

  1. 1

    Deposit

    Your USDC moves into Circle's GatewayWallet on the source chain.

    From Solana this is a single transaction that funds the service fee transfer and the Gateway deposit together. From Arc it is an ERC-20 approval (only when the existing allowance is short) followed by deposit into the GatewayWallet contract.

    The deposit credits a unified Gateway balance attributed to your address on the source domain. Before depositing, the app reads that balance and reduces or skips the deposit if it is already covered.

  2. 2

    Sign

    You sign a burn intent authorizing Circle to move a specific amount to a specific destination.

    On Arc the intent is an EIP-712 typed message under the GatewayWallet domain. On Solana it is a binary struct signed Ed25519 by your wallet. Either way the signature covers the amount, the source and destination domains, and the destination recipient.

    This is a signature over a message, not a transaction. It costs no gas and broadcasts nothing.

  3. 3

    Attest

    Circle Gateway validates the intent and returns a signed attestation.

    Gateway checks that the signature is valid, that the deposited balance covers the amount, and that the intent has not been spent. It answers with an attestation that the destination minter will accept. An intent that is malformed or unfunded is rejected here and nothing moves.

  4. 4

    Mint

    gatewayMint on the destination chain credits native USDC to the recipient.

    Circle's forwarder can submit this call and pay for it, so you do not need gas on the destination chain. If the forwarder path is unavailable, the app falls back to submitting gatewayMint from your own connected wallet on that chain.

    Timing is dominated by the source deposit reaching chain finality. Once it has and the intent is signed, attestation and mint typically land within seconds.

Timing

End to end, the source deposit needs chain finality before Gateway will attest against it. Once it is final, the mint on the far side lands in seconds.

03

Fees

Total cost to you is two components: the Arcross service fee of 2.00%, and Circle Gateway's own network fee for carrying the transfer. Nothing else is added anywhere in the flow.

Service fee mechanics

The service fee is 2.00% of the amount, which is 200 basis points, computed in integer arithmetic on 6-decimal base units and floored:

fee = amount * 2 / 100   (integer division, floors)
net = amount - fee

Because the fee floors and the net is the exact remainder, fee plus amount received always equals the amount sent, to the last unit of 6-decimal precision. There is no rounding residue, and any sub-unit remainder from the floor operation goes to you rather than to the fee. The same function that produces these numbers on screen is the one that produces the amounts inside the transaction.

Worked examples

Computed at page render by the production fee function. All figures in USDC.
Amount sentFee (2.00%)You receive
100.002.0098.00
1,000.0020.00980.00
10,000.00200.009,800.00
25.3333330.50666624.826667

The last row is deliberately awkward. 25.333333 at exactly 2.00% is 0.75999999, which is finer than USDC can represent, so the fee floors to 0.506666 and the remainder stays in the 24.826667 you receive. Fee and net still sum to the amount sent, to the unit.

Gateway network fee

Circle Gateway charges its own fee for the transfer, deducted by Circle and independent of the service fee. The app authorizes at most 2.01 USDC per burn intent for it, and the amount actually taken is at or below that cap. This fee is close to fixed rather than proportional, which is why very small transfers are uneconomic.

How the fee is collected

The service fee is deducted from the amount you send, in USDC, inside the same flow you authorize. When the source is Solana it moves as a token transfer in the same transaction as the Gateway deposit. When the source is Arc it moves as a second burn intent, signed alongside the first and settled with it.

No silent fees

The amount, the fee and the amount you receive are displayed before you sign, on every transfer, and they update as you type. The fee is never taken silently, and there is no path in the app that charges more than the figure shown.

04

Security and trust model

The honest version of a trust model names what you are trusting, not just what is safe. Here is both.

What the app cannot do

  • It cannot hold your funds. There is no app-controlled account or escrow in the path. Deposits go into Circle's GatewayWallet, credited to your own address.
  • It cannot move your funds. It holds no private key, no seed and no session that could sign for you. Every transfer, deposit and intent is authorized by a signature made in your wallet.
  • It has no admin key, upgrade key or pause switch over user funds, because it deploys no contract that holds them.
  • It cannot reverse or claw back a settled transfer. Neither can anyone operating it.

The one privileged thing the server does

Arc mainnet is in soft launch, and Gateway requires a private-mainnet access header on every API call. That header must not ship to the browser, so calls are proxied through this app's server, which adds the header and forwards the request.

That proxy is deliberately dull:

  • It accepts POST only, on a fixed whitelist of Gateway paths (transfer, balances, estimate), with a request size cap.
  • It adds one header and forwards. It does not construct intents, alter amounts, choose recipients or sign anything.
  • It never sees, receives or stores a private key, and it does not log request bodies.

A proxy that relays an already-signed intent cannot redirect your money: the destination and amount are inside the payload your wallet signed, and tampering with either invalidates the signature.

What you are trusting

  • Circle. The Gateway contracts and programs on both chains, and the attestation service that signs transfers. Circle is the party that mints the destination USDC and the party that could decline to attest.
  • This frontend. That it constructs burn intents correctly: the right domains, the right amounts, and your destination encoded correctly. A malformed intent is rejected at attestation rather than misrouted, but the destination address you type is used verbatim.
  • Your wallet and your device. Signing is only as safe as the software you sign with. Read what your wallet shows you before you approve it.
05

Networks and addresses

Two chains, two Gateway domains. Verify any address you care about against Circle's own documentation before you rely on it.

ArcCircle L1 · Mainnet
Chain ID
5042
Gateway domain
26
Native gas
USDC
USDC (ERC-20)
0x3600000000000000000000000000000000000000
SolanaMainnet beta
Gateway domain
5
Native gas
SOL
USDC mint
EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
Recipient
USDC associated token account
Explorer
solscan.io

Circle Gateway contracts and programs

GatewayWallet, Arc
0x77777777Dcc4d5A8B6E418Fd04D8997ef11000eE
GatewayMinter, Arc
0x2222222d7164433c4C09B0b0D809a9b52C04C205
GatewayWallet, Solana
GATEwy4YxeiEbRJLwB6dXgg7q61e6zBPrMzYj5h1pRXQ
GatewayMinter, Solana
GATEm5SoBJiSw1v2Pz1iPBgUYkXzCUJ27XSXhDfSyzVZ

Deposits are held by the GatewayWallet on the source chain. The mint on the destination chain is executed by the GatewayMinter against a signed Circle attestation.

06

FAQ

Do I need gas on the destination chain?

Usually not. The mint is requested with Circle's forwarder enabled, which submits the destination transaction and pays for it, so a wallet with no native balance on the far side can still receive.

If the forwarder path is unavailable the app falls back to submitting gatewayMint from your own wallet, and then you do need gas there: USDC on Arc, since Arc's native gas is USDC, or a small amount of SOL on Solana.

Is this wrapped USDC?

No. Both sides are native USDC issued by Circle. There is no wrapper contract, no synthetic representation, and no third-party liquidity pool standing between the two chains. Your source balance is burned from the Gateway balance and native USDC is minted to you on the destination.

What happens if a step fails partway through?

Nothing is lost and nothing is stuck with this app, because this app never holds it. A completed deposit stays credited to your address in Circle's GatewayWallet on the source chain. An attestation that was issued but not yet minted can be minted afterwards.

Every step is idempotent and safe to retry. Re-running the flow reads your existing Gateway balance first and will not deposit twice.

Can I bridge to an address I do not control?

Yes. The destination is a field you fill in, and it does not have to match a connected wallet. Nothing checks that you own it, and a settled transfer cannot be recalled, so verify the address before signing.

For Solana destinations the credited account is the recipient's USDC associated token account. The app creates it idempotently if it does not exist yet, paid by your Solana wallet.

Is there a minimum amount?

There is no protocol minimum, but economics impose one. Circle Gateway charges its own per-transfer fee that is independent of the service fee, and the app authorizes up to 2.01 USDC per burn intent for it. On a very small transfer that fixed cost dominates, so small transfers are uneconomic rather than blocked.

The service fee floors to whole 6-decimal units, so on amounts below 0.000034 USDC it rounds to zero.

How long does a transfer take?

The slow part is the source deposit reaching finality on its own chain. After that, Gateway attestation and the destination mint are a matter of seconds, and the app reports each step as it lands with a link to the transaction.

Who can pause, censor or reverse a transfer?

Not this app. It has no admin key over your funds, no pause switch, and no privileged position in settlement. Once you have signed a burn intent, settlement is between you and Circle's contracts.

Circle operates the Gateway contracts and the attestation service and is therefore the party that could decline to attest an intent or halt minting. That is a real dependency and it is stated plainly in the trust model above.

Is the 2.00% fee ever hidden?

No. Amount, fee and the amount you receive are on screen before you authorize anything, recalculated on every keystroke by the same function that builds the transaction. There is no spread and no exchange rate to mark up, because USDC to USDC is one to one.

If a figure is not shown to you before you sign, it is not being charged by this app.