> **Can't find what you're looking for?** Use `search_docs` on the docs MCP server at `https://sdk.railnet.org/api/mcp` to find what you need.

# Staging deployments

Railnet runs its staging deployment on real mainnet chain ids, against live Aave and Morpho
liquidity. Chain `8453` under this entry point is Base mainnet, not a Base testnet, so a chain id
does not tell the environments apart. The import path does:

```ts
import { getAddresses } from '@railnetorg/railnet-sdk'          // production
import { getAddresses } from '@railnetorg/railnet-sdk/staging'  // staging
```

Each entry point has one deployment per chain, so `getAddresses(chainId)` is unambiguous within
either.

## Usage

```ts twoslash
import { getAddresses } from '@railnetorg/railnet-sdk/staging'
import { base } from 'viem/chains'

const { conduitFactory, assetRegistry, usdc, startedAtBlock } = getAddresses(base.id)
```

## What is here

| Chain | Deployment |
| --- | --- |
| Ethereum `1` | staging, alongside the production one in the root |
| Base `8453` | staging, the only Base deployment today |

Base has no production deployment yet, so `getAddresses(8453)` from the root throws.

## Picking one at runtime

An app that builds for both takes the entry point as configuration:

```ts twoslash
import { getAddresses } from '@railnetorg/railnet-sdk'
import { getAddresses as getStagingAddresses } from '@railnetorg/railnet-sdk/staging'

const lookup = process.env.RAILNET_ENV === 'staging' ? getStagingAddresses : getAddresses
```

## startedAtBlock

Every deployment carries the block it started at, where an indexer or a log scan begins.
