Docs

beefy_getFinalizedHead - Bridge Hub RPC Method

Get the BEEFY finalized block hash on Bridge Hub. Bridge-optimized finality proofs for cross-chain communication and light client verification on Polkadot's trustless bridging parachain with $75M+ TVL via Snowbridge to Ethereum.

Returns the block hash of the latest BEEFY-finalized block on Bridge Hub. BEEFY (Bridge Efficiency Enabling Finality Yielder) provides additional finality proofs that are optimized for light clients and cross-chain bridges, using compact aggregated signatures instead of full GRANDPA justifications.

Why Bridge Hub? Build on Polkadot's trustless bridging parachain with $75M+ TVL via Snowbridge to Ethereum with on-chain BEEFY/Beacon light clients (no multisigs), 100+ ERC-20 tokens supported, 24+ parachain integrations, and 1-2 minute transfer times.

When to Use This Method

beefy_getFinalizedHead is important for cross-chain developers, bridge operators, and teams requiring trustless Ethereum-Polkadot transfers:

  • Cross-Chain Bridges — Verify finality proofs efficiently for bridge operations on trustless ETH and ERC-20 bridging, cross-chain messaging, and parachain-to-Ethereum asset transfers
  • Light Clients — Verify finality without downloading full GRANDPA justifications
  • Trustless Bridges — Generate compact finality proofs that can be verified on external chains
  • Bridge Monitoring — Track BEEFY finality progress relative to GRANDPA finality

Code Examples

Common Use Cases

1. Bridge Finality Verification

Verify BEEFY finality before relaying messages on a cross-chain bridge:

JavaScript
async function verifyBridgeFinality(api, targetBlockHash) {
  const beefyHead = await api.rpc.beefy.getFinalizedHead();
  const beefyBlock = await api.rpc.chain.getBlock(beefyHead);
  const beefyNumber = beefyBlock.block.header.number.toNumber();

  const targetBlock = await api.rpc.chain.getBlock(targetBlockHash);
  const targetNumber = targetBlock.block.header.number.toNumber();

  if (beefyNumber >= targetNumber) {
    console.log(`Block #${targetNumber} has BEEFY finality — safe to relay`);
    return true;
  } else {
    console.log(`Waiting: BEEFY at #${beefyNumber}, target at #${targetNumber}`);
    return false;
  }
}

2. BEEFY vs GRANDPA Finality Monitor

Track the gap between the two finality gadgets:

JavaScript
async function monitorFinalityGadgets(api) {
  setInterval(async () => {
    try {
      const [beefyHead, grandpaHead] = await Promise.all([
        api.rpc.beefy.getFinalizedHead(),
        api.rpc.chain.getFinalizedHead()
      ]);

      const [beefyBlock, grandpaBlock] = await Promise.all([
        api.rpc.chain.getBlock(beefyHead),
        api.rpc.chain.getBlock(grandpaHead)
      ]);

      const beefyNum = beefyBlock.block.header.number.toNumber();
      const grandpaNum = grandpaBlock.block.header.number.toNumber();
      const lag = grandpaNum - beefyNum;

      console.log(`GRANDPA: #${grandpaNum} | BEEFY: #${beefyNum} | Lag: ${lag} blocks`);
    } catch (error) {
      console.error('Monitor error:', error.message);
    }
  }, 12000);
}

BEEFY vs GRANDPA Finality

AspectGRANDPABEEFY
PurposePrimary chain finalityBridge-optimized finality
Proof SizeLarger (full validator set signatures)Compact (aggregated BLS signatures)
LatencyImmediate after supermajoritySlightly delayed behind GRANDPA
Verification CostHigher on external chainsLower — designed for on-chain verification
Use CaseOn-chain consensus finalityCross-chain bridges and light clients

Availability

BEEFY is enabled on Polkadot and Kusama relay chains and some parachains. If BEEFY is not active on the chain you are querying, this method will return an error. Check chain documentation or try calling the method to confirm availability.

Error Handling

Error CodeDescriptionSolution
-32603Internal error / BEEFY not enabledVerify BEEFY is active on this chain
-32601Method not foundChain runtime may not include BEEFY pallet
-32005Rate limit exceededImplement client-side rate limiting