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

# Several chains, and Solana

> Quote every chain the relay serves from one node and one wallet.

From 0.6.0 one node quotes every chain its policy lists. Put each network under `chains:` with its own RPC,
contracts and corridors. The single-chain policy from the [runbook](/resolvers/runbook/command-line) keeps
working and counts as one chain. Each chain keeps its own inventory, open offers, daily caps and health, so
an RPC outage on one never stops the others.

```yaml policy.yaml theme={null}
node:
  name: my-desk
  region: lagos
  alert_email: ops@example.com
  relay_url: wss://relay-production-f175.up.railway.app/ws/node
  metrics_addr: 127.0.0.1:8787
  data_dir: ./data
  max_clock_skew_seconds: 20
signer:            # EVM offers, and this node's identity with the relay
  backend: keyfile
  keyfile: ./keyfile.json
solana_signer:     # Solana offers; opened with the same passphrase
  backend: keyfile
  keyfile: ./solana-keyfile.json
chains:
  - name: Base Sepolia
    chain_id: 84532
    rpc_url: "${RPC_URL}"
    contracts:
      reactor: 0x6228F9505647Df94838397A0ED03b158e3C8c59C
      validation: 0x42c1E8Aa00C0D48338494CC5a631169E4F2a4E7E
      executor: 0x64DcA68A0186c6aa632088fBE90b630e0c9D6b32
      permit2: 0x000000000022D473030F116dDEE9F6B43aC78BA3
    corridors:
      - base_token: 0xe2387F04d3858e7Cb64Ef5Ed6617f9B2fcEEAfa2   # cNGN
        quote_token: 0x036CbD53842c5426634e7929541eC2318f3dCF7e  # USDC
        base_symbol: cNGN
        quote_symbol: USDC
        base_decimals: 6
        quote_decimals: 6
        spread_bps: 40
        max_ticket_base: "5000000"
        daily_cap_base: "200000000"
        inventory_floor: { base: "1000", quote: "1" }
        rate: { oracle: true, max_age_seconds: 30 }
        offer_ttl_seconds: 90
  - name: Solana devnet
    kind: solana
    chain_id: 103
    rpc_url: https://api.devnet.solana.com
    program: PFXzwLoUsUAC1eNBGVxbgpsrhduaMFVmqLy9oge4N5n
    corridors:
      - base_token: 6RFnYruxidpR1m9L91bs8cZKjmigEpxXB2Wv2rR8m2pu   # test cNGN (Token-2022)
        quote_token: 72GtYU66mCGJV311qh12EVGyQGkAb8TJVpxSXMPSghKx  # test USDC
        base_symbol: cNGN
        quote_symbol: USDC
        base_decimals: 6
        quote_decimals: 6
        spread_bps: 50
        max_ticket_base: "5000000"
        inventory_floor: { base: "1000", quote: "1" }
        rate: { oracle: true, max_age_seconds: 30 }
        offer_ttl_seconds: 60
      - base_token: 6RFnYruxidpR1m9L91bs8cZKjmigEpxXB2Wv2rR8m2pu   # test cNGN
        quote_token: An2RV3ZgsyXspuWLY2TgmjwR5UY1iYNgymrsLCTaPpCN  # test USDT (SPL Token)
        base_symbol: cNGN
        quote_symbol: USDT
        base_decimals: 6
        quote_decimals: 6
        spread_bps: 50
        max_ticket_base: "5000000"
        inventory_floor: { base: "1000", quote: "1" }
        rate: { oracle: true, max_age_seconds: 30 }
        offer_ttl_seconds: 60
```

`policy.multichain.example.yaml` in the `panofx-node` folder is this file, complete.

## Add a Solana key

A Solana chain needs a Solana key as well. It is created under the same passphrase:

```bash theme={null}
panofx-node init --solana --keyfile ./solana-keyfile.json
```

Fund the address it prints with the Solana corridor tokens and a little SOL, then open its token accounts.
There are no approvals to send on Solana; `approve` opens the accounts instead, and needs the SOL for rent:

```bash theme={null}
panofx-node approve --policy policy.yaml
```

On Solana a taker's network fee is paid by the Panofx keeper, never by you.

## Solana notes

* **Two corridors on devnet.** cNGN/USDC and cNGN/USDT. Each pair's protocol and network fees are charged in its own dollar token. To quote USDT, add the second corridor as above and open your USDT token account with `approve`.
* **Offer lifetime.** Keep `offer_ttl_seconds` at 120 or less: the relay refuses longer offers, and a Solana transaction's blockhash expires after about a minute anyway. 60 is a good value.
* **Test tokens.** Devnet test cNGN and USDC come from the Panofx team.
* **Containers.** Pass the Solana keyfile as `PANOFX_SOLANA_KEYFILE_JSON`: the entrypoint writes it to `$PANOFX_RUNTIME_DIR/solana-keyfile.json` (default `/tmp/panofx`), which is where `solana_signer.keyfile` should point.
* **Executor overrides.** With two EVM chains in one policy, `PANOFX_EXECUTOR` is ambiguous; set `PANOFX_EXECUTOR_<chain id>` instead.
* **Chain ids.** 101 mainnet-beta, 102 testnet, 103 devnet, 104 and above for local validators. The node checks the RPC's genesis hash against the id.

The relay side of Solana settlement is under [Solana settlement](/protocol/settlement-solana).
