Copy
import { createTarget } from "@subsquid/pipes";
import { evmPortalSource, EvmQueryBuilder } from "@subsquid/pipes/evm";
async function main() {
const queryBuilder = new EvmQueryBuilder()
.addFields({
block: { number: true, hash: true },
log: { address: true, topics: true, data: true, transactionHash: true },
})
.addLog({
request: {
address: ["0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48"], // USDC
topic0: [
"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
], // Transfer
},
range: { from: 20000000, to: 20000000 },
});
const source = evmPortalSource({
portal: "https://portal.sqd.dev/datasets/ethereum-mainnet",
query: queryBuilder,
});
const target = createTarget({
write: async ({ logger, read }) => {
for await (const { data } of read()) {
logger.info(data, "data");
}
},
});
await source.pipeTo(target);
}
void main();
For better type safety and developer experience, use
evmDecoder with ABIs generated by @subsquid/evm-typegen instead of manually specifying topic0 hashes. See the Event Decoding guide for a typed approach.
