mirror of
https://github.com/grassrootseconomics/eth-tracker.git
synced 2025-02-23 08:02:16 +01:00
78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
package syncer
|
|
|
|
import (
|
|
"context"
|
|
"log/slog"
|
|
|
|
"github.com/celo-org/celo-blockchain"
|
|
"github.com/celo-org/celo-blockchain/ethclient"
|
|
"github.com/grassrootseconomics/celo-tracker/db"
|
|
"github.com/grassrootseconomics/celo-tracker/internal/chain"
|
|
"github.com/grassrootseconomics/celo-tracker/internal/pool"
|
|
"github.com/grassrootseconomics/celo-tracker/internal/stats"
|
|
)
|
|
|
|
type (
|
|
SyncerOpts struct {
|
|
DB db.DB
|
|
Chain chain.Chain
|
|
Logg *slog.Logger
|
|
Pool *pool.Pool
|
|
Stats *stats.Stats
|
|
StartBlock int64
|
|
WebSocketEndpoint string
|
|
}
|
|
|
|
Syncer struct {
|
|
db db.DB
|
|
ethClient *ethclient.Client
|
|
logg *slog.Logger
|
|
realtimeSub celo.Subscription
|
|
pool *pool.Pool
|
|
stats *stats.Stats
|
|
stopCh chan struct{}
|
|
}
|
|
)
|
|
|
|
func New(o SyncerOpts) (*Syncer, error) {
|
|
latestBlock, err := o.Chain.GetLatestBlock(context.Background())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
lowerBound, err := o.DB.GetLowerBound()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if lowerBound == 0 {
|
|
if o.StartBlock > 0 {
|
|
if err := o.DB.SetLowerBound(uint64(o.StartBlock)); err != nil {
|
|
return nil, err
|
|
}
|
|
} else {
|
|
if err := o.DB.SetLowerBound(latestBlock); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
}
|
|
|
|
if err := o.DB.SetUpperBound(latestBlock); err != nil {
|
|
return nil, err
|
|
}
|
|
o.Stats.SetLatestBlock(latestBlock)
|
|
|
|
ethClient, err := ethclient.Dial(o.WebSocketEndpoint)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &Syncer{
|
|
db: o.DB,
|
|
ethClient: ethClient,
|
|
logg: o.Logg,
|
|
pool: o.Pool,
|
|
stats: o.Stats,
|
|
stopCh: make(chan struct{}),
|
|
}, nil
|
|
}
|