Skip to main content

evmPortalSource

Create a Portal source for EVM chains.
evmPortalSource(config: EvmPortalSourceConfig): Source
Parameters:
  • portal: Portal API URL or config object
    • String: "https://portal.sqd.dev/datasets/ethereum-mainnet"
    • Object: { url: string, finalized?: boolean }
  • query: EvmQueryBuilder instance (optional)
  • cursor: Resume from block { number: number } (optional)
  • cache: Portal cache instance (optional)
  • logger: Logger instance or false/'silent' to disable logging (optional)
  • metrics: MetricsServer for monitoring (optional)
  • progress: ProgressTrackerOptions for progress tracking (optional)
Example:
import { evmPortalSource } from "@subsquid/pipes/evm";
import { portalSqliteCache } from "@subsquid/pipes/portal-cache/node";

const source = evmPortalSource({
  portal: "https://portal.sqd.dev/datasets/ethereum-mainnet",
  query: queryBuilder,
  cursor: { number: 20000000 },
  cache: portalSqliteCache({ path: "./cache.sqlite" }),
});

Finalized Blocks

You can configure the source to only receive finalized blocks:
const source = evmPortalSource({
  portal: {
    finalized: true,
    url: 'https://portal.sqd.dev/datasets/ethereum-mainnet'
  }
});
Using finalized blocks eliminates the need for rollback handlers in your targets.
Set logger: false or logger: 'silent' to disable logging in the Portal source.

Pipe Methods

Methods for chaining transformers and connecting to targets.

pipe

Chain a single transformer to the source.
source.pipe(transformer)
Example:
const pipeline = source.pipe(evmDecoder({
  range: { from: 20000000 },
  contracts: ['0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'],
  events: { transfer: commonAbis.erc20.events.Transfer }
}))

pipeComposite

Chain multiple transformers that run in parallel.
source.pipeComposite({
  key1: transformer1,
  key2: transformer2
})
Example:
const pipeline = source.pipeComposite({
  transfers: evmDecoder({
    range: { from: 20000000 },
    contracts: ['0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48'],
    events: { transfer: commonAbis.erc20.events.Transfer }
  }),
  swaps: evmDecoder({
    range: { from: 20000000 },
    contracts: ['0x88e6a0c2ddd26feeb64f039a2c41296fcb3f5640'],
    events: { swap: uniswapAbi.events.Swap }
  })
})

pipeTo

Connect the pipeline to a target (terminal operation).
source.pipeTo(target)
Example:
async function main() {
  await source
    .pipe(decoder)
    .pipeTo(target)
}

void main();
pipeTo is a terminal operation. You cannot continue piping after calling this method.

Next Steps