This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
Origin Squid is a Subsquid-based blockchain indexing system for Origin Protocol. It processes EVM events from multiple networks (Ethereum Mainnet, Arbitrum, Base, Sonic, Plume) and serves aggregated DeFi analytics via GraphQL.
# Install dependencies
pnpm install
# Build
pnpm run build
# Run tests
pnpm test
pnpm run test:watch # Watch mode
# Linting
pnpm run lint
pnpm run lint:fix
pnpm run prettier-check
pnpm run prettier-fix
# Database setup (resets DB, applies migrations)
pnpm run setup
# Code generation
pnpm run generate # Full codegen + migration
pnpm run typegen # Generate ABI TypeScript interfaces
# Run processors (choose one)
pnpm run process:oeth # OETH processor
pnpm run process:ousd # OUSD processor
pnpm run process:mainnet # Mainnet misc processor
pnpm run process:arbitrum # Arbitrum processor
pnpm run process:base # Base processor
pnpm run process:sonic # Sonic processor
pnpm run process:plume # Plume processor
pnpm run process # Combined processor
# Start GraphQL server (localhost:4350/graphql)
pnpm run serveEnvironment variables for processing:
DEBUG_PERF=true- Enable performance loggingBLOCK_FROM=<number>- Start processing at specific blockBLOCK_TO=<number>- Process up to specific block
Each chain/product has a processor that:
- Defines event filters (logs/traces) for specific contract events
- Decodes events using generated ABI interfaces
- Updates TypeORM entities in batches
- Runs post-processors for derived data (e.g., exchange rates)
Entry points: src/main-*.ts files (e.g., main-oeth.ts, main-ousd.ts)
src/templates/- Reusable processor templates (otoken, erc20, strategy, pools)src/utils/- Shared utilities including chain-specific addresses (addresses-*.ts)src/shared/- Shared modules (ERC20 state, post-processors)src/model/- TypeORM entities (generated from GraphQL)src/abi-json/- Raw ABI JSON files (kept inside src/ so JSON imports don't shift tsc output into lib/src/)src/abi/- Generated TypeScript ABI interfaces
@abi/*→src/abi/*@model→src/model@shared/*→src/shared/*@templates/*→src/templates/*@utils/*→src/utils/*@test-utils/*→src/test-utils/*
- Processor filters blockchain events by contract address and topic
- Events decoded using
@abi/*generated interfaces - Entities collected in maps during batch processing
- Entities upserted to database at end of batch
- Post-processors calculate derived data
- GraphQL server serves TypeORM models
- Always pause for human review before committing. Present the diff/summary and wait for explicit approval; do not run
git commituntil the user confirms. This applies even after tests/validation pass. - Never push or open PRs unless the user explicitly asks.
- Add ABI JSON to
src/abi-json/ - Run
pnpm run typegento generate TypeScript interfaces - Create processor in
src/[network]/processors/or use existing template - Update
squid.yamlif adding new processor
- Edit GraphQL files in
src/**/*.graphql - Run
pnpm run generate(generates TypeORM entities + migration) - Generated files are auto-staged in git
- Use
.insert()or.upsert()for entity saves - Batch operations by collecting entities in maps
- Save at end of context processing, not per-event
- Create separate filter per event type with descriptive names
- Handle each event in its own conditional block
- Use maps for entity tracking (
Map<string, Entity>)
- Order fields with indexed fields first
- Use
@indexdirective only for queried fields - Prefix entities with context (e.g.,
PoolBooster*)
- TypeScript sources in
src/, compiled JS inlib/ - All TypeORM classes exported by
src/model/index.ts - Database migrations in
db/migrations/(plain JS files) - Schema generated from
src/**/*.graphqlfiles