eth_syncing - Moonbeam RPC Method
Check the sync status of your Moonbeam node. Returns sync progress or false when fully synced — essential for node health monitoring and dApp reliability.
Returns the sync status of your Moonbeam node — either false when fully synced, or an object describing the sync progress.
Why Moonbeam? Build on the cross-chain connected EVM platform on Polkadot with $65M+ TVL and 100+ projects with full EVM compatibility on Polkadot, native XCM cross-chain messaging, 10K+ TPS, 24% staking APR, and $0.015 transaction costs.
When to Use This Method
eth_syncing is essential for cross-chain dApp developers, Polkadot builders, and teams requiring multi-chain interoperability:
- Node Health Checks — Verify your node is fully synced before processing transactions
- Sync Progress Monitoring — Track how far behind your node is during initial sync or after downtime
- Load Balancer Routing — Route requests only to fully synced nodes in multi-node setups
- dApp Reliability — Display sync warnings to users when data may be stale
Code Examples
Common Use Cases
1. Node Health Monitor
Continuously check sync status and alert on issues:
async function monitorNodeHealth(provider, interval = 30000) {
setInterval(async () => {
const syncing = await provider.send('eth_syncing', []);
if (syncing === false) {
const blockNumber = await provider.getBlockNumber();
const block = await provider.getBlock(blockNumber);
const age = Date.now() / 1000 - block.timestamp;
if (age > 60) {
console.warn(`Node synced but block is ${age.toFixed(0)}s old`);
} else {
console.log(`Healthy — block ${blockNumber}`);
}
} else {
const current = parseInt(syncing.currentBlock, 16);
const highest = parseInt(syncing.highestBlock, 16);
console.warn(`Syncing: ${highest - current} blocks behind`);
}
}, interval);
}2. Wait for Sync Before Processing
Block application startup until the node is ready:
async function waitForSync(provider, pollInterval = 5000) {
while (true) {
const syncing = await provider.send('eth_syncing', []);
if (syncing === false) {
console.log('Node synced — ready to process transactions');
return;
}
const current = parseInt(syncing.currentBlock, 16);
const highest = parseInt(syncing.highestBlock, 16);
console.log(`Waiting for sync: ${highest - current} blocks remaining...`);
await new Promise(r => setTimeout(r, pollInterval));
}
}Error Handling
| Error Code | Description | Solution |
|---|---|---|
| -32603 | Internal error | Node may be starting up — retry after delay |
| -32005 | Rate limit exceeded | Reduce polling frequency |
Related Methods
eth_blockNumber— Get current block heightnet_peerCount— Check peer connectionsnet_listening— Verify node is accepting connectionsweb3_clientVersion— Get node client info