# Config

`EnsforgeProvider` accepts the same mutually exclusive client configurations as the SDK.

## viem clients

:::code-group
```tsx [providers.tsx]
import { EnsforgeProvider } from "@ensforge/react";
import { publicClient, walletClient } from "./clients";

export function Providers({ children }: React.PropsWithChildren) {
  return (
    <EnsforgeProvider config={{ network: "mainnet", publicClient, walletClient }}>
      {children}
    </EnsforgeProvider>
  );
}
```

```ts [clients.ts]
import { createPublicClient, createWalletClient, custom, http } from "viem";
import { mainnet } from "viem/chains";

export const publicClient = createPublicClient({ chain: mainnet, transport: http() });
export const walletClient = createWalletClient({
  chain: mainnet,
  transport: custom(window.ethereum),
});
```
:::

Omit `walletClient` for a read-only application.

## Wagmi

:::code-group
```tsx [provider.tsx]
// [!include ~/snippets/react/provider.tsx]
```

```ts [config.ts]
// [!include ~/snippets/wagmi/config.ts]
```
:::

The active wallet is resolved when a mutation executes, so account and connector changes do not
require recreating the provider.

## Atom defaults

```tsx
<EnsforgeProvider
  config={{ network: "mainnet", wagmiConfig }}
  defaults={{
    atoms: {
      idleTTL: "10 minutes",
      swr: {
        staleTime: "1 minute",
        revalidateOnFocus: true,
      },
    },
  }}
>
  <App />
</EnsforgeProvider>
```

See [Atom Options](/react/api/atom-options) for defaults, Effect schedules, and per-hook overrides.
