Docs

eth_getLogs - Moonbase RPC Method

Query event logs on Moonbase Alpha. Essential for indexing EVM dApp testing, XCM integration validation, and pre-mainnet deployment verification on the Moonbeam testnet for risk-free EVM dApp development and deployment testing.

Returns an array of all logs matching a given filter object on Moonbase Alpha.

Why Moonbase? Build on the Moonbeam testnet for risk-free EVM dApp development and deployment testing with free testnet tokens, full EVM compatibility, XCM testing capabilities, and identical feature set to Moonbeam mainnet.

When to Use This Method

The eth_getLogs method serves these key scenarios for Moonbeam developers, dApp testers, and teams validating cross-chain integrations:

  • Index smart contract events - Track transfers, swaps, and approvals emitted by any contract on Moonbase for use in indexed databases
  • Monitor DeFi protocol activity - Watch for liquidity changes, price updates, and position events in real time across EVM dApp testing, XCM integration validation, and pre-mainnet deployment verification
  • Build analytics pipelines - Extract on-chain event data for dashboards, reporting, and trend analysis on Moonbase Alpha
  • Track token holder activity - Monitor whale movements and large transfers to detect significant market activity

Common Use Cases

1. Monitor ERC20 Transfer Events

Track all transfer events for a specific token contract within a defined block range. The Transfer event signature hash filters for exactly this event type, and you can optionally filter by sender or recipient address using indexed topics.

JavaScript
import { JsonRpcProvider } from 'ethers';

const provider = new JsonRpcProvider('https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY');
const tokenAddress = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';
const transferTopic = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef';

async function getRecentTransfers(fromBlock, toBlock) {
  const logs = await provider.getLogs({
    address: tokenAddress,
    fromBlock: fromBlock,
    toBlock: toBlock,
    topics: [transferTopic]
  });

  const transfers = logs.map(log => ({
    from: '0x' + log.topics[1].slice(26),
    to: '0x' + log.topics[2].slice(26),
    amount: BigInt(log.data).toString(),
    txHash: log.transactionHash
  }));

  console.log(`Found ${transfers.length} transfers`);
  return transfers;
}

const recentTransfers = await getRecentTransfers('latest', 'latest');

2. Track DEX Swap Events

Capture swap events from a DEX to analyze trading volume, price impact, and liquidity flow. Each swap emits event parameters that include the amounts and addresses involved - ideal for building price feeds and volume aggregators.

JavaScript
const provider = new JsonRpcProvider('https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY');

const SWAP_TOPIC = '0xd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d822';
const pairAddress = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045';

async function getRecentSwaps(fromBlock, toBlock) {
  const logs = await provider.getLogs({
    address: pairAddress,
    fromBlock: fromBlock,
    toBlock: toBlock,
    topics: [SWAP_TOPIC]
  });

  return logs.map(log => ({
    sender: '0x' + log.topics[1].slice(26),
    to: '0x' + log.topics[2].slice(26),
    amount0In: BigInt('0x' + log.data.slice(2, 66)).toString(),
    amount1In: BigInt('0x' + log.data.slice(66, 130)).toString(),
    amount0Out: BigInt('0x' + log.data.slice(130, 194)).toString(),
    amount1Out: BigInt('0x' + log.data.slice(194, 258)).toString(),
    txHash: log.transactionHash
  }));
}

const swaps = await getRecentSwaps('latest', 'latest');
console.log(`Found ${swaps.length} swaps`);

3. Multi-Contract Event Aggregation

Query events from multiple contracts simultaneously by passing an array of addresses. This is useful for cross-protocol analytics - aggregating lending, borrowing, and liquidation events from multiple DeFi protocols in a single query on Moonbase.

JavaScript
const provider = new JsonRpcProvider('https://api-moonbase-alpha.n.dwellir.com/YOUR_API_KEY');

const contracts = [
  '0xContractA...',
  '0xContractB...',
  '0xContractC...'
];

const EVENT_TOPIC = '0x...';

async function aggregateEvents(fromBlock, toBlock) {
  const logs = await provider.getLogs({
    address: contracts,
    fromBlock: fromBlock,
    toBlock: toBlock,
    topics: [EVENT_TOPIC]
  });

  const grouped = {};
  for (const log of logs) {
    const contract = log.address;
    if (!grouped[contract]) grouped[contract] = [];
    grouped[contract].push(log);
  }

  for (const [contract, events] of Object.entries(grouped)) {
    console.log(`${contract}: ${events.length} events`);
  }

  return grouped;
}

aggregateEvents('0x100000', '0x100500');

Best Practices

  • Limit block range to 1,000-5,000 blocks per query to avoid timeouts and rate limits on Moonbase
  • Use topic filters for efficient log filtering: the node filters at the storage level before returning results
  • For high-volume monitoring, use eth_newFilter with polling instead of repeatedly calling eth_getLogs
  • Store the last processed block number for incremental indexing rather than re-scanning the full chain
  • Be aware that eth_getLogs often has stricter rate limits than other RPC methods on Moonbase Alpha

Code Examples

Error Handling

Error CodeMessageDescription
-32005Query returned more than 10000 resultsReduce block range
-32602Invalid paramsInvalid filter parameters