wormhole-explorer/fly/cmd/backfiller/txhash_encoding_strategy.go

104 lines
3.2 KiB
Go

package main
import (
"context"
"encoding/hex"
"time"
"github.com/wormhole-foundation/wormhole-explorer/common/client/alert"
"github.com/wormhole-foundation/wormhole-explorer/common/dbutil"
"github.com/wormhole-foundation/wormhole-explorer/common/domain"
"github.com/wormhole-foundation/wormhole-explorer/common/logger"
"github.com/wormhole-foundation/wormhole-explorer/fly/event"
"github.com/wormhole-foundation/wormhole-explorer/fly/internal/metrics"
"github.com/wormhole-foundation/wormhole-explorer/fly/producer"
"github.com/wormhole-foundation/wormhole-explorer/fly/storage"
"github.com/wormhole-foundation/wormhole-explorer/fly/txhash"
"github.com/wormhole-foundation/wormhole/sdk/vaa"
"go.uber.org/zap"
)
type TxHashEncondingConfig struct {
LogLevel string `env:"LOG_LEVEL,required"`
MongoURI string `env:"MONGODB_URI,required"`
MongoDatabase string `env:"MONGODB_DATABASE,required"`
ChainID uint16 `env:"CHAIN_ID,required"`
PageSize int64 `env:"PAGE_SIZE,required"`
}
func RunTxHashEncoding(cfg TxHashEncondingConfig) {
ctx := context.Background()
logger := logger.New("wormhole-fly", logger.WithLevel(cfg.LogLevel))
db, err := dbutil.Connect(ctx, logger, cfg.MongoURI, cfg.MongoDatabase, false)
if err != nil {
logger.Fatal("could not connect to DB", zap.Error(err))
}
defer db.DisconnectWithTimeout(10 * time.Second)
repository := storage.NewRepository(
alert.NewDummyClient(),
metrics.NewDummyMetrics(),
db.Database,
producer.NewVAAInMemory(logger).Push,
txhash.NewMongoTxHash(db.Database, logger),
event.NewNoopEventDispatcher(),
logger)
workerTxHashEncoding(ctx, logger, repository, vaa.ChainID(cfg.ChainID), cfg.PageSize)
}
func workerTxHashEncoding(ctx context.Context, logger *zap.Logger, repo *storage.Repository, chainID vaa.ChainID, pageSize int64) {
log := logger.With(zap.String("chainID", chainID.String()))
log.Info("Processing chain")
page := int64(0)
for {
log.Info("Processing page", zap.Int64("page", page))
vaas, err := repo.FindVaaByChainID(ctx, chainID, page, pageSize)
if err != nil {
log.Error("Failed to get vaas", zap.Error(err))
break
}
if len(vaas) == 0 {
log.Info("Empty page", zap.Int64("page", page))
break
}
for _, v := range vaas {
l := log.With(zap.String("vaaId", v.ID), zap.String("txHash", v.TxHash))
// check if txHash is already processed
if v.OriginTxHash != nil && *v.OriginTxHash != "" {
l.Debug("Already processed")
continue
}
// check if txHash is not a hexadecimal, ignore it
if len(v.TxHash) != 64 && len(v.TxHash) != 66 {
l.Debug("txHash is not hexadecimal, ignore it")
continue
}
hexTxHash, err := hex.DecodeString(v.TxHash)
// txHash is not hex
if err != nil {
l.Error("txHash can not decode to hexadecimal", zap.Error(err))
continue
}
newTxHash, err := domain.EncodeTrxHashByChainID(chainID, hexTxHash)
if err != nil {
l.Error("Failed to encode txHash", zap.String("vaaId", v.ID), zap.String("txHash", v.TxHash), zap.Error(err))
continue
}
err = repo.ReplaceVaaTxHash(ctx, v.ID, v.TxHash, newTxHash)
if err != nil {
l.Error("replacing txHash", zap.Error(err))
continue
}
l.Debug("Processing vaa")
}
page++
}
}