state_getRuntimeVersion - Polkadot RPC Method
Get the runtime version on Polkadot. Essential for compatibility checking, upgrade detection, and transaction construction on the heterogeneous multi-chain protocol with $300M+ DeFi TVL and JAM supercomputer upgrade incoming.
Returns the runtime version information for Polkadot, including the spec name, spec version, implementation version, and supported API versions.
Why Polkadot? Build on the heterogeneous multi-chain protocol with $300M+ DeFi TVL and JAM supercomputer upgrade incoming with shared relay chain security, XCM cross-chain messaging, JAM upgrade targeting 1M TPS, and 2.1B DOT supply cap.
When to Use This Method
state_getRuntimeVersion is essential for parachain developers, cross-chain dApp builders, and teams requiring shared security:
- Version Checking — Verify runtime compatibility before constructing transactions on Polkadot
- Upgrade Detection — Monitor for runtime upgrades that may change chain behavior for cross-chain DeFi, parachain deployment, XCM interoperability, and DOT staking (8-10% APY)
- Transaction Construction — Include the correct
specVersionandtransactionVersionin signed extrinsics - API Compatibility — Check which runtime APIs are available and at what version
Code Examples
Common Use Cases
1. Runtime Upgrade Monitor
Detect runtime upgrades on Polkadot in real time:
async function monitorUpgrades(api) {
let currentVersion = (await api.rpc.state.getRuntimeVersion()).specVersion.toNumber();
console.log(`Starting monitor at spec version: ${currentVersion}`);
const unsub = await api.rpc.chain.subscribeNewHeads(async (header) => {
const version = await api.rpc.state.getRuntimeVersion(header.hash);
const newVersion = version.specVersion.toNumber();
if (newVersion !== currentVersion) {
console.log(`Runtime upgrade detected! ${currentVersion} -> ${newVersion}`);
currentVersion = newVersion;
// Trigger reconnection or metadata refresh
}
});
return unsub;
}2. Transaction Construction with Correct Version
Include the correct version fields when constructing signed extrinsics:
async function getSigningPayloadInfo(api) {
const version = await api.rpc.state.getRuntimeVersion();
const genesisHash = await api.rpc.chain.getBlockHash(0);
return {
specVersion: version.specVersion.toNumber(),
transactionVersion: version.transactionVersion.toNumber(),
genesisHash: genesisHash.toHex(),
// These fields are required for signing extrinsics
};
}3. Historical Version Comparison
Compare runtime versions across blocks to identify upgrade boundaries:
async function findUpgradeBlock(api, startBlock, endBlock) {
const startHash = await api.rpc.chain.getBlockHash(startBlock);
const startVersion = (await api.rpc.state.getRuntimeVersion(startHash)).specVersion.toNumber();
// Binary search for upgrade block
let low = startBlock;
let high = endBlock;
while (low < high) {
const mid = Math.floor((low + high) / 2);
const midHash = await api.rpc.chain.getBlockHash(mid);
const midVersion = (await api.rpc.state.getRuntimeVersion(midHash)).specVersion.toNumber();
if (midVersion === startVersion) {
low = mid + 1;
} else {
high = mid;
}
}
console.log(`Runtime upgraded at block #${low}`);
return low;
}Error Handling
| Error Code | Description | Solution |
|---|---|---|
| -32603 | Internal error | Node may be syncing — retry with backoff |
| -32602 | Invalid params | Verify block hash format is valid hex with 0x prefix |
| -32601 | Method not found | Verify the node supports this RPC method |
| -32005 | Rate limit exceeded | Implement client-side rate limiting |
Related Methods
state_getMetadata— Get full runtime metadata for decodingsystem_version— Get node software versionchain_subscribeFinalizedHeads— Subscribe to detect upgrade blocks
state_getMetadata
Get runtime metadata on Polkadot. Essential for decoding storage, building extrinsics, and discovering available pallets and calls on the heterogeneous multi-chain protocol with $300M+ DeFi TVL and JAM supercomputer upgrade incoming.
state_call
Call a runtime API function on Polkadot. Execute on-chain computations like account nonce lookups, fee estimation, and custom runtime logic without submitting a transaction.