Docs

state_getMetadata - Enjin RPC Method

Get runtime metadata on Enjin. Essential for decoding storage, building extrinsics, and discovering available pallets and calls on the purpose-built NFT blockchain with protocol-level minting and $100M Metaverse Fund.

Returns the runtime metadata for Enjin 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 Enjin? Build on the purpose-built NFT blockchain with protocol-level minting and $100M Metaverse Fund with NFT functions at protocol level, Fuel Tanks for subsidized fees, 700-1000 TPS, 6-second finality, and ERC-1155 standard pioneer.

When to Use This Method

state_getMetadata is essential for game developers, NFT creators, and enterprises building cross-chain digital assets:

  • Runtime Introspection — Discover available pallets, calls, and storage items on Enjin
  • Extrinsic Building — Get call signatures and type information for constructing transactions for high-volume NFT minting (2,000+ per tx), gaming assets, and cross-chain NFT transfers via Paratoken standard
  • 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 Enjin:

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 Enjin:

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