Copy
import { createTarget } from "@subsquid/pipes";
import { solanaPortalSource, SolanaQueryBuilder } from "@subsquid/pipes/solana";
const queryBuilder = new SolanaQueryBuilder()
.addFields({
block: { slot: true, hash: true },
instruction: { programId: true, data: true, accounts: true, transactionHash: true },
})
.addInstruction({
request: {
programId: ["whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"], // Orca Whirlpool
d8: ["0xf8c69e91e17587c8"], // Swap instruction discriminator
},
range: { from: 200000000, to: 200000000 },
});
const source = solanaPortalSource({
portal: "https://portal.sqd.dev/datasets/solana-mainnet",
query: queryBuilder,
});
const target = createTarget({
write: async ({ logger, read }) => {
for await (const { data } of read()) {
logger.info(data, "data");
}
},
});
await source.pipeTo(target);
For better type safety and developer experience, use
solanaInstructionDecoder with ABIs generated by @subsquid/solana-typegen. See the Instruction Decoding guide for a typed approach.
