> **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.

# Getting Started

## Installation

:::code-group
```bash [bun]
bun add @railnetorg/railnet-sdk viem
```

```bash [pnpm]
pnpm add @railnetorg/railnet-sdk viem
```

```bash [npm]
npm install @railnetorg/railnet-sdk viem
```
:::

`viem` is a required peer dependency.

### React (optional)

If you want to use the React hooks, you'll also need `wagmi`, `@tanstack/react-query`, and `react`:

:::code-group
```bash [bun]
bun add wagmi @tanstack/react-query react
```

```bash [pnpm]
pnpm add wagmi @tanstack/react-query react
```

```bash [npm]
npm install wagmi @tanstack/react-query react
```
:::

## Usage

### Standalone Actions

Actions are standalone async functions that take a viem `Client` as first argument. No framework required.

```ts
import { createPublicClient, http } from 'viem'
import { base } from 'viem/chains'
import { getConduitPosition } from '@railnetorg/railnet-sdk'

const client = createPublicClient({
  chain: base,
  transport: http(),
})

const position = await getConduitPosition(client, {
  conduit: '0x...',
  account: '0x...',
})
```

### Client Decorator

You can also extend a viem client with all Railnet actions using the `railnetActions` decorator:

```ts
import { createPublicClient, http } from 'viem'
import { base } from 'viem/chains'
import { railnetActions } from '@railnetorg/railnet-sdk'

const client = createPublicClient({
  chain: base,
  transport: http(),
}).extend(railnetActions)

const position = await client.getConduitPosition({
  conduit: '0x...',
  account: '0x...',
})
```

### React Hooks

Hooks are built on [wagmi](https://wagmi.sh) and [TanStack Query](https://tanstack.com/query). They handle caching, re-fetching, and loading states automatically.

```tsx
import { useConduitPosition } from '@railnetorg/railnet-sdk/react'

function Position() {
  const { data, isLoading } = useConduitPosition({
    conduit: '0x...',
    account: '0x...',
  })

  if (isLoading) return <div>Loading...</div>

  return (
    <div>
      <p>Shares: {data?.shares.toString()}</p>
      <p>Assets: {data?.assets.toString()}</p>
    </div>
  )
}
```
