Files
explorer-monorepo/backend/indexer/main.go
2026-03-02 12:14:13 -08:00

89 lines
2.1 KiB
Go

package main
import (
"context"
"log"
"os"
"os/signal"
"strconv"
"syscall"
"github.com/ethereum/go-ethereum/ethclient"
pgconfig "github.com/explorer/backend/libs/go-pgconfig"
"github.com/explorer/backend/indexer/listener"
"github.com/explorer/backend/indexer/processor"
"github.com/jackc/pgx/v5/pgxpool"
)
func main() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Load configuration (reusable lib: libs/go-pgconfig)
dbConfig := pgconfig.LoadDatabaseConfig()
poolConfig, err := dbConfig.PoolConfig()
if err != nil {
log.Fatalf("Failed to create pool config: %v", err)
}
// Connect to database
db, err := pgxpool.NewWithConfig(ctx, poolConfig)
if err != nil {
log.Fatalf("Failed to connect to database: %v", err)
}
defer db.Close()
// Connect to RPC
rpcURL := os.Getenv("RPC_URL")
if rpcURL == "" {
rpcURL = "http://localhost:8545"
}
wsURL := os.Getenv("WS_URL")
chainID := 138
if envChainID := os.Getenv("CHAIN_ID"); envChainID != "" {
if id, err := strconv.Atoi(envChainID); err == nil {
chainID = id
}
}
client, err := ethclient.Dial(rpcURL)
if err != nil {
log.Fatalf("Failed to connect to RPC: %v", err)
}
defer client.Close()
// Create block listener
blockListener, err := listener.NewBlockListener(rpcURL, wsURL, int64(chainID))
if err != nil {
log.Fatalf("Failed to create block listener: %v", err)
}
defer blockListener.Stop()
// Create block processor
blockProcessor := processor.NewBlockProcessor(db, client, chainID)
// Start listening
if err := blockListener.Start(); err != nil {
log.Fatalf("Failed to start block listener: %v", err)
}
// Process blocks
go func() {
for block := range blockListener.GetBlockChannel() {
if err := blockProcessor.ProcessBlock(ctx, block); err != nil {
log.Printf("Failed to process block %d: %v", block.Number().Int64(), err)
} else {
log.Printf("Processed block %d", block.Number().Int64())
}
}
}()
// Wait for interrupt
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
<-sigChan
log.Println("Shutting down...")
}