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

# Query options

Every read hook is built on a `*QueryOptions` function from `@railnetorg/railnet-sdk/react`. Spread
it into `useQuery` for a custom `staleTime`, into `queryClient.prefetchQuery` in a route loader,
or into `useQueries`. Every hook resolves the public client for its `chainId`, and its query stays
disabled while no client is available.

| Hook | Options | Key | Prefix |
| --- | --- | --- | --- |
| [`useAccountListStatus`](/react/useAccountListStatus) | `accountListStatusQueryOptions` | `accountListStatusQueryKey` | `accountListStatusQueryPrefix` |
| [`useConduitInfo`](/react/useConduitInfo) | `conduitInfoQueryOptions` | `conduitInfoQueryKey` | `conduitInfoQueryPrefix` |
| [`useConduitInterceptions`](/react/useConduitInterceptions) | `conduitInterceptionsQueryOptions` | `conduitInterceptionsQueryKey` | `conduitInterceptionsQueryPrefix` |
| [`useConduitPosition`](/react/useConduitPosition) | `conduitPositionQueryOptions` | `conduitPositionQueryKey` | `conduitPositionQueryPrefix` |
| [`useDepositConduitCall`](/react/useDepositConduitCall) | `depositConduitCallQueryOptions` | `depositConduitCallQueryKey` | `depositConduitCallQueryPrefix` |
| [`useEstimateConduit`](/react/useEstimateConduit) | `estimateConduitQueryOptions` | `estimateConduitQueryKey` | `estimateConduitQueryPrefix` |
| [`useEstimateVehicle`](/react/useEstimateVehicle) | `estimateVehicleQueryOptions` | `estimateVehicleQueryKey` | `estimateVehicleQueryPrefix` |
| [`useHasRole`](/react/useHasRole) | `hasRoleQueryOptions` | `hasRoleQueryKey` | `hasRoleQueryPrefix` |
| [`useInitialDepositAmount`](/react/useInitialDepositAmount) | `initialDepositAmountQueryOptions` | `initialDepositAmountQueryKey` | `initialDepositAmountQueryPrefix` |
| [`useIsTransferable`](/react/useIsTransferable) | `isTransferableQueryOptions` | `isTransferableQueryKey` | `isTransferableQueryPrefix` |
| [`useMorphoBlueSingleton`](/react/useMorphoBlueSingleton) | `morphoBlueSingletonQueryOptions` | `morphoBlueSingletonQueryKey` | `morphoBlueSingletonQueryPrefix` |
| [`useMorphoMarketAsset`](/react/useMorphoMarketAsset) | `morphoMarketAssetQueryOptions` | `morphoMarketAssetQueryKey` | `morphoMarketAssetQueryPrefix` |
| [`usePendingDefaultAdmin`](/react/usePendingDefaultAdmin) | `pendingDefaultAdminQueryOptions` | `pendingDefaultAdminQueryKey` | `pendingDefaultAdminQueryPrefix` |
| [`usePredictAaveV3VehicleDeployment`](/react/usePredictAaveV3VehicleDeployment) | `predictAaveV3VehicleDeploymentQueryOptions` | `predictAaveV3VehicleDeploymentQueryKey` | `predictAaveV3VehicleDeploymentQueryPrefix` |
| [`usePredictAccessControlDeployment`](/react/usePredictAccessControlDeployment) | `predictAccessControlDeploymentQueryOptions` | `predictAccessControlDeploymentQueryKey` | `predictAccessControlDeploymentQueryPrefix` |
| [`usePredictAccountListDeployment`](/react/usePredictAccountListDeployment) | `predictAccountListDeploymentQueryOptions` | `predictAccountListDeploymentQueryKey` | `predictAccountListDeploymentQueryPrefix` |
| [`usePredictConduitDeployment`](/react/usePredictConduitDeployment) | `predictConduitDeploymentQueryOptions` | `predictConduitDeploymentQueryKey` | `predictConduitDeploymentQueryPrefix` |
| [`usePredictErc4626VehicleDeployment`](/react/usePredictErc4626VehicleDeployment) | `predictErc4626VehicleDeploymentQueryOptions` | `predictErc4626VehicleDeploymentQueryKey` | `predictErc4626VehicleDeploymentQueryPrefix` |
| [`usePredictFeeManagerDeployment`](/react/usePredictFeeManagerDeployment) | `predictFeeManagerDeploymentQueryOptions` | `predictFeeManagerDeploymentQueryKey` | `predictFeeManagerDeploymentQueryPrefix` |
| [`usePredictMorphoBlueVehicleDeployment`](/react/usePredictMorphoBlueVehicleDeployment) | `predictMorphoBlueVehicleDeploymentQueryOptions` | `predictMorphoBlueVehicleDeploymentQueryKey` | `predictMorphoBlueVehicleDeploymentQueryPrefix` |
| [`usePredictMultiVehicleDeployment`](/react/usePredictMultiVehicleDeployment) | `predictMultiVehicleDeploymentQueryOptions` | `predictMultiVehicleDeploymentQueryKey` | `predictMultiVehicleDeploymentQueryPrefix` |
| [`usePredictOwnerRegistryDeployment`](/react/usePredictOwnerRegistryDeployment) | `predictOwnerRegistryDeploymentQueryOptions` | `predictOwnerRegistryDeploymentQueryKey` | `predictOwnerRegistryDeploymentQueryPrefix` |
| [`usePredictWrapperVehicleDeployment`](/react/usePredictWrapperVehicleDeployment) | `predictWrapperVehicleDeploymentQueryOptions` | `predictWrapperVehicleDeploymentQueryKey` | `predictWrapperVehicleDeploymentQueryPrefix` |
| [`useQueryClaim`](/react/useQueryClaim) | `queryClaimQueryOptions` | `queryClaimQueryKey` | `queryClaimQueryPrefix` |
| [`useQueryState`](/react/useQueryState) | `queryStateQueryOptions` | `queryStateQueryKey` | `queryStateQueryPrefix` |
| [`useRedeemConduitCall`](/react/useRedeemConduitCall) | `redeemConduitCallQueryOptions` | `redeemConduitCallQueryKey` | `redeemConduitCallQueryPrefix` |
| [`useSectorBalance`](/react/useSectorBalance) | `sectorBalanceQueryOptions` | `sectorBalanceQueryKey` | `sectorBalanceQueryPrefix` |
| [`useVehicleConversion`](/react/useVehicleConversion) | `vehicleConversionQueryOptions` | `vehicleConversionQueryKey` | `vehicleConversionQueryPrefix` |
| [`useVehicleInterceptions`](/react/useVehicleInterceptions) | `vehicleInterceptionsQueryOptions` | `vehicleInterceptionsQueryKey` | `vehicleInterceptionsQueryPrefix` |
| [`useVehicleManagerLimits`](/react/useVehicleManagerLimits) | `vehicleManagerLimitsQueryOptions` | `vehicleManagerLimitsQueryKey` | `vehicleManagerLimitsQueryPrefix` |

## Usage

```ts
import { useQuery } from '@tanstack/react-query'
import { usePublicClient } from 'wagmi'
import { conduitPositionQueryOptions } from '@railnetorg/railnet-sdk/react'

function Position() {
  const client = usePublicClient()

  const { data } = useQuery({
    ...conduitPositionQueryOptions(client, { conduit, account }),
    staleTime: 30_000,
  })
}
```

### Prefetching

```ts
import { QueryClient } from '@tanstack/react-query'
import { createPublicClient, http } from 'viem'
import { base } from 'viem/chains'
import { conduitPositionQueryOptions } from '@railnetorg/railnet-sdk/react'

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

await queryClient.prefetchQuery(conduitPositionQueryOptions(client, { conduit, account }))
```

## Query keys

Every key is `['railnet', '<read>', { chainId, ...parameters }]`. The chain is part of it, so two
chains never share a cache entry. A `bigint` parameter is stored as a string.

The hook returns its `queryKey`, which covers most invalidation:

```ts
const { data, queryKey } = useConduitPosition({ conduit, account })

queryClient.invalidateQueries({ queryKey })
```

When the hook is not mounted where you invalidate, a mutation's `onSuccess` in another component
or a route loader, build the key with `*QueryKey(chainId, parameters)`. `*QueryPrefix` invalidates
the family across every chain and every parameter set.

```ts
import { conduitPositionQueryKey, conduitPositionQueryPrefix } from '@railnetorg/railnet-sdk/react'

queryClient.invalidateQueries({ queryKey: conduitPositionQueryKey(base.id, { conduit, account }) })
queryClient.invalidateQueries({ queryKey: conduitPositionQueryPrefix })
```
