import { commonAbis, evmDecoder, evmPortalSource } from '@subsquid/pipes/evm'
import { batchForInsert, drizzleTarget } from '@subsquid/pipes/targets/drizzle/node-postgres'
import { drizzle } from 'drizzle-orm/node-postgres'
import { integer, numeric, pgTable, primaryKey, varchar } from 'drizzle-orm/pg-core'
const transfersTable = pgTable('transfers', {
blockNumber: integer().notNull(),
logIndex: integer().notNull(),
from: varchar({ length: 42 }).notNull(),
to: varchar({ length: 42 }).notNull(),
value: numeric({ mode: 'bigint' }).notNull(),
}, (t) => [primaryKey({ columns: [t.blockNumber, t.logIndex] })])
await evmPortalSource({
portal: 'https://portal.sqd.dev/datasets/ethereum-mainnet',
outputs: evmDecoder({
range: { from: '0' },
events: { transfers: commonAbis.erc20.events.Transfer },
}),
}).pipeTo(
drizzleTarget({
db: drizzle('postgresql://postgres:postgres@localhost:5432/postgres'),
tables: [transfersTable],
onData: async ({ tx, data }) => {
for (const batch of batchForInsert(data.transfers)) {
await tx.insert(transfersTable).values(
batch.map((d) => ({
blockNumber: d.block.number,
logIndex: d.rawEvent.logIndex,
from: d.event.from,
to: d.event.to,
value: d.event.value,
})),
)
}
},
}),
)