Get the contract event indexer running in 5 minutes.
- Docker & Docker Compose (recommended)
- OR Node.js 18+ and PostgreSQL 12+
# Start PostgreSQL and indexer service
docker-compose up -d
# Check services are running
docker-compose ps# Create tables and indexes
docker-compose exec indexer pnpm run migrateExpected output:
Starting migrations...
Running migration: 000_initial_schema
Creating initial schema...
✓ Migration 000_initial_schema completed
Running migration: 001_add_contract_events_replay_indexes
Creating contract_events replay indexes...
✓ Migration 001_add_contract_events_replay_indexes completed
✓ All migrations completed successfully
# Generate 10,000 test events
docker-compose exec indexer pnpm run seed 10000curl -X POST http://localhost:3000/internal/indexer/events/replay \
-H "Content-Type: application/json" \
-d '{
"contract_id": "contract-0",
"ledger": 1
}'curl http://localhost:3000/internal/indexer/statusdocker-compose exec indexer pnpm testdocker-compose exec indexer pnpm run benchmark# Install pnpm if not already installed
npm install -g pnpm
# Install project dependencies
pnpm install# Copy environment template
cp .env.example .env
# Edit .env with your PostgreSQL credentials
# DATABASE_URL=postgresql://user:password@localhost:5432/indexer_db# Create database (if needed)
createdb indexer_db
# Run migrations
pnpm run migratepnpm run seed 10000# Development mode with auto-reload
pnpm run dev
# Or build and run production
pnpm run build
pnpm start# Start replay
curl -X POST http://localhost:3000/internal/indexer/events/replay \
-H "Content-Type: application/json" \
-d '{
"contract_id": "contract-0",
"ledger": 1
}'
# Check status
curl http://localhost:3000/internal/indexer/statuspnpm test:coveragecurl http://localhost:3000/healthExpected: {"status":"healthy"}
# Docker
docker-compose exec postgres psql -U indexer_user -d indexer_db -c "\dt"
# Local
psql $DATABASE_URL -c "\dt"Expected tables:
historical_eventscontract_events
# Docker
docker-compose exec postgres psql -U indexer_user -d indexer_db -c "\di"
# Local
psql $DATABASE_URL -c "\di"Expected indexes:
idx_contract_events_contract_ledgeridx_contract_events_pending_ingestionidx_historical_events_replay
# View logs
docker-compose logs -f indexer
# Stop services
docker-compose down
# Restart services
docker-compose restart
# Clean up (removes volumes)
docker-compose down -v# Run tests
pnpm test
# Run tests with coverage
pnpm test:coverage
# Run tests in watch mode
pnpm test:watch
# Build TypeScript
pnpm run build
# Run benchmark
pnpm run benchmark
# Seed more data
pnpm run seed 100000# Check what's using port 3000
lsof -i :3000
# Or use a different port
PORT=3001 pnpm run dev# Check PostgreSQL is running
docker-compose ps postgres
# Check connection string
echo $DATABASE_URL
# Test connection
psql $DATABASE_URL -c "SELECT 1"# Check database exists
psql -l | grep indexer
# Drop and recreate (WARNING: deletes all data)
docker-compose down -v
docker-compose up -d
docker-compose exec indexer pnpm run migrate# Ensure test database is clean
docker-compose down -v
docker-compose up -d
docker-compose exec indexer pnpm test- Read the documentation: docs/indexer.md
- Try examples: EXAMPLES.md
- Review security: SECURITY.md
- Check implementation: IMPLEMENTATION_SUMMARY.md
POST /internal/indexer/events/replay
Content-Type: application/json
{
"contract_id": "string",
"ledger": number,
"from_block": number (optional),
"to_block": number (optional)
}GET /internal/indexer/statusGET /health-
Tune batch size: Adjust
REPLAY_BATCH_SIZEbased on your hardware- Small (100-500): Lower memory, more round-trips
- Medium (1000-2000): Balanced (recommended)
- Large (5000+): Faster, higher memory
-
Monitor resources: Watch CPU, memory, and database connections
docker stats indexer-service
-
Run during off-peak: Large replays can impact OLTP workload
-
Use block ranges: Replay incrementally for very large datasets
# Replay in chunks curl -X POST http://localhost:3000/internal/indexer/events/replay \ -d '{"contract_id": "contract-0", "ledger": 1, "from_block": 0, "to_block": 10000}'
- Documentation: See docs/indexer.md
- Examples: See EXAMPLES.md
- Issues: Check existing issues or create a new one
- Security: See SECURITY.md
Ready to go! 🚀
Your indexer is now running and ready to replay contract events with optimized batch processing.