Skip to main content

IotaClientProvider

The IotaClientProvider manages the active IotaClient that hooks and components use in the dApp Kit.

Usage​

Place the IotaClientProvider at the root of your app and wrap all components that use the dApp Kit hooks.

IotaClientProvider accepts a list of network configurations to create IotaClient instances for the currently active network.

import { createNetworkConfig, IotaClientProvider, WalletProvider } from '@iota/dapp-kit';
import { getFullnodeUrl } from '@iota/iota-sdk/client';

// Config options for the networks you want to connect to
const { networkConfig } = createNetworkConfig({
localnet: { url: getFullnodeUrl('localnet') },
testnet: { url: getFullnodeUrl('testnet') },
});

function App() {
return (
<IotaClientProvider networks={networkConfig} defaultNetwork="localnet">
<YourApp />
</IotaClientProvider>
);
}

Props​

  • networks: A map of networks you can use. The keys are the network names, and the values can be either a configuration object (IotaClientOptions) or a IotaClient instance.
  • defaultNetwork: The name of the network to use by default when using the IotaClientProvider as an uncontrolled component.
  • network: The name of the network to use when using the IotaClientProvider as a controlled component.
  • onNetworkChange: A callback when the active network changes.
  • createClient: A callback when a new IotaClient is created (for example, when the active network changes). It receives the network name and configuration object as arguments, returning a IotaClient instance.

Controlled component​

The following example demonstrates a IotaClientProvider used as a controlled component.

import { createNetworkConfig, IotaClientProvider } from '@iota/dapp-kit';
import { getFullnodeUrl } from '@iota/iota-sdk/client';
import { useState } from 'react';

// Config options for the networks you want to connect to
const { networkConfig } = createNetworkConfig({
localnet: { url: getFullnodeUrl('localnet') },
testnet: { url: getFullnodeUrl('testnet') },
});

function App() {
const [activeNetwork, setActiveNetwork] = useState('localnet' as keyof typeof networks);

return (
<IotaClientProvider
networks={networkConfig}
network={activeNetwork}
onNetworkChange={(network) => {
setActiveNetwork(network);
}}
>
<YourApp />
</IotaClientProvider>
);
}

IotaClient customization​

The following example demonstrates how to create a custom IotaClient.

import { IotaClientProvider } from '@iota/dapp-kit';
import { getFullnodeUrl, IotaClient, IotaHTTPTransport } from '@iota/iota-sdk/client';

// Config options for the networks you want to connect to
const networks = {
localnet: { url: getFullnodeUrl('localnet') },
testnet: { url: getFullnodeUrl('testnet') },
} satisfies Record<string, IotaClientOptions>;

function App() {
return (
<IotaClientProvider
networks={networks}
defaultNetwork="localnet"
createClient={(network, config) => {
return new IotaClient({
transport: new IotaHTTPTransport({
url: 'https://api.safecoin.org',
rpc: {
headers: {
Authorization: 'xyz',
},
},
}),
});
}}
>
<YourApp />
</IotaClientProvider>
);
}

Using the IotaClient from the provider​

To use the IotaClient from the provider, import the useIotaClient function from the @iota/dapp-kit module.

import { useIotaClient } from '@iota/dapp-kit';

function MyComponent() {
const client = useIotaClient();

// use the client
}

Creating a network selector​

The dApp Kit doesn't provide its own network switcher, but you can use the useIotaClientContext hook to get the list of networks and set the active one:

function NetworkSelector() {
const ctx = useIotaClientContext();

return (
<div>
{Object.keys(ctx.networks).map((network) => (
<button key={network} onClick={() => ctx.selectNetwork(network)}>
{`select ${network}`}
</button>
))}
</div>
);
}

Using network specific configuration​

If your dApp runs on multiple networks, the IDs for packages and other configurations might change, depending on which network you're using. You can use createNetworkConfig to create per-network configurations that your components can access.

The createNetworkConfig function returns the provided configuration, along with hooks you can use to get the variables defined in your configuration.

  • useNetworkConfig returns the full network configuration object
  • useNetworkVariables returns the full variables object from the network configuration
  • useNetworkVariable returns a specific variable from the network configuration
import { createNetworkConfig, IotaClientProvider } from '@iota/dapp-kit';

import { createNetworkConfig, IotaClientProvider, WalletProvider } from '@iota/dapp-kit';
import { getFullnodeUrl } from '@iota/iota-sdk/client';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';

// Config options for the networks you want to connect to
const { networkConfig, useNetworkVariable } = createNetworkConfig({
localnet: {
url: getFullnodeUrl('localnet'),
variables: {
myMovePackageId: '0x123',
},
},
testnet: {
url: getFullnodeUrl('testnet'),
variables: {
myMovePackageId: '0x456',
},
},
});

const queryClient = new QueryClient();

function App() {
return (
<QueryClientProvider client={queryClient}>
<IotaClientProvider networks={networkConfig} defaultNetwork="localnet">
<WalletProvider>
<YourApp />
</WalletProvider>
</IotaClientProvider>
</QueryClientProvider>
);
}

function YourApp() {
const id = useNetworkVariable('myMovePackageId');

return <div>Package ID: {id}</div>;
}