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

# Any token

> Tokens by address

Name an ERC-20 contract or an SPL mint as `sourceAsset` or `destinationAsset` and Orchestra routes it, whether or not the token appears in `/routes`. The token is swapped against a listed stablecoin on its own chain; everything between the two stablecoins is an ordinary route.

## Routing

```text theme={null}
source token    --swap-->   hub stablecoin
hub stablecoin  --route-->  hub stablecoin
hub stablecoin  --swap-->   destination token
```

A hub is a listed USD stablecoin on the token's chain, such as `solana:USDC` or `base:USDC`. Orchestra measures value only in hubs. Order bounds and fees are measured in the hub, and no fee is ever taken in the token, so `feeAsset` is always a stablecoin. A token never crosses chains, and two tokens on one chain still pass through a hub. Swaps price against Jupiter on Solana and a race of DEX venues on EVM chains.

## Supported chains

`GET /v2/orchestration/routes` returns `tokenSupport`, one entry per chain where your key can name tokens by address:

```json theme={null}
{
  "chain": "solana",
  "source": "any",
  "destination": "any",
  "via": ["solana:USDC", "solana:USDT"]
}
```

* `source`, `destination`: `any` accepts any token address at that end; `listed` accepts only assets in `assets`.
* `via`: the hubs on that chain. A destination token is reachable from asset A when A is a hub or A's `route.to` contains one. A source token reaches asset B when B is a hub or a hub's `route.to` contains B.

Solana accepts any token at both ends. EVM chains accept any source token; tokens by address are not yet available as EVM destinations. Availability is set per partner, so read it with the key you quote with.

To check one token, resolve its address:

```bash theme={null}
curl "https://orchestration.flashnet.xyz/v1/orchestration/assets/resolve?chain=solana&address=DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"
```

```json theme={null}
{
  "asset": {
    "chain": "solana",
    "asset": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
    "assetDisplaySymbol": "Bonk",
    "decimals": 5,
    "tokenProgram": "spl",
    "listing": "unlisted"
  },
  "destination": true,
  "source": true
}
```

`destination` and `source` say which ends your key may use the token at. An address the registry lists resolves to that listed asset instead. Name, symbol, and decimals are read from the token contract or mint. The issuer chooses the name and symbol, so show the address beside them.

## Quote

Send the address in place of the symbol. EVM addresses can be lowercase or checksummed; Solana mints are case-sensitive. 10 USDC on Solana into BONK:

```bash theme={null}
curl -X POST "https://orchestration.flashnet.xyz/v1/orchestration/quote" \
  -H "Authorization: Bearer SERVER_KEY" \
  -H "Content-Type: application/json" \
  -H "X-Idempotency-Key: $(uuidgen)" \
  -d '{
    "sourceChain": "solana",
    "sourceAsset": "USDC",
    "destinationChain": "solana",
    "destinationAsset": "DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263",
    "amount": "10000000",
    "recipientAddress": "RECIPIENT_ADDRESS"
  }'
```

<Info>
  Replace `SERVER_KEY` with your `fn_...` key. Use a new `X-Idempotency-Key` for each operation and reuse it when retrying that same request. Amounts are integer strings in the asset's smallest unit: `"100000"` is 0.001 BTC; `"50000000"` is 50 USDC on Base. Read each asset's `decimals` from `/routes`.
</Info>

Compared with a listed pair:

* Only exact-in with variable delivery. `exact_out` and `deliveryMode: "fixed"` return `unsupported_amount_mode`.
* A source token requires `refundAddress` on the source chain.
* A destination token adds `minAmountOut`, the least of the token the recipient receives, and `fallback`, what the recipient receives instead if the swap cannot reach it.
* `source` and `destination` describe each end. Read the token's `decimals` there.

Trimmed response fields:

```json theme={null}
{
  "estimatedOut": "290767382421",
  "minAmountOut": "289168888736",
  "fallback": { "chain": "solana", "asset": "USDC", "minAmount": "9990000" },
  "feeAsset": "USDC",
  "route": ["solana:USDC", "solana:DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"]
}
```

Fund and follow it like any other [quote](/orchestra/quotes).

## Outcomes

Each end has two outcomes, both fixed by the quote.

* **Source token**: sold at or above the quote's floor. If the sale cannot happen, the deposit is returned in full, in the same token, to `refundAddress`, and the order ends `refunded`.
* **Destination token**: at least `minAmountOut` reaches the recipient, or at least `fallback.minAmount` of the hub does on the destination chain. A fallback order ends `fallback_delivered` with `fallbackAsset`, `fallbackAmount`, and `fallbackTxHash`, and `amountOut` is null. Its webhook is `order.completed` with `data.status` set to `fallback_delivered`.

A refund or fallback is sent only after the swap it replaces can no longer land, so an order never pays out twice. When Orchestra cannot prove that, the order waits for an operator and reports `processing`. On Solana the swap delivers straight to the recipient, and the same transaction enforces `minAmountOut`.

## Refused tokens

Orchestra reads the token from its chain before quoting and refuses:

* tokens with more than 18 decimals;
* Solana Token-2022 mints with a transfer fee, transfer hook, pausable, default account state, interest-bearing, scaled UI amount, non-transferable, or confidential-transfer extension, or any extension it does not recognize;
* as a source, Solana mints with a freeze authority or permanent delegate, since the issuer could freeze or move the deposit while Orchestra holds it;
* tokens on the Flashnet denylist.

These return `token_unsupported` or `token_blocked`. A token with no route to or from a hub returns `insufficient_liquidity`, and order value above the cap, measured in the hub, returns `amount_too_large`. See [Errors](/api/errors#tokens-by-address).

An EVM source deposit is credited from the deposit address's balance change, not from the token's transfer events. A token that takes a fee on transfer or rebases cannot prove its deposit, so the order is held for an operator instead of sold.


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