# ChainApi

`ChainApi` interface is a concept that allows Dedot to enable Types & APIs suggestions for any Substrated-based blockchains. Each Substrate-based blockchain has its own `ChainApi` interface that exposes all of its Types & APIs to interact with the node & runtime.

A `ChainApi` interface has the following structure:

```typescript
export interface ChainApi {
  rpc: ChainJsonRpcApis; // json-rpc methods
  consts: ChainConsts; // runtime constants
  query: ChainStorage; // on-chain storage queries
  errors: ChainErrors; // on-chain errors
  events: ChainEvents; // on-chain events
  call: RuntimeApis; // runtime apis
  tx: ChainTx<ChainKnownTypes>; // transactions
  
  types: ChainKnownTypes; // known chain types from the runtime (Address, Signature, AssetId ...)
}
```

### Access `ChainApi` interfaces

Dedot offers 2 different ways to access `ChainApi` interfaces for different Substrate-based blockchains.

#### Known `ChainApi` interfaces defined in `@dedot/chaintypes` package

Install package `@dedot/chaintypes` to get access to a [list of known `ChainApi` interfaces](https://github.com/dedotdev/chaintypes/blob/main/packages/chaintypes/src/index.ts). For example:

* [`PolkadotApi`](https://github.com/dedotdev/chaintypes/blob/main/packages/chaintypes/src/polkadot/index.d.ts)
* [`KusamaApi`](https://github.com/dedotdev/chaintypes/blob/main/packages/chaintypes/src/kusama/index.d.ts)
* [`PolkadotAssetHubApi`](https://github.com/dedotdev/chaintypes/blob/main/packages/chaintypes/src/polkadot-asset-hub/index.d.ts)
* [`KusamaAssetHubApi`](https://github.com/dedotdev/chaintypes/blob/main/packages/chaintypes/src/kusama-asset-hub/index.d.ts)
* ...

{% hint style="info" %}
We're welcome everyone to open a [pull request](https://github.com/dedotdev/chaintypes/pulls) to add your favorite Substrate-based network to the [existing list](https://github.com/dedotdev/chaintypes/blob/main/scripts/networks.ts) of supported networks in[`@dedot/chaintypes`](https://github.com/dedotdev/chaintypes) repo.
{% endhint %}

{% hint style="info" %}
There is a job running twice a day to check for any runtime upgrades in the existing supported networks list and regenerate the `ChainApi` interface (Types & APIs) accordingly for these changes.&#x20;

It's important to keep up with changes from the network that you're working with and prepare for any breaking upgrades coming up. Please refer to the [Runtime upgrades](https://docs.dedot.dev/runtime-upgrades) page for more information.
{% endhint %}

#### Generate `ChainApi` interface using Dedot's CLI

You can also generate `ChainApi` interface for any Substrate-based blockchains using `dedot`' CLI.

Generate `ChainApi` interface for a local substrate-based blockchains running on `ws://127.0.0.1:9944`:

```sh
npx dedot chaintypes -w ws://127.0.0.1:9944
```

You can also generate `ChainApi` interface using a raw metadata file (.scale) or runtime wasm file (.wasm). More information about this can be found in the [CLI page](https://docs.dedot.dev/cli#dedot-chaintypes).

### Using `ChainApi` interface

`ChainApi` interface is the generic parameter for Dedot's clients, so when intialize a Dedot client, make sure to pick the right `ChainApi` interface of the chain you're working with to enable Types & APIs suggestions for that particular chains.

<figure><img src="https://2890540792-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FqKeV2eaKHEVsK7HH0Fbt%2Fuploads%2FtfNnor8izvb9s3zErZxS%2Ftypesafe-apis.gif?alt=media&#x26;token=1517c780-1815-4d7f-ae11-6f37a71b71ea" alt=""><figcaption></figcaption></figure>

Example working with Polkadot Asset Hub:

<pre class="language-typescript"><code class="lang-typescript"><strong>import { DedotClient, WsProvider } from 'dedot';
</strong>import type { PolkadotAssetHubApi } from '@dedot/chaintypes';

// Initialize providers &#x26; clients
const provider = new WsProvider('wss://polkadot-asset-hub-rpc.polkadot.io');
const client = await DedotClient.new&#x3C;PolkadotAssetHubApi>(provider);
</code></pre>
