Use createWidgetClient so each chain’s public client uses Metalayer’s RPC ordering and fallbacks. Build a non-empty viem chain tuple from chainsToViemChains(metalayerChains) (or a filtered list). Below, ViemChain is viem’s Chain type under an alias so it is not confused with the Metalayer Chain from the SDK.
import { chainsToViemChains } from '@metalayer/sdk';import { createWidgetClient } from '@metalayer/widget';import type { Chain as ViemChain } from 'viem';import { createConfig } from 'wagmi';function createWagmiConfig(chains: [ViemChain, ...ViemChain[]]) { return createConfig({ chains, multiInjectedProviderDiscovery: false, client({ chain }) { return createWidgetClient(chain); }, });}
📋 Note: The widget requires an external WagmiProvider — it does not create its own. Use onSupportedChainsLoad to update your wagmi config with the widget’s supported chains.
These helpers take viem Chain objects—the same shape returned by chainToViemChain / chainsToViemChains in @metalayer/sdk. Internally, createWidgetTransport calls collectChainHttpRpcUrls (see SDK utilities) and builds a viem fallback transport over those HTTP URLs: Metalayer default RPC first, then rpc-0, rpc-1, … slots that chainToViemChain fills from alternativeRpcs. If no URLs are present, it falls back to viem’s default http() behavior.
Returns a viem Transport for a single chain. It reads every HTTP RPC URL from the chain via collectChainHttpRpcUrls and wraps them in a viem fallback() transport, so requests automatically retry on the next endpoint when one is rate-limited or unavailable. If no URLs are present it returns a plain http() transport.Most integrations should use createWidgetClient (wagmi client callback) or createWidgetTransportsRecord (wagmi transports map) instead of calling this directly. Use createWidgetTransport when you need the raw transport for a custom viem client or want to compose it with other transports:
import { createWidgetTransport } from '@metalayer/widget';import { createClient } from 'viem';const client = createClient({ chain: viemChain, transport: createWidgetTransport(viemChain),});
Convenience wrapper: creates a viem Client with createWidgetTransport already wired in. This is the recommended way to configure wagmi via the client callback (see Wagmi client callback above).
import { createWidgetClient } from '@metalayer/widget';const client = createWidgetClient(viemChain);
Builds Record<number, Transport> keyed by chain id. Useful with RainbowKit’s getDefaultConfig or any wagmi setup that takes a transports map instead of a client callback:
import { createWidgetTransportsRecord } from '@metalayer/widget';import { getDefaultConfig } from '@rainbow-me/rainbowkit';const config = getDefaultConfig({ appName: 'My App', projectId: 'your-walletconnect-project-id', chains: supportedChains as unknown as readonly [Chain, ...Chain[]], transports: createWidgetTransportsRecord(supportedChains),});
For custom transport stacks (for example viem fallback()), you can read ordered HTTP URLs from a viem chain with collectChainHttpRpcUrls in @metalayer/sdk.
The widget supports extensive theming options including predefined themes, custom colors, fonts, and advanced overrides.See the Theming page for complete customization options and visual examples.
When onDisconnectClick is provided, the widget manages wallet connection state internally and displays wallet info in the settings tab. If your page already handles wallet connect/disconnect logic, you don’t need to set this prop; the widget will work with your existing wallet connection management.
import type { WidgetProps } from '@metalayer/widget';