--- title: Supported chains description: Mainnet chains, deployed contracts, and the per-chain limits that change what a quote will accept. --- import { ROUTER_ARBITRUM, ESCROW_ARBITRUM, SOLVER_ARBITRUM, PROGRAM_SOLANA, ESCROW_SOLANA, TREASURY_SOLANA, PACKAGE_SUI, ESCROW_SUI, TREASURY_SUI, CHAIN_ID_ARBITRUM, MAX_GAS_DROP_ARBITRUM, MAX_GAS_DROP_SOLANA, MAX_GAS_DROP_SUI, } from "/snippets/vars.mdx"; Hular runs on mainnet only. Chain names are lowercase strings in every request and response. The chains currently deployed are `arbitrum`, `solana`, and `sui`; `ethereum` and `base` are recognized names in the protocol but are not enabled right now, and `GetChains` is the source of truth for what is live. | Chain | Chain id | Native | Escrow | Solver | Router | | --- | --- | --- | --- | --- | --- | | `arbitrum` | {CHAIN_ID_ARBITRUM} | ETH | {ESCROW_ARBITRUM} | {SOLVER_ARBITRUM} | {ROUTER_ARBITRUM} | | `solana` | none | SOL | {ESCROW_SOLANA} | {TREASURY_SOLANA} | {PROGRAM_SOLANA} | | `sui` | none | SUI | {ESCROW_SUI} | {TREASURY_SUI} | {PACKAGE_SUI} | On EVM chains there are three contracts. `HularEscrow` receives every deposit (plain `depositToken` and `depositNative` calls land here) and pays refunds; its funds move to the solver only after the deposit settles past the deep-reorg check. `HularSolver` holds the operator float and pays fulfillments, gas drops, and voucher redemptions; only the solver can pull from the escrow, and only its registered executors can trigger that pull. `HularRouter` carries the swap, permit, permit2, and gasless entry points and forwards the funds into the escrow. `GetChains` returns the router as `router`; the quote's `router_address` is the contract that specific quote deposits into. On Solana the program id carries every instruction. Deposits pay into the escrow, a program-derived account ({ESCROW_SOLANA}), and fulfillments pay out of the treasury {TREASURY_SOLANA}, returned as `treasury` by `GetChains`. On Sui a single Move package carries every entry function, and one shared escrow object created at publish holds the deposit float, the referral voucher float, and the settlement markers. Deposits call `deposit` on the package with the escrow object; fulfillments pay out of the treasury address, which holds the operator float as an address balance. `GetChains` returns the package id as `router`, the escrow object id as `escrow`, and the treasury address as `treasury`. The only accepted token on Sui is native USDC, and it is identified by its full coin type string rather than an address. Use the `router_address` returned on the quote rather than a hardcoded address. A plain cross-chain deposit binds to the escrow, a same-chain swap binds to the router, and the quote hash was priced against exactly one of them. ## Availability is runtime state A chain being listed here does not mean it is currently open for quoting. Quoting, indexing, and relaying are toggled per chain, and `GetChains` is the source of truth: ```ts const { chains } = await hular.getChains({}); const quotable = chains.filter((c) => c.quoteEnabled).map((c) => c.chain); ``` | Field | Meaning | | --- | --- | | `quote_enabled` | The chain can appear as a source or destination on a new quote. | | `indexer_enabled` | Deposits on the chain are being ingested. | | `relayer_enabled` | Destination payouts on the chain are being submitted. | | `last_indexed_at` | Timestamp the indexer last advanced. A stale value means deposits are not being picked up right now. | | `gasless` | Gasless deposits are available with the chain as source. | | `vm` | `evm`, `svm`, or `sui`. Which wallet family and deposit path the chain uses. | Build chain selectors from `quote_enabled` instead of a static list, and the selector stays correct when a chain is paused for maintenance. ## Gas drop ceilings The maximum native asset that can be delivered with a fulfillment, in base units of the destination chain's native asset. `GetChains` returns the live value as `max_gas_drop`. | Chain | Ceiling | Unit | | --- | --- | --- | | `arbitrum` | {MAX_GAS_DROP_ARBITRUM} | wei | | `solana` | {MAX_GAS_DROP_SOLANA} | lamports | | `sui` | {MAX_GAS_DROP_SUI} | MIST | See [Gas drop](/concepts/gas-drop). ## Confirmations Required confirmations are set per chain and scale with trade size in USD. They are not a constant you can hardcode: read `required_confirmations` and `src_confirmations` from the order returned by `GetOrder` and show progress from those two numbers. ## Tokens Token support is per chain and served by the catalog, not fixed here. `ListTokens` returns every quotable token with its chain, address, decimals, tier, and whether it supports EIP-2612 permit. See [Token catalog](/integration/tokens).