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.
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).
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