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

# Across: bridging

> How Corridor moves USDC between the Tempo hub, Base and Solana through Across's Swap API: quotes, approvals and deposits, fill tracking, and why the route is two hops.

Across moves value between the hub and the spokes. Corridor uses its **Swap API**, which returns ready-to-sign calldata, and tracks each deposit until a relayer fills it on the destination chain.

<Info>
  **Status.** The Across adapter (`@corridor/bridge-across`: quote, execute, deposit status, wait for fill) is built and has run against the live API. The mainnet `across.bridge` saga leg that wraps it is next on the [roadmap](/status/roadmap); testnet flows use `bridge.simulated`, which has the same interface.
</Info>

## Route shape

Across has no direct Tempo ↔ Solana route, so the hub reaches Solana in **two hops through Base**. Each hop is its own saga leg with its own compensation, and between hops the funds sit in a Corridor-owned address on Base.

<Frame caption="Fig. 03 · Mainnet topology: Tempo to Base through Across, then partners on Base and Solana, and NEAR Intents into Zcash.">
  <img className="block dark:hidden" src="https://mintcdn.com/corridorapp/2ENSYUKrUyeQFRVS/images/diagrams/chain-topology-light.svg?fit=max&auto=format&n=2ENSYUKrUyeQFRVS&q=85&s=706ec6436ef5bfd234f396c4acfdf17b" alt="Chain topology from Tempo through Across to Base, Solana, partners and Zcash" width="1200" height="560" data-path="images/diagrams/chain-topology-light.svg" />

  <img className="hidden dark:block" src="https://mintcdn.com/corridorapp/2ENSYUKrUyeQFRVS/images/diagrams/chain-topology-dark.svg?fit=max&auto=format&n=2ENSYUKrUyeQFRVS&q=85&s=9c71c3874e6a1bfc3fd6a294aa79dc0e" alt="Chain topology from Tempo through Across to Base, Solana, partners and Zcash" width="1200" height="560" data-path="images/diagrams/chain-topology-dark.svg" />
</Frame>

Paj, the naira partner, settles on Solana, so a naira payout uses **both** hops. A partner that settles on Base would be paid after one. Live quotes verified on 29 September 2026: Tempo USDC.e → Base USDC, 5 USDC in, fill \~1 s, fee ≈ $0.004; Base USDC → Solana USDC, fill ~8 s, fee ≈ $0.0006.

## API

| Environment | Base URL |
| - | - |
| Mainnet | `https://app.across.to/api` |
| Testnet | `https://testnet.across.to/api` |

<Steps>
  <Step title="Quote">
    `GET /swap/approval` with origin and destination chain ids, input and output tokens, amount in base units, depositor and recipient. Returns approval transactions, the deposit transaction, the expected output and an expiry.

    ```ts theme={"dark"}
    const q = await quote({
      env: "mainnet",
      originChainId: CHAINS.tempo, destinationChainId: CHAINS.base,
      inputToken: TOKENS.tempoPathUSD, outputToken: TOKENS.baseUSDC,
      amount: 5_000_000n, depositor: vault, recipient: relay,
    });
    ```
  </Step>

  <Step title="Execute">
    `executeEvm(sender, q)` sends any approvals, then the deposit, and returns the deposit transaction hash.
  </Step>

  <Step title="Track the fill">
    `GET /deposit/status` until the status is `filled` (with `fillTxnRef`), or `expired` / `refunded`. `waitForFill` polls with a deadline.
  </Step>
</Steps>

<Note>
  CCTP-backed routes return `quoteExpiryTimestamp: 0`. The adapter treats zero as "no expiry" rather than "already expired".
</Note>

## Compensation design

Each hop is its own leg, so if the second hop fails after the first has filled, the saga compensates the first by bridging back from Base to the hub. Because each hop books separately, the ledger always shows where the money is: on Tempo, on Base, or in flight with a deposit hash.

## Testnet findings

Across has no Tempo testnet deployment, so the Moderato demo uses `bridge.simulated`, which has the same interface: the Tempo side is real (pathUSD moves to an escrow with the reference as memo) and the far side is simulated. A live Across testnet deposit from Base Sepolia to Solana devnet ([0x782d8b52…](https://sepolia.basescan.org/tx/0x782d8b52d1278892e5215a7a72bf731fa0e205a9274f38f99e0bcb9992c76e02)) burned the USDC and completed Circle's CCTP v2 attestation, but the final Solana mint is restricted to Across's designated `destinationCaller` (its testnet relayer), which did not execute it. The mainnet run uses the same adapter. See [ADR 0007](/decisions/0007-live-bridge-first).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.