eth-tracker/internal/syncer/syncer.go

80 lines
1.8 KiB
Go

package syncer
import (
"context"
"log/slog"
"github.com/celo-org/celo-blockchain"
"github.com/celo-org/celo-blockchain/core/types"
"github.com/celo-org/celo-blockchain/ethclient"
"github.com/ef-ds/deque/v2"
"github.com/grassrootseconomics/celo-tracker/internal/chain"
"github.com/grassrootseconomics/celo-tracker/internal/db"
"github.com/grassrootseconomics/celo-tracker/internal/stats"
)
type (
SyncerOpts struct {
WebSocketEndpoint string
EnableHistorical bool
StartBlock uint64
BatchQueue *deque.Deque[uint64]
BlocksQueue *deque.Deque[types.Block]
Chain *chain.Chain
Logg *slog.Logger
Stats *stats.Stats
DB *db.DB
}
Syncer struct {
batchQueue *deque.Deque[uint64]
blocksQueue *deque.Deque[types.Block]
chain *chain.Chain
logg *slog.Logger
stats *stats.Stats
ethClient *ethclient.Client
db *db.DB
quit chan struct{}
startBlock uint64
realtimeSub celo.Subscription
}
)
func New(o SyncerOpts) (*Syncer, error) {
if o.EnableHistorical {
latestBlock, err := o.Chain.GetLatestBlock(context.Background())
if err != nil {
return nil, err
}
if o.StartBlock == 0 {
o.StartBlock = latestBlock
}
if err := o.DB.SetLowerBound(o.StartBlock); err != nil {
return nil, err
}
if err := o.DB.SetUpperBound(latestBlock); err != nil {
return nil, err
}
}
ethClient, err := ethclient.Dial(o.WebSocketEndpoint)
if err != nil {
return nil, err
}
return &Syncer{
batchQueue: o.BatchQueue,
blocksQueue: o.BlocksQueue,
chain: o.Chain,
logg: o.Logg,
stats: o.Stats,
ethClient: ethClient,
db: o.DB,
quit: make(chan struct{}),
startBlock: o.StartBlock,
}, nil
}