---
title: Catalog and chains
description: Discovering quotable tokens, token metadata, and per-chain status and limits.
---
## ListTokens
```
rpc ListTokens(ListTokensRequest) returns (ListTokensResponse)
```
Every quotable token across every chain. Takes no arguments.
See [CatalogToken](/api-reference/types#catalogtoken).
Cache per page load. The list changes when the operator lists or delists a token.
## GetTokenInfo
```
rpc GetTokenInfo(TokenInfoRequest) returns (TokenInfo)
```
Metadata for one token.
Chain name, lowercase.
Token address on that chain.
Chain name.
EVM chain id. Absent for Solana.
Token address.
Display symbol.
Base-unit exponent.
Icon URL. Optional.
Metadata is read live from the chain (the ERC-20 contract on EVM, the mint account on Solana), so it also resolves addresses that are not in the catalog. A token outside the catalog still is not quotable. When the chain read fails, the call returns `UNAVAILABLE` with `could not read token info from the chain` rather than guessing.
## GetChains
```
rpc GetChains(GetChainsRequest) returns (ChainsResponse)
```
Live per-chain status, limits, and display data. Takes no arguments. This is the source of truth for what is currently open.
See [ChainStatus](/api-reference/types#chainstatus).
The fields integrations use most:
| Field | Use |
| --- | --- |
| `quote_enabled` | Whether the chain can appear on a new quote. Build selectors from this. |
| `max_gas_drop` | Ceiling for `gas_drop` on this destination, in native base units. |
| `native_symbol`, `native_decimals` | Render native amounts without a second source. |
| `explorer_tx_url`, `explorer_address_url` | Templates with `{tx}` and `{address}` placeholders. |
| `treasury` | Deposit target on Solana. |
| `rpc_url` | Public RPC the SDK uses for balance and allowance reads. |
| `router` | The `HularRouter` contract on EVM chains, used for permit and gasless deposits. |
| `gasless` | Whether gasless deposits are available from this chain. |
| `vm` | `evm` or `svm`, for choosing the wallet family and deposit path. |
| `last_indexed_at` | Freshness of deposit ingestion. |
| `logo_url` | Chain icon. |
```ts
const { chains } = await hular.getChains({});
const open = chains.filter((c) => c.quoteEnabled);
```
`indexer_enabled` and `relayer_enabled` describe the settlement path rather than quoting. A chain with quoting off still settles orders already in flight.