Docs

state_getMetadata - Bifrost RPC Method

Get runtime metadata on Bifrost. Essential for decoding storage, building extrinsics, and discovering available pallets and calls on Polkadot's largest liquid staking appchain with 60% DOT LST market share and $125M+ TVL.

Returns the runtime metadata for Bifrost as a SCALE-encoded hex string. Metadata describes all available pallets, storage items, calls, events, errors, and type definitions — everything needed to interact with the chain programmatically.

Why Bifrost? Build on Polkadot's largest liquid staking appchain with 60% DOT LST market share and $125M+ TVL with first LST governance on OpenGov, 60% DOT market share, Hyperbridge ETH integration, and 500K DOT treasury support.

When to Use This Method

state_getMetadata is essential for liquid staking developers, DeFi builders, and teams requiring cross-chain yield solutions:

  • Runtime Introspection — Discover available pallets, calls, and storage items on Bifrost
  • Extrinsic Building — Get call signatures and type information for constructing transactions for omnichain liquid staking (vDOT, vKSM, vGLMR, vMOVR, vASTR), cross-chain vToken governance, and DOT/ETH liquidity bridging
  • Storage Key Generation — Build correct storage keys from metadata type definitions
  • Client Generation — Auto-generate typed APIs and SDKs from the runtime metadata
  • Upgrade Awareness — Detect metadata changes after runtime upgrades

Code Examples

Common Use Cases

1. Discover Available Pallets and Calls

Explore what functionality is available on Bifrost:

JavaScript
async function explorePallets(api) {
  const metadata = await api.rpc.state.getMetadata();
  const pallets = metadata.asLatest.pallets;

  for (const pallet of pallets) {
    const name = pallet.name.toString();
    const hasCalls = pallet.calls.isSome;
    const hasStorage = pallet.storage.isSome;
    const hasEvents = pallet.events.isSome;

    console.log(`${name}: calls=${hasCalls} storage=${hasStorage} events=${hasEvents}`);
  }
}

2. Build Storage Keys from Metadata

Generate correct storage keys for querying chain state:

JavaScript
import { xxhashAsHex } from '@polkadot/util-crypto';

function buildStorageKey(palletName, storageName) {
  const palletHash = xxhashAsHex(palletName, 128);
  const storageHash = xxhashAsHex(storageName, 128);

  return palletHash + storageHash.slice(2); // Concatenate without duplicate 0x
}

// Example: Build key for System.Account storage
const key = buildStorageKey('System', 'Account');
console.log('Storage prefix key:', key);

3. Metadata Version Tracking

Track metadata changes across runtime upgrades on Bifrost:

JavaScript
async function compareMetadataVersions(api, blockA, blockB) {
  const hashA = await api.rpc.chain.getBlockHash(blockA);
  const hashB = await api.rpc.chain.getBlockHash(blockB);

  const metaA = await api.rpc.state.getMetadata(hashA);
  const metaB = await api.rpc.state.getMetadata(hashB);

  const palletsA = new Set(metaA.asLatest.pallets.map(p => p.name.toString()));
  const palletsB = new Set(metaB.asLatest.pallets.map(p => p.name.toString()));

  const added = [...palletsB].filter(p => !palletsA.has(p));
  const removed = [...palletsA].filter(p => !palletsB.has(p));

  console.log('Added pallets:', added);
  console.log('Removed pallets:', removed);
}

Error Handling

Error CodeDescriptionSolution
-32603Internal errorNode may be syncing — retry with backoff
-32602Invalid paramsVerify block hash is valid hex with 0x prefix
-32601Method not foundVerify the node supports this RPC method
-32005Rate limit exceededCache metadata locally — it only changes on runtime upgrades