This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
The 0L Network Explorer is a full-stack blockchain explorer application with:
- api/: NestJS GraphQL backend with ClickHouse analytics
- web-app/: React TypeScript frontend with Vite
- api/transformer/: Rust binary for blockchain data transformation
- infra/: Kubernetes deployment configurations
- ol-fyi-local-infra/: Docker Compose for local development
cd api
npm install
npm run start:dev # Development with hot reload (port 3000)
npm run build # Production build
npm run test # Run Jest unit tests
npm run test:watch # Jest watch mode
npm run test:cov # Coverage report
npm run test:e2e # End-to-end tests
npm run lint # ESLint with auto-fix
npm run format # Prettier formatting
npx prisma generate # Regenerate Prisma client after schema changes
npx prisma db push # Push schema changes to databasecd web-app
npm install
npm run dev # Vite dev server (port 5173)
npm run build # TypeScript + Vite production build
npm run lint # ESLint
npm run preview # Preview production build
npm run prettier-fix # Auto-format codecd api/transformer
cargo build # Build the transformer binaryModule Structure (api/src/):
app/app.module.ts: Root module with dependency configurationol/: Core blockchain data handlingaccounts/: Account processing and resolutionvalidators/: Validator information and statisticstransactions/: Transaction factory pattern implementationmovements/: Token movement trackingcommunity-wallets/: Community wallet management
stats/: Analytics and metrics processingnode-watcher/: Network monitoringclickhouse/: ClickHouse database integrationmulti-sig/: Multi-signature wallet operationsredis/,nats/,s3/,firebase/: Service integrations
Role-Based Worker System:
Workers are configured via the ROLES environment variable:
version-batch-processor: Batch blockchain version processingparquet-producer-processor: Parquet file generation for analyticsversion-processor: Individual version processingclickhouse-ingestor-processor: Data ingestion to ClickHouseexpired-transactions-processor: Clean up expired transactionsaccounts-processor: Account data processing
GraphQL Patterns:
- Resolvers use
@Resolver()decorator with model types - Field resolvers use
@ResolveField()for nested data - Pagination uses cursor-based approach with
PaginatedXtypes - Custom scalars for Buffer and BigNumber types
Transaction Processing:
Factory pattern in api/src/ol/transactions/:
TransactionsFactory.ts: Creates transaction handlersTransactionsService.ts: Core business logicTransactionsRepository.ts: Database operationsOnChainTransactionsRepository.ts: Blockchain data access
Module Structure (web-app/src/modules/):
core/: Application foundationrouter.tsx: React Router v6 configurationapollo-client.ts: GraphQL client setup with WebSocket subscriptionsroutes/: Page components (Account, Stats, Validators, Blocks, etc.)
ui/: Reusable UI componentsinterface/: TypeScript interfaces and typesaptos/: Wallet integration componentsol/,movements/: Domain-specific modules
Routing Structure:
/accounts/:address: Account details with nested routes (movements, transactions)/transactions/:version: Transaction details/blocks/:blockHeight: Block exploration/validators: Validator list and details/stats: Network statistics dashboard/community-wallets: Community wallet tracking
State Management:
- Apollo Client for GraphQL state and caching
- Real-time updates via GraphQL subscriptions
- Styled Components + Tailwind CSS for styling
- Blockchain data ingested via role-based processors
- Rust transformer processes raw data (
api/transformer/) - Processed data stored in ClickHouse (analytics) and PostgreSQL (app data)
- GraphQL resolvers query both databases
- React frontend consumes GraphQL API with real-time subscriptions via WebSocket
- Docker and Docker Compose
- Node.js 22+
- Rust and Cargo
- PostgreSQL client tools
-
Start infrastructure:
cd ol-fyi-local-infra docker compose up -d -
Run ClickHouse migrations:
docker compose exec -T clickhouse clickhouse-client --database=olfyi -n < ../api/tables_local.sql
-
Build transformer:
cd api/transformer cargo build -
Setup API:
cd api npm install cp .env.example .env npx prisma generate npx prisma db push npm run start:dev -
Setup frontend:
cd web-app npm install npm run dev
Key environment variables in api/.env:
DATABASE_URL: PostgreSQL connection for PrismaCLICKHOUSE_HOST,CLICKHOUSE_DATABASE: ClickHouse connectionREDIS_HOST: Redis for BullMQ queuesNATS_SERVERS: NATS messaging systemRPC_PROVIDER_URL: 0L blockchain RPC endpointDATA_API_HOST: Blockchain data APIROLES: Comma-separated list of worker roles to enableS3_*: Object storage configuration for Parquet files
- Test Files:
*.spec.tsfiles co-located with source code - E2E Tests: Separate
/test/directory - Configuration: Jest with ESM support via ts-jest
- Run Tests:
npm run test(unit),npm run test:e2e(integration)
- Prettier: Line width 100, single quotes, trailing commas
- ESLint: TypeScript configuration with auto-fix
- Pre-commit: Run
npm run lintandnpm run prettier-fix
- Dependency Injection: NestJS DI for service management
- Factory Pattern: Transaction processing with pluggable handlers
- Repository Pattern: Clean data access layer abstractions
- Module Federation: Feature-based module organization
- Real-time Updates: GraphQL subscriptions over WebSocket
- Multi-database: PostgreSQL (app), ClickHouse (analytics)
- Background Processing: BullMQ queues with Redis
- Role-based Workers: Configurable processing roles
- Application configuration
- User preferences
- Wallet subscriptions
- Multi-sig wallet data
- Blockchain transactions
- Account balances
- Validator statistics
- Network metrics
- Time-series analytics
- API: Multi-stage build with Rust transformer and Node.js
- Frontend: Vite build with Nginx serving
- Infrastructure: Kubernetes manifests in
/infra/
- Enable specific worker roles per deployment
- Configure appropriate database connections
- Set up S3 for Parquet file storage
- Configure Firebase for push notifications