diff --git a/analytics/cmd/main.go b/analytics/cmd/main.go index 06e96b5b..0e5f20bf 100644 --- a/analytics/cmd/main.go +++ b/analytics/cmd/main.go @@ -72,14 +72,14 @@ func addVaaCountCommand(parent *cobra.Command) { } func addVaaVolumeFromFileCommand(parent *cobra.Command) { - var input, output, prices, vaaPayloadParserURL string + var input, output, prices, vaaPayloadParserURL, p2pNetwork string //vaa-volume from csv file vaaVolumeFileCmd := &cobra.Command{ Use: "file", Short: "Generate volume metrics from a VAA csv file", Run: func(_ *cobra.Command, _ []string) { - metrics.RunVaaVolumeFromFile(input, output, prices, vaaPayloadParserURL) + metrics.RunVaaVolumeFromFile(input, output, prices, vaaPayloadParserURL, p2pNetwork) }, } @@ -96,17 +96,21 @@ func addVaaVolumeFromFileCommand(parent *cobra.Command) { vaaVolumeFileCmd.Flags().StringVar(&vaaPayloadParserURL, "vaa-payload-parser-url", "", "VAA payload parser URL") vaaVolumeFileCmd.MarkFlagRequired("vaa-payload-parser-url") + //p2p-network flag + vaaVolumeFileCmd.Flags().StringVar(&p2pNetwork, "p2p-network", "", "P2P network") + vaaVolumeFileCmd.MarkFlagRequired("p2p-network") + parent.AddCommand(vaaVolumeFileCmd) } func addVaaVolumeFromMongoCommand(parent *cobra.Command) { - var mongoUri, mongoDb, output, prices, vaaPayloadParserURL string + var mongoUri, mongoDb, output, prices, vaaPayloadParserURL, p2pNetwork string //vaa-volume from MongoDB vaaVolumeMongoCmd := &cobra.Command{ Use: "mongo", Short: "Generate volume metrics from MongoDB", Run: func(_ *cobra.Command, _ []string) { - metrics.RunVaaVolumeFromMongo(mongoUri, mongoDb, output, prices, vaaPayloadParserURL) + metrics.RunVaaVolumeFromMongo(mongoUri, mongoDb, output, prices, vaaPayloadParserURL, p2pNetwork) }, } @@ -124,6 +128,10 @@ func addVaaVolumeFromMongoCommand(parent *cobra.Command) { vaaVolumeMongoCmd.Flags().StringVar(&vaaPayloadParserURL, "vaa-payload-parser-url", "", "VAA payload parser URL") vaaVolumeMongoCmd.MarkFlagRequired("vaa-payload-parser-url") + //p2p-network flag + vaaVolumeMongoCmd.Flags().StringVar(&p2pNetwork, "p2p-network", "", "P2P network") + vaaVolumeMongoCmd.MarkFlagRequired("p2p-network") + parent.AddCommand(vaaVolumeMongoCmd) } @@ -141,16 +149,20 @@ func addVaaVolumeCommand(parent *cobra.Command) { } func addPricesCommand(root *cobra.Command) { - var output string + var output, p2pNetwork string vaaCountCmd := &cobra.Command{ Use: "history", Short: "Generate notional price history for symbol", Run: func(_ *cobra.Command, _ []string) { - prices.RunPrices(output) + prices.RunPrices(output, p2pNetwork) }, } // output flag vaaCountCmd.Flags().StringVar(&output, "output", "", "path to output file") vaaCountCmd.MarkFlagRequired("output") + + //p2p-network flag + vaaCountCmd.Flags().StringVar(&p2pNetwork, "p2p-network", "", "P2P network") + vaaCountCmd.MarkFlagRequired("p2p-network") root.AddCommand(vaaCountCmd) } diff --git a/analytics/cmd/metrics/volume.go b/analytics/cmd/metrics/volume.go index 3a940f92..1bad29ec 100644 --- a/analytics/cmd/metrics/volume.go +++ b/analytics/cmd/metrics/volume.go @@ -22,15 +22,17 @@ type VaaConverter struct { PriceCache *prices.CoinPricesCache Metrics metrics.Metrics GetTransferredTokenByVaa token.GetTransferredTokenByVaa + TokenProvider *domain.TokenProvider } -func NewVaaConverter(priceCache *prices.CoinPricesCache, GetTransferredTokenByVaa token.GetTransferredTokenByVaa) *VaaConverter { +func NewVaaConverter(priceCache *prices.CoinPricesCache, GetTransferredTokenByVaa token.GetTransferredTokenByVaa, tokenProvider *domain.TokenProvider) *VaaConverter { return &VaaConverter{ MissingTokens: make(map[sdk.Address]sdk.ChainID), MissingTokensCounter: make(map[sdk.Address]int), PriceCache: priceCache, Metrics: metrics.NewNoopMetrics(), GetTransferredTokenByVaa: GetTransferredTokenByVaa, + TokenProvider: tokenProvider, } } @@ -47,7 +49,7 @@ func (c *VaaConverter) Convert(ctx context.Context, vaaBytes []byte) (string, er } // Look up token metadata - tokenMetadata, ok := domain.GetTokenByAddress(transferredToken.TokenChain, transferredToken.TokenAddress.String()) + tokenMetadata, ok := c.TokenProvider.GetTokenByAddress(transferredToken.TokenChain, transferredToken.TokenAddress.String()) if !ok { // if not found, add to missing tokens @@ -74,6 +76,7 @@ func (c *VaaConverter) Convert(ctx context.Context, vaaBytes []byte) (string, er }, Metrics: c.Metrics, TransferredToken: transferredToken, + TokenProvider: c.TokenProvider, } var err error diff --git a/analytics/cmd/metrics/volume_csv.go b/analytics/cmd/metrics/volume_csv.go index 9f15beea..9ea6a944 100755 --- a/analytics/cmd/metrics/volume_csv.go +++ b/analytics/cmd/metrics/volume_csv.go @@ -12,6 +12,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/analytics/cmd/token" "github.com/wormhole-foundation/wormhole-explorer/analytics/prices" "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" + "github.com/wormhole-foundation/wormhole-explorer/common/domain" "github.com/wormhole-foundation/wormhole-explorer/common/logger" "go.uber.org/zap" ) @@ -22,7 +23,7 @@ type LineParser struct { // read a csv file with VAAs and convert into a decoded csv file // ready to upload to the database -func RunVaaVolumeFromFile(inputFile, outputFile, pricesFile, vaaPayloadParserURL string) { +func RunVaaVolumeFromFile(inputFile, outputFile, pricesFile, vaaPayloadParserURL, p2pNetwork string) { ctx := context.Background() // build logger @@ -39,6 +40,9 @@ func RunVaaVolumeFromFile(inputFile, outputFile, pricesFile, vaaPayloadParserURL // create a token resolver tokenResolver := token.NewTokenResolver(parserVAAAPIClient, logger) + // create a token provider + tokenProvider := domain.NewTokenProvider(p2pNetwork) + // open input file f, err := os.Open(inputFile) if err != nil { @@ -65,7 +69,7 @@ func RunVaaVolumeFromFile(inputFile, outputFile, pricesFile, vaaPayloadParserURL logger.Info("loading historical prices...") priceCache := prices.NewCoinPricesCache(pricesFile) priceCache.InitCache() - converter := NewVaaConverter(priceCache, tokenResolver.GetTransferredTokenByVaa) + converter := NewVaaConverter(priceCache, tokenResolver.GetTransferredTokenByVaa, tokenProvider) lp := NewLineParser(converter) logger.Info("loaded historical prices") diff --git a/analytics/cmd/metrics/volume_mongo.go b/analytics/cmd/metrics/volume_mongo.go index a740591a..5f3a982a 100755 --- a/analytics/cmd/metrics/volume_mongo.go +++ b/analytics/cmd/metrics/volume_mongo.go @@ -10,6 +10,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/analytics/prices" "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" "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/common/repository" "go.uber.org/zap" @@ -17,7 +18,7 @@ import ( // read a csv file with VAAs and convert into a decoded csv file // ready to upload to the database -func RunVaaVolumeFromMongo(mongoUri, mongoDb, outputFile, pricesFile, vaaPayloadParserURL string) { +func RunVaaVolumeFromMongo(mongoUri, mongoDb, outputFile, pricesFile, vaaPayloadParserURL, p2pNetwork string) { rootCtx := context.Background() @@ -44,6 +45,9 @@ func RunVaaVolumeFromMongo(mongoUri, mongoDb, outputFile, pricesFile, vaaPayload // create a token resolver tokenResolver := token.NewTokenResolver(parserVAAAPIClient, logger) + // create a token provider + tokenProvider := domain.NewTokenProvider(p2pNetwork) + // create missing tokens file missingTokensFile := "missing_tokens.csv" fmissingTokens, err := os.Create(missingTokensFile) @@ -63,7 +67,7 @@ func RunVaaVolumeFromMongo(mongoUri, mongoDb, outputFile, pricesFile, vaaPayload logger.Info("loading historical prices...") priceCache := prices.NewCoinPricesCache(pricesFile) priceCache.InitCache() - converter := NewVaaConverter(priceCache, tokenResolver.GetTransferredTokenByVaa) + converter := NewVaaConverter(priceCache, tokenResolver.GetTransferredTokenByVaa, tokenProvider) logger.Info("loaded historical prices") endTime := time.Now() diff --git a/analytics/cmd/prices/run.go b/analytics/cmd/prices/run.go index 6d31ba59..74c226a6 100644 --- a/analytics/cmd/prices/run.go +++ b/analytics/cmd/prices/run.go @@ -14,7 +14,7 @@ import ( // go througth the symbol list provided by wormhole // and fetch the history from coingecko // and save it to a file -func RunPrices(output string) { +func RunPrices(output, p2pNetwork string) { // build logger logger := logger.New("wormhole-explorer-analytics") @@ -29,7 +29,9 @@ func RunPrices(output string) { } defer pricesOutput.Close() - tokens := domain.GetAllTokens() + // create token provider + tokenProvider := domain.NewTokenProvider(p2pNetwork) + tokens := tokenProvider.GetAllTokens() logger.Info("found tokens", zap.Int("count", len(tokens))) for index, token := range tokens { logger.Info("processing token", diff --git a/analytics/cmd/service/run.go b/analytics/cmd/service/run.go index 20252418..1bd2ec95 100644 --- a/analytics/cmd/service/run.go +++ b/analytics/cmd/service/run.go @@ -27,6 +27,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" sqs_client "github.com/wormhole-foundation/wormhole-explorer/common/client/sqs" "github.com/wormhole-foundation/wormhole-explorer/common/dbutil" + "github.com/wormhole-foundation/wormhole-explorer/common/domain" health "github.com/wormhole-foundation/wormhole-explorer/common/health" "github.com/wormhole-foundation/wormhole-explorer/common/logger" "go.mongodb.org/mongo-driver/mongo" @@ -97,19 +98,28 @@ func Run() { // create a token resolver tokenResolver := token.NewTokenResolver(parserVAAAPIClient, logger) + // create a token provider + tokenProvider := domain.NewTokenProvider(config.P2pNetwork) + // create a metrics instance logger.Info("initializing metrics instance...") metric, err := metric.New(rootCtx, db.Database, influxCli, config.InfluxOrganization, config.InfluxBucketInfinite, - config.InfluxBucket30Days, config.InfluxBucket24Hours, notionalCache, metrics, tokenResolver.GetTransferredTokenByVaa, logger) + config.InfluxBucket30Days, config.InfluxBucket24Hours, notionalCache, metrics, tokenResolver.GetTransferredTokenByVaa, tokenProvider, logger) if err != nil { logger.Fatal("failed to create metrics instance", zap.Error(err)) } - // create and start a consumer. - logger.Info("initializing metrics consumer...") - vaaConsumeFunc := newVAAConsume(rootCtx, config, logger) - consumer := consumer.New(vaaConsumeFunc, metric.Push, logger, config.P2pNetwork) - consumer.Start(rootCtx) + // create and start a vaa consumer. + logger.Info("initializing vaa consumer...") + vaaConsumeFunc := newVAAConsumeFunc(rootCtx, config, logger) + vaaConsumer := consumer.New(vaaConsumeFunc, metric.Push, logger, config.P2pNetwork) + vaaConsumer.Start(rootCtx) + + // create and start a notification consumer. + logger.Info("initializing notification consumer...") + notificationConsumeFunc := newNotificationConsumeFunc(rootCtx, config, logger) + notificationConsumer := consumer.New(notificationConsumeFunc, metric.Push, logger, config.P2pNetwork) + notificationConsumer.Start(rootCtx) // create and start server. logger.Info("initializing infrastructure server...") @@ -146,23 +156,34 @@ func Run() { } // Creates a callbacks depending on whether the execution is local (memory queue) or not (SQS queue) -func newVAAConsume(appCtx context.Context, config *config.Configuration, logger *zap.Logger) queue.VAAConsumeFunc { - sqsConsumer, err := newSQSConsumer(appCtx, config) +func newVAAConsumeFunc(appCtx context.Context, config *config.Configuration, logger *zap.Logger) queue.ConsumeFunc { + sqsConsumer, err := newSQSConsumer(appCtx, config, config.PipelineSQSUrl) if err != nil { logger.Fatal("failed to create sqs consumer", zap.Error(err)) } - vaaQueue := queue.NewVaaSqs(sqsConsumer, logger) + vaaQueue := queue.NewEventSqs(sqsConsumer, queue.NewVaaConverter(logger), logger) return vaaQueue.Consume } -func newSQSConsumer(appCtx context.Context, config *config.Configuration) (*sqs_client.Consumer, error) { +func newNotificationConsumeFunc(ctx context.Context, cfg *config.Configuration, logger *zap.Logger) queue.ConsumeFunc { + + sqsConsumer, err := newSQSConsumer(ctx, cfg, cfg.NotificationsSQSUrl) + if err != nil { + logger.Fatal("failed to create sqs consumer", zap.Error(err)) + } + + vaaQueue := queue.NewEventSqs(sqsConsumer, queue.NewNotificationEvent(logger), logger) + return vaaQueue.Consume +} + +func newSQSConsumer(appCtx context.Context, config *config.Configuration, sqsUrl string) (*sqs_client.Consumer, error) { awsconfig, err := newAwsConfig(appCtx, config) if err != nil { return nil, err } - return sqs_client.NewConsumer(awsconfig, config.SQSUrl, + return sqs_client.NewConsumer(awsconfig, sqsUrl, sqs_client.WithMaxMessages(10), sqs_client.WithVisibilityTimeout(120)) } @@ -211,7 +232,8 @@ func newHealthChecks( } healthChecks := []health.Check{ - health.SQS(awsConfig, config.SQSUrl), + health.SQS(awsConfig, config.PipelineSQSUrl), + health.SQS(awsConfig, config.NotificationsSQSUrl), health.Influx(influxCli), health.Mongo(db), } diff --git a/analytics/cmd/token/token.go b/analytics/cmd/token/token.go index 52ced44c..f1f944b2 100644 --- a/analytics/cmd/token/token.go +++ b/analytics/cmd/token/token.go @@ -94,7 +94,7 @@ func (r *TokenResolver) GetTransferredTokenByVaa(ctx context.Context, vaa *sdk.V token, err := createToken(result.StandardizedProperties, vaa.EmitterChain) if err != nil { - r.logger.Error("Creating transferred token", + r.logger.Debug("Creating transferred token", zap.String("vaaId", vaa.MessageID()), zap.Error(err)) return nil, ErrUnknownToken diff --git a/analytics/config/config.go b/analytics/config/config.go index d984ff63..01fa9ea5 100644 --- a/analytics/config/config.go +++ b/analytics/config/config.go @@ -17,7 +17,8 @@ type Configuration struct { AwsAccessKeyID string `env:"AWS_ACCESS_KEY_ID"` AwsSecretAccessKey string `env:"AWS_SECRET_ACCESS_KEY"` AwsRegion string `env:"AWS_REGION"` - SQSUrl string `env:"SQS_URL"` + PipelineSQSUrl string `env:"PIPELINE_SQS_URL"` + NotificationsSQSUrl string `env:"NOTIFICATIONS_SQS_URL"` InfluxUrl string `env:"INFLUX_URL"` InfluxToken string `env:"INFLUX_TOKEN"` InfluxOrganization string `env:"INFLUX_ORGANIZATION"` diff --git a/analytics/consumer/consumer.go b/analytics/consumer/consumer.go index c6d840d9..55916c9f 100644 --- a/analytics/consumer/consumer.go +++ b/analytics/consumer/consumer.go @@ -11,14 +11,14 @@ import ( // Consumer consumer struct definition. type Consumer struct { - consume queue.VAAConsumeFunc + consume queue.ConsumeFunc pushMetric metric.MetricPushFunc logger *zap.Logger p2pNetwork string } // New creates a new vaa consumer. -func New(consume queue.VAAConsumeFunc, pushMetric metric.MetricPushFunc, logger *zap.Logger, p2pNetwork string) *Consumer { +func New(consume queue.ConsumeFunc, pushMetric metric.MetricPushFunc, logger *zap.Logger, p2pNetwork string) *Consumer { return &Consumer{consume: consume, pushMetric: pushMetric, logger: logger, p2pNetwork: p2pNetwork} } @@ -44,7 +44,7 @@ func (c *Consumer) Start(ctx context.Context) { } // push vaa metrics. - err = c.pushMetric(ctx, vaa) + err = c.pushMetric(ctx, &metric.Params{TrackID: event.TrackID, Vaa: vaa, VaaIsSigned: event.VaaIsSigned}) if err != nil { msg.Failed() continue diff --git a/analytics/http/infrastructure/controller.go b/analytics/http/infrastructure/controller.go deleted file mode 100644 index 612d7a7d..00000000 --- a/analytics/http/infrastructure/controller.go +++ /dev/null @@ -1,46 +0,0 @@ -package infrastructure - -import ( - "fmt" - - "github.com/gofiber/fiber/v2" - health "github.com/wormhole-foundation/wormhole-explorer/common/health" - "go.uber.org/zap" -) - -// Controller definition. -type Controller struct { - checks []health.Check - logger *zap.Logger -} - -// NewController creates a Controller instance. -func NewController(checks []health.Check, logger *zap.Logger) *Controller { - return &Controller{checks: checks, logger: logger} -} - -// HealthCheck handler for the endpoint /health. -func (c *Controller) HealthCheck(ctx *fiber.Ctx) error { - return ctx.JSON(struct { - Status string `json:"status"` - }{Status: "OK"}) -} - -// ReadyCheck handler for the endpoint /ready. -func (c *Controller) ReadyCheck(ctx *fiber.Ctx) error { - rctx := ctx.Context() - requestID := fmt.Sprintf("%v", rctx.Value("requestid")) - for _, check := range c.checks { - if err := check(rctx); err != nil { - c.logger.Error("Ready check failed", zap.Error(err), zap.String("requestID", requestID)) - return ctx.Status(fiber.StatusInternalServerError).JSON(struct { - Ready string `json:"ready"` - Error string `json:"error"` - }{Ready: "NO", Error: err.Error()}) - } - } - return ctx.Status(fiber.StatusOK).JSON(struct { - Ready string `json:"ready"` - }{Ready: "OK"}) - -} diff --git a/analytics/http/server.go b/analytics/http/server.go index 639826a7..eeb8f8fc 100644 --- a/analytics/http/server.go +++ b/analytics/http/server.go @@ -4,7 +4,6 @@ import ( "github.com/ansrivas/fiberprometheus/v2" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/pprof" - "github.com/wormhole-foundation/wormhole-explorer/analytics/http/infrastructure" "github.com/wormhole-foundation/wormhole-explorer/analytics/http/vaa" health "github.com/wormhole-foundation/wormhole-explorer/common/health" "go.uber.org/zap" @@ -29,7 +28,7 @@ func NewServer(logger *zap.Logger, port string, pprofEnabled bool, vaaController app.Use(pprof.New()) } - ctrl := infrastructure.NewController(checks, logger) + ctrl := health.NewController(checks, logger) api := app.Group("/api") api.Get("/health", ctrl.HealthCheck) api.Get("/ready", ctrl.ReadyCheck) diff --git a/analytics/http/vaa/controller.go b/analytics/http/vaa/controller.go index 5941e5bf..05ad17c4 100644 --- a/analytics/http/vaa/controller.go +++ b/analytics/http/vaa/controller.go @@ -1,6 +1,8 @@ package vaa import ( + "fmt" + "github.com/gofiber/fiber/v2" "github.com/wormhole-foundation/wormhole-explorer/analytics/metric" sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" @@ -44,7 +46,8 @@ func (c *Controller) PushVAAMetrics(ctx *fiber.Ctx) error { return err } - err = c.pushMetric(ctx.Context(), vaa) + trackID := fmt.Sprintf("controller-%s", vaa.MessageID()) + err = c.pushMetric(ctx.Context(), &metric.Params{TrackID: trackID, Vaa: vaa}) if err != nil { c.logger.Error("Error pushing metric", zap.Error(err)) return err diff --git a/analytics/metric/metric.go b/analytics/metric/metric.go index bfc0cd31..db1943b2 100644 --- a/analytics/metric/metric.go +++ b/analytics/metric/metric.go @@ -38,6 +38,7 @@ type Metric struct { notionalCache wormscanNotionalCache.NotionalLocalCacheReadable metrics metrics.Metrics getTransferredTokenByVaa token.GetTransferredTokenByVaa + tokenProvider *domain.TokenProvider logger *zap.Logger } @@ -53,6 +54,7 @@ func New( notionalCache wormscanNotionalCache.NotionalLocalCacheReadable, metrics metrics.Metrics, getTransferredTokenByVaa token.GetTransferredTokenByVaa, + tokenProvider *domain.TokenProvider, logger *zap.Logger, ) (*Metric, error) { @@ -72,50 +74,80 @@ func New( notionalCache: notionalCache, metrics: metrics, getTransferredTokenByVaa: getTransferredTokenByVaa, + tokenProvider: tokenProvider, } return &m, nil } // Push implement MetricPushFunc definition. -func (m *Metric) Push(ctx context.Context, vaa *sdk.VAA) error { +func (m *Metric) Push(ctx context.Context, params *Params) error { - err1 := m.vaaCountMeasurement(ctx, vaa) + var err1, err2, err3, err4 error - err2 := m.vaaCountAllMessagesMeasurement(ctx, vaa) + isVaaSigned := params.VaaIsSigned - transferredToken, err := m.getTransferredTokenByVaa(ctx, vaa) - if err != nil { - m.logger.Warn("failed to obtain transferred token for this VAA", - zap.String("vaaId", vaa.MessageID()), - zap.Error(err)) - if err != token.ErrUnknownToken { - return err - } + if isVaaSigned { + err1 = m.vaaCountMeasurement(ctx, params) + + err2 = m.vaaCountAllMessagesMeasurement(ctx, params) } - err3 := m.volumeMeasurement(ctx, vaa, transferredToken.Clone()) + if params.Vaa.EmitterChain != sdk.ChainIDPythNet { - err4 := upsertTransferPrices( - ctx, - m.logger, - vaa, - m.transferPrices, - func(tokenID string, timestamp time.Time) (decimal.Decimal, error) { - - priceData, err := m.notionalCache.Get(tokenID) - if err != nil { - return decimal.NewFromInt(0), err + transferredToken, err := m.getTransferredTokenByVaa(ctx, params.Vaa) + if err != nil { + if err != token.ErrUnknownToken { + m.logger.Error("Failed to obtain transferred token for this VAA", + zap.String("trackId", params.TrackID), + zap.String("vaaId", params.Vaa.MessageID()), + zap.Error(err)) + return err } - return priceData.NotionalUsd, nil - }, - transferredToken.Clone(), - ) + } + + if transferredToken != nil { + + if isVaaSigned { + err3 = m.volumeMeasurement(ctx, params, transferredToken.Clone()) + } + + err4 = upsertTransferPrices( + ctx, + m.logger, + params.Vaa, + m.transferPrices, + func(tokenID string, timestamp time.Time) (decimal.Decimal, error) { + + priceData, err := m.notionalCache.Get(tokenID) + if err != nil { + return decimal.NewFromInt(0), err + } + return priceData.NotionalUsd, nil + }, + transferredToken.Clone(), + m.tokenProvider, + ) + + } else { + + m.logger.Warn("Cannot obtain transferred token for this VAA", + zap.String("trackId", params.TrackID), + zap.String("vaaId", params.Vaa.MessageID()), + ) + } + } //TODO if we had go 1.20, we could just use `errors.Join(err1, err2, err3, ...)` here. if err1 != nil || err2 != nil || err3 != nil || err4 != nil { return fmt.Errorf("err1=%w, err2=%w, err3=%w err4=%w", err1, err2, err3, err4) } + if params.Vaa.EmitterChain != sdk.ChainIDPythNet { + m.logger.Info("Transaction processed successfully", + zap.String("trackId", params.TrackID), + zap.String("vaaId", params.Vaa.MessageID())) + } + return nil } @@ -135,10 +167,10 @@ func (m *Metric) Close() { } // vaaCountMeasurement creates a new point for the `vaa_count` measurement. -func (m *Metric) vaaCountMeasurement(ctx context.Context, vaa *sdk.VAA) error { +func (m *Metric) vaaCountMeasurement(ctx context.Context, p *Params) error { // Create a new point - point, err := MakePointForVaaCount(vaa) + point, err := MakePointForVaaCount(p.Vaa) if err != nil { return fmt.Errorf("failed to generate data point for vaa count measurement: %w", err) } @@ -150,9 +182,9 @@ func (m *Metric) vaaCountMeasurement(ctx context.Context, vaa *sdk.VAA) error { // Write the point to influx err = m.apiBucket30Days.WritePoint(ctx, point) if err != nil { - m.logger.Error("failed to write metric", + m.logger.Error("Failed to write metric", zap.String("measurement", point.Name()), - zap.Uint16("chain_id", uint16(vaa.EmitterChain)), + zap.Uint16("chain_id", uint16(p.Vaa.EmitterChain)), zap.Error(err), ) m.metrics.IncFailedMeasurement(VaaCountMeasurement) @@ -164,15 +196,16 @@ func (m *Metric) vaaCountMeasurement(ctx context.Context, vaa *sdk.VAA) error { } // vaaCountAllMessagesMeasurement creates a new point for the `vaa_count_all_messages` measurement. -func (m *Metric) vaaCountAllMessagesMeasurement(ctx context.Context, vaa *sdk.VAA) error { +func (m *Metric) vaaCountAllMessagesMeasurement(ctx context.Context, params *Params) error { // Quite often we get VAAs that are older than 24 hours. // We do not want to generate metrics for those, and moreover influxDB // returns an error when we try to do so. - if time.Since(vaa.Timestamp) > time.Hour*24 { + if time.Since(params.Vaa.Timestamp) > time.Hour*24 { m.logger.Debug("vaa is older than 24 hours, skipping", - zap.Time("timestamp", vaa.Timestamp), - zap.String("vaaId", vaa.UniqueID()), + zap.String("trackId", params.TrackID), + zap.Time("timestamp", params.Vaa.Timestamp), + zap.String("vaaId", params.Vaa.UniqueID()), ) return nil } @@ -180,16 +213,16 @@ func (m *Metric) vaaCountAllMessagesMeasurement(ctx context.Context, vaa *sdk.VA // Create a new point point := influxdb2. NewPointWithMeasurement(VaaAllMessagesMeasurement). - AddTag("chain_id", strconv.Itoa(int(vaa.EmitterChain))). + AddTag("chain_id", strconv.Itoa(int(params.Vaa.EmitterChain))). AddField("count", 1). - SetTime(generateUniqueTimestamp(vaa)) + SetTime(generateUniqueTimestamp(params.Vaa)) // Write the point to influx err := m.apiBucket24Hours.WritePoint(ctx, point) if err != nil { - m.logger.Error("failed to write metric", + m.logger.Error("Failed to write metric", zap.String("measurement", VaaAllMessagesMeasurement), - zap.Uint16("chain_id", uint16(vaa.EmitterChain)), + zap.Uint16("chain_id", uint16(params.Vaa.EmitterChain)), zap.Error(err), ) m.metrics.IncFailedMeasurement(VaaAllMessagesMeasurement) @@ -201,12 +234,12 @@ func (m *Metric) vaaCountAllMessagesMeasurement(ctx context.Context, vaa *sdk.VA } // volumeMeasurement creates a new point for the `vaa_volume_v2` measurement. -func (m *Metric) volumeMeasurement(ctx context.Context, vaa *sdk.VAA, token *token.TransferredToken) error { +func (m *Metric) volumeMeasurement(ctx context.Context, params *Params, token *token.TransferredToken) error { // Generate a data point for the volume metric p := MakePointForVaaVolumeParams{ Logger: m.logger, - Vaa: vaa, + Vaa: params.Vaa, TokenPriceFunc: func(tokenID string, timestamp time.Time) (decimal.Decimal, error) { priceData, err := m.notionalCache.Get(tokenID) @@ -218,6 +251,7 @@ func (m *Metric) volumeMeasurement(ctx context.Context, vaa *sdk.VAA, token *tok }, Metrics: m.metrics, TransferredToken: token, + TokenProvider: m.tokenProvider, } point, err := MakePointForVaaVolume(&p) if err != nil { @@ -234,8 +268,9 @@ func (m *Metric) volumeMeasurement(ctx context.Context, vaa *sdk.VAA, token *tok m.metrics.IncFailedMeasurement(VaaVolumeMeasurement) return err } - m.logger.Info("Wrote a data point for the volume metric", - zap.String("vaaId", vaa.MessageID()), + m.logger.Debug("Wrote a data point for the volume metric", + zap.String("vaaId", params.Vaa.MessageID()), + zap.String("trackId", params.TrackID), zap.String("measurement", point.Name()), zap.Any("tags", point.TagList()), zap.Any("fields", point.FieldList()), @@ -283,6 +318,9 @@ type MakePointForVaaVolumeParams struct { // TransferredToken is the token that was transferred in the VAA. TransferredToken *token.TransferredToken + + // TokenProvider is used to obtain token metadata. + TokenProvider *domain.TokenProvider } // MakePointForVaaVolume builds the InfluxDB volume metric for a given VAA @@ -299,7 +337,7 @@ func MakePointForVaaVolume(params *MakePointForVaaVolumeParams) (*write.Point, e // Do not generate this metric when the emitter chain is unset if params.Vaa.EmitterChain.String() == sdk.ChainIDUnset.String() { if params.Logger != nil { - params.Logger.Warn("emitter chain is unset", + params.Logger.Warn("Emitter chain is unset", zap.String("vaaId", params.Vaa.MessageID()), zap.Uint16("emitterChain", uint16(params.Vaa.EmitterChain)), ) @@ -310,7 +348,7 @@ func MakePointForVaaVolume(params *MakePointForVaaVolumeParams) (*write.Point, e // Do not generate this metric when the TransferredToken is undefined if params.TransferredToken == nil { if params.Logger != nil { - params.Logger.Warn("transferred token is undefined", + params.Logger.Warn("Transferred token is undefined", zap.String("vaaId", params.Vaa.MessageID()), ) } @@ -335,7 +373,7 @@ func MakePointForVaaVolume(params *MakePointForVaaVolumeParams) (*write.Point, e // Get the token metadata // // This is complementary data about the token that is not present in the VAA itself. - tokenMeta, ok := domain.GetTokenByAddress(params.TransferredToken.TokenChain, params.TransferredToken.TokenAddress.String()) + tokenMeta, ok := params.TokenProvider.GetTokenByAddress(params.TransferredToken.TokenChain, params.TransferredToken.TokenAddress.String()) if !ok { params.Metrics.IncMissingToken(params.TransferredToken.TokenChain.String(), params.TransferredToken.TokenAddress.String()) // We don't have metadata for this token, so we can't compute the volume-related fields @@ -346,6 +384,12 @@ func MakePointForVaaVolume(params *MakePointForVaaVolumeParams) (*write.Point, e // // Moreover, many flux queries depend on the existence of the `volume` field, // and would break if we had measurements without it. + params.Logger.Warn("Cannot obtain this token", + zap.String("vaaId", params.Vaa.MessageID()), + zap.String("tokenAddress", params.TransferredToken.TokenAddress.String()), + zap.Uint16("tokenChain", uint16(params.TransferredToken.TokenChain)), + zap.Any("tokenMetadata", tokenMeta), + ) point.AddField("volume", uint64(0)) return point, nil } @@ -367,7 +411,7 @@ func MakePointForVaaVolume(params *MakePointForVaaVolumeParams) (*write.Point, e if err != nil { params.Metrics.IncMissingNotional(tokenMeta.Symbol.String()) if params.Logger != nil { - params.Logger.Warn("failed to obtain notional for this token", + params.Logger.Warn("Failed to obtain notional for this token", zap.String("vaaId", params.Vaa.MessageID()), zap.String("tokenAddress", params.TransferredToken.TokenAddress.String()), zap.Uint16("tokenChain", uint16(params.TransferredToken.TokenChain)), diff --git a/analytics/metric/mongo.go b/analytics/metric/mongo.go index c4ed74a4..405566a6 100644 --- a/analytics/metric/mongo.go +++ b/analytics/metric/mongo.go @@ -29,6 +29,14 @@ type TransferPriceDoc struct { TokenAmount string `bson:"tokenAmount"` // UsdAmount is the value in USD of the token being transferred. UsdAmount string `bson:"usdAmount"` + // TokenChain is the chain ID of the token being transferred. + TokenChain uint16 `bson:"tokenChain"` + // TokenAddress is the address of the token being transferred. + TokenAddress string `bson:"tokenAddress"` + // CoinGeckoID is the CoinGecko ID of the token being transferred. + CoinGeckoID string `bson:"coinGeckoId"` + // UpdatedAt is the timestamp the document was updated. + UpdatedAt time.Time `bson:"updatedAt"` } func upsertTransferPrices( @@ -38,6 +46,7 @@ func upsertTransferPrices( transferPrices *mongo.Collection, tokenPriceFunc func(tokenID string, timestamp time.Time) (decimal.Decimal, error), transferredToken *token.TransferredToken, + tokenProvider *domain.TokenProvider, ) error { // Do not generate this metric for PythNet VAAs @@ -53,7 +62,7 @@ func upsertTransferPrices( // Get the token metadata // // This is complementary data about the token that is not present in the VAA itself. - tokenMeta, ok := domain.GetTokenByAddress(transferredToken.TokenChain, transferredToken.TokenAddress.String()) + tokenMeta, ok := tokenProvider.GetTokenByAddress(transferredToken.TokenChain, transferredToken.TokenAddress.String()) if !ok { return nil } @@ -92,10 +101,14 @@ func upsertTransferPrices( SymbolPriceUsd: notionalUSD.Truncate(8).String(), TokenAmount: tokenAmount.Truncate(8).String(), UsdAmount: usdAmount.Truncate(8).String(), + TokenChain: uint16(transferredToken.TokenChain), + TokenAddress: transferredToken.TokenAddress.String(), + CoinGeckoID: tokenMeta.CoingeckoID, + UpdatedAt: time.Now(), }, } _, err = transferPrices.UpdateByID( - context.Background(), + ctx, vaa.MessageID(), update, options.Update().SetUpsert(true), diff --git a/analytics/metric/types.go b/analytics/metric/types.go index 1b4a6e96..ae6eef2f 100644 --- a/analytics/metric/types.go +++ b/analytics/metric/types.go @@ -6,5 +6,11 @@ import ( "github.com/wormhole-foundation/wormhole/sdk/vaa" ) +type Params struct { + TrackID string + Vaa *vaa.VAA + VaaIsSigned bool +} + // MetricPushFunc is a function to push metrics -type MetricPushFunc func(context.Context, *vaa.VAA) error +type MetricPushFunc func(context.Context, *Params) error diff --git a/analytics/queue/converter.go b/analytics/queue/converter.go new file mode 100644 index 00000000..2e8afc9c --- /dev/null +++ b/analytics/queue/converter.go @@ -0,0 +1,115 @@ +package queue + +import ( + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/wormhole-foundation/wormhole-explorer/common/events" + "go.uber.org/zap" +) + +// VaaEvent represents a vaa data to be handle by the pipeline. +type VaaEvent struct { + ID string `json:"id"` + ChainID uint16 `json:"emitterChain"` + EmitterAddress string `json:"emitterAddr"` + Sequence string `json:"sequence"` + GuardianSetIndex uint32 `json:"guardianSetIndex"` + Vaa []byte `json:"vaas"` + IndexedAt time.Time `json:"indexedAt"` + Timestamp *time.Time `json:"timestamp"` + UpdatedAt *time.Time `json:"updatedAt"` + TxHash string `json:"txHash"` + Version uint16 `json:"version"` + Revision uint16 `json:"revision"` +} + +// VaaConverter converts a message from a VAAEvent. +func NewVaaConverter(log *zap.Logger) ConverterFunc { + + return func(msg string) (*Event, error) { + // unmarshal message to vaaEvent + var vaaEvent VaaEvent + err := json.Unmarshal([]byte(msg), &vaaEvent) + if err != nil { + return nil, err + } + return &Event{ + TrackID: fmt.Sprintf("pipeline-%s", vaaEvent.ID), + ID: vaaEvent.ID, + ChainID: vaaEvent.ChainID, + EmitterAddress: vaaEvent.EmitterAddress, + Sequence: vaaEvent.Sequence, + Vaa: vaaEvent.Vaa, + Timestamp: vaaEvent.Timestamp, + VaaIsSigned: true, + }, nil + } +} + +func NewNotificationEvent(log *zap.Logger) ConverterFunc { + + return func(msg string) (*Event, error) { + // unmarshal message to NotificationEvent + var notification events.NotificationEvent + err := json.Unmarshal([]byte(msg), ¬ification) + if err != nil { + return nil, err + } + + if notification.Event != events.SignedVaaType && notification.Event != events.LogMessagePublishedMesageType { + log.Debug("Skip event type", zap.String("trackId", notification.TrackID), zap.String("type", notification.Event)) + return nil, nil + } + + switch notification.Event { + case events.SignedVaaType: + signedVaa, err := events.GetEventData[events.SignedVaa](¬ification) + if err != nil { + log.Error("Error decoding signedVAA from notification event", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, nil + } + + return &Event{ + TrackID: notification.TrackID, + ID: signedVaa.ID, + ChainID: signedVaa.EmitterChain, + EmitterAddress: signedVaa.EmitterAddress, + Sequence: strconv.FormatUint(signedVaa.Sequence, 10), + Timestamp: &signedVaa.Timestamp, + VaaIsSigned: false, + }, nil + case events.LogMessagePublishedMesageType: + plm, err := events.GetEventData[events.LogMessagePublished](¬ification) + if err != nil { + log.Error("Error decoding publishedLogMessage from notification event", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, nil + } + + vaa, err := events.CreateUnsignedVAA(&plm) + if err != nil { + log.Error("Error creating unsigned vaa", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, err + } + + vaaBytes, err := vaa.MarshalBinary() + if err != nil { + return nil, err + } + + return &Event{ + TrackID: notification.TrackID, + ID: vaa.MessageID(), + ChainID: plm.ChainID, + EmitterAddress: plm.Attributes.Sender, + Sequence: strconv.FormatUint(plm.Attributes.Sequence, 10), + Timestamp: &plm.BlockTime, + Vaa: vaaBytes, + VaaIsSigned: false, + }, nil + } + return nil, nil + } +} diff --git a/analytics/queue/vaa_sqs.go b/analytics/queue/event_sqs.go similarity index 73% rename from analytics/queue/vaa_sqs.go rename to analytics/queue/event_sqs.go index ef938d4f..6e81395e 100644 --- a/analytics/queue/vaa_sqs.go +++ b/analytics/queue/event_sqs.go @@ -16,19 +16,24 @@ type SQSOption func(*SQS) // SQS represents a VAA queue in SQS. type SQS struct { - consumer *sqs_client.Consumer - ch chan ConsumerMessage - chSize int - wg sync.WaitGroup - logger *zap.Logger + consumer *sqs_client.Consumer + ch chan ConsumerMessage + converter ConverterFunc + chSize int + wg sync.WaitGroup + logger *zap.Logger } -// NewVaaSqs creates a VAA queue in SQS instances. -func NewVaaSqs(consumer *sqs_client.Consumer, logger *zap.Logger, opts ...SQSOption) *SQS { +// ConverterFunc converts a message from a sqs message. +type ConverterFunc func(string) (*Event, error) + +// NewEventSqs creates a VAA queue in SQS instances. +func NewEventSqs(consumer *sqs_client.Consumer, converter ConverterFunc, logger *zap.Logger, opts ...SQSOption) *SQS { s := &SQS{ - consumer: consumer, - chSize: 10, - logger: logger} + consumer: consumer, + converter: converter, + chSize: 10, + logger: logger} for _, opt := range opts { opt(s) } @@ -62,18 +67,17 @@ func (q *SQS) Consume(ctx context.Context) <-chan ConsumerMessage { continue } - // unmarshal message to vaaEvent - var vaaEvent VaaEvent - err = json.Unmarshal([]byte(sqsEvent.Message), &vaaEvent) + // converts message to event + event, err := q.converter(sqsEvent.Message) if err != nil { - q.logger.Error("Error decoding vaaEvent message from SQSEvent", zap.Error(err)) + q.logger.Error("Error converting event message from SQSEvent", zap.Error(err)) continue } q.wg.Add(1) q.ch <- &sqsConsumerMessage{ id: msg.ReceiptHandle, - data: &vaaEvent, + data: event, wg: &q.wg, logger: q.logger, consumer: q.consumer, @@ -94,7 +98,7 @@ func (q *SQS) Close() { } type sqsConsumerMessage struct { - data *VaaEvent + data *Event consumer *sqs_client.Consumer wg *sync.WaitGroup id *string @@ -103,7 +107,7 @@ type sqsConsumerMessage struct { ctx context.Context } -func (m *sqsConsumerMessage) Data() *VaaEvent { +func (m *sqsConsumerMessage) Data() *Event { return m.data } diff --git a/analytics/queue/queue.go b/analytics/queue/queue.go deleted file mode 100644 index 9e414076..00000000 --- a/analytics/queue/queue.go +++ /dev/null @@ -1,38 +0,0 @@ -package queue - -import ( - "context" - "time" -) - -type sqsEvent struct { - MessageID string `json:"MessageId"` - Message string `json:"Message"` -} - -// VaaEvent represents a vaa data to be handle by the pipeline. -type VaaEvent struct { - ID string `json:"id"` - ChainID uint16 `json:"emitterChain"` - EmitterAddress string `json:"emitterAddr"` - Sequence string `json:"sequence"` - GuardianSetIndex uint32 `json:"guardianSetIndex"` - Vaa []byte `json:"vaas"` - IndexedAt time.Time `json:"indexedAt"` - Timestamp *time.Time `json:"timestamp"` - UpdatedAt *time.Time `json:"updatedAt"` - TxHash string `json:"txHash"` - Version uint16 `json:"version"` - Revision uint16 `json:"revision"` -} - -// ConsumerMessage defition. -type ConsumerMessage interface { - Data() *VaaEvent - Done() - Failed() - IsExpired() bool -} - -// VAAConsumeFunc is a function to consume VAAEvent. -type VAAConsumeFunc func(context.Context) <-chan ConsumerMessage diff --git a/analytics/queue/types.go b/analytics/queue/types.go new file mode 100644 index 00000000..7792bea3 --- /dev/null +++ b/analytics/queue/types.go @@ -0,0 +1,34 @@ +package queue + +import ( + "context" + "time" +) + +type sqsEvent struct { + MessageID string `json:"MessageId"` + Message string `json:"Message"` +} + +// Event represents a event data to be handle. +type Event struct { + TrackID string + ID string + ChainID uint16 + EmitterAddress string + Sequence string + Vaa []byte + Timestamp *time.Time + VaaIsSigned bool +} + +// ConsumerMessage defition. +type ConsumerMessage interface { + Data() *Event + Done() + Failed() + IsExpired() bool +} + +// ConsumeFunc is a function to consume VAAEvent. +type ConsumeFunc func(context.Context) <-chan ConsumerMessage diff --git a/api/docs/docs.go b/api/docs/docs.go index a0aabf30..d2345f40 100644 --- a/api/docs/docs.go +++ b/api/docs/docs.go @@ -1,4 +1,5 @@ -// Code generated by swaggo/swag. DO NOT EDIT +// Code generated by swaggo/swag. DO NOT EDIT. + package docs import "github.com/swaggo/swag" @@ -574,19 +575,12 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "allOf": [ - { - "type": "object" - }, - { - "type": "object", - "properties": { - "status": { - "type": "string" - } - } + "type": "object", + "properties": { + "status": { + "type": "string" } - ] + } } }, "400": { @@ -899,19 +893,12 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "allOf": [ - { - "type": "object" - }, - { - "type": "object", - "properties": { - "ready": { - "type": "string" - } - } + "type": "object", + "properties": { + "ready": { + "type": "string" } - ] + } } }, "400": { @@ -1736,22 +1723,15 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "allOf": [ - { - "type": "object" - }, - { - "type": "object", - "properties": { - "vaaBytes": { - "type": "array", - "items": { - "type": "integer" - } - } + "type": "object", + "properties": { + "vaaBytes": { + "type": "array", + "items": { + "type": "integer" } } - ] + } } }, "400": { @@ -1797,22 +1777,15 @@ const docTemplate = `{ "200": { "description": "OK", "schema": { - "allOf": [ - { - "type": "object" - }, - { - "type": "object", - "properties": { - "vaaBytes": { - "type": "array", - "items": { - "type": "integer" - } - } + "type": "object", + "properties": { + "vaaBytes": { + "type": "array", + "items": { + "type": "integer" } } - ] + } } }, "400": { @@ -2435,9 +2408,137 @@ const docTemplate = `{ } } }, + "relays.DeliveryReponse": { + "type": "object", + "properties": { + "execution": { + "$ref": "#/definitions/relays.ResultExecutionResponse" + }, + "relayGasUsed": { + "type": "integer" + } + } + }, + "relays.InstructionsResponse": { + "type": "object", + "properties": { + "encodedExecutionInfo": { + "type": "string" + }, + "extraReceiverValue": { + "type": "object", + "properties": { + "_hex": { + "type": "string" + }, + "_isBigNumber": { + "type": "boolean" + } + } + }, + "refundAddress": { + "type": "string" + }, + "refundChainId": { + "type": "integer" + }, + "refundDeliveryProvider": { + "type": "string" + }, + "requestedReceiverValue": { + "type": "object", + "properties": { + "_hex": { + "type": "string" + }, + "_isBigNumber": { + "type": "boolean" + } + } + }, + "senderAddress": { + "type": "string" + }, + "sourceDeliveryProvider": { + "type": "string" + }, + "targetAddress": { + "type": "string" + }, + "targetChainId": { + "type": "integer" + }, + "vaaKeys": { + "type": "array", + "items": {} + } + } + }, + "relays.RelayDataResponse": { + "type": "object", + "properties": { + "delivery": { + "$ref": "#/definitions/relays.DeliveryReponse" + }, + "fromTxHash": { + "type": "string" + }, + "instructions": { + "$ref": "#/definitions/relays.InstructionsResponse" + }, + "toTxHash": { + "type": "string" + } + } + }, "relays.RelayResponse": { "type": "object", - "additionalProperties": true + "properties": { + "completedAt": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/relays.RelayDataResponse" + }, + "failedAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "receivedAt": { + "type": "string" + }, + "relayer": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "relays.ResultExecutionResponse": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "gasUsed": { + "type": "string" + }, + "refundStatus": { + "type": "string" + }, + "revertString": { + "type": "string" + }, + "status": { + "type": "string" + }, + "transactionHash": { + "type": "string" + } + } }, "response.Response-address_AddressOverview": { "type": "object", @@ -3046,6 +3147,8 @@ var SwaggerInfo = &swag.Spec{ Description: "Wormhole Guardian API\nThis is the API for the Wormhole Guardian and Explorer.\nThe API has two namespaces: wormholescan and guardian.\nwormholescan is the namespace for the explorer and the new endpoints. The prefix is /api/v1.\nguardian is the legacy namespace backguard compatible with guardian node API. The prefix is /v1.\nThis API is public and does not require authentication although some endpoints are rate limited.\nCheck each endpoint documentation for more information.", InfoInstanceName: "swagger", SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", } func init() { diff --git a/api/docs/swagger.json b/api/docs/swagger.json index d99106e8..b51c51bc 100644 --- a/api/docs/swagger.json +++ b/api/docs/swagger.json @@ -567,19 +567,12 @@ "200": { "description": "OK", "schema": { - "allOf": [ - { - "type": "object" - }, - { - "type": "object", - "properties": { - "status": { - "type": "string" - } - } + "type": "object", + "properties": { + "status": { + "type": "string" } - ] + } } }, "400": { @@ -892,19 +885,12 @@ "200": { "description": "OK", "schema": { - "allOf": [ - { - "type": "object" - }, - { - "type": "object", - "properties": { - "ready": { - "type": "string" - } - } + "type": "object", + "properties": { + "ready": { + "type": "string" } - ] + } } }, "400": { @@ -1729,22 +1715,15 @@ "200": { "description": "OK", "schema": { - "allOf": [ - { - "type": "object" - }, - { - "type": "object", - "properties": { - "vaaBytes": { - "type": "array", - "items": { - "type": "integer" - } - } + "type": "object", + "properties": { + "vaaBytes": { + "type": "array", + "items": { + "type": "integer" } } - ] + } } }, "400": { @@ -1790,22 +1769,15 @@ "200": { "description": "OK", "schema": { - "allOf": [ - { - "type": "object" - }, - { - "type": "object", - "properties": { - "vaaBytes": { - "type": "array", - "items": { - "type": "integer" - } - } + "type": "object", + "properties": { + "vaaBytes": { + "type": "array", + "items": { + "type": "integer" } } - ] + } } }, "400": { @@ -2428,9 +2400,137 @@ } } }, + "relays.DeliveryReponse": { + "type": "object", + "properties": { + "execution": { + "$ref": "#/definitions/relays.ResultExecutionResponse" + }, + "relayGasUsed": { + "type": "integer" + } + } + }, + "relays.InstructionsResponse": { + "type": "object", + "properties": { + "encodedExecutionInfo": { + "type": "string" + }, + "extraReceiverValue": { + "type": "object", + "properties": { + "_hex": { + "type": "string" + }, + "_isBigNumber": { + "type": "boolean" + } + } + }, + "refundAddress": { + "type": "string" + }, + "refundChainId": { + "type": "integer" + }, + "refundDeliveryProvider": { + "type": "string" + }, + "requestedReceiverValue": { + "type": "object", + "properties": { + "_hex": { + "type": "string" + }, + "_isBigNumber": { + "type": "boolean" + } + } + }, + "senderAddress": { + "type": "string" + }, + "sourceDeliveryProvider": { + "type": "string" + }, + "targetAddress": { + "type": "string" + }, + "targetChainId": { + "type": "integer" + }, + "vaaKeys": { + "type": "array", + "items": {} + } + } + }, + "relays.RelayDataResponse": { + "type": "object", + "properties": { + "delivery": { + "$ref": "#/definitions/relays.DeliveryReponse" + }, + "fromTxHash": { + "type": "string" + }, + "instructions": { + "$ref": "#/definitions/relays.InstructionsResponse" + }, + "toTxHash": { + "type": "string" + } + } + }, "relays.RelayResponse": { "type": "object", - "additionalProperties": true + "properties": { + "completedAt": { + "type": "string" + }, + "data": { + "$ref": "#/definitions/relays.RelayDataResponse" + }, + "failedAt": { + "type": "string" + }, + "id": { + "type": "string" + }, + "receivedAt": { + "type": "string" + }, + "relayer": { + "type": "string" + }, + "status": { + "type": "string" + } + } + }, + "relays.ResultExecutionResponse": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "gasUsed": { + "type": "string" + }, + "refundStatus": { + "type": "string" + }, + "revertString": { + "type": "string" + }, + "status": { + "type": "string" + }, + "transactionHash": { + "type": "string" + } + } }, "response.Response-address_AddressOverview": { "type": "object", diff --git a/api/docs/swagger.yaml b/api/docs/swagger.yaml index 66cb10ea..3eb60a6d 100644 --- a/api/docs/swagger.yaml +++ b/api/docs/swagger.yaml @@ -396,8 +396,91 @@ definitions: tokenChain: $ref: '#/definitions/vaa.ChainID' type: object + relays.DeliveryReponse: + properties: + execution: + $ref: '#/definitions/relays.ResultExecutionResponse' + relayGasUsed: + type: integer + type: object + relays.InstructionsResponse: + properties: + encodedExecutionInfo: + type: string + extraReceiverValue: + properties: + _hex: + type: string + _isBigNumber: + type: boolean + type: object + refundAddress: + type: string + refundChainId: + type: integer + refundDeliveryProvider: + type: string + requestedReceiverValue: + properties: + _hex: + type: string + _isBigNumber: + type: boolean + type: object + senderAddress: + type: string + sourceDeliveryProvider: + type: string + targetAddress: + type: string + targetChainId: + type: integer + vaaKeys: + items: {} + type: array + type: object + relays.RelayDataResponse: + properties: + delivery: + $ref: '#/definitions/relays.DeliveryReponse' + fromTxHash: + type: string + instructions: + $ref: '#/definitions/relays.InstructionsResponse' + toTxHash: + type: string + type: object relays.RelayResponse: - additionalProperties: true + properties: + completedAt: + type: string + data: + $ref: '#/definitions/relays.RelayDataResponse' + failedAt: + type: string + id: + type: string + receivedAt: + type: string + relayer: + type: string + status: + type: string + type: object + relays.ResultExecutionResponse: + properties: + detail: + type: string + gasUsed: + type: string + refundStatus: + type: string + revertString: + type: string + status: + type: string + transactionHash: + type: string type: object response.Response-address_AddressOverview: properties: @@ -1204,12 +1287,10 @@ paths: "200": description: OK schema: - allOf: - - type: object - - properties: - status: - type: string - type: object + properties: + status: + type: string + type: object "400": description: Bad Request "500": @@ -1421,12 +1502,10 @@ paths: "200": description: OK schema: - allOf: - - type: object - - properties: - ready: - type: string - type: object + properties: + ready: + type: string + type: object "400": description: Bad Request "500": @@ -1998,14 +2077,12 @@ paths: "200": description: OK schema: - allOf: - - type: object - - properties: - vaaBytes: - items: - type: integer - type: array - type: object + properties: + vaaBytes: + items: + type: integer + type: array + type: object "400": description: Bad Request "500": @@ -2036,14 +2113,12 @@ paths: "200": description: OK schema: - allOf: - - type: object - - properties: - vaaBytes: - items: - type: integer - type: array - type: object + properties: + vaaBytes: + items: + type: integer + type: array + type: object "400": description: Bad Request "500": diff --git a/api/handlers/address/repository.go b/api/handlers/address/repository.go index 32377c64..e894d5d3 100644 --- a/api/handlers/address/repository.go +++ b/api/handlers/address/repository.go @@ -4,8 +4,8 @@ import ( "context" "fmt" + "github.com/wormhole-foundation/wormhole-explorer/api/handlers/common" "github.com/wormhole-foundation/wormhole-explorer/api/handlers/vaa" - "github.com/wormhole-foundation/wormhole-explorer/api/types" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.uber.org/zap" @@ -32,25 +32,28 @@ func NewRepository(db *mongo.Database, logger *zap.Logger) *Repository { } type GetAddressOverviewParams struct { - Address *types.Address + Address string Skip int64 Limit int64 } func (r *Repository) GetAddressOverview(ctx context.Context, params *GetAddressOverviewParams) (*AddressOverview, error) { + ids, err := common.FindVaasIdsByFromAddressOrToAddress(ctx, r.db, params.Address) + if err != nil { + return nil, err + } + + if len(ids) == 0 { + var result []*vaa.VaaDoc + return &AddressOverview{Vaas: result}, nil + } + // build a query pipeline based on input parameters var pipeline mongo.Pipeline { - // filter by address - pipeline = append(pipeline, bson.D{ - {"$match", bson.D{ - {"$or", bson.A{ - bson.D{{"result.fromAddress", bson.D{{"$eq", "0x" + params.Address.Hex()}}}}, - bson.D{{"result.toAddress", bson.M{"$eq": "0x" + params.Address.Hex()}}}, - }}, - }}, - }) + // filter by list ids + pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.D{{Key: "_id", Value: bson.D{{Key: "$in", Value: ids}}}}}}) // specify sorting criteria pipeline = append(pipeline, bson.D{ diff --git a/api/handlers/address/service.go b/api/handlers/address/service.go index 45fa0874..4c76a25f 100644 --- a/api/handlers/address/service.go +++ b/api/handlers/address/service.go @@ -5,7 +5,6 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/api/internal/pagination" "github.com/wormhole-foundation/wormhole-explorer/api/response" - "github.com/wormhole-foundation/wormhole-explorer/api/types" "go.uber.org/zap" ) @@ -26,7 +25,7 @@ func NewService(r *Repository, logger *zap.Logger) *Service { func (s *Service) GetAddressOverview( ctx context.Context, - address *types.Address, + address string, pagination *pagination.Pagination, ) (*response.Response[*AddressOverview], error) { diff --git a/api/handlers/common/repository.go b/api/handlers/common/repository.go new file mode 100644 index 00000000..0f468485 --- /dev/null +++ b/api/handlers/common/repository.go @@ -0,0 +1,56 @@ +package common + +import ( + "context" + "strings" + + "github.com/wormhole-foundation/wormhole-explorer/common/utils" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" +) + +type mongoID struct { + Id string `bson:"_id"` +} + +func FindVaasIdsByFromAddressOrToAddress( + ctx context.Context, + db *mongo.Database, + address string, +) ([]string, error) { + addressHexa := strings.ToLower(address) + if !utils.StartsWith0x(address) { + addressHexa = "0x" + strings.ToLower(addressHexa) + } + + matchForToAddress := bson.D{{Key: "$match", Value: bson.D{{Key: "$or", Value: bson.A{ + bson.D{{Key: "standardizedProperties.toAddress", Value: bson.M{"$eq": addressHexa}}}, + bson.D{{Key: "standardizedProperties.toAddress", Value: bson.M{"$eq": address}}}, + }}}}} + + matchForFromAddress := bson.D{{Key: "$match", Value: bson.D{{Key: "$or", Value: bson.A{ + bson.D{{Key: "originTx.from", Value: bson.M{"$eq": addressHexa}}}, + bson.D{{Key: "originTx.from", Value: bson.M{"$eq": address}}}, + }}}}} + + toAddressFilter := bson.D{{Key: "$unionWith", Value: bson.D{{Key: "coll", Value: "parsedVaa"}, {Key: "pipeline", Value: bson.A{matchForToAddress}}}}} + fromAddressFilter := bson.D{{Key: "$unionWith", Value: bson.D{{Key: "coll", Value: "globalTransactions"}, {Key: "pipeline", Value: bson.A{matchForFromAddress}}}}} + group := bson.D{{Key: "$group", Value: bson.D{{Key: "_id", Value: "$_id"}}}} + + pipeline := []bson.D{fromAddressFilter, toAddressFilter, group} + + cur, err := db.Collection("_temporal").Aggregate(ctx, pipeline) + if err != nil { + return nil, err + } + var documents []mongoID + err = cur.All(ctx, &documents) + if err != nil { + return nil, err + } + var ids []string + for _, doc := range documents { + ids = append(ids, doc.Id) + } + return ids, nil +} diff --git a/api/handlers/operations/model.go b/api/handlers/operations/model.go new file mode 100644 index 00000000..bb8267d4 --- /dev/null +++ b/api/handlers/operations/model.go @@ -0,0 +1,86 @@ +package operations + +import ( + "time" + + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" +) + +// OperationDto operation data transfer object. +type OperationDto struct { + ID string `bson:"_id"` + TxHash string `bson:"txHash"` + Symbol string `bson:"symbol"` + UsdAmount string `bson:"usdAmount"` + TokenAmount string `bson:"tokenAmount"` + Vaa *VaaDto `bson:"vaa"` + SourceTx *OriginTx `bson:"originTx" json:"originTx"` + DestinationTx *DestinationTx `bson:"destinationTx" json:"destinationTx"` + Payload map[string]any `bson:"payload"` + StandardizedProperties *StandardizedProperties `bson:"standardizedProperties"` +} + +// StandardizedProperties represents the standardized properties of a operation. +type StandardizedProperties struct { + AppIds []string `json:"appIds" bson:"appIds"` + FromChain sdk.ChainID `json:"fromChain" bson:"fromChain"` + FromAddress string `json:"fromAddress" bson:"fromAddress"` + ToChain sdk.ChainID `json:"toChain" bson:"toChain"` + ToAddress string `json:"toAddress" bson:"toAddress"` + TokenChain sdk.ChainID `json:"tokenChain" bson:"tokenChain"` + TokenAddress string `json:"tokenAddress" bson:"tokenAddress"` + Amount string `json:"amount" bson:"amount"` + FeeAddress string `json:"feeAddress" bson:"feeAddress"` + FeeChain sdk.ChainID `json:"feeChain" bson:"feeChain"` + Fee string `json:"fee" bson:"fee"` +} + +// VaaDto vaa data transfer object. +type VaaDto struct { + ID string `bson:"_id" json:"id"` + Version uint8 `bson:"version" json:"version"` + EmitterChain sdk.ChainID `bson:"emitterChain" json:"emitterChain"` + EmitterAddr string `bson:"emitterAddr" json:"emitterAddr"` + EmitterNativeAddr string `json:"emitterNativeAddr,omitempty"` + Sequence string `bson:"sequence" json:"-"` + GuardianSetIndex uint32 `bson:"guardianSetIndex" json:"guardianSetIndex"` + Vaa []byte `bson:"vaas" json:"vaa"` + Timestamp *time.Time `bson:"timestamp" json:"timestamp"` + UpdatedAt *time.Time `bson:"updatedAt" json:"updatedAt"` + IndexedAt *time.Time `bson:"indexedAt" json:"indexedAt"` +} + +// GlobalTransactionDoc definitions. +type GlobalTransactionDoc struct { + ID string `bson:"_id" json:"id"` + OriginTx *OriginTx `bson:"originTx" json:"originTx"` + DestinationTx *DestinationTx `bson:"destinationTx" json:"destinationTx"` +} + +// OriginTx represents a origin transaction. +type OriginTx struct { + TxHash string `bson:"nativeTxHash" json:"txHash"` + From string `bson:"from" json:"from"` + Status string `bson:"status" json:"status"` + Timestamp *time.Time `bson:"timestamp" json:"timestamp"` + Attribute *AttributeDoc `bson:"attribute" json:"attribute"` +} + +// AttributeDoc represents a custom attribute for a origin transaction. +type AttributeDoc struct { + Type string `bson:"type" json:"type"` + Value map[string]any `bson:"value" json:"value"` +} + +// DestinationTx represents a destination transaction. +type DestinationTx struct { + ChainID sdk.ChainID `bson:"chainId" json:"chainId"` + Status string `bson:"status" json:"status"` + Method string `bson:"method" json:"method"` + TxHash string `bson:"txHash" json:"txHash"` + From string `bson:"from" json:"from"` + To string `bson:"to" json:"to"` + BlockNumber string `bson:"blockNumber" json:"blockNumber"` + Timestamp *time.Time `bson:"timestamp" json:"timestamp"` + UpdatedAt *time.Time `bson:"updatedAt" json:"updatedAt"` +} diff --git a/api/handlers/operations/repository.go b/api/handlers/operations/repository.go new file mode 100644 index 00000000..23fbc378 --- /dev/null +++ b/api/handlers/operations/repository.go @@ -0,0 +1,238 @@ +package operations + +import ( + "context" + "fmt" + "regexp" + "strings" + + "github.com/wormhole-foundation/wormhole-explorer/api/internal/errors" + "github.com/wormhole-foundation/wormhole-explorer/api/internal/pagination" + "github.com/wormhole-foundation/wormhole-explorer/common/utils" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.uber.org/zap" +) + +// Repository definition +type Repository struct { + db *mongo.Database + logger *zap.Logger + collections struct { + vaas *mongo.Collection + parsedVaa *mongo.Collection + globalTransactions *mongo.Collection + } +} + +// NewRepository create a new Repository. +func NewRepository(db *mongo.Database, logger *zap.Logger) *Repository { + return &Repository{db: db, + logger: logger.With(zap.String("module", "OperationRepository")), + collections: struct { + vaas *mongo.Collection + parsedVaa *mongo.Collection + globalTransactions *mongo.Collection + }{ + vaas: db.Collection("vaas"), + parsedVaa: db.Collection("parsedVaa"), + globalTransactions: db.Collection("globalTransactions"), + }, + } +} + +// FindById returns the operations for the given chainID/emitter/seq. +func (r *Repository) FindById(ctx context.Context, id string) (*OperationDto, error) { + + var pipeline mongo.Pipeline + + // filter vaas by id + pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.D{{Key: "_id", Value: id}}}}) + + // lookup vaas + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{{Key: "from", Value: "vaas"}, {Key: "localField", Value: "_id"}, {Key: "foreignField", Value: "_id"}, {Key: "as", Value: "vaas"}}}}) + + // lookup globalTransactions + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{{Key: "from", Value: "globalTransactions"}, {Key: "localField", Value: "_id"}, {Key: "foreignField", Value: "_id"}, {Key: "as", Value: "globalTransactions"}}}}) + + // lookup transferPrices + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{{Key: "from", Value: "transferPrices"}, {Key: "localField", Value: "_id"}, {Key: "foreignField", Value: "_id"}, {Key: "as", Value: "transferPrices"}}}}) + + // lookup parsedVaa + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{{Key: "from", Value: "parsedVaa"}, {Key: "localField", Value: "_id"}, {Key: "foreignField", Value: "_id"}, {Key: "as", Value: "parsedVaa"}}}}) + + // add fields + pipeline = append(pipeline, bson.D{{Key: "$addFields", Value: bson.D{ + {Key: "payload", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$parsedVaa.parsedPayload", 0}}}}, + {Key: "vaa", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$vaas", 0}}}}, + {Key: "standardizedProperties", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$parsedVaa.standardizedProperties", 0}}}}, + {Key: "symbol", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$transferPrices.symbol", 0}}}}, + {Key: "usdAmount", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$transferPrices.usdAmount", 0}}}}, + {Key: "tokenAmount", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$transferPrices.tokenAmount", 0}}}}, + }}}) + + // unset + pipeline = append(pipeline, bson.D{{Key: "$unset", Value: bson.A{"transferPrices", "parsedVaa"}}}) + + // Execute the aggregation pipeline + cur, err := r.collections.globalTransactions.Aggregate(ctx, pipeline) + if err != nil { + r.logger.Error("failed execute aggregation pipeline", zap.Error(err)) + return nil, err + } + + // Read results from cursor + var operations []*OperationDto + err = cur.All(ctx, &operations) + if err != nil { + r.logger.Error("failed to decode cursor", zap.Error(err)) + return nil, err + } + + // Check if there is only one operation + if len(operations) > 1 { + r.logger.Error("invalid number of operations", zap.Int("count", len(operations))) + return nil, fmt.Errorf("invalid number of operations") + } + + if len(operations) == 0 { + return nil, errors.ErrNotFound + } + + return operations[0], nil +} + +type mongoID struct { + Id string `bson:"_id"` +} + +// findOperationsIdByAddressOrTxHash returns all operations filtered by address or txHash. +func findOperationsIdByAddressOrTxHash(ctx context.Context, db *mongo.Database, q string, pagination *pagination.Pagination) ([]string, error) { + qHexa := strings.ToLower(q) + if !utils.StartsWith0x(q) { + qHexa = "0x" + strings.ToLower(qHexa) + } + + matchGlobalTransactions := bson.D{{Key: "$match", Value: bson.D{{Key: "$or", Value: bson.A{ + bson.D{{Key: "originTx.from", Value: bson.M{"$eq": qHexa}}}, + bson.D{{Key: "originTx.from", Value: bson.M{"$eq": q}}}, + bson.D{{Key: "originTx.nativeTxHash", Value: bson.M{"$eq": qHexa}}}, + bson.D{{Key: "originTx.nativeTxHash", Value: bson.M{"$eq": q}}}, + bson.D{{Key: "originTx.attribute.value.originTxHash", Value: bson.M{"$eq": qHexa}}}, + bson.D{{Key: "originTx.attribute.value.originTxHash", Value: bson.M{"$eq": q}}}, + bson.D{{Key: "destinationTx.txHash", Value: bson.M{"$eq": qHexa}}}, + bson.D{{Key: "destinationTx.txHash", Value: bson.M{"$eq": q}}}, + }}}}} + + matchParsedVaa := bson.D{{Key: "$match", Value: bson.D{{Key: "$or", Value: bson.A{ + bson.D{{Key: "standardizedProperties.toAddress", Value: bson.M{"$eq": qHexa}}}, + bson.D{{Key: "standardizedProperties.toAddress", Value: bson.M{"$eq": q}}}, + }}}}} + + globalTransactionFilter := bson.D{{Key: "$unionWith", Value: bson.D{{Key: "coll", Value: "globalTransactions"}, {Key: "pipeline", Value: bson.A{matchGlobalTransactions}}}}} + parserFilter := bson.D{{Key: "$unionWith", Value: bson.D{{Key: "coll", Value: "parsedVaa"}, {Key: "pipeline", Value: bson.A{matchParsedVaa}}}}} + group := bson.D{{Key: "$group", Value: bson.D{{Key: "_id", Value: "$_id"}}}} + pipeline := []bson.D{globalTransactionFilter, parserFilter, group} + + cur, err := db.Collection("_operationsTemporal").Aggregate(ctx, pipeline) + if err != nil { + return nil, err + } + var documents []mongoID + err = cur.All(ctx, &documents) + if err != nil { + return nil, err + } + var ids []string + for _, doc := range documents { + ids = append(ids, doc.Id) + } + return ids, nil +} + +// QueryFilterIsVaaID checks if q is a vaaID. +func QueryFilterIsVaaID(ctx context.Context, q string) []string { + // check if q is a vaaID + isVaaID := regexp.MustCompile(`\d+/\w+/\d+`).MatchString(q) + if isVaaID { + return []string{q} + } + return []string{} +} + +// FindAll returns all operations filtered by q. +func (r *Repository) FindAll(ctx context.Context, q string, pagination *pagination.Pagination) ([]*OperationDto, error) { + + var pipeline mongo.Pipeline + + // get all ids by that match q + if q != "" { + var ids []string + // find all ids that match q (vaaID) + ids = QueryFilterIsVaaID(ctx, q) + if len(ids) == 0 { + // find all ids that match q (address or txHash) + var err error + ids, err = findOperationsIdByAddressOrTxHash(ctx, r.db, q, pagination) + if err != nil { + return nil, err + } + + if len(ids) == 0 { + return []*OperationDto{}, nil + } + } + pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.D{{Key: "_id", Value: bson.D{{Key: "$in", Value: ids}}}}}}) + } + + // sort + pipeline = append(pipeline, bson.D{{Key: "$sort", Value: bson.D{bson.E{Key: "originTx.timestamp", Value: pagination.GetSortInt()}}}}) + + // Skip initial results + pipeline = append(pipeline, bson.D{{Key: "$skip", Value: pagination.Skip}}) + + // Limit size of results + pipeline = append(pipeline, bson.D{{Key: "$limit", Value: pagination.Limit}}) + + // lookup vaas + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{{Key: "from", Value: "vaas"}, {Key: "localField", Value: "_id"}, {Key: "foreignField", Value: "_id"}, {Key: "as", Value: "vaas"}}}}) + + // lookup globalTransactions + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{{Key: "from", Value: "globalTransactions"}, {Key: "localField", Value: "_id"}, {Key: "foreignField", Value: "_id"}, {Key: "as", Value: "globalTransactions"}}}}) + + // lookup transferPrices + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{{Key: "from", Value: "transferPrices"}, {Key: "localField", Value: "_id"}, {Key: "foreignField", Value: "_id"}, {Key: "as", Value: "transferPrices"}}}}) + + // lookup parsedVaa + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{{Key: "from", Value: "parsedVaa"}, {Key: "localField", Value: "_id"}, {Key: "foreignField", Value: "_id"}, {Key: "as", Value: "parsedVaa"}}}}) + + // add fields + pipeline = append(pipeline, bson.D{{Key: "$addFields", Value: bson.D{ + {Key: "payload", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$parsedVaa.parsedPayload", 0}}}}, + {Key: "vaa", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$vaas", 0}}}}, + {Key: "standardizedProperties", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$parsedVaa.standardizedProperties", 0}}}}, + {Key: "symbol", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$transferPrices.symbol", 0}}}}, + {Key: "usdAmount", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$transferPrices.usdAmount", 0}}}}, + {Key: "tokenAmount", Value: bson.D{{Key: "$arrayElemAt", Value: bson.A{"$transferPrices.tokenAmount", 0}}}}, + }}}) + + // unset + pipeline = append(pipeline, bson.D{{Key: "$unset", Value: bson.A{"transferPrices", "parsedVaa"}}}) + + // Execute the aggregation pipeline + cur, err := r.collections.globalTransactions.Aggregate(ctx, pipeline) + if err != nil { + r.logger.Error("failed execute aggregation pipeline", zap.Error(err)) + return nil, err + } + + // Read results from cursor + var operations []*OperationDto + err = cur.All(ctx, &operations) + if err != nil { + r.logger.Error("failed to decode cursor", zap.Error(err)) + return nil, err + } + + return operations, nil +} diff --git a/api/handlers/operations/service.go b/api/handlers/operations/service.go new file mode 100644 index 00000000..0f95f292 --- /dev/null +++ b/api/handlers/operations/service.go @@ -0,0 +1,41 @@ +package operations + +import ( + "context" + "fmt" + + "github.com/wormhole-foundation/wormhole-explorer/api/internal/pagination" + "github.com/wormhole-foundation/wormhole-explorer/api/types" + "github.com/wormhole-foundation/wormhole/sdk/vaa" + "go.uber.org/zap" +) + +type Service struct { + repo *Repository + logger *zap.Logger +} + +// NewService create a new Service. +func NewService(repo *Repository, logger *zap.Logger) *Service { + return &Service{repo: repo, logger: logger.With(zap.String("module", "OperationService"))} +} + +// FindById returns the operations for the given chainID/emitter/seq. +func (s *Service) FindById(ctx context.Context, chainID vaa.ChainID, + emitter *types.Address, seq string) (*OperationDto, error) { + id := fmt.Sprintf("%d/%s/%s", chainID, emitter.Hex(), seq) + operation, err := s.repo.FindById(ctx, id) + if err != nil { + return nil, err + } + return operation, nil +} + +// FindAll returns all operations filtered by q. +func (s *Service) FindAll(ctx context.Context, q string, pagination *pagination.Pagination) ([]*OperationDto, error) { + operations, err := s.repo.FindAll(ctx, q, pagination) + if err != nil { + return nil, err + } + return operations, nil +} diff --git a/api/handlers/relays/repository.go b/api/handlers/relays/repository.go index f4473faa..bf92a80f 100644 --- a/api/handlers/relays/repository.go +++ b/api/handlers/relays/repository.go @@ -3,6 +3,7 @@ package relays import ( "context" "fmt" + "time" "github.com/pkg/errors" errs "github.com/wormhole-foundation/wormhole-explorer/api/internal/errors" @@ -31,8 +32,8 @@ func NewRepository(db *mongo.Database, logger *zap.Logger) *Repository { } } -func (r *Repository) FindOne(ctx context.Context, q *RelaysQuery) (*RelayResponse, error) { - response := make(RelayResponse) +func (r *Repository) FindOne(ctx context.Context, q *RelaysQuery) (*RelayDoc, error) { + var response RelayDoc err := r.collections.relays.FindOne(ctx, q.toBSON()).Decode(&response) if err != nil { if errors.Is(err, mongo.ErrNoDocuments) { @@ -53,7 +54,117 @@ type RelaysQuery struct { sequence string } -type RelayResponse map[string]interface{} +type RelayDoc struct { + ID string `bson:"_id"` + Data struct { + Status string `bson:"status"` + ReceivedAt time.Time `bson:"receivedAt"` + CompletedAt *time.Time `bson:"completedAt"` + ToTxHash *string `bson:"toTxHash"` + Metadata *struct { + Attempts int `bson:"attempts"` + ExecutionStartTime int64 `bson:"executionStartTime"` + EmitterChain int `bson:"emitterChain"` + DidMatchDeliveryProvider bool `bson:"didMatchDeliveryProvider"` + DidParse bool `bson:"didParse"` + Instructions struct { + EncodedExecutionInfo string `bson:"encodedExecutionInfo"` + RefundAddress string `bson:"refundAddress"` + SourceDeliveryProvider string `bson:"sourceDeliveryProvider"` + SenderAddress string `bson:"senderAddress"` + VaaKeys []any `bson:"vaaKeys"` + ExtraReceiverValue struct { + Hex string `bson:"_hex"` + IsBigNumber bool `bson:"_isBigNumber"` + } `bson:"extraReceiverValue"` + TargetAddress string `bson:"targetAddress"` + RequestedReceiverValue struct { + Hex string `bson:"_hex"` + IsBigNumber bool `bson:"_isBigNumber"` + } `bson:"requestedReceiverValue"` + RefundChainID int `bson:"refundChainId"` + RefundDeliveryProvider string `bson:"refundDeliveryProvider"` + TargetChainID int `bson:"targetChainId"` + } `bson:"instructions"` + DeliveryRecord struct { + MaxRefund string `bson:"maxRefund"` + Budget string `bson:"budget"` + TargetChainAssetPriceUSD float64 `bson:"targetChainAssetPriceUSD"` + WalletNonce int `bson:"walletNonce"` + TransactionHashes []string `bson:"transactionHashes"` + HasAdditionalVaas bool `bson:"hasAdditionalVaas"` + AdditionalVaasDidFetch bool `bson:"additionalVaasDidFetch"` + WalletAcquisitionEndTime int64 `bson:"walletAcquisitionEndTime"` + WalletAcquisitionDidSucceed bool `bson:"walletAcquisitionDidSucceed"` + WalletBalanceAfter string `bson:"walletBalanceAfter"` + ResultLog struct { + TransactionHash string `bson:"transactionHash"` + VaaHash string `bson:"vaaHash"` + RefundStatus string `bson:"refundStatus"` + RevertString string `bson:"revertString"` + Status string `bson:"status"` + GasUsed string `bson:"gasUsed"` + SourceChain string `bson:"sourceChain"` + SourceVaaSequence string `bson:"sourceVaaSequence"` + } `bson:"resultLog"` + ResultString string `bson:"resultString"` + AdditionalVaaKeysPrintable string `bson:"additionalVaaKeysPrintable"` + BudgetUsd float64 `bson:"budgetUsd"` + WalletAcquisitionStartTime int64 `bson:"walletAcquisitionStartTime"` + GasUnitsEstimate int `bson:"gasUnitsEstimate"` + EstimatedTransactionFeeEther string `bson:"estimatedTransactionFeeEther"` + TargetChainDecimals int `bson:"targetChainDecimals"` + DeliveryInstructionsPrintable struct { + Payload string `bson:"payload"` + EncodedExecutionInfo string `bson:"encodedExecutionInfo"` + RefundDeliveryProvider string `bson:"refundDeliveryProvider"` + SourceDeliveryProvider string `bson:"sourceDeliveryProvider"` + SenderAddress string `bson:"senderAddress"` + TargetAddress string `bson:"targetAddress"` + RequestedReceiverValue string `bson:"requestedReceiverValue"` + ExtraReceiverValue string `bson:"extraReceiverValue"` + RefundChainID string `bson:"refundChainId"` + RefundAddress string `bson:"refundAddress"` + VaaKeys []any `bson:"vaaKeys"` + TargetChainID string `bson:"targetChainId"` + } `bson:"deliveryInstructionsPrintable"` + WalletAddress string `bson:"walletAddress"` + GasUsed int `bson:"gasUsed"` + GasPrice string `bson:"gasPrice"` + ReceiverValue string `bson:"receiverValue"` + MaxRefundUsd float64 `bson:"maxRefundUsd"` + GasPriceEstimate string `bson:"gasPriceEstimate"` + TransactionDidSubmit bool `bson:"transactionDidSubmit"` + EstimatedTransactionFee string `bson:"estimatedTransactionFee"` + TransactionSubmitTimeStart int64 `bson:"transactionSubmitTimeStart"` + TransactionSubmitTimeEnd int64 `bson:"transactionSubmitTimeEnd"` + ResultLogDidParse bool `bson:"resultLogDidParse"` + ChainID int `bson:"chainId"` + ReceiverValueUsd float64 `bson:"receiverValueUsd"` + WalletBalanceBefore string `bson:"walletBalanceBefore"` + } `bson:"deliveryRecord"` + RawVaaHex string `bson:"rawVaaHex"` + PayloadType int `bson:"payloadType"` + MaxAttempts int `bson:"maxAttempts"` + DidError bool `bson:"didError"` + ExecutionEndTime int64 `bson:"executionEndTime"` + EmitterAddress string `bson:"emitterAddress"` + DidSubmitTransaction bool `bson:"didSubmitTransaction"` + Sequence string `bson:"sequence"` + } `bson:"metadata"` + Sequence string `bson:"sequence"` + Vaa string `bson:"vaa"` + FromTxHash string `bson:"fromTxHash"` + MaxAttempts int `bson:"maxAttempts"` + AddedTimes int `bson:"addedTimes"` + ErrorMessage any `bson:"errorMessage"` + EmitterChain int `bson:"emitterChain"` + EmitterAddress string `bson:"emitterAddress"` + FailedAt *time.Time `bson:"failedAt"` + } `bson:"data"` + Event string `bson:"event"` + Origin string `bson:"origin"` +} func (q *RelaysQuery) toBSON() *bson.D { r := bson.D{} diff --git a/api/handlers/relays/service.go b/api/handlers/relays/service.go index e7b89410..49e8d9c2 100644 --- a/api/handlers/relays/service.go +++ b/api/handlers/relays/service.go @@ -24,7 +24,7 @@ func (s *Service) FindByVAA( chainID vaa.ChainID, emitterAddr *types.Address, seq string, -) (*RelayResponse, error) { +) (*RelayDoc, error) { query := Query(). SetChain(chainID). diff --git a/api/handlers/transactions/repository.go b/api/handlers/transactions/repository.go index 63d03616..723ccb6b 100644 --- a/api/handlers/transactions/repository.go +++ b/api/handlers/transactions/repository.go @@ -12,11 +12,11 @@ import ( "github.com/influxdata/influxdb-client-go/v2/api" "github.com/mitchellh/mapstructure" "github.com/pkg/errors" + "github.com/wormhole-foundation/wormhole-explorer/api/handlers/common" errs "github.com/wormhole-foundation/wormhole-explorer/api/internal/errors" "github.com/wormhole-foundation/wormhole-explorer/api/internal/pagination" "github.com/wormhole-foundation/wormhole-explorer/api/internal/tvl" "github.com/wormhole-foundation/wormhole-explorer/common/domain" - "github.com/wormhole-foundation/wormhole-explorer/common/utils" sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" @@ -893,119 +893,76 @@ func (r *Repository) ListTransactionsByAddress( pagination *pagination.Pagination, ) ([]TransactionDto, error) { - // Build the aggregation pipeline - var pipeline mongo.Pipeline - { - // filter transactions by destination address - { - const fieldName = "standardizedProperties.toAddress" - - // If the address is non-EVM, it could be case sensitive (i.e. Solana), so we can't alter it. - var nonEvmFilter = bson.D{{fieldName, bson.M{"$eq": address}}} - - // If the address is EVM, we must normalize it to the format used in the database, - // which is a 0x prefix and all lowercase characters. - var evmFilter bson.D - if utils.StartsWith0x(address) { - evmFilter = bson.D{{fieldName, bson.M{"$eq": strings.ToLower(address)}}} - } else { - evmFilter = bson.D{{fieldName, bson.M{"$eq": "0x" + strings.ToLower(address)}}} - } - - pipeline = append(pipeline, bson.D{{"$match", bson.D{{"$or", bson.A{nonEvmFilter, evmFilter}}}}}) - } - - // specify sorting criteria - pipeline = append(pipeline, bson.D{ - {"$sort", bson.D{bson.E{"indexedAt", -1}}}, - }) - - // left outer join on the `transferPrices` collection - pipeline = append(pipeline, bson.D{ - {"$lookup", bson.D{ - {"from", "transferPrices"}, - {"localField", "_id"}, - {"foreignField", "_id"}, - {"as", "transferPrices"}, - }}, - }) - - // left outer join on the `vaas` collection - pipeline = append(pipeline, bson.D{ - {"$lookup", bson.D{ - {"from", "vaas"}, - {"localField", "_id"}, - {"foreignField", "_id"}, - {"as", "vaas"}, - }}, - }) - - // left outer join on the `vaaIdTxHash` collection - pipeline = append(pipeline, bson.D{ - {"$lookup", bson.D{ - {"from", "vaaIdTxHash"}, - {"localField", "_id"}, - {"foreignField", "_id"}, - {"as", "vaaIdTxHash"}, - }}, - }) - - // left outer join on the `parsedVaa` collection - pipeline = append(pipeline, bson.D{ - {"$lookup", bson.D{ - {"from", "parsedVaa"}, - {"localField", "_id"}, - {"foreignField", "_id"}, - {"as", "parsedVaa"}, - }}, - }) - - // left outer join on the `globalTransactions` collection - pipeline = append(pipeline, bson.D{ - {"$lookup", bson.D{ - {"from", "globalTransactions"}, - {"localField", "_id"}, - {"foreignField", "_id"}, - {"as", "globalTransactions"}, - }}, - }) - - // add nested fields - pipeline = append(pipeline, bson.D{ - {"$addFields", bson.D{ - {"txHash", bson.M{"$arrayElemAt": []interface{}{"$vaaIdTxHash.txHash", 0}}}, - {"timestamp", bson.M{"$arrayElemAt": []interface{}{"$vaas.timestamp", 0}}}, - {"payload", bson.M{"$arrayElemAt": []interface{}{"$parsedVaa.parsedPayload", 0}}}, - {"standardizedProperties", bson.M{"$arrayElemAt": []interface{}{"$parsedVaa.standardizedProperties", 0}}}, - {"symbol", bson.M{"$arrayElemAt": []interface{}{"$transferPrices.symbol", 0}}}, - {"usdAmount", bson.M{"$arrayElemAt": []interface{}{"$transferPrices.usdAmount", 0}}}, - {"tokenAmount", bson.M{"$arrayElemAt": []interface{}{"$transferPrices.tokenAmount", 0}}}, - }}, - }) - - // Sorting criteria - pipeline = append(pipeline, bson.D{ - {"$sort", bson.D{bson.E{"timestamp", pagination.GetSortInt()}}}, - }) - - // Unset unused fields - pipeline = append(pipeline, bson.D{ - {"$unset", []interface{}{"transferPrices", "vaas", "vaaTxIdHash", "parsedVaa"}}, - }) - - // Skip initial results - pipeline = append(pipeline, bson.D{ - {"$skip", pagination.Skip}, - }) - - // Limit size of results - pipeline = append(pipeline, bson.D{ - {"$limit", pagination.Limit}, - }) + ids, err := common.FindVaasIdsByFromAddressOrToAddress(ctx, r.db, address) + if err != nil { + return nil, err } + if len(ids) == 0 { + return []TransactionDto{}, nil + } + + var pipeline mongo.Pipeline + + // filter by ids + pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.D{{Key: "_id", Value: bson.D{{Key: "$in", Value: ids}}}}}}) + + // inner join on the `parsedVaa` collection + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{ + {Key: "from", Value: "parsedVaa"}, + {Key: "localField", Value: "_id"}, + {Key: "foreignField", Value: "_id"}, + {Key: "as", Value: "parsedVaa"}, + }}}) + pipeline = append(pipeline, bson.D{{Key: "$match", Value: bson.D{{Key: "parsedVaa", Value: bson.D{{Key: "$ne", Value: []any{}}}}}}}) + + // sort by timestamp + pipeline = append(pipeline, bson.D{{Key: "$sort", Value: bson.D{bson.E{Key: "timestamp", Value: pagination.GetSortInt()}}}}) + + // Skip initial results + pipeline = append(pipeline, bson.D{{Key: "$skip", Value: pagination.Skip}}) + + // Limit size of results + pipeline = append(pipeline, bson.D{{Key: "$limit", Value: pagination.Limit}}) + + // left outer join on the `transferPrices` collection + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{ + {Key: "from", Value: "transferPrices"}, + {Key: "localField", Value: "_id"}, + {Key: "foreignField", Value: "_id"}, + {Key: "as", Value: "transferPrices"}, + }}}) + + // left outer join on the `vaaIdTxHash` collection + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{ + {Key: "from", Value: "vaaIdTxHash"}, + {Key: "localField", Value: "_id"}, + {Key: "foreignField", Value: "_id"}, + {Key: "as", Value: "vaaIdTxHash"}, + }}}) + + // left outer join on the `globalTransactions` collection + pipeline = append(pipeline, bson.D{{Key: "$lookup", Value: bson.D{ + {Key: "from", Value: "globalTransactions"}, + {Key: "localField", Value: "_id"}, + {Key: "foreignField", Value: "_id"}, + {Key: "as", Value: "globalTransactions"}, + }}}) + + // add nested fields + pipeline = append(pipeline, bson.D{ + {Key: "$addFields", Value: bson.D{ + {Key: "txHash", Value: bson.M{"$arrayElemAt": []interface{}{"$vaaIdTxHash.txHash", 0}}}, + {Key: "payload", Value: bson.M{"$arrayElemAt": []interface{}{"$parsedVaa.parsedPayload", 0}}}, + {Key: "standardizedProperties", Value: bson.M{"$arrayElemAt": []interface{}{"$parsedVaa.standardizedProperties", 0}}}, + {Key: "symbol", Value: bson.M{"$arrayElemAt": []interface{}{"$transferPrices.symbol", 0}}}, + {Key: "usdAmount", Value: bson.M{"$arrayElemAt": []interface{}{"$transferPrices.usdAmount", 0}}}, + {Key: "tokenAmount", Value: bson.M{"$arrayElemAt": []interface{}{"$transferPrices.tokenAmount", 0}}}, + }}, + }) + // Execute the aggregation pipeline - cur, err := r.collections.parsedVaa.Aggregate(ctx, pipeline) + cur, err := r.collections.vaas.Aggregate(ctx, pipeline) if err != nil { r.logger.Error("failed execute aggregation pipeline", zap.Error(err)) return nil, err diff --git a/api/handlers/transactions/service.go b/api/handlers/transactions/service.go index 91905ce9..36b6026a 100644 --- a/api/handlers/transactions/service.go +++ b/api/handlers/transactions/service.go @@ -22,6 +22,7 @@ type Service struct { cache cache.Cache expiration time.Duration supportedChainIDs map[vaa.ChainID]string + tokenProvider *domain.TokenProvider logger *zap.Logger } @@ -34,10 +35,10 @@ const ( ) // NewService create a new Service. -func NewService(repo *Repository, cache cache.Cache, expiration time.Duration, logger *zap.Logger) *Service { +func NewService(repo *Repository, cache cache.Cache, expiration time.Duration, tokenProvider *domain.TokenProvider, logger *zap.Logger) *Service { supportedChainIDs := domain.GetSupportedChainIDs() return &Service{repo: repo, supportedChainIDs: supportedChainIDs, - cache: cache, expiration: expiration, logger: logger.With(zap.String("module", "TransactionService"))} + cache: cache, expiration: expiration, tokenProvider: tokenProvider, logger: logger.With(zap.String("module", "TransactionService"))} } // GetTransactionCount get the last transactions. @@ -104,7 +105,7 @@ func (s *Service) GetTokenByChainAndAddress(ctx context.Context, chainID vaa.Cha } //get token by contractID (chainID + tokenAddress) - tokenMetadata, ok := domain.GetTokenByAddress(chainID, tokenAddress.Hex()) + tokenMetadata, ok := s.tokenProvider.GetTokenByAddress(chainID, tokenAddress.Hex()) if !ok { return nil, errs.ErrNotFound } @@ -159,3 +160,7 @@ func (s *Service) GetTransactionByID( // Return matching document return &output[0], nil } + +func (s *Service) GetTokenProvider() *domain.TokenProvider { + return s.tokenProvider +} diff --git a/api/handlers/vaa/repository.go b/api/handlers/vaa/repository.go index a6308082..281e501b 100644 --- a/api/handlers/vaa/repository.go +++ b/api/handlers/vaa/repository.go @@ -72,10 +72,13 @@ func (r *Repository) FindVaasByTxHashWorkaround( {"$or", bson.A{ bson.D{{"originTx.nativeTxHash", bson.M{"$eq": query.txHash}}}, bson.D{{"originTx.nativeTxHash", bson.M{"$eq": "0x" + query.txHash}}}, + bson.D{{"originTx.attribute.value.originTxHash", bson.M{"$eq": query.txHash}}}, + bson.D{{"originTx.attribute.value.originTxHash", bson.M{"$eq": "0x" + query.txHash}}}, }}, }, nil, ) + if err != nil { requestID := fmt.Sprintf("%v", ctx.Value("requestid")) r.logger.Error("failed to find globalTransactions by TxHash", diff --git a/api/main.go b/api/main.go index 02c373d7..7a2114db 100644 --- a/api/main.go +++ b/api/main.go @@ -29,6 +29,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/api/handlers/heartbeats" "github.com/wormhole-foundation/wormhole-explorer/api/handlers/infrastructure" "github.com/wormhole-foundation/wormhole-explorer/api/handlers/observations" + "github.com/wormhole-foundation/wormhole-explorer/api/handlers/operations" "github.com/wormhole-foundation/wormhole-explorer/api/handlers/relays" "github.com/wormhole-foundation/wormhole-explorer/api/handlers/transactions" "github.com/wormhole-foundation/wormhole-explorer/api/handlers/vaa" @@ -42,6 +43,7 @@ import ( wormscanCache "github.com/wormhole-foundation/wormhole-explorer/common/client/cache" vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" "github.com/wormhole-foundation/wormhole-explorer/common/dbutil" + "github.com/wormhole-foundation/wormhole-explorer/common/domain" xlogger "github.com/wormhole-foundation/wormhole-explorer/common/logger" "github.com/wormhole-foundation/wormhole-explorer/common/utils" sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" @@ -151,6 +153,10 @@ func main() { rootLogger, ) relaysRepo := relays.NewRepository(db.Database, rootLogger) + operationsRepo := operations.NewRepository(db.Database, rootLogger) + + // create token provider + tokenProvider := domain.NewTokenProvider(cfg.P2pNetwork) // Set up services rootLogger.Info("initializing services") @@ -160,8 +166,9 @@ func main() { governorService := governor.NewService(governorRepo, rootLogger) infrastructureService := infrastructure.NewService(infrastructureRepo, rootLogger) heartbeatsService := heartbeats.NewService(heartbeatsRepo, rootLogger) - transactionsService := transactions.NewService(transactionsRepo, cache, time.Duration(cfg.Cache.MetricExpiration)*time.Second, rootLogger) + transactionsService := transactions.NewService(transactionsRepo, cache, time.Duration(cfg.Cache.MetricExpiration)*time.Second, tokenProvider, rootLogger) relaysService := relays.NewService(relaysRepo, rootLogger) + operationsService := operations.NewService(operationsRepo, rootLogger) // Set up a custom error handler response.SetEnableStackTrace(*cfg) @@ -203,7 +210,7 @@ func main() { // Set up route handlers app.Get("/swagger.json", GetSwagger) - wormscan.RegisterRoutes(app, rootLogger, addressService, vaaService, obsService, governorService, infrastructureService, transactionsService, relaysService) + wormscan.RegisterRoutes(app, rootLogger, addressService, vaaService, obsService, governorService, infrastructureService, transactionsService, relaysService, operationsService) guardian.RegisterRoutes(cfg, app, rootLogger, vaaService, governorService, heartbeatsService) // Set up gRPC handlers diff --git a/api/middleware/extract_parameters.go b/api/middleware/extract_parameters.go index 2754df88..86d196b4 100644 --- a/api/middleware/extract_parameters.go +++ b/api/middleware/extract_parameters.go @@ -208,22 +208,13 @@ func ExtractAddressFromQueryParams(c *fiber.Ctx, l *zap.Logger) string { } // ExtractAddressFromPath parses the `id` parameter from the route path. -func ExtractAddressFromPath(c *fiber.Ctx, l *zap.Logger) (*types.Address, error) { +func ExtractAddressFromPath(c *fiber.Ctx, l *zap.Logger) string { + return c.Params("id") +} - val := c.Params("id") - - // Attempt to parse the address - addr, err := types.StringToAddress(val, true /*acceptSolanaFormat*/) - if err != nil { - requestID := fmt.Sprintf("%v", c.Locals("requestid")) - l.Error("failed to decode address", - zap.Error(err), - zap.String("requestID", requestID), - ) - return nil, response.NewInvalidParamError(c, "MALFORMED ADDR", errors.WithStack(err)) - } - - return addr, nil +// ExtractQueryParam parses the `q` parameter from query params. +func ExtractQueryParam(c *fiber.Ctx, l *zap.Logger) string { + return c.Query("q") } // GetTxHash parses the `txHash` parameter from query params. diff --git a/api/routes/wormscan/address/controller.go b/api/routes/wormscan/address/controller.go index 97eadbb7..ef90ca24 100644 --- a/api/routes/wormscan/address/controller.go +++ b/api/routes/wormscan/address/controller.go @@ -38,10 +38,7 @@ func NewController(srv *address.Service, logger *zap.Logger) *Controller { // @Router /api/v1/address/{address} [get] func (c *Controller) FindById(ctx *fiber.Ctx) error { - address, err := middleware.ExtractAddressFromPath(ctx, c.logger) - if err != nil { - return err - } + address := middleware.ExtractAddressFromPath(ctx, c.logger) pagination, err := middleware.ExtractPagination(ctx) if err != nil { diff --git a/api/routes/wormscan/operations/controller.go b/api/routes/wormscan/operations/controller.go new file mode 100644 index 00000000..3c0dd7f0 --- /dev/null +++ b/api/routes/wormscan/operations/controller.go @@ -0,0 +1,88 @@ +package operations + +import ( + "strconv" + + "github.com/gofiber/fiber/v2" + "github.com/wormhole-foundation/wormhole-explorer/api/handlers/operations" + "github.com/wormhole-foundation/wormhole-explorer/api/middleware" + "go.uber.org/zap" +) + +// Controller is the controller for the operation resource. +type Controller struct { + srv *operations.Service + logger *zap.Logger +} + +// NewController create a new controler. +func NewController(operationService *operations.Service, logger *zap.Logger) *Controller { + return &Controller{ + srv: operationService, + logger: logger.With(zap.String("module", "OperationsController")), + } +} + +// FindAll godoc +// @Description Find all operations. +// @Tags wormholescan +// @ID get-operations +// @Param q query string false "search query" +// @Param page query integer false "page number" +// @Param size query integer false "page size" +// @Success 200 {object} []OperationResponse +// @Failure 400 +// @Failure 500 +// @Router /api/v1/operations [get] +func (c *Controller) FindAll(ctx *fiber.Ctx) error { + // Extract query parameters + pagination, err := middleware.ExtractPagination(ctx) + if err != nil { + return err + } + + // Extract q search query parameter + q := middleware.ExtractQueryParam(ctx, c.logger) + + // Find operations by q search param. + operations, err := c.srv.FindAll(ctx.Context(), q, pagination) + if err != nil { + return err + } + + // build response + response := toListOperationResponse(operations, q, c.logger) + return ctx.JSON(response) +} + +// FindById godoc +// @Description Find operations by ID (chainID/emitter/sequence). +// @Tags wormholescan +// @ID get-operation-by-id +// @Param chain_id path integer true "id of the blockchain" +// @Param emitter path string true "address of the emitter" +// @Param seq path integer true "sequence of the VAA" +// @Success 200 {object} OperationResponse +// @Failure 400 +// @Failure 500 +// @Router /api/v1/operations/{chain_id}/{emitter}/{seq} [get] +func (c *Controller) FindById(ctx *fiber.Ctx) error { + // Extract query params + chainID, emitter, seq, err := middleware.ExtractVAAParams(ctx, c.logger) + if err != nil { + return err + } + + // Find operations by chainID, emitter and sequence. + operation, err := c.srv.FindById(ctx.Context(), chainID, emitter, strconv.FormatUint(seq, 10)) + if err != nil { + return err + } + + // build response + response, err := toOperationResponse(operation, c.logger) + if err != nil { + return err + } + return ctx.JSON(response) +} diff --git a/api/routes/wormscan/operations/response.go b/api/routes/wormscan/operations/response.go new file mode 100644 index 00000000..4c5fc7d1 --- /dev/null +++ b/api/routes/wormscan/operations/response.go @@ -0,0 +1,298 @@ +package operations + +import ( + "strconv" + "strings" + "time" + + "github.com/wormhole-foundation/wormhole-explorer/api/handlers/operations" + "github.com/wormhole-foundation/wormhole-explorer/api/internal/errors" + "github.com/wormhole-foundation/wormhole-explorer/common/domain" + "github.com/wormhole-foundation/wormhole-explorer/common/utils" + + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" + "go.uber.org/zap" +) + +// OperationResponse definition. +type OperationResponse struct { + ID string `json:"id"` + EmitterChain sdk.ChainID `json:"emitterChain"` + EmitterAddress EmitterAddress `json:"emitterAddress"` + Sequence string `json:"sequence"` + Vaa []byte `json:"vaa,omitempty"` + Content *Content `json:"content,omitempty"` + SourceChain *SourceChain `json:"sourceChain,omitempty"` + TargetChain *TargetChain `json:"targetChain,omitempty"` + Data map[string]any `json:"data,omitempty"` +} + +// EmitterAddress definition. +type EmitterAddress struct { + Hex string `json:"hex,omitempty"` + Native string `json:"native,omitempty"` +} + +// Content definition. +type Content struct { + Payload map[string]any `json:"payload,omitempty"` + StandardizedProperties *operations.StandardizedProperties `json:"standardizedProperties,omitempty"` +} + +// SourceChain definition. +type SourceChain struct { + ChainId sdk.ChainID `json:"chainId"` + Timestamp *time.Time `json:"timestamp"` + Transaction Transaction `json:"transaction"` + From string `json:"from"` + Status string `json:"status"` + Data *Data `json:"attribute,omitempty"` +} + +// TxHash definition. +type Transaction struct { + TxHash string `json:"txHash"` + SecondTxHash *string `json:"secondTxHash,omitempty"` +} + +// TargetChain definition. +type TargetChain struct { + ChainId sdk.ChainID `json:"chainId"` + Timestamp *time.Time `json:"timestamp"` + Transaction Transaction `json:"transaction"` + Status string `json:"status"` + From string `json:"from"` + To string `json:"to"` +} + +// Data represents a custom attribute for a origin transaction. +type Data struct { + Type string `bson:"type" json:"type"` + Value map[string]any `bson:"value" json:"value"` +} + +type ListOperationResponse struct { + Operations []*OperationResponse `json:"operations"` + Match string `json:"matched"` +} + +// toOperationResponse converts an operations.OperationDto to an OperationResponse. +func toOperationResponse(operation *operations.OperationDto, log *zap.Logger) (*OperationResponse, error) { + // Get emitter chain, address and sequence from operation. + chainID, address, sequence, err := getChainEmitterSequence(operation) + if err != nil { + log.Error("Error parsing chainId, address, sequence from operation ID", + zap.Error(err), + zap.String("operationID", operation.ID)) + return nil, err + } + + // Get emitter native address from chainID and address. + emitterNativeAddress, err := domain.TranslateEmitterAddress(chainID, address) + if err != nil { + log.Warn("failed to translate emitter address", + zap.Stringer("chain", chainID), + zap.String("address", address), + zap.Error(err), + ) + return nil, err + } + + // Get rawVAA from operation. + var rawVAA []byte + if operation.Vaa != nil { + rawVAA = operation.Vaa.Vaa + } + + // Get content from operation. + var content Content + if len(operation.Payload) > 0 || operation.StandardizedProperties != nil { + content = Content{ + Payload: operation.Payload, + StandardizedProperties: operation.StandardizedProperties, + } + } + + // Get sourceChain and targetChain events + sourceChain, targetChain := getChainEvents(chainID, operation) + r := OperationResponse{ + ID: operation.ID, + EmitterChain: chainID, + EmitterAddress: EmitterAddress{ + Hex: address, + Native: emitterNativeAddress, + }, + Sequence: sequence, + Vaa: rawVAA, + Content: &content, + Data: getAdditionalData(operation), + SourceChain: sourceChain, + TargetChain: targetChain, + } + + return &r, nil +} + +// getChainEmitterSequence returns the chainID, address, sequence for the given operation. +func getChainEmitterSequence(operation *operations.OperationDto) (sdk.ChainID, string, string, error) { + if operation.Vaa != nil { + return operation.Vaa.EmitterChain, operation.Vaa.EmitterAddr, operation.Vaa.Sequence, nil + } else { + // Get emitter chain, address, sequence by operation ID. + id := strings.Split(operation.ID, "/") + if len(id) != 3 { + return 0, "", "", errors.ErrInternalError + } + chainID, err := strconv.ParseUint(id[0], 10, 16) + if err != nil { + return 0, "", "", err + } + return sdk.ChainID(chainID), id[1], id[2], nil + } +} + +func getAdditionalData(operation *operations.OperationDto) map[string]interface{} { + ok := operation.Symbol == "" && operation.TokenAmount == "" && operation.UsdAmount == "" + if ok { + return nil + } + return map[string]interface{}{ + "symbol": operation.Symbol, + "tokenAmount": operation.TokenAmount, + "usdAmount": operation.UsdAmount, + } +} + +// getChainEvents returns the sourceChain and targetChain events for the given operation. +func getChainEvents(chainID sdk.ChainID, operation *operations.OperationDto) (*SourceChain, *TargetChain) { + if operation.SourceTx == nil && operation.DestinationTx == nil { + return nil, nil + } + + // if len(operation.GlobalTransations) == 0 { + // return nil, nil + // } + + // build sourceChain + var sourceChain *SourceChain + if operation.SourceTx != nil { + var data *Data + if operation.SourceTx.Attribute != nil { + data = &Data{ + Type: operation.SourceTx.Attribute.Type, + Value: operation.SourceTx.Attribute.Value, + } + } + + // transactions + var secondTxHash *string + if data != nil { + attributeTxHash, ok := data.Value["originTxHash"] + if ok { + txHash, ok := attributeTxHash.(string) + if ok { + secondTxHash = &txHash + } + } + } + transaction := Transaction{ + TxHash: operation.SourceTx.TxHash, + SecondTxHash: secondTxHash, + } + + sourceChain = &SourceChain{ + ChainId: chainID, + Timestamp: operation.SourceTx.Timestamp, + Transaction: transaction, + From: operation.SourceTx.From, + Status: operation.SourceTx.Status, + Data: data, + } + } + + // build targetChain + var targetChain *TargetChain + if operation.DestinationTx != nil { + targetChain = &TargetChain{ + ChainId: operation.DestinationTx.ChainID, + Timestamp: operation.DestinationTx.Timestamp, + Transaction: Transaction{ + TxHash: operation.DestinationTx.TxHash, + }, + Status: operation.DestinationTx.Status, + From: operation.DestinationTx.From, + To: operation.DestinationTx.To, + } + } + + return sourceChain, targetChain +} + +func toListOperationResponse(operations []*operations.OperationDto, q string, log *zap.Logger) ListOperationResponse { + response := ListOperationResponse{ + Operations: make([]*OperationResponse, 0, len(operations)), + } + + for i := range operations { + r, err := toOperationResponse(operations[i], log) + if err == nil { + response.Operations = append(response.Operations, r) + } + } + + response.Match = buildMatchedField(response, q) + return response +} + +func buildMatchedField(operations ListOperationResponse, q string) string { + if q == "" { + return "" + } + if len(operations.Operations) == 0 { + return "" + } + operation := operations.Operations[0] + if operation.ID == q { + return "vaaId" + } + + // format q to match values + qHexa := strings.ToLower(q) + if !utils.StartsWith0x(q) { + qHexa = "0x" + strings.ToLower(qHexa) + } + + // matched by sourceChain txHash + if operation.SourceChain != nil { + if operation.SourceChain.Transaction.TxHash == q || operation.SourceChain.Transaction.TxHash == qHexa { + return "txHash" + } + + if operation.SourceChain.Data != nil { + if operation.SourceChain.Data.Value["OriginTxHash"] == q || operation.SourceChain.Data.Value["originTxHash"] == qHexa { + return "txHash" + } + } + } + + // matched by targetChain txHash + if operation.TargetChain != nil { + if operation.TargetChain.Transaction.TxHash == q || operation.TargetChain.Transaction.TxHash == qHexa { + return "txHash" + } + } + + // matched by sourceChain from address + if operation.SourceChain != nil { + if operation.SourceChain.From == q || operation.SourceChain.From == qHexa { + return "address" + } + } + + // matched by standardizedProperties to address + if operation.Content.StandardizedProperties.ToAddress == q || operation.Content.StandardizedProperties.ToAddress == qHexa { + return "address" + } + + return "" +} diff --git a/api/routes/wormscan/relays/controller.go b/api/routes/wormscan/relays/controller.go index f40b2117..c2f3e4a4 100644 --- a/api/routes/wormscan/relays/controller.go +++ b/api/routes/wormscan/relays/controller.go @@ -2,6 +2,7 @@ package relays import ( "strconv" + "time" "github.com/gofiber/fiber/v2" "github.com/wormhole-foundation/wormhole-explorer/api/handlers/relays" @@ -40,5 +41,112 @@ func (c *Controller) FindOne(ctx *fiber.Ctx) error { if err != nil { return err } - return ctx.JSON(relay) + response := c.makeResponse(relay) + return ctx.JSON(response) +} + +func (c *Controller) makeResponse(doc *relays.RelayDoc) *RelayResponse { + var data *RelayDataResponse + if doc.Data.Metadata != nil { + data = &RelayDataResponse{ + FromTxHash: doc.Data.FromTxHash, + ToTxHash: doc.Data.ToTxHash, + Delivery: DeliveryReponse{ + ResultExecution: ResultExecutionResponse{ + TransactionHash: doc.Data.Metadata.DeliveryRecord.ResultLog.TransactionHash, + RefundStatus: doc.Data.Metadata.DeliveryRecord.ResultLog.RefundStatus, + RevertString: doc.Data.Metadata.DeliveryRecord.ResultLog.RevertString, + Status: doc.Data.Metadata.DeliveryRecord.ResultLog.Status, + GasUsed: doc.Data.Metadata.DeliveryRecord.ResultLog.GasUsed, + Detail: doc.Data.Metadata.DeliveryRecord.ResultString, + }, + RelayGasUsed: doc.Data.Metadata.DeliveryRecord.GasUsed, + }, + Instructions: InstructionsResponse{ + EncodedExecutionInfo: doc.Data.Metadata.Instructions.EncodedExecutionInfo, + RefundAddress: doc.Data.Metadata.Instructions.RefundAddress, + SourceDeliveryProvider: doc.Data.Metadata.Instructions.SourceDeliveryProvider, + SenderAddress: doc.Data.Metadata.Instructions.SenderAddress, + VaaKeys: doc.Data.Metadata.Instructions.VaaKeys, + ExtraReceiverValue: struct { + Hex string `json:"_hex"` + IsBigNumber bool `json:"_isBigNumber"` + }{ + Hex: doc.Data.Metadata.Instructions.ExtraReceiverValue.Hex, + IsBigNumber: doc.Data.Metadata.Instructions.ExtraReceiverValue.IsBigNumber, + }, + TargetAddress: doc.Data.Metadata.Instructions.TargetAddress, + RequestedReceiverValue: struct { + Hex string `json:"_hex"` + IsBigNumber bool `json:"_isBigNumber"` + }{ + Hex: doc.Data.Metadata.Instructions.RequestedReceiverValue.Hex, + IsBigNumber: doc.Data.Metadata.Instructions.RequestedReceiverValue.IsBigNumber, + }, + RefundChainID: doc.Data.Metadata.Instructions.RefundChainID, + RefundDeliveryProvider: doc.Data.Metadata.Instructions.RefundDeliveryProvider, + TargetChainID: doc.Data.Metadata.Instructions.TargetChainID, + }, + } + } + return &RelayResponse{ + ID: doc.ID, + Relayer: doc.Origin, + ReceivedAt: doc.Data.ReceivedAt, + Status: doc.Data.Status, + CompletedAt: doc.Data.CompletedAt, + FailedAt: doc.Data.FailedAt, + Data: data, + } +} + +type RelayResponse struct { + ID string `json:"id"` + Relayer string `json:"relayer"` + Status string `json:"status"` + ReceivedAt time.Time `json:"receivedAt"` + CompletedAt *time.Time `json:"completedAt"` + FailedAt *time.Time `json:"failedAt"` + Data *RelayDataResponse `json:"data"` +} + +type RelayDataResponse struct { + FromTxHash string `json:"fromTxHash"` + ToTxHash *string `json:"toTxHash"` + Instructions InstructionsResponse `json:"instructions"` + Delivery DeliveryReponse `json:"delivery"` +} + +type DeliveryReponse struct { + ResultExecution ResultExecutionResponse `json:"execution"` + RelayGasUsed int `json:"relayGasUsed"` +} + +type ResultExecutionResponse struct { + TransactionHash string `json:"transactionHash"` + RefundStatus string `json:"refundStatus"` + RevertString string `json:"revertString"` + Status string `json:"status"` + GasUsed string `json:"gasUsed"` + Detail string `json:"detail"` +} + +type InstructionsResponse struct { + EncodedExecutionInfo string `json:"encodedExecutionInfo"` + RefundAddress string `json:"refundAddress"` + SourceDeliveryProvider string `json:"sourceDeliveryProvider"` + SenderAddress string `json:"senderAddress"` + VaaKeys []any `json:"vaaKeys"` + ExtraReceiverValue struct { + Hex string `json:"_hex"` + IsBigNumber bool `json:"_isBigNumber"` + } `json:"extraReceiverValue"` + TargetAddress string `json:"targetAddress"` + RequestedReceiverValue struct { + Hex string `json:"_hex"` + IsBigNumber bool `json:"_isBigNumber"` + } `json:"requestedReceiverValue"` + RefundChainID int `json:"refundChainId"` + RefundDeliveryProvider string `json:"refundDeliveryProvider"` + TargetChainID int `json:"targetChainId"` } diff --git a/api/routes/wormscan/routes.go b/api/routes/wormscan/routes.go index 736e35b0..bdd78d2d 100644 --- a/api/routes/wormscan/routes.go +++ b/api/routes/wormscan/routes.go @@ -10,6 +10,7 @@ import ( govsvc "github.com/wormhole-foundation/wormhole-explorer/api/handlers/governor" infrasvc "github.com/wormhole-foundation/wormhole-explorer/api/handlers/infrastructure" obssvc "github.com/wormhole-foundation/wormhole-explorer/api/handlers/observations" + opsvc "github.com/wormhole-foundation/wormhole-explorer/api/handlers/operations" relayssvc "github.com/wormhole-foundation/wormhole-explorer/api/handlers/relays" trxsvc "github.com/wormhole-foundation/wormhole-explorer/api/handlers/transactions" vaasvc "github.com/wormhole-foundation/wormhole-explorer/api/handlers/vaa" @@ -17,6 +18,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/api/routes/wormscan/governor" "github.com/wormhole-foundation/wormhole-explorer/api/routes/wormscan/infrastructure" "github.com/wormhole-foundation/wormhole-explorer/api/routes/wormscan/observations" + "github.com/wormhole-foundation/wormhole-explorer/api/routes/wormscan/operations" "github.com/wormhole-foundation/wormhole-explorer/api/routes/wormscan/relays" "github.com/wormhole-foundation/wormhole-explorer/api/routes/wormscan/transactions" "github.com/wormhole-foundation/wormhole-explorer/api/routes/wormscan/vaa" @@ -44,6 +46,7 @@ func RegisterRoutes( infrastructureService *infrasvc.Service, transactionsService *trxsvc.Service, relaysService *relayssvc.Service, + operationsService *opsvc.Service, ) { // Set up controllers @@ -54,6 +57,7 @@ func RegisterRoutes( infrastructureCtrl := infrastructure.NewController(infrastructureService) transactionCtrl := transactions.NewController(transactionsService, rootLogger) relaysCtrl := relays.NewController(relaysService, rootLogger) + opsCtrl := operations.NewController(operationsService, rootLogger) // Set up route handlers api := app.Group("/api/v1") @@ -78,6 +82,11 @@ func RegisterRoutes( api.Get("/transactions", transactionCtrl.ListTransactions) api.Get("/transactions/:chain/:emitter/:sequence", transactionCtrl.GetTransactionByID) + // operations resource + operations := api.Group("/operations") + operations.Get("/", opsCtrl.FindAll) + operations.Get("/:chain/:emitter/:sequence", opsCtrl.FindById) + // vaas resource vaas := api.Group("/vaas") vaas.Use(cache.New(cacheConfig)) diff --git a/api/routes/wormscan/transactions/controller.go b/api/routes/wormscan/transactions/controller.go index 7d860fba..520236c9 100644 --- a/api/routes/wormscan/transactions/controller.go +++ b/api/routes/wormscan/transactions/controller.go @@ -169,7 +169,7 @@ func (c *Controller) GetTopAssets(ctx *fiber.Ctx) error { } // Look up the token symbol - tokenMeta, ok := domain.GetTokenByAddress(assetDTOs[i].TokenChain, assetDTOs[i].TokenAddress) + tokenMeta, ok := c.srv.GetTokenProvider().GetTokenByAddress(assetDTOs[i].TokenChain, assetDTOs[i].TokenAddress) if ok { asset.Symbol = tokenMeta.Symbol.String() } diff --git a/blockchain-watcher/config/default.json b/blockchain-watcher/config/default.json index a2c3cec1..d713ece0 100644 --- a/blockchain-watcher/config/default.json +++ b/blockchain-watcher/config/default.json @@ -22,7 +22,11 @@ "network": "devnet", "chainId": 1, "rpcs": ["https://api.devnet.solana.com"], - "timeout": 10000 + "timeout": 10000, + "rateLimit": { + "period": 10000, + "limit": 40 + } }, "ethereum": { "name": "ethereum", diff --git a/blockchain-watcher/config/prod-mainnet.json b/blockchain-watcher/config/prod-mainnet.json new file mode 100644 index 00000000..8bd1b7b9 --- /dev/null +++ b/blockchain-watcher/config/prod-mainnet.json @@ -0,0 +1,11 @@ +{ + "platforms": { + "ethereum": { + "name": "ethereum", + "network": "mainnet", + "chainId": 2, + "rpcs": ["https://rpc.ankr.com/eth"], + "timeout": 10000 + } + } +} diff --git a/blockchain-watcher/config/prod-testnet.json b/blockchain-watcher/config/prod-testnet.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/blockchain-watcher/config/prod-testnet.json @@ -0,0 +1 @@ +{} diff --git a/blockchain-watcher/jest.config.js b/blockchain-watcher/jest.config.js index c7773de5..6a2dfd38 100644 --- a/blockchain-watcher/jest.config.js +++ b/blockchain-watcher/jest.config.js @@ -1,6 +1,7 @@ /** @type {import('ts-jest').JestConfigWithTsJest} */ module.exports = { moduleFileExtensions: ["js", "json", "ts"], + setupFiles: ["/src/infrastructure/log.ts"], roots: ["test", "src"], testRegex: ".*\\.test\\.ts$", transform: { diff --git a/blockchain-watcher/package-lock.json b/blockchain-watcher/package-lock.json index 020228a5..23c5e8bd 100644 --- a/blockchain-watcher/package-lock.json +++ b/blockchain-watcher/package-lock.json @@ -17,6 +17,7 @@ "config": "^3.3.9", "dotenv": "^16.3.1", "ethers": "^5", + "mollitia": "^0.1.0", "prom-client": "^15.0.0", "uuid": "^9.0.1", "winston": "3.8.2" @@ -9683,6 +9684,11 @@ "node": ">=10" } }, + "node_modules/mollitia": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mollitia/-/mollitia-0.1.0.tgz", + "integrity": "sha512-lbbFJdhrNEuReGlbsMqXyTnTiO8Pt+8rKAlLcVyRPNmsRyL+YWR3MlC9Sx8UkOSSLIAUNvIoNlXqD/BWBv9TFQ==" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -19057,6 +19063,11 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "optional": true }, + "mollitia": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mollitia/-/mollitia-0.1.0.tgz", + "integrity": "sha512-lbbFJdhrNEuReGlbsMqXyTnTiO8Pt+8rKAlLcVyRPNmsRyL+YWR3MlC9Sx8UkOSSLIAUNvIoNlXqD/BWBv9TFQ==" + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", diff --git a/blockchain-watcher/package.json b/blockchain-watcher/package.json index 77cfe3f8..77610ea6 100644 --- a/blockchain-watcher/package.json +++ b/blockchain-watcher/package.json @@ -23,6 +23,7 @@ "config": "^3.3.9", "dotenv": "^16.3.1", "ethers": "^5", + "mollitia": "^0.1.0", "prom-client": "^15.0.0", "uuid": "^9.0.1", "winston": "3.8.2" diff --git a/blockchain-watcher/src/domain/actions/RunPollingJob.ts b/blockchain-watcher/src/domain/actions/RunPollingJob.ts index 5b884e75..9f1ab05c 100644 --- a/blockchain-watcher/src/domain/actions/RunPollingJob.ts +++ b/blockchain-watcher/src/domain/actions/RunPollingJob.ts @@ -1,9 +1,12 @@ import { setTimeout } from "timers/promises"; import winston from "winston"; import { Handler } from "../entities"; +import { StatRepository } from "../repositories"; export abstract class RunPollingJob { private interval: number; + private id: string; + private statRepo?: StatRepository; private running: boolean = false; protected abstract logger: winston.Logger; protected abstract preHook(): Promise; @@ -11,9 +14,11 @@ export abstract class RunPollingJob { protected abstract get(): Promise; protected abstract persist(): Promise; - constructor(interval: number) { + constructor(interval: number, id: string, statRepo?: StatRepository) { this.interval = interval; + this.id = id; this.running = true; + this.statRepo = statRepo; } public async run(handlers: Handler[]): Promise { @@ -31,18 +36,21 @@ export abstract class RunPollingJob { try { items = await this.get(); await Promise.all(handlers.map((handler) => handler(items))); - } catch (e) { + } catch (e: Error | any) { this.logger.error("Error processing items", e); + this.statRepo?.count("job_runs_total", { id: this.id, status: "error" }); await setTimeout(this.interval); continue; } await this.persist(); + this.statRepo?.count("job_runs_total", { id: this.id, status: "success" }); await setTimeout(this.interval); } } public async stop(): Promise { this.running = false; + this.statRepo?.count("job_runs_stopped", { id: this.id }); } } diff --git a/blockchain-watcher/src/domain/actions/evm/PollEvmLogs.ts b/blockchain-watcher/src/domain/actions/evm/PollEvmLogs.ts index aaf58b3b..b82e6c60 100644 --- a/blockchain-watcher/src/domain/actions/evm/PollEvmLogs.ts +++ b/blockchain-watcher/src/domain/actions/evm/PollEvmLogs.ts @@ -26,7 +26,7 @@ export class PollEvmLogs extends RunPollingJob { statsRepository: StatRepository, cfg: PollEvmLogsConfig ) { - super(cfg.interval ?? 1_000); + super(cfg.interval ?? 1_000, cfg.id, statsRepository); this.blockRepo = blockRepo; this.metadataRepo = metadataRepo; this.statsRepository = statsRepository; diff --git a/blockchain-watcher/src/domain/actions/solana/HandleSolanaTransactions.ts b/blockchain-watcher/src/domain/actions/solana/HandleSolanaTransactions.ts index 0cfaae93..f0c81f35 100644 --- a/blockchain-watcher/src/domain/actions/solana/HandleSolanaTransactions.ts +++ b/blockchain-watcher/src/domain/actions/solana/HandleSolanaTransactions.ts @@ -12,7 +12,7 @@ export class HandleSolanaTransactions { constructor( cfg: HandleSolanaTxConfig, - mapper: (txs: solana.Transaction) => Promise, + mapper: (tx: solana.Transaction) => Promise, target?: (parsed: T[]) => Promise ) { this.cfg = cfg; diff --git a/blockchain-watcher/src/domain/actions/solana/PollSolanaTransactions.ts b/blockchain-watcher/src/domain/actions/solana/PollSolanaTransactions.ts index 0042c2b9..7ca940ea 100644 --- a/blockchain-watcher/src/domain/actions/solana/PollSolanaTransactions.ts +++ b/blockchain-watcher/src/domain/actions/solana/PollSolanaTransactions.ts @@ -8,10 +8,9 @@ export class PollSolanaTransactions extends RunPollingJob { private metadataRepo: MetadataRepository; private slotRepository: SolanaSlotRepository; private statsRepo: StatRepository; - private latestSlot?: number; private slotCursor?: number; - private lastRange?: { fromSlot: number; toSlot: number }; + private lastRange?: Range; protected logger: winston.Logger; constructor( @@ -20,7 +19,7 @@ export class PollSolanaTransactions extends RunPollingJob { statsRepo: StatRepository, cfg: PollSolanaTransactionsConfig ) { - super(1_000); + super(1_000, cfg.id, statsRepo); this.metadataRepo = metadataRepo; this.slotRepository = slotRepo; @@ -36,8 +35,8 @@ export class PollSolanaTransactions extends RunPollingJob { } } - protected async hasNext(): Promise { - if (this.cfg.toSlot && this.slotCursor && this.slotCursor > this.cfg.toSlot) { + async hasNext(): Promise { + if (this.cfg.toSlot && this.slotCursor && this.slotCursor >= this.cfg.toSlot) { this.logger.info( `Finished processing all slots from ${this.cfg.fromSlot} to ${this.cfg.toSlot}` ); @@ -68,8 +67,15 @@ export class PollSolanaTransactions extends RunPollingJob { } // signatures for address goes back from current sig - const afterSignature = fromBlock.transactions[0].transaction.signatures[0]; - let beforeSignature = toBlock.transactions[0].transaction.signatures[0]; + const afterSignature = fromBlock.transactions[0]?.transaction.signatures[0]; + let beforeSignature = + toBlock.transactions[toBlock.transactions.length - 1]?.transaction.signatures[0]; + if (!afterSignature || !beforeSignature) { + throw new Error( + `No signature presents in transactions. After: ${afterSignature}. Before: ${beforeSignature} [slots: ${range.fromSlot} - ${range.toSlot}]` + ); + } + let currentSignaturesCount = this.cfg.signaturesLimit; let results: solana.Transaction[] = []; @@ -100,7 +106,7 @@ export class PollSolanaTransactions extends RunPollingJob { } } - private getSlotRange(latestSlot: number): { fromSlot: number; toSlot: number } { + private getSlotRange(latestSlot: number): Range { let fromSlot = this.slotCursor ? this.slotCursor + 1 : this.cfg.fromSlot ?? latestSlot; // cfg.fromSlot is present and is greater than current slot height, then we allow to skip slots. if (this.slotCursor && this.cfg.fromSlot && this.cfg.fromSlot > this.slotCursor) { @@ -178,3 +184,8 @@ export class PollSolanaTransactionsConfig { export type PollSolanaTransactionsMetadata = { lastSlot: number; }; + +type Range = { + fromSlot: number; + toSlot: number; +}; diff --git a/blockchain-watcher/src/domain/errors/SolanaFailure.ts b/blockchain-watcher/src/domain/errors/SolanaFailure.ts index 91899518..85d0bdce 100644 --- a/blockchain-watcher/src/domain/errors/SolanaFailure.ts +++ b/blockchain-watcher/src/domain/errors/SolanaFailure.ts @@ -1,6 +1,7 @@ export enum ErrorType { SkippedSlot, NoBlockOrBlockTime, + Ratelimit, } export class SolanaFailure extends Error { diff --git a/blockchain-watcher/src/infrastructure/RepositoriesBuilder.ts b/blockchain-watcher/src/infrastructure/RepositoriesBuilder.ts index ddf8e0d7..22a9db1b 100644 --- a/blockchain-watcher/src/infrastructure/RepositoriesBuilder.ts +++ b/blockchain-watcher/src/infrastructure/RepositoriesBuilder.ts @@ -7,6 +7,7 @@ import { PromStatRepository, StaticJobRepository, Web3SolanaSlotRepository, + RateLimitedSolanaSlotRepository, } from "./repositories"; import { JobRepository } from "../domain/repositories"; import { RepositoriesStrategy } from "./repositories/strategies/RepositoriesStrategy"; diff --git a/blockchain-watcher/src/infrastructure/config.ts b/blockchain-watcher/src/infrastructure/config.ts index 67ee82ed..aeaa3692 100644 --- a/blockchain-watcher/src/infrastructure/config.ts +++ b/blockchain-watcher/src/infrastructure/config.ts @@ -23,6 +23,10 @@ export type PlatformConfig = { chainId: number; rpcs: string[]; timeout?: number; + rateLimit?: { + period: number; + limit: number; + }; }; /* diff --git a/blockchain-watcher/src/infrastructure/repositories/EvmJsonRPCBlockRepository.ts b/blockchain-watcher/src/infrastructure/repositories/EvmJsonRPCBlockRepository.ts index 2bbe98a3..2f7f9bd1 100644 --- a/blockchain-watcher/src/infrastructure/repositories/EvmJsonRPCBlockRepository.ts +++ b/blockchain-watcher/src/infrastructure/repositories/EvmJsonRPCBlockRepository.ts @@ -11,6 +11,7 @@ import { DynamicStrategy } from "./strategies/DynamicStrategy"; * On the reliability side, only knows how to timeout. */ +const HEXADECIMAL_PREFIX = "0x"; const CHAIN = "ethereum"; export class EvmJsonRPCBlockRepository implements EvmBlockRepository, DynamicStrategy { @@ -66,12 +67,14 @@ export class EvmJsonRPCBlockRepository implements EvmBlockRepository, DynamicStr const reqs: any[] = []; for (let blockNumber of blockNumbers) { - const blockNumberStr = blockNumber.toString(); + const blockNumberStrParam = `${HEXADECIMAL_PREFIX}${blockNumber.toString(16)}`; + const blockNumberStrId = blockNumber.toString(); + reqs.push({ jsonrpc: "2.0", - id: blockNumberStr, + id: blockNumberStrId, method: "eth_getBlockByNumber", - params: [blockNumberStr, false], + params: [blockNumberStrParam, false], }); } @@ -146,8 +149,8 @@ export class EvmJsonRPCBlockRepository implements EvmBlockRepository, DynamicStr const parsedFilters = { topics: filter.topics, address: filter.addresses, - fromBlock: `0x${filter.fromBlock.toString(16)}`, - toBlock: `0x${filter.toBlock.toString(16)}`, + fromBlock: `${HEXADECIMAL_PREFIX}${filter.fromBlock.toString(16)}`, + toBlock: `${HEXADECIMAL_PREFIX}${filter.toBlock.toString(16)}`, }; let response: { result: Log[]; error?: ErrorBlock }; @@ -182,13 +185,13 @@ export class EvmJsonRPCBlockRepository implements EvmBlockRepository, DynamicStr /** * Loosely based on the wormhole-dashboard implementation (minus some specially crafted blocks when null result is obtained) */ - private async getBlock(blockNumberOrTag: bigint | EvmTag): Promise { + private async getBlock(blockNumberOrTag: EvmTag): Promise { let response: { result?: EvmBlock; error?: ErrorBlock }; try { response = await this.httpClient.post(this.rpc.href, { jsonrpc: "2.0", method: "eth_getBlockByNumber", - params: [blockNumberOrTag.toString(), false], // this means we'll get a light block (no txs) + params: [blockNumberOrTag, false], // this means we'll get a light block (no txs) id: 1, }); } catch (e: HttpClientError | any) { diff --git a/blockchain-watcher/src/infrastructure/repositories/FileMetadataRepo.ts b/blockchain-watcher/src/infrastructure/repositories/FileMetadataRepo.ts new file mode 100644 index 00000000..d4f2f248 --- /dev/null +++ b/blockchain-watcher/src/infrastructure/repositories/FileMetadataRepo.ts @@ -0,0 +1,27 @@ +import fs from "fs"; +import { MetadataRepository } from "../../domain/repositories"; + +export class FileMetadataRepo implements MetadataRepository { + private readonly dirPath: string; + + constructor(dirPath: string) { + this.dirPath = dirPath; + if (!fs.existsSync(this.dirPath)) { + fs.mkdirSync(this.dirPath, { recursive: true }); + } + } + + async get(id: string): Promise { + const filePath = `${this.dirPath}/${id}.json`; + + return fs.promises + .readFile(filePath, "utf8") + .then(JSON.parse) + .catch((err) => null); + } + + async save(id: string, metadata: any): Promise { + const filePath = `${this.dirPath}/${id}.json`; + return fs.promises.writeFile(filePath, JSON.stringify(metadata), "utf8"); + } +} diff --git a/blockchain-watcher/src/infrastructure/repositories/HttpClient.ts b/blockchain-watcher/src/infrastructure/repositories/HttpClient.ts new file mode 100644 index 00000000..8b1f6e4d --- /dev/null +++ b/blockchain-watcher/src/infrastructure/repositories/HttpClient.ts @@ -0,0 +1,130 @@ +import axios, { AxiosError, AxiosInstance } from "axios"; +import { setTimeout } from "timers/promises"; + +/** + * A simple HTTP client with exponential backoff retries and 429 handling. + */ +export class HttpClient { + private initialDelay: number = 1_000; + private maxDelay: number = 60_000; + private retries: number = 0; + private timeout: number = 5_000; + private axios: AxiosInstance; + + constructor(options?: HttpClientOptions) { + options?.initialDelay && (this.initialDelay = options.initialDelay); + options?.maxDelay && (this.maxDelay = options.maxDelay); + options?.retries && (this.retries = options.retries); + options?.timeout && (this.timeout = options.timeout); + this.axios = axios.create(); + } + + public async post(url: string, body: any, opts?: HttpClientOptions): Promise { + return this.executeWithRetry(url, "POST", body, opts); + } + + private async execute( + url: string, + method: string, + body?: any, + opts?: HttpClientOptions + ): Promise { + let response; + try { + response = await this.axios.request({ + url: url, + method: method, + data: body, + timeout: opts?.timeout ?? this.timeout, + signal: AbortSignal.timeout(opts?.timeout ?? this.timeout), + }); + } catch (err: AxiosError | any) { + // Connection / timeout error: + if (err instanceof AxiosError) { + throw new HttpClientError(err.message ?? err.code, { status: err?.status ?? 0 }, err); + } + + throw new HttpClientError(err.message ?? err.code, undefined, err); + } + + if (!(response.status > 200) && !(response.status < 300)) { + throw new HttpClientError(undefined, response, response.data); + } + + return response.data; + } + + private async executeWithRetry( + url: string, + method: string, + body?: any, + opts?: HttpClientOptions + ): Promise { + const maxRetries = opts?.retries ?? this.retries; + let retries = 0; + const initialDelay = opts?.initialDelay ?? this.initialDelay; + const maxDelay = opts?.maxDelay ?? this.maxDelay; + while (maxRetries >= 0) { + try { + return await this.execute(url, method, body, opts); + } catch (err) { + if (err instanceof HttpClientError) { + if (retries < maxRetries) { + const retryAfter = err.getRetryAfter(maxDelay, err); + if (retryAfter) { + await setTimeout(retryAfter, { ref: false }); + } else { + const timeout = Math.min(initialDelay * 2 ** maxRetries, maxDelay); + await setTimeout(timeout, { ref: false }); + } + retries++; + continue; + } + } + throw err; + } + } + + throw new Error(`Failed to reach ${url}`); + } +} + +export type HttpClientOptions = { + initialDelay?: number; + maxDelay?: number; + retries?: number; + timeout?: number; +}; + +export class HttpClientError extends Error { + public readonly status?: number; + public readonly data?: any; + public readonly headers?: any; + + constructor(message?: string, response?: { status: number; headers?: any }, data?: any) { + super(message ?? `Unexpected status code: ${response?.status}`); + this.status = response?.status; + this.data = data; + this.headers = response?.headers; + Error.captureStackTrace(this, this.constructor); + } + + /** + * Parses the Retry-After header and returns the value in milliseconds. + * @param maxDelay + * @param error + * @throws {HttpClientError} if retry-after is bigger than maxDelay. + * @returns the retry-after value in milliseconds. + */ + public getRetryAfter(maxDelay: number, error: HttpClientError): number | undefined { + const retryAfter = this.headers?.get("Retry-After"); + if (retryAfter) { + const value = parseInt(retryAfter) * 1000; // header value is in seconds + if (value <= maxDelay) { + return value; + } + + throw error; + } + } +} diff --git a/blockchain-watcher/src/infrastructure/repositories/SnsEventRepository.ts b/blockchain-watcher/src/infrastructure/repositories/SnsEventRepository.ts index bfb86aa2..d82907c1 100644 --- a/blockchain-watcher/src/infrastructure/repositories/SnsEventRepository.ts +++ b/blockchain-watcher/src/infrastructure/repositories/SnsEventRepository.ts @@ -107,6 +107,7 @@ export class SnsEventRepository implements SnsRepository, StaticStrategy { }; } + this.logger.info(`Published ${events.length} events to SNS`); return { status: SUCCESS_STATUS, }; @@ -120,8 +121,6 @@ export class SnsEventRepository implements SnsRepository, StaticStrategy { this.logger.error(`Error publishing events to SNS: ${result.reason ?? result.reasons}`); throw new Error(`Error publishing events to SNS: ${result.reason}`); } - - this.logger.info(`Published ${events.length} events to SNS`); }; } } diff --git a/blockchain-watcher/src/infrastructure/repositories/index.ts b/blockchain-watcher/src/infrastructure/repositories/index.ts index 2ff0e5fb..3d8fbd22 100644 --- a/blockchain-watcher/src/infrastructure/repositories/index.ts +++ b/blockchain-watcher/src/infrastructure/repositories/index.ts @@ -12,4 +12,5 @@ export * from "./SnsEventRepository"; export * from "./EvmJsonRPCBlockRepository"; export * from "./PromStatRepository"; export * from "./StaticJobRepository"; -export * from "./Web3SolanaSlotRepository"; +export * from "./solana/Web3SolanaSlotRepository"; +export * from "./solana/RateLimitedSolanaSlotRepository"; diff --git a/blockchain-watcher/src/infrastructure/repositories/solana/RateLimitedSolanaSlotRepository.ts b/blockchain-watcher/src/infrastructure/repositories/solana/RateLimitedSolanaSlotRepository.ts new file mode 100644 index 00000000..c022d64c --- /dev/null +++ b/blockchain-watcher/src/infrastructure/repositories/solana/RateLimitedSolanaSlotRepository.ts @@ -0,0 +1,102 @@ +import { Circuit, Ratelimit, RatelimitError, Retry, RetryMode } from "mollitia"; +import { solana } from "../../../domain/entities"; +import { SolanaSlotRepository } from "../../../domain/repositories"; +import { Fallible, SolanaFailure, ErrorType } from "../../../domain/errors"; +import winston from "../../../infrastructure/log"; +import { DynamicStrategy } from "../strategies/DynamicStrategy"; + +const CHAIN = "solana"; +const NAME = "solana-slotRepo"; + +export class RateLimitedSolanaSlotRepository implements SolanaSlotRepository, DynamicStrategy { + delegate: SolanaSlotRepository; + breaker: Circuit; + logger: winston.Logger = winston.child({ module: "RateLimitedSolanaSlotRepository" }); + + constructor(delegate: SolanaSlotRepository, opts: Options = { period: 10_000, limit: 50 }) { + this.delegate = delegate; + this.breaker = new Circuit({ + options: { + modules: [ + new Ratelimit({ limitPeriod: opts.period, limitForPeriod: opts.limit }), + new Retry({ + attempts: 1, + interval: 10_000, + fastFirst: false, + mode: RetryMode.LINEAR, + factor: 1, + onRejection: (err: Error | any) => { + if (err.message?.startsWith("429 Too Many Requests")) { + this.logger.warn("Got 429 from solana RPC node. Retrying in 10 secs..."); + return 10_000; // Wait 10 secs if we get a 429 + } else { + return false; // Dont retry, let the caller handle it + } + }, + }), + ], + }, + }); + } + + apply(chain: string): boolean { + return chain === CHAIN; + } + + getName(): string { + return NAME; + } + + createInstance(): RateLimitedSolanaSlotRepository { + return this; + } + + getLatestSlot(commitment: string): Promise { + return this.breaker.fn(() => this.delegate.getLatestSlot(commitment)).execute(); + } + + async getBlock(slot: number, finality?: string): Promise> { + try { + const result: Fallible = await this.breaker + .fn(() => this.delegate.getBlock(slot, finality)) + .execute(); + + if (!result.isOk()) { + throw result.getError(); + } + + return result; + } catch (err: SolanaFailure | any) { + // this needs more handling due to delegate.getBlock returning a Fallible with a SolanaFailure + if (err instanceof RatelimitError) { + return Fallible.error(new SolanaFailure(0, err.message, ErrorType.Ratelimit)); + } + + if (err instanceof SolanaFailure) { + return Fallible.error(err); + } + + return Fallible.error(new SolanaFailure(err, err?.message ?? "unknown error")); + } + } + + getSignaturesForAddress( + address: string, + beforeSig: string, + afterSig: string, + limit: number + ): Promise { + return this.breaker + .fn(() => this.delegate.getSignaturesForAddress(address, beforeSig, afterSig, limit)) + .execute(address, beforeSig, afterSig, limit); + } + + getTransactions(sigs: solana.ConfirmedSignatureInfo[]): Promise { + return this.breaker.fn(() => this.delegate.getTransactions(sigs)).execute(sigs); + } +} + +export type Options = { + period: number; + limit: number; +}; diff --git a/blockchain-watcher/src/infrastructure/repositories/Web3SolanaSlotRepository.ts b/blockchain-watcher/src/infrastructure/repositories/solana/Web3SolanaSlotRepository.ts similarity index 85% rename from blockchain-watcher/src/infrastructure/repositories/Web3SolanaSlotRepository.ts rename to blockchain-watcher/src/infrastructure/repositories/solana/Web3SolanaSlotRepository.ts index c921a830..04ccb5a5 100644 --- a/blockchain-watcher/src/infrastructure/repositories/Web3SolanaSlotRepository.ts +++ b/blockchain-watcher/src/infrastructure/repositories/solana/Web3SolanaSlotRepository.ts @@ -5,36 +5,21 @@ import { VersionedTransactionResponse, SolanaJSONRPCError, } from "@solana/web3.js"; -import { solana } from "../../domain/entities"; -import { SolanaSlotRepository } from "../../domain/repositories"; -import { Fallible, SolanaFailure } from "../../domain/errors"; -import { DynamicStrategy } from "./strategies/DynamicStrategy"; +import { solana } from "../../../domain/entities"; +import { SolanaSlotRepository } from "../../../domain/repositories"; +import { Fallible, SolanaFailure } from "../../../domain/errors"; const COMMITMENT_FINALIZED = "finalized"; const COMMITMENT_CONDIRMED = "confirmed"; const LEGACY_VERSION = "legacy"; -const CHAIN = "solana"; -const NAME = "solana-slotRepo"; -export class Web3SolanaSlotRepository implements SolanaSlotRepository, DynamicStrategy { +export class Web3SolanaSlotRepository implements SolanaSlotRepository { private connection: Connection; constructor(connection: Connection) { this.connection = connection; } - apply(chain: string): boolean { - return chain === CHAIN; - } - - getName(): string { - return NAME; - } - - createInstance(): Web3SolanaSlotRepository { - return this; - } - getLatestSlot(commitment: string): Promise { return this.connection.getSlot(commitment as Commitment); } @@ -64,7 +49,7 @@ export class Web3SolanaSlotRepository implements SolanaSlotRepository, DynamicSt return Fallible.error(new SolanaFailure(err.code, err.message)); } - return Fallible.error(new SolanaFailure(0, err.message)); + throw err; }); } diff --git a/blockchain-watcher/src/infrastructure/repositories/strategies/RepositoriesStrategy.ts b/blockchain-watcher/src/infrastructure/repositories/strategies/RepositoriesStrategy.ts index 8129d13e..ec19d70b 100644 --- a/blockchain-watcher/src/infrastructure/repositories/strategies/RepositoriesStrategy.ts +++ b/blockchain-watcher/src/infrastructure/repositories/strategies/RepositoriesStrategy.ts @@ -4,10 +4,10 @@ import { PromStatRepository } from "../PromStatRepository"; import { SNSClient } from "@aws-sdk/client-sns"; import { Config } from "../../config"; import { EvmJsonRPCBlockRepository } from "../EvmJsonRPCBlockRepository"; -import { Web3SolanaSlotRepository } from "../Web3SolanaSlotRepository"; import { Connection } from "@solana/web3.js"; import { DynamicStrategy } from "./DynamicStrategy"; import { StaticStrategy } from "./StaticStrategy"; +import { RateLimitedSolanaSlotRepository, Web3SolanaSlotRepository } from ".."; export class RepositoriesStrategy { private snsClient?: SNSClient; @@ -42,11 +42,14 @@ export class RepositoriesStrategy { const platform = this.cfg.platforms[chain]; if (!platform) throw new Error(`No config for chain ${chain}`); - const repositories: DynamicStrategy[] = [ + const repositories = [ new EvmJsonRPCBlockRepository(this.cfg), - new Web3SolanaSlotRepository( - new Connection(platform.rpcs[0], { disableRetryOnRateLimit: true }), - ), + new RateLimitedSolanaSlotRepository( + new Web3SolanaSlotRepository( + new Connection(platform.rpcs[0], { disableRetryOnRateLimit: true }) + ), + platform.rateLimit + ) ]; repositories.forEach((repository) => { diff --git a/blockchain-watcher/test/domain/actions/solana/HandleSolanaTransactions.test.ts b/blockchain-watcher/test/domain/actions/solana/HandleSolanaTransactions.test.ts new file mode 100644 index 00000000..44cd0297 --- /dev/null +++ b/blockchain-watcher/test/domain/actions/solana/HandleSolanaTransactions.test.ts @@ -0,0 +1,59 @@ +import { describe, jest, it, expect } from "@jest/globals"; +import { + HandleSolanaTransactions, + HandleSolanaTxConfig, +} from "../../../../src/domain/actions/solana/HandleSolanaTransactions"; +import { solana } from "../../../../src/domain/entities"; + +let solanaTxs: solana.Transaction[]; + +describe("HandleSolanaTransactions", () => { + let handleSolanaTransactions: HandleSolanaTransactions; + const mockConfig: HandleSolanaTxConfig = { + programId: "mockProgramId", + }; + + it("should handle Solana transactions", async () => { + givenSolanaTransactions(); + handleSolanaTransactions = new HandleSolanaTransactions( + mockConfig, + async (tx: solana.Transaction) => { + return [tx]; + } + ); + + const result = await handleSolanaTransactions.handle(solanaTxs); + + expect(result).toEqual(solanaTxs); + }); + + it("should handle Solana transactions with a target", async () => { + givenSolanaTransactions(); + const mockTarget = jest.fn<(parsed: any[]) => Promise>(); + handleSolanaTransactions = new HandleSolanaTransactions( + mockConfig, + async (tx: solana.Transaction) => { + return [tx]; + }, + mockTarget + ); + const mockTransactions: solana.Transaction[] = await handleSolanaTransactions.handle(solanaTxs); + + expect(mockTarget).toHaveBeenCalledWith(mockTransactions); + }); +}); + +const givenSolanaTransactions = () => + (solanaTxs = [ + { + slot: 1, + transaction: { + message: { + accountKeys: [], + instructions: [], + compiledInstructions: [], + }, + signatures: [], + }, + }, + ]); diff --git a/blockchain-watcher/test/domain/actions/solana/PollSolanaTransactions.test.ts b/blockchain-watcher/test/domain/actions/solana/PollSolanaTransactions.test.ts index e2fcb3c2..02b71d91 100644 --- a/blockchain-watcher/test/domain/actions/solana/PollSolanaTransactions.test.ts +++ b/blockchain-watcher/test/domain/actions/solana/PollSolanaTransactions.test.ts @@ -96,10 +96,35 @@ describe("PollSolanaTransactions", () => { }) ); }); + + it("should be able to read transactions from last known slot and stop when toSlot is reached", async () => { + const latestSlot = 100; + const lastSlot = 10; + const toSlot = 50; + const expectedSigs = givenSigs(); + const expectedTxs = givenTxs(); + + givenCfg({ toSlot }); + givenStatsRepository(); + givenMetadataRepository({ lastSlot }); + givenSolanaSlotRepository(latestSlot, givenBlock(1), expectedSigs, expectedTxs); + givenPollSolanaTransactions(); + + pollSolanaTransactions.run([handlers.working]); + + await thenWaitForAssertion( + () => + expect(metadataSaveSpy).toHaveBeenCalledWith(cfg.id, { + lastSlot: toSlot, + }), + () => expect(pollSolanaTransactions.hasNext()).resolves.toBe(false) + ); + }); }); -const givenCfg = () => { +const givenCfg = (overrides?: Partial) => { cfg = new PollSolanaTransactionsConfig("anId", "programID", "confirmed"); + Object.assign(cfg, overrides); }; const givenMetadataRepository = (data?: PollSolanaTransactionsMetadata) => { diff --git a/blockchain-watcher/test/infrastructure/repositories/EvmJsonRPCBlockRepository.integration.test.ts b/blockchain-watcher/test/infrastructure/repositories/EvmJsonRPCBlockRepository.integration.test.ts index 2500b1cd..c3298cba 100644 --- a/blockchain-watcher/test/infrastructure/repositories/EvmJsonRPCBlockRepository.integration.test.ts +++ b/blockchain-watcher/test/infrastructure/repositories/EvmJsonRPCBlockRepository.integration.test.ts @@ -140,7 +140,7 @@ const givenBlocksArePresent = (blockNumbers: bigint[]) => { const requests = blockNumbers.map((blockNumber) => ({ jsonrpc: "2.0", method: "eth_getBlockByNumber", - params: [blockNumber.toString(), false], + params: [`0x${blockNumber.toString(16)}`, false], id: blockNumber.toString(), })); const response = blockNumbers.map((blockNumber) => ({ diff --git a/blockchain-watcher/test/infrastructure/repositories/RateLimitedSolanaSlotRepository.test.ts b/blockchain-watcher/test/infrastructure/repositories/RateLimitedSolanaSlotRepository.test.ts new file mode 100644 index 00000000..05741d86 --- /dev/null +++ b/blockchain-watcher/test/infrastructure/repositories/RateLimitedSolanaSlotRepository.test.ts @@ -0,0 +1,55 @@ +import { expect, describe, it } from "@jest/globals"; +import { + Web3SolanaSlotRepository, + RateLimitedSolanaSlotRepository, +} from "../../../src/infrastructure/repositories"; + +const repoMock = { + getSlot: () => Promise.resolve(100), + getLatestSlot: () => Promise.resolve(100), + getBlock: () => Promise.resolve({ blockTime: 100, transactions: [] }), + getSignaturesForAddress: () => Promise.resolve([]), + getTransactions: () => Promise.resolve([]), +} as any as Web3SolanaSlotRepository; + +describe("RateLimitedSolanaSlotRepository", () => { + describe("getLatestSlot", () => { + it("should fail when ratelimit is exceeded", async () => { + const repository = new RateLimitedSolanaSlotRepository(repoMock, { period: 1000, limit: 1 }); + + await repository.getLatestSlot("confirmed"); + await expect(repository.getLatestSlot("confirmed")).rejects.toThrowError(); + }); + }); + + describe("getBlock", () => { + it("should fail when ratelimit is exceeded", async () => { + const repository = new RateLimitedSolanaSlotRepository(repoMock, { period: 1000, limit: 1 }); + + await repository.getBlock(1); + const failure = await repository.getBlock(1); + + expect(failure.getError()).toHaveProperty("message", "Ratelimited"); + }); + }); + + describe("getSignaturesForAddress", () => { + it("should fail when ratelimit is exceeded", async () => { + const repository = new RateLimitedSolanaSlotRepository(repoMock, { period: 1000, limit: 1 }); + + await repository.getSignaturesForAddress("address", "before", "after", 1); + await expect( + repository.getSignaturesForAddress("address", "before", "after", 1) + ).rejects.toThrowError(); + }); + }); + + describe("getTransactions", () => { + it("should fail when ratelimit is exceeded", async () => { + const repository = new RateLimitedSolanaSlotRepository(repoMock, { period: 1000, limit: 1 }); + + await repository.getTransactions([]); + await expect(repository.getTransactions([])).rejects.toThrowError(); + }); + }); +}); diff --git a/blockchain-watcher/test/infrastructure/repositories/RepositoriesBuilder.test.ts b/blockchain-watcher/test/infrastructure/repositories/RepositoriesBuilder.test.ts index a0b19556..a41c653b 100644 --- a/blockchain-watcher/test/infrastructure/repositories/RepositoriesBuilder.test.ts +++ b/blockchain-watcher/test/infrastructure/repositories/RepositoriesBuilder.test.ts @@ -5,8 +5,8 @@ import { EvmJsonRPCBlockRepository, FileMetadataRepository, PromStatRepository, + RateLimitedSolanaSlotRepository, SnsEventRepository, - Web3SolanaSlotRepository, } from "../../../src/infrastructure/repositories"; describe("RepositoriesBuilder", () => { @@ -41,6 +41,6 @@ describe("RepositoriesBuilder", () => { expect(repos.getMetadataRepository()).toBeInstanceOf(FileMetadataRepository); expect(repos.getSnsEventRepository()).toBeInstanceOf(SnsEventRepository); expect(repos.getStatsRepository()).toBeInstanceOf(PromStatRepository); - expect(repos.getSolanaSlotRepository()).toBeInstanceOf(Web3SolanaSlotRepository); + expect(repos.getSolanaSlotRepository()).toBeInstanceOf(RateLimitedSolanaSlotRepository); }); }); diff --git a/blockchain-watcher/test/infrastructure/repositories/Web3SolanaSlotRepository.test.ts b/blockchain-watcher/test/infrastructure/repositories/Web3SolanaSlotRepository.test.ts index 6dacf88c..78417ab1 100644 --- a/blockchain-watcher/test/infrastructure/repositories/Web3SolanaSlotRepository.test.ts +++ b/blockchain-watcher/test/infrastructure/repositories/Web3SolanaSlotRepository.test.ts @@ -1,47 +1,9 @@ import { expect, describe, it } from "@jest/globals"; +import { PublicKey } from "@solana/web3.js"; import { solana } from "../../../src/domain/entities"; import { Web3SolanaSlotRepository } from "../../../src/infrastructure/repositories"; describe("Web3SolanaSlotRepository", () => { - const chain = "solana"; - - describe("strategy", () => { - it("should be apply Web3SolanaSlotRepository", async () => { - // Given - const connectionMock = {}; - const repo = new Web3SolanaSlotRepository(connectionMock as any); - - // When - const result = await repo.apply(chain); - - // Then - expect(result).toBe(true); - }); - - it("should be get name metadata", async () => { - // Given - const connectionMock = {}; - const repo = new Web3SolanaSlotRepository(connectionMock as any); - - // When - const result = await repo.getName(); - - // Then - expect(result).toBe("solana-slotRepo"); - }); - - it("should be create instance", async () => { - // Given - const connectionMock = {}; - const repo = new Web3SolanaSlotRepository(connectionMock as any); - - // When - const result = await repo.createInstance(); - - // Then - expect(result).toBeInstanceOf(Web3SolanaSlotRepository); - }); - }); describe("getLatestSlot", () => { it("should return the latest slot number", async () => { @@ -64,7 +26,32 @@ describe("Web3SolanaSlotRepository", () => { // Given const expected = { blockTime: 100, - transactions: [], + transactions: [ + { + signature: "signature1", + slot: 100, + transaction: { + message: { + version: "legacy", + accountKeys: [new PublicKey("3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5")], + instructions: [], + compiledInstructions: [], + }, + }, + }, + { + signature: "signature1", + slot: 100, + transaction: { + message: { + version: 0, + staticAccountKeys: [new PublicKey("3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5")], + instructions: [], + compiledInstructions: [], + }, + }, + }, + ], }; const connectionMock = { getBlock: (slot: number) => Promise.resolve(expected), @@ -78,6 +65,17 @@ describe("Web3SolanaSlotRepository", () => { expect(block.blockTime).toBe(expected.blockTime); expect(block.transactions).toHaveLength(expected.transactions.length); }); + + it("should return an error when the block is not found", async () => { + const connectionMock = { + getBlock: (slot: number) => Promise.resolve(null), + }; + const repository = new Web3SolanaSlotRepository(connectionMock as any); + + const block = await repository.getBlock(100); + + expect(block.getError()).toBeDefined(); + }); }); describe("getSignaturesForAddress", () => { diff --git a/common/client/cache/notional/cache_test.go b/common/client/cache/notional/cache_test.go index b40ca403..44398a2d 100644 --- a/common/client/cache/notional/cache_test.go +++ b/common/client/cache/notional/cache_test.go @@ -26,13 +26,13 @@ func TestNotionalCache_renderRegexp(t *testing.T) { } key := nc.renderRegExp() - assert.Equal(t, "*staging-mainnet:WORMSCAN:NOTIONAL:SYMBOL:*", key) + assert.Equal(t, "*staging-mainnet:WORMSCAN:NOTIONAL:TOKEN:*", key) nc = &NotionalCache{ client: nil, prefix: "", } key = nc.renderRegExp() - assert.Equal(t, "*WORMSCAN:NOTIONAL:SYMBOL:*", key) + assert.Equal(t, "*WORMSCAN:NOTIONAL:TOKEN:*", key) } diff --git a/common/domain/events.go b/common/domain/events.go deleted file mode 100644 index 2d9ba15c..00000000 --- a/common/domain/events.go +++ /dev/null @@ -1,63 +0,0 @@ -package domain - -import ( - "encoding/json" - "time" -) - -const ( - SignedVaaType = "signed-vaa" - PublishedLogMessageType = "published-log-message" -) - -type NotificationEvent struct { - TrackID string `json:"trackId"` - Source string `json:"source"` - Type string `json:"type"` - Payload json.RawMessage `json:"payload"` -} - -func NewNotificationEvent[T EventPayload](trackID, source, _type string, payload T) (*NotificationEvent, error) { - p, err := json.Marshal(payload) - if err != nil { - return nil, err - } - return &NotificationEvent{ - TrackID: trackID, - Source: source, - Type: _type, - Payload: json.RawMessage(p), - }, nil -} - -type EventPayload interface { - SignedVaa | PublishedLogMessage -} - -func GetEventPayload[T EventPayload](e *NotificationEvent) (T, error) { - var payload T - err := json.Unmarshal(e.Payload, &payload) - return payload, err -} - -type SignedVaa struct { - ID string `json:"id"` - EmitterChain uint16 `json:"emitterChain"` - EmitterAddr string `json:"emitterAddr"` - Sequence uint64 `json:"sequence"` - GuardianSetIndex uint32 `json:"guardianSetIndex"` - Timestamp time.Time `json:"timestamp"` - Vaa []byte `json:"vaa"` - TxHash string `json:"txHash"` - Version int `json:"version"` -} - -type PublishedLogMessage struct { - ID string `json:"id"` - EmitterChain uint16 `json:"emitterChain"` - EmitterAddr string `json:"emitterAddr"` - Sequence uint64 `json:"sequence"` - Timestamp time.Time `json:"timestamp"` - Vaa []byte `json:"vaa"` - TxHash string `json:"txHash"` -} diff --git a/common/domain/generated_mainnet_tokens.go b/common/domain/generated_mainnet_tokens.go index a984617b..38ddeb32 100644 --- a/common/domain/generated_mainnet_tokens.go +++ b/common/domain/generated_mainnet_tokens.go @@ -1,871 +1,972 @@ // This file contains the token config to be used in the mainnet environment. // -// This file was generated: Wed Aug 02 2023 14:30:16 GMT-0500 (Central Daylight Time) using a min notional of 0 +// This file was generated: Mon Oct 23 2023 09:11:21 GMT-0500 (Central Daylight Time) using a min notional of 0 package domain func generatedMainnetTokenList() []TokenMetadata { return []TokenMetadata{ - {TokenChain: 1, TokenAddress: "e24bdeaeffa04f43b8771a420b80061cf093260db29ac9c8ead65058a97f7857", Symbol: "", CoingeckoID: "genopets", Decimals: 9}, // Addr: GENEtH5amGSi8kHAtQoezp1XEXwZJ8vcuePYnXdKrMYz, Notional: 102.39625512761579 - {TokenChain: 1, TokenAddress: "05be6c87eec2d40a2e26e1fc0a8423a379820ca454982348adfc9563b5157725", Symbol: "PRT", CoingeckoID: "parrot-protocol", Decimals: 6}, // Addr: PRT88RkA4Kg5z7pKnezeNH4mafTvtQdfFgpQTGRjz44, Notional: 1.2921243328728 - {TokenChain: 1, TokenAddress: "e334cd4a3826672ea4c5394a042929c94638ecee0deeae37fbd41e396d06fc77", Symbol: "SOLAPE", CoingeckoID: "solape-token", Decimals: 9}, // Addr: GHvFFSZ9BctWsEc5nujR1MTmmJWY7tgQz2AXE6WVFtGN, Notional: 0.0021806 + {TokenChain: 1, TokenAddress: "e24bdeaeffa04f43b8771a420b80061cf093260db29ac9c8ead65058a97f7857", Symbol: "", CoingeckoID: "genopets", Decimals: 9}, // Addr: GENEtH5amGSi8kHAtQoezp1XEXwZJ8vcuePYnXdKrMYz, Notional: 1.4902820214015997 + {TokenChain: 1, TokenAddress: "05be6c87eec2d40a2e26e1fc0a8423a379820ca454982348adfc9563b5157725", Symbol: "PRT", CoingeckoID: "parrot-protocol", Decimals: 6}, // Addr: PRT88RkA4Kg5z7pKnezeNH4mafTvtQdfFgpQTGRjz44, Notional: 1.2924766464089399 + {TokenChain: 1, TokenAddress: "e334cd4a3826672ea4c5394a042929c94638ecee0deeae37fbd41e396d06fc77", Symbol: "SOLAPE", CoingeckoID: "solape-token", Decimals: 9}, // Addr: GHvFFSZ9BctWsEc5nujR1MTmmJWY7tgQz2AXE6WVFtGN, Notional: 0.00102029 {TokenChain: 1, TokenAddress: "92d10feca33abd20cdb6c082b7066be3a8664e9098e5758226e82e28a0e0cc0a", Symbol: "", CoingeckoID: "battle-of-guardians-share", Decimals: 9}, // Addr: At7RLMbA6ZUjj7riyvFq2j5NHQ19aJabCju2VxLDAqso, Notional: 2.135548870464 - {TokenChain: 1, TokenAddress: "069b8857feab8184fb687f634618c035dac439dc1aeb3b5598a0f00000000001", Symbol: "SOL", CoingeckoID: "wrapped-solana", Decimals: 9}, // Addr: So11111111111111111111111111111111111111112, Notional: 8059441.503412684 + {TokenChain: 1, TokenAddress: "069b8857feab8184fb687f634618c035dac439dc1aeb3b5598a0f00000000001", Symbol: "SOL", CoingeckoID: "wrapped-solana", Decimals: 9}, // Addr: So11111111111111111111111111111111111111112, Notional: 8788979.893575722 {TokenChain: 1, TokenAddress: "360c012e23f5bf12d1e47e985682d8814e6bb1715920852acca33346708fa968", Symbol: "MIM", CoingeckoID: "mim", Decimals: 9}, // Addr: 4dydh8EGNEdTz6grqnGBxpduRg55eLnwNZXoNZJetadu, Notional: 0.0147472007788439 - {TokenChain: 1, TokenAddress: "4757899fb8bedba28778aacd67e568e73470cce90bcd532b6cb618297628824e", Symbol: "", CoingeckoID: "socean-staked-sol", Decimals: 9}, // Addr: 5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm, Notional: 27.5747824845 - {TokenChain: 1, TokenAddress: "9266050ea34cd64a96e9e7be1e210ed22b2e3f5fde61861af7527c681ef2f3d3", Symbol: "renDOGE", CoingeckoID: "rendoge", Decimals: 8}, // Addr: ArUkYE2XDKzqy77PRRGjo4wREWwqk6RXTfM9NeqzPvjU, Notional: 78.45482555232 - {TokenChain: 1, TokenAddress: "a790b593d8c348fba977d377f67f86214cb50662ae0e1410776d5b92611aec13", Symbol: "SOLX", CoingeckoID: "soldex", Decimals: 9}, // Addr: CH74tuRLTYcxG7qNJCsV9rghfLXJCQJbsu7i52a8F1Gn, Notional: 0.00314046902871 - {TokenChain: 1, TokenAddress: "518ecf30942036e11b4eb4f2f5a05d32661f9ada0a6a4402c5df098ea6c4fbce", Symbol: "wHAPI", CoingeckoID: "hapi", Decimals: 9}, // Addr: 6VNKqgz9hk7zRShTFdg5AnkfKwZUcojzwAkzxSH3bnUm, Notional: 0.2517906924 - {TokenChain: 1, TokenAddress: "e8aea53120492d4b007a41f4fea777ac914c36dc21f944614e9a96ebe0a18367", Symbol: "SOLPAD", CoingeckoID: "solpad-finance", Decimals: 9}, // Addr: GfJ3Vq2eSTYf1hJP6kKLE9RT6u7jF9gNszJhZwo5VPZp, Notional: 0.0030812965713507 - {TokenChain: 1, TokenAddress: "4099261906e4d99a6926404cb79d4a2de516b4aef140e4bf48d35b4ba22654e4", Symbol: "ACS", CoingeckoID: "access-protocol", Decimals: 6}, // Addr: 5MAYDfq5yxtudAhtfyuMBuHZjgAbaS9tbEyEQYAhDS5y, Notional: 121.20324457313691 - {TokenChain: 1, TokenAddress: "82444ff8283660793c0370a7dd9fb35cb1f7338d57eb088765d0dad090541e72", Symbol: "", CoingeckoID: "mimatic", Decimals: 9}, // Addr: 9mWRABuz2x6koTPCWiCPM49WUbcrNqGTHBV9T9k7y1o7, Notional: 19.873711789762282 + {TokenChain: 1, TokenAddress: "4757899fb8bedba28778aacd67e568e73470cce90bcd532b6cb618297628824e", Symbol: "", CoingeckoID: "socean-staked-sol", Decimals: 9}, // Addr: 5oVNBeEEQvYi1cX3ir8Dx5n1P7pdxydbGF2X4TxVusJm, Notional: 34.4157394506 + {TokenChain: 1, TokenAddress: "9266050ea34cd64a96e9e7be1e210ed22b2e3f5fde61861af7527c681ef2f3d3", Symbol: "renDOGE", CoingeckoID: "rendoge", Decimals: 8}, // Addr: ArUkYE2XDKzqy77PRRGjo4wREWwqk6RXTfM9NeqzPvjU, Notional: 788.775730218 + {TokenChain: 1, TokenAddress: "a790b593d8c348fba977d377f67f86214cb50662ae0e1410776d5b92611aec13", Symbol: "SOLX", CoingeckoID: "soldex", Decimals: 9}, // Addr: CH74tuRLTYcxG7qNJCsV9rghfLXJCQJbsu7i52a8F1Gn, Notional: 0.00312822091284 + {TokenChain: 1, TokenAddress: "518ecf30942036e11b4eb4f2f5a05d32661f9ada0a6a4402c5df098ea6c4fbce", Symbol: "wHAPI", CoingeckoID: "hapi", Decimals: 9}, // Addr: 6VNKqgz9hk7zRShTFdg5AnkfKwZUcojzwAkzxSH3bnUm, Notional: 0.2283263268 + {TokenChain: 1, TokenAddress: "e8aea53120492d4b007a41f4fea777ac914c36dc21f944614e9a96ebe0a18367", Symbol: "SOLPAD", CoingeckoID: "solpad-finance", Decimals: 9}, // Addr: GfJ3Vq2eSTYf1hJP6kKLE9RT6u7jF9gNszJhZwo5VPZp, Notional: 0.0020029127054808004 + {TokenChain: 1, TokenAddress: "4099261906e4d99a6926404cb79d4a2de516b4aef140e4bf48d35b4ba22654e4", Symbol: "ACS", CoingeckoID: "access-protocol", Decimals: 6}, // Addr: 5MAYDfq5yxtudAhtfyuMBuHZjgAbaS9tbEyEQYAhDS5y, Notional: 127.20958475036296 + {TokenChain: 1, TokenAddress: "82444ff8283660793c0370a7dd9fb35cb1f7338d57eb088765d0dad090541e72", Symbol: "", CoingeckoID: "mimatic", Decimals: 9}, // Addr: 9mWRABuz2x6koTPCWiCPM49WUbcrNqGTHBV9T9k7y1o7, Notional: 15.655298373201441 {TokenChain: 1, TokenAddress: "fe41912ceb0b2cb23badaac80e3b41d42cbe0e0c999ccdec5cf0d70bc3e2ccd1", Symbol: "", CoingeckoID: "mongoosecoin", Decimals: 9}, // Addr: J7WYVzFNynk9D28eBCccw2EYkygygiLDCVCabV7CupWL, Notional: 0.0000068550000000000004 - {TokenChain: 1, TokenAddress: "131fec1ab25c75e93eceea35ea3d3d82e6a3fd3d1e1f45a68ee0c14245aebaf6", Symbol: "SAO", CoingeckoID: "sator", Decimals: 9}, // Addr: 2HeykdKjzHKGm2LKHw8pDYwjKPiFEoXAz74dirhUgQvq, Notional: 53899.55906257977 - {TokenChain: 1, TokenAddress: "c9a11f01cc857e5febddff9fd9e04cc82f44ec58ec6f19e23f5e7cca07ffb041", Symbol: "PAI", CoingeckoID: "parrot-usd", Decimals: 6}, // Addr: Ea5SjE2Y6yvCeW5dYTn7PYMuW5ikXkvbGdcmSnXeaLjS, Notional: 39.8932 - {TokenChain: 1, TokenAddress: "c6fa7af3bedbad3a3d65f36aabc97431b1bbe4c2d2f6e0e47ca60203452f5d61", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v, Notional: 5707846.575265835 - {TokenChain: 1, TokenAddress: "068677427842ef204cf58abdf76271228b5a485abb6dfa465e6ed7ee8b7d5e79", Symbol: "SUNNY", CoingeckoID: "sunny-aggregator", Decimals: 6}, // Addr: SUNNYWgPQmFxe9wTZzNK7iPnJ3vYDrkgnxJRJm1s3ag, Notional: 0.07691878272661 - {TokenChain: 1, TokenAddress: "068d824d56f0eebb7566e6ee1d65a9d260ff509a4b5c69b6269ad64de3cd50bc", Symbol: "SBR", CoingeckoID: "saber", Decimals: 6}, // Addr: Saber2gLauYim4Mvftnrasomsv6NvAuncvMEZwcLpD1, Notional: 1.0334570648976 - {TokenChain: 1, TokenAddress: "0707305232e6160c18b4099da5b66bd387bc6469ad2244f283f73ff2a8e40338", Symbol: "", CoingeckoID: "usdh", Decimals: 6}, // Addr: USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX, Notional: 9.907882211374 - {TokenChain: 1, TokenAddress: "2688c77a2a9c9ad17318699dcb85b3d9a23762c6e7156bc7f83b3052953293f2", Symbol: "LIKE", CoingeckoID: "only1", Decimals: 9}, // Addr: 3bRTivrVsitbmCTGtqwp7hxXPsybkjn4XLNtPsHqa3zR, Notional: 0.0134799666 + {TokenChain: 1, TokenAddress: "131fec1ab25c75e93eceea35ea3d3d82e6a3fd3d1e1f45a68ee0c14245aebaf6", Symbol: "SAO", CoingeckoID: "sator", Decimals: 9}, // Addr: 2HeykdKjzHKGm2LKHw8pDYwjKPiFEoXAz74dirhUgQvq, Notional: 43492.591872050405 + {TokenChain: 1, TokenAddress: "c9a11f01cc857e5febddff9fd9e04cc82f44ec58ec6f19e23f5e7cca07ffb041", Symbol: "PAI", CoingeckoID: "parrot-usd", Decimals: 6}, // Addr: Ea5SjE2Y6yvCeW5dYTn7PYMuW5ikXkvbGdcmSnXeaLjS, Notional: 39.92472 + {TokenChain: 1, TokenAddress: "c6fa7af3bedbad3a3d65f36aabc97431b1bbe4c2d2f6e0e47ca60203452f5d61", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v, Notional: 5798747.578516892 + {TokenChain: 1, TokenAddress: "068677427842ef204cf58abdf76271228b5a485abb6dfa465e6ed7ee8b7d5e79", Symbol: "SUNNY", CoingeckoID: "sunny-aggregator", Decimals: 6}, // Addr: SUNNYWgPQmFxe9wTZzNK7iPnJ3vYDrkgnxJRJm1s3ag, Notional: 0.10330932742778999 + {TokenChain: 1, TokenAddress: "068d824d56f0eebb7566e6ee1d65a9d260ff509a4b5c69b6269ad64de3cd50bc", Symbol: "SBR", CoingeckoID: "saber", Decimals: 6}, // Addr: Saber2gLauYim4Mvftnrasomsv6NvAuncvMEZwcLpD1, Notional: 3.6609998562213 + {TokenChain: 1, TokenAddress: "0707305232e6160c18b4099da5b66bd387bc6469ad2244f283f73ff2a8e40338", Symbol: "", CoingeckoID: "usdh", Decimals: 6}, // Addr: USDH1SM1ojwWUga67PGrgFWUHibbjqMvuMaDkRJTgkX, Notional: 9.942077893299999 + {TokenChain: 1, TokenAddress: "2688c77a2a9c9ad17318699dcb85b3d9a23762c6e7156bc7f83b3052953293f2", Symbol: "LIKE", CoingeckoID: "only1", Decimals: 9}, // Addr: 3bRTivrVsitbmCTGtqwp7hxXPsybkjn4XLNtPsHqa3zR, Notional: 0.0269075589 {TokenChain: 1, TokenAddress: "2903e3b75ce4a7a17e88a51089e5ab74c0337016511bd471870e26012321a296", Symbol: "", CoingeckoID: "wagmi-on-solana", Decimals: 6}, // Addr: 3m7A2A8HHdqmiDrjAfaddj7Hxd88FrBHA1KSoqjoELtu, Notional: 0.0000287597 - {TokenChain: 1, TokenAddress: "06e44836998a9e52bde7b5182fdbbdde4e2789cbffe5ab0e9762cb13651c8bda", Symbol: "TULIP", CoingeckoID: "solfarm", Decimals: 6}, // Addr: TuLipcqtGVXP9XR62wM8WWCm6a9vhLs7T1uoWBk6FDs, Notional: 0.00234 - {TokenChain: 1, TokenAddress: "b953b5f8dd5457a2a0f0d41903409785b9d84d4045614faa4f505ee132dcd769", Symbol: "DUST", CoingeckoID: "dust-protocol", Decimals: 9}, // Addr: DUSTawucrTsGU8hcqRdHDCbuYhCPADMLM2VcCb8VnFnQ, Notional: 13262927.979858844 - {TokenChain: 1, TokenAddress: "0b3338a0ab2cc841d5b014bc6a3cf756291874b319c9517d9bbfa9e4e9661ef9", Symbol: "KIN", CoingeckoID: "kin", Decimals: 5}, // Addr: kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6, Notional: 1.987977785259 - {TokenChain: 1, TokenAddress: "128bcb647d8bad1e7250e3b834bcfa9fd986f4d477d1bbb9054e602b11ebe061", Symbol: "ETH", CoingeckoID: "wrapped-ethereum-sollet", Decimals: 6}, // Addr: 2FPyTwcZLUg1MDrwsyoP4D6s1tM7hAkHYRjkNb5w6Pxk, Notional: 1.9065 - {TokenChain: 1, TokenAddress: "8cbf9fdba8691b67e32eb57a784b1cae2744c6fc03ac61e450dd9331b9bdbb2e", Symbol: "AURY", CoingeckoID: "aurory", Decimals: 9}, // Addr: AURYydfxJib1ZkTir1Jn1J9ECYUtjb6rKQVmtYaixWPP, Notional: 4293.394013554485 - {TokenChain: 1, TokenAddress: "f926de74d018c7be81c476f359aaacba61b762767977d2565c9eb57682011706", Symbol: "PSOL", CoingeckoID: "parasol-finance", Decimals: 7}, // Addr: Hmatmu1ktLbobSvim94mfpZmjL5iiyoM1zidtXJRAdLZ, Notional: 0.0103784 + {TokenChain: 1, TokenAddress: "06e44836998a9e52bde7b5182fdbbdde4e2789cbffe5ab0e9762cb13651c8bda", Symbol: "TULIP", CoingeckoID: "solfarm", Decimals: 6}, // Addr: TuLipcqtGVXP9XR62wM8WWCm6a9vhLs7T1uoWBk6FDs, Notional: 0.0015473680000000001 + {TokenChain: 1, TokenAddress: "b953b5f8dd5457a2a0f0d41903409785b9d84d4045614faa4f505ee132dcd769", Symbol: "DUST", CoingeckoID: "dust-protocol", Decimals: 9}, // Addr: DUSTawucrTsGU8hcqRdHDCbuYhCPADMLM2VcCb8VnFnQ, Notional: 7264485.275997677 + {TokenChain: 1, TokenAddress: "0b3338a0ab2cc841d5b014bc6a3cf756291874b319c9517d9bbfa9e4e9661ef9", Symbol: "KIN", CoingeckoID: "kin", Decimals: 5}, // Addr: kinXdEcpDQeHPEuQnqmUgtYykqKGVFq6CeVX5iAHJq6, Notional: 1.3409353341333001 + {TokenChain: 1, TokenAddress: "128bcb647d8bad1e7250e3b834bcfa9fd986f4d477d1bbb9054e602b11ebe061", Symbol: "ETH", CoingeckoID: "wrapped-ethereum-sollet", Decimals: 6}, // Addr: 2FPyTwcZLUg1MDrwsyoP4D6s1tM7hAkHYRjkNb5w6Pxk, Notional: 1.4304 + {TokenChain: 1, TokenAddress: "8cbf9fdba8691b67e32eb57a784b1cae2744c6fc03ac61e450dd9331b9bdbb2e", Symbol: "AURY", CoingeckoID: "aurory", Decimals: 9}, // Addr: AURYydfxJib1ZkTir1Jn1J9ECYUtjb6rKQVmtYaixWPP, Notional: 2561.4588326190187 + {TokenChain: 1, TokenAddress: "f926de74d018c7be81c476f359aaacba61b762767977d2565c9eb57682011706", Symbol: "PSOL", CoingeckoID: "parasol-finance", Decimals: 7}, // Addr: Hmatmu1ktLbobSvim94mfpZmjL5iiyoM1zidtXJRAdLZ, Notional: 0.00911795 {TokenChain: 1, TokenAddress: "8cc1469b46aa9e904a5106fa3e6dd3937ac55099a1fbb62047fc1c556d88d29b", Symbol: "AUT", CoingeckoID: "avenue-university-token", Decimals: 9}, // Addr: AUT1gfMZw37wMMQqAxk89nfpjZpEEf2XSoBUd8V5ydnS, Notional: 0.06016835 - {TokenChain: 1, TokenAddress: "6752055c20b3e9d8746656ddf73855507f87ab6d87523e4c76a7fa36096a99eb", Symbol: "SAMO", CoingeckoID: "samoyedcoin", Decimals: 9}, // Addr: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU, Notional: 1.4798675466371058 + {TokenChain: 1, TokenAddress: "3b15c6089ac9e1722434f64313f16131fa6dab386951f47f2a6f02f3a9ab602a", Symbol: "CTUS", CoingeckoID: "contractus", Decimals: 9}, // Addr: 4yeK2cCyxNNz28fVqEbkLYNCb1T9qPadsuJWeZ44Evcq, Notional: 453553.8119171308 + {TokenChain: 1, TokenAddress: "6752055c20b3e9d8746656ddf73855507f87ab6d87523e4c76a7fa36096a99eb", Symbol: "SAMO", CoingeckoID: "samoyedcoin", Decimals: 9}, // Addr: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU, Notional: 1.437137181579528 {TokenChain: 1, TokenAddress: "86d786039c432f0d4d65f3d29b9fe4ba5fd0f4057f259bcdc314c115559274fc", Symbol: "", CoingeckoID: "vynk-chain", Decimals: 4}, // Addr: A5NF1e6RnYkVwtg3V3z1qeUz4PZfHCXmQ9RotuJWgi6F, Notional: 0.036396 - {TokenChain: 1, TokenAddress: "aa77c1f5d0d2c07ce7075e31d348ca1c0965bb287be13984dec1c5615bf22665", Symbol: "CUSD", CoingeckoID: "coin98-dollar", Decimals: 6}, // Addr: CUSDvqAQLbt7fRofcmV2EXfPA2t36kzj7FjzdmqDiNQL, Notional: 2.109354235187 - {TokenChain: 1, TokenAddress: "ebd47511adbd4c48202bc2d335138ce08fca42964e99e08126d8cdd78f974985", Symbol: "gSAIL", CoingeckoID: "solanasail-governance-token", Decimals: 9}, // Addr: Gsai2KN28MTGcSZ1gKYFswUpFpS7EM9mvdR9c8f6iVXJ, Notional: 0.00299838 - {TokenChain: 1, TokenAddress: "33b8d6efc25f5766808494c4ec2c62ad1409a96266eab2113b72b3148ebede0f", Symbol: "XSB", CoingeckoID: "solareum-wallet", Decimals: 9}, // Addr: 4UuGQgkD3rSeoXatXRWwRfRd21G87d5LiCfkVzNNv1Tt, Notional: 0.00023685 - {TokenChain: 1, TokenAddress: "f204ae4a202016d4de45496d2b0becaa650f1e9a58c02426f4190166488f4d9c", Symbol: "", CoingeckoID: "pip", Decimals: 9}, // Addr: HHjoYwUp5aU6pnrvN4s2pwEErwXNZKhxKGYjRJMoBjLw, Notional: 23.94173403 + {TokenChain: 1, TokenAddress: "aa77c1f5d0d2c07ce7075e31d348ca1c0965bb287be13984dec1c5615bf22665", Symbol: "CUSD", CoingeckoID: "coin98-dollar", Decimals: 6}, // Addr: CUSDvqAQLbt7fRofcmV2EXfPA2t36kzj7FjzdmqDiNQL, Notional: 2.1308303709999996 + {TokenChain: 1, TokenAddress: "ebd47511adbd4c48202bc2d335138ce08fca42964e99e08126d8cdd78f974985", Symbol: "gSAIL", CoingeckoID: "solanasail-governance-token", Decimals: 9}, // Addr: Gsai2KN28MTGcSZ1gKYFswUpFpS7EM9mvdR9c8f6iVXJ, Notional: 0.01767441 + {TokenChain: 1, TokenAddress: "33b8d6efc25f5766808494c4ec2c62ad1409a96266eab2113b72b3148ebede0f", Symbol: "XSB", CoingeckoID: "solareum-wallet", Decimals: 9}, // Addr: 4UuGQgkD3rSeoXatXRWwRfRd21G87d5LiCfkVzNNv1Tt, Notional: 0.00027355 + {TokenChain: 1, TokenAddress: "f204ae4a202016d4de45496d2b0becaa650f1e9a58c02426f4190166488f4d9c", Symbol: "", CoingeckoID: "pip", Decimals: 9}, // Addr: HHjoYwUp5aU6pnrvN4s2pwEErwXNZKhxKGYjRJMoBjLw, Notional: 18.39213813 {TokenChain: 1, TokenAddress: "28baefb80baafbc803106976f26f343eb62d796b8f96a8c6b81a425b9ac0f388", Symbol: "FLOOF", CoingeckoID: "floof", Decimals: 1}, // Addr: 3jzdrXXKxwkBk82u2eCWASZLCKoZs1LQTg87HBEAmBJw, Notional: 2.05329e-7 - {TokenChain: 1, TokenAddress: "3ffd20f06c83bba88002f87f9d56050a5ef941fbbb0ea0293c829a82f11e3891", Symbol: "APYS", CoingeckoID: "apyswap", Decimals: 9}, // Addr: 5JnZ667P3VcjDinkJFysWh2K2KtViy63FZ3oL5YghEhW, Notional: 0.45423527999999996 - {TokenChain: 1, TokenAddress: "63abd0967076f58ba2edadb41f10719df1354abe118f29a8f30ee6639474b947", Symbol: "", CoingeckoID: "stepn", Decimals: 9}, // Addr: 7i5KKsX2weiTkry7jA4ZwSuXGhs5eJBEjY8vVxR4pfRx, Notional: 384.2778183580469 - {TokenChain: 1, TokenAddress: "052e7f80a14a1e7a5254e9a1c27f7fc48563bfc35f0be177a8d556ae8ba1add6", Symbol: "MEAN", CoingeckoID: "meanfi", Decimals: 6}, // Addr: MEANeD3XDdUmNMsRGjASkSWdC8prLYsoRJ61pPeHctD, Notional: 0.11729102879999999 - {TokenChain: 1, TokenAddress: "bfc5f3a72f20be422f69837df545b8a5c992a9cb3e4687f61030f55ae9e3b235", Symbol: "CRP", CoingeckoID: "cropperfinance", Decimals: 9}, // Addr: DubwWZNWiNGMMeeQHPnMATNj77YZPZSAz2WVR5WjLJqz, Notional: 1.6094828e-9 - {TokenChain: 1, TokenAddress: "d6c679aa7652867ebb3221cd90f5cf1d7f1b20e3bfd713c95de54bbdd6df2172", Symbol: "wBIRD", CoingeckoID: "bird-money", Decimals: 9}, // Addr: FTPnEQ3NfRRZ9tvmpDW6JFrvweBE5sanxnXSpJL1dvbB, Notional: 2.122 - {TokenChain: 1, TokenAddress: "560d05641b74bbada05fdd6b3fd731b5df7cd417fd1d8cf129476a7aaa55b308", Symbol: "", CoingeckoID: "wrapped-busd-allbridge-from-bsc", Decimals: 9}, // Addr: 6nuaX3ogrr2CaoAPjtaKHAoBNWok32BMcRozuf32s2QF, Notional: 258.01489888980547 - {TokenChain: 1, TokenAddress: "db9f5cc7f4249010132350e743d99e2a30f0a264b8b345cf23622f0e4eca9d14", Symbol: "SYP", CoingeckoID: "sypool", Decimals: 9}, // Addr: FnKE9n6aGjQoNWRBZXy4RW6LZVao7qwBonUbiD7edUmZ, Notional: 1794.544510916824 - {TokenChain: 1, TokenAddress: "7589fb28d63e11a5f134a97a6bc85399e6cbe2fddb268d496f91204d5271ff05", Symbol: "GRAPE", CoingeckoID: "grape-2", Decimals: 6}, // Addr: 8upjSpvjcdpuzhfR1zriwg5NXkwDruejqNE9WNbPRtyA, Notional: 0.027509631999999996 - {TokenChain: 1, TokenAddress: "82993f9b768020400dc11af927de6d015f4f4abe63d73272b7e57ae17c7c5c6e", Symbol: "KING", CoingeckoID: "king-2", Decimals: 9}, // Addr: 9noXzpXnkyEcKF3AeXqUHTdR59V5uvrRBUZ9bwfQwxeq, Notional: 12916.573639866727 + {TokenChain: 1, TokenAddress: "3ffd20f06c83bba88002f87f9d56050a5ef941fbbb0ea0293c829a82f11e3891", Symbol: "APYS", CoingeckoID: "apyswap", Decimals: 9}, // Addr: 5JnZ667P3VcjDinkJFysWh2K2KtViy63FZ3oL5YghEhW, Notional: 0.46443624 + {TokenChain: 1, TokenAddress: "63abd0967076f58ba2edadb41f10719df1354abe118f29a8f30ee6639474b947", Symbol: "", CoingeckoID: "stepn", Decimals: 9}, // Addr: 7i5KKsX2weiTkry7jA4ZwSuXGhs5eJBEjY8vVxR4pfRx, Notional: 291.8224199901621 + {TokenChain: 1, TokenAddress: "052e7f80a14a1e7a5254e9a1c27f7fc48563bfc35f0be177a8d556ae8ba1add6", Symbol: "MEAN", CoingeckoID: "meanfi", Decimals: 6}, // Addr: MEANeD3XDdUmNMsRGjASkSWdC8prLYsoRJ61pPeHctD, Notional: 0.0933521292 + {TokenChain: 1, TokenAddress: "bfc5f3a72f20be422f69837df545b8a5c992a9cb3e4687f61030f55ae9e3b235", Symbol: "CRP", CoingeckoID: "cropperfinance", Decimals: 9}, // Addr: DubwWZNWiNGMMeeQHPnMATNj77YZPZSAz2WVR5WjLJqz, Notional: 1.0987162e-9 + {TokenChain: 1, TokenAddress: "d6c679aa7652867ebb3221cd90f5cf1d7f1b20e3bfd713c95de54bbdd6df2172", Symbol: "wBIRD", CoingeckoID: "bird-money", Decimals: 9}, // Addr: FTPnEQ3NfRRZ9tvmpDW6JFrvweBE5sanxnXSpJL1dvbB, Notional: 1.6920000000000002 + {TokenChain: 1, TokenAddress: "560d05641b74bbada05fdd6b3fd731b5df7cd417fd1d8cf129476a7aaa55b308", Symbol: "", CoingeckoID: "wrapped-busd-allbridge-from-bsc", Decimals: 9}, // Addr: 6nuaX3ogrr2CaoAPjtaKHAoBNWok32BMcRozuf32s2QF, Notional: 257.8480828077746 + {TokenChain: 1, TokenAddress: "db9f5cc7f4249010132350e743d99e2a30f0a264b8b345cf23622f0e4eca9d14", Symbol: "SYP", CoingeckoID: "sypool", Decimals: 9}, // Addr: FnKE9n6aGjQoNWRBZXy4RW6LZVao7qwBonUbiD7edUmZ, Notional: 1836.7749326398923 + {TokenChain: 1, TokenAddress: "7589fb28d63e11a5f134a97a6bc85399e6cbe2fddb268d496f91204d5271ff05", Symbol: "GRAPE", CoingeckoID: "grape-2", Decimals: 6}, // Addr: 8upjSpvjcdpuzhfR1zriwg5NXkwDruejqNE9WNbPRtyA, Notional: 0.022828567999999997 + {TokenChain: 1, TokenAddress: "82993f9b768020400dc11af927de6d015f4f4abe63d73272b7e57ae17c7c5c6e", Symbol: "KING", CoingeckoID: "king-2", Decimals: 9}, // Addr: 9noXzpXnkyEcKF3AeXqUHTdR59V5uvrRBUZ9bwfQwxeq, Notional: 5398.841176377059 {TokenChain: 1, TokenAddress: "89efe489cf710a97bb9346ccc2dd81a30d71b982ed3523f6bfefdd8ebd04187c", Symbol: "AHT", CoingeckoID: "avenue-hamilton-token", Decimals: 9}, // Addr: AHT1yynTv45s3P3KrRfQCVMHckdHeMVA3fteEg34xt9y, Notional: 0.17925424999999998 + {TokenChain: 1, TokenAddress: "16360094fd16e58867412ca58e622fe81a71fe47b8a8bf3b612e9d96a403d33b", Symbol: "EUROe", CoingeckoID: "euroe-stablecoin", Decimals: 6}, // Addr: 2VhjJ9WxaGC3EZFwJG9BDUs9KxKCAjQY4vgd1qxgYWVg, Notional: 5.2700000000000005 {TokenChain: 1, TokenAddress: "e67a4e87ce4d1df99623ee52b47b2675bfa1dc3c875eac60533c6e7cc6daee27", Symbol: "", CoingeckoID: "1safu", Decimals: 0}, // Addr: GWgwUUrgai3BFeEJZp7bdsBSYiuDqNmHf9uRusWsf3Yi, Notional: 5.329e-9 - {TokenChain: 1, TokenAddress: "d813ffacd702778f0e56a4224bc22b7c2644dfa713fe929fec09c5fae093a802", Symbol: "MC", CoingeckoID: "tap-fantasy-mc", Decimals: 9}, // Addr: FYUkUybywqUUyrUwiAezbvhTp2DUgx1eg8tQNiKkXqJ9, Notional: 0.0517892749517 - {TokenChain: 1, TokenAddress: "ebc7380b4b2467a56f247d9d83635f45df774bd341fe028ef56b45607bfe256c", Symbol: "DXL", CoingeckoID: "dexlab", Decimals: 6}, // Addr: GsNzxJfFn6zQdJGeYsupJWzUAm57Ba7335mfhWvFiE9Z, Notional: 0.000013237408960000002 - {TokenChain: 1, TokenAddress: "05beb884b642b260d9c2b53cb3d876b8b4de72aea0d787d779bf4266688a3935", Symbol: "", CoingeckoID: "solanaprime", Decimals: 9}, // Addr: PRiME7gDoiG1vGr95a3CRMv9xHY7UGjd4JKvfSkmQu2, Notional: 2.10780046 - {TokenChain: 1, TokenAddress: "689ac099ef657e5d3b7efaf1e36ab8b897e2746232d8a9261b3e49b35c1dead4", Symbol: "xUSD", CoingeckoID: "synthetic-usd", Decimals: 6}, // Addr: 83LGLCm7QKpYZbX8q4W2kYWbtt8NJBwbVwEepzkVnJ9y, Notional: 9.865620114602999 - {TokenChain: 1, TokenAddress: "139fc1fba8ff288c85d542130fc2caf2caf15d4dc9fce4ac81c1de0fdd3e5be1", Symbol: "KURO", CoingeckoID: "kurobi", Decimals: 6}, // Addr: 2Kc38rfQ49DFaKHQaWbijkE7fcymUMLY5guUiUsDmFfn, Notional: 0.8694149345940001 - {TokenChain: 1, TokenAddress: "89a0fd32e8624b657a53062808b8980d227274c3f76d3ddaa49985ddf034004c", Symbol: "FTT", CoingeckoID: "ftx-token", Decimals: 6}, // Addr: AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3, Notional: 25.08746928 - {TokenChain: 1, TokenAddress: "9990517de4aab724b1d8e7fead02d3f25a7ad6912ba339c6b7b637d2f53d7d10", Symbol: "", CoingeckoID: "blocto-token", Decimals: 8}, // Addr: BLT1noyNr3GttckEVrtcfC6oyK6yV1DpPgSyXbncMwef, Notional: 0.21568407 - {TokenChain: 1, TokenAddress: "558bfd9cf2fcdc18de6a9463c3d2a372e961c63264900d3d3cb5d86560c4655b", Symbol: "SAIL", CoingeckoID: "sail", Decimals: 6}, // Addr: 6kwTqmdQkJd8qRr9RjSnUX9XJ24RmJRSrU1rsragP97Y, Notional: 0.05566488 - {TokenChain: 1, TokenAddress: "017009a9390d6d6e7777a27675f05e1692fe09561cf25879203a0d282f8b3408", Symbol: "SHILL", CoingeckoID: "shill-token", Decimals: 6}, // Addr: 6cVgJUqo4nmvQpbgrDZwyfd6RwWw5bfnCamS3M9N1fd, Notional: 28.192572818826 - {TokenChain: 1, TokenAddress: "068310861a98327d0550574d84418aa6e10c3352ddaa7fd7f58152cceeb23887", Symbol: "SRM", CoingeckoID: "serum", Decimals: 6}, // Addr: SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt, Notional: 2162.440346229875 - {TokenChain: 1, TokenAddress: "cf3be585daf0d7aa080054c5ff622f468dbb2f49d086c5ca3230b60529e06103", Symbol: "", CoingeckoID: "wrapped-cusd-allbridge-from-celo", Decimals: 9}, // Addr: EwxNF8g9UfmsJVcZFTpL9Hx5MCkoQFoJi6XNWzKf1j8e, Notional: 1.6943713 - {TokenChain: 1, TokenAddress: "4a05e1f7f53477602c239f1a2b8da4277ccd279ff26128cb361c3791b5a9156c", Symbol: "Fronk", CoingeckoID: "fronk", Decimals: 5}, // Addr: 5yxNbU8DgYJZNi3mPD9rs4XLh9ckXrhPjJ5VCujUWg5H, Notional: 331.1439527273298 - {TokenChain: 1, TokenAddress: "06cf442fd1ea50d2b18629079232396c075d29c1eda912d38fd75049f827e3a3", Symbol: "TAKI", CoingeckoID: "taki", Decimals: 9}, // Addr: Taki7fi3Zicv7Du1xNAWLaf6mRK7ikdn77HeGzgwvo4, Notional: 64900.16078776299 - {TokenChain: 1, TokenAddress: "a5854b583d61bd674064522d1d3017a389990e96a9c244b9c57f0dac1cde4ea8", Symbol: "C98", CoingeckoID: "coin98", Decimals: 6}, // Addr: C98A4nkJXhpVZNAZdHUA95RpTF3T4whtQubL3YobiUX9, Notional: 70.18103499402099 - {TokenChain: 1, TokenAddress: "a832b1347f65932aa5a8b8e3b6f7854a2972157d0375097d599eabac9685a95c", Symbol: "", CoingeckoID: "gari-network", Decimals: 9}, // Addr: CKaKtYvz6dKPyMvYq9Rh3UBrnNqYZAyd7iF4hJtjUvks, Notional: 21175.004233344 - {TokenChain: 1, TokenAddress: "0936990e30118f3e824ab4ad611dbacae303117a46ab833c9c911acb736a7ecf", Symbol: "", CoingeckoID: "solchicks-token", Decimals: 9}, // Addr: cxxShYRVcepDudXhe7U62QHvw8uBJoKFifmzggGKVC2, Notional: 0.00485736 - {TokenChain: 1, TokenAddress: "2109ce397c41f14a97da3d94eb68a2fcbc62fdd568e73b3d8a8c62d18a691b80", Symbol: "", CoingeckoID: "arenum", Decimals: 6}, // Addr: 3Dy8KFyvpUJ8nfRCbvk4HLWjNRRzxiVhTeE9PQF9RARD, Notional: 0.58392007428594 - {TokenChain: 1, TokenAddress: "8274472938310e90c774c25ade5e6fcaa7238aef9e3e67764d45b920d0c3e075", Symbol: "WOOF", CoingeckoID: "woof-token", Decimals: 6}, // Addr: 9nEqaUcb16sQ3Tn1psbkWqyhPdLmfHWjKGymREjsAgTE, Notional: 0.27582033897255 - {TokenChain: 1, TokenAddress: "842f35b8d1f37e6cc0a7eb8d12bf9079f7abf194cdcd466c22f5f1e8baa4dea8", Symbol: "", CoingeckoID: "arb-protocol", Decimals: 6}, // Addr: 9tzZzEHsKnwFL1A3DyFJwj36KnZj3gZ7g4srWp9YTEoh, Notional: 0.34041807 - {TokenChain: 1, TokenAddress: "0b32c16d6e18acb932405c63adbf490ed2e214adf8860590fafcc3c869556b26", Symbol: "", CoingeckoID: "kineko", Decimals: 9}, // Addr: kiNeKo77w1WBEzFFCXrTDRWGRWGP8yHvKC9rX6dqjQh, Notional: 0.0406237141621935 - {TokenChain: 1, TokenAddress: "e2975e097997188b8c83cf5b64f28ff42b1ae579b1b6747857bf722150de7fb0", Symbol: "GOFX", CoingeckoID: "goosefx", Decimals: 9}, // Addr: GFX1ZjR2P15tmrSwow6FjyDYcEkoFb4p4gJCpLBjaxHD, Notional: 0.00245792 + {TokenChain: 1, TokenAddress: "d813ffacd702778f0e56a4224bc22b7c2644dfa713fe929fec09c5fae093a802", Symbol: "MC", CoingeckoID: "tap-fantasy-mc", Decimals: 9}, // Addr: FYUkUybywqUUyrUwiAezbvhTp2DUgx1eg8tQNiKkXqJ9, Notional: 0.060841995476 + {TokenChain: 1, TokenAddress: "ebc7380b4b2467a56f247d9d83635f45df774bd341fe028ef56b45607bfe256c", Symbol: "DXL", CoingeckoID: "dexlab", Decimals: 6}, // Addr: GsNzxJfFn6zQdJGeYsupJWzUAm57Ba7335mfhWvFiE9Z, Notional: 0.00000759374448 + {TokenChain: 1, TokenAddress: "05beb884b642b260d9c2b53cb3d876b8b4de72aea0d787d779bf4266688a3935", Symbol: "", CoingeckoID: "solanaprime", Decimals: 9}, // Addr: PRiME7gDoiG1vGr95a3CRMv9xHY7UGjd4JKvfSkmQu2, Notional: 1.7247588600000001 + {TokenChain: 1, TokenAddress: "689ac099ef657e5d3b7efaf1e36ab8b897e2746232d8a9261b3e49b35c1dead4", Symbol: "xUSD", CoingeckoID: "synthetic-usd", Decimals: 6}, // Addr: 83LGLCm7QKpYZbX8q4W2kYWbtt8NJBwbVwEepzkVnJ9y, Notional: 9.649539155921 + {TokenChain: 1, TokenAddress: "139fc1fba8ff288c85d542130fc2caf2caf15d4dc9fce4ac81c1de0fdd3e5be1", Symbol: "KURO", CoingeckoID: "kurobi", Decimals: 6}, // Addr: 2Kc38rfQ49DFaKHQaWbijkE7fcymUMLY5guUiUsDmFfn, Notional: 0.61833447231168 + {TokenChain: 1, TokenAddress: "0679db01ce2a84f71c139e7c9942f6da3b331fdec3319d02f899eba70134737e", Symbol: "SHDW", CoingeckoID: "genesysgo-shadow", Decimals: 9}, // Addr: SHDWyBxihqiCj6YekG2GUr7wqKLeLAMK1gHZck9pL6y, Notional: 0.073235 + {TokenChain: 1, TokenAddress: "89a0fd32e8624b657a53062808b8980d227274c3f76d3ddaa49985ddf034004c", Symbol: "FTT", CoingeckoID: "ftx-token", Decimals: 6}, // Addr: AGFEad2et2ZJif9jaGpdMixQqvW5i81aBdvKe7PHNfz3, Notional: 19.695535584 + {TokenChain: 1, TokenAddress: "9990517de4aab724b1d8e7fead02d3f25a7ad6912ba339c6b7b637d2f53d7d10", Symbol: "", CoingeckoID: "blocto-token", Decimals: 8}, // Addr: BLT1noyNr3GttckEVrtcfC6oyK6yV1DpPgSyXbncMwef, Notional: 0.13230378 + {TokenChain: 1, TokenAddress: "558bfd9cf2fcdc18de6a9463c3d2a372e961c63264900d3d3cb5d86560c4655b", Symbol: "SAIL", CoingeckoID: "sail", Decimals: 6}, // Addr: 6kwTqmdQkJd8qRr9RjSnUX9XJ24RmJRSrU1rsragP97Y, Notional: 0.03970584 + {TokenChain: 1, TokenAddress: "017009a9390d6d6e7777a27675f05e1692fe09561cf25879203a0d282f8b3408", Symbol: "SHILL", CoingeckoID: "shill-token", Decimals: 6}, // Addr: 6cVgJUqo4nmvQpbgrDZwyfd6RwWw5bfnCamS3M9N1fd, Notional: 18.670376194776 + {TokenChain: 1, TokenAddress: "068310861a98327d0550574d84418aa6e10c3352ddaa7fd7f58152cceeb23887", Symbol: "SRM", CoingeckoID: "serum", Decimals: 6}, // Addr: SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt, Notional: 823.6615722659488 + {TokenChain: 1, TokenAddress: "cf3be585daf0d7aa080054c5ff622f468dbb2f49d086c5ca3230b60529e06103", Symbol: "", CoingeckoID: "wrapped-cusd-allbridge-from-celo", Decimals: 9}, // Addr: EwxNF8g9UfmsJVcZFTpL9Hx5MCkoQFoJi6XNWzKf1j8e, Notional: 1.6958587999999999 + {TokenChain: 1, TokenAddress: "4a05e1f7f53477602c239f1a2b8da4277ccd279ff26128cb361c3791b5a9156c", Symbol: "Fronk", CoingeckoID: "fronk", Decimals: 5}, // Addr: 5yxNbU8DgYJZNi3mPD9rs4XLh9ckXrhPjJ5VCujUWg5H, Notional: 106.29144666122238 + {TokenChain: 1, TokenAddress: "06cf442fd1ea50d2b18629079232396c075d29c1eda912d38fd75049f827e3a3", Symbol: "TAKI", CoingeckoID: "taki", Decimals: 9}, // Addr: Taki7fi3Zicv7Du1xNAWLaf6mRK7ikdn77HeGzgwvo4, Notional: 62819.55974836206 + {TokenChain: 1, TokenAddress: "a5854b583d61bd674064522d1d3017a389990e96a9c244b9c57f0dac1cde4ea8", Symbol: "C98", CoingeckoID: "coin98", Decimals: 6}, // Addr: C98A4nkJXhpVZNAZdHUA95RpTF3T4whtQubL3YobiUX9, Notional: 78.36794198493199 + {TokenChain: 1, TokenAddress: "a832b1347f65932aa5a8b8e3b6f7854a2972157d0375097d599eabac9685a95c", Symbol: "", CoingeckoID: "gari-network", Decimals: 9}, // Addr: CKaKtYvz6dKPyMvYq9Rh3UBrnNqYZAyd7iF4hJtjUvks, Notional: 30018.332676903996 + {TokenChain: 1, TokenAddress: "0936990e30118f3e824ab4ad611dbacae303117a46ab833c9c911acb736a7ecf", Symbol: "", CoingeckoID: "solchicks-token", Decimals: 9}, // Addr: cxxShYRVcepDudXhe7U62QHvw8uBJoKFifmzggGKVC2, Notional: 0.00489066 + {TokenChain: 1, TokenAddress: "2109ce397c41f14a97da3d94eb68a2fcbc62fdd568e73b3d8a8c62d18a691b80", Symbol: "", CoingeckoID: "arenum", Decimals: 6}, // Addr: 3Dy8KFyvpUJ8nfRCbvk4HLWjNRRzxiVhTeE9PQF9RARD, Notional: 0.007348613671980001 + {TokenChain: 1, TokenAddress: "8274472938310e90c774c25ade5e6fcaa7238aef9e3e67764d45b920d0c3e075", Symbol: "WOOF", CoingeckoID: "woof-token", Decimals: 6}, // Addr: 9nEqaUcb16sQ3Tn1psbkWqyhPdLmfHWjKGymREjsAgTE, Notional: 0.15080233058164 + {TokenChain: 1, TokenAddress: "842f35b8d1f37e6cc0a7eb8d12bf9079f7abf194cdcd466c22f5f1e8baa4dea8", Symbol: "", CoingeckoID: "arb-protocol", Decimals: 6}, // Addr: 9tzZzEHsKnwFL1A3DyFJwj36KnZj3gZ7g4srWp9YTEoh, Notional: 0.15560545 + {TokenChain: 1, TokenAddress: "0b32c16d6e18acb932405c63adbf490ed2e214adf8860590fafcc3c869556b26", Symbol: "", CoingeckoID: "kineko", Decimals: 9}, // Addr: kiNeKo77w1WBEzFFCXrTDRWGRWGP8yHvKC9rX6dqjQh, Notional: 0.0387386153579178 + {TokenChain: 1, TokenAddress: "e2975e097997188b8c83cf5b64f28ff42b1ae579b1b6747857bf722150de7fb0", Symbol: "GOFX", CoingeckoID: "goosefx", Decimals: 9}, // Addr: GFX1ZjR2P15tmrSwow6FjyDYcEkoFb4p4gJCpLBjaxHD, Notional: 0.00416128 {TokenChain: 1, TokenAddress: "0c96450628904429a41300a3eeb390680414f8c0a2e1a2442610df748aca371e", Symbol: "DAOJONES", CoingeckoID: "fractionalized-smb-2367", Decimals: 2}, // Addr: r8nuuzXCchjtqsmQZVZDPXXq928tuk7KVH479GsKVpy, Notional: 0.17373 - {TokenChain: 1, TokenAddress: "ca4d39964c9cb5f9790d0a12969f60fd9724936284ea4a12daded42ddfa69c5d", Symbol: "FIDA", CoingeckoID: "bonfida", Decimals: 6}, // Addr: EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp, Notional: 6.589479040613999 - {TokenChain: 1, TokenAddress: "897658557d211722ba678ad99276eb14d9567f0a792e3ba70c894785c742bfae", Symbol: "", CoingeckoID: "green-satoshi-token", Decimals: 9}, // Addr: AFbX8oGjGpmVFywbVouvhQSRmiW2aR1mohfahi4Y2AdB, Notional: 39.23825377552305 - {TokenChain: 1, TokenAddress: "0c00d0afeb8614da7f19aba02d40f18c692585f65020dfced3d5e5f9a9c0c4e1", Symbol: "ORCA", CoingeckoID: "orca", Decimals: 6}, // Addr: orcaEKTdK7LKz57vaAYr9QeNsVEPfiu6QeMU1kektZE, Notional: 17.72412945476 + {TokenChain: 1, TokenAddress: "ca4d39964c9cb5f9790d0a12969f60fd9724936284ea4a12daded42ddfa69c5d", Symbol: "FIDA", CoingeckoID: "bonfida", Decimals: 6}, // Addr: EchesyfXePKdLtoiZSL8pBe8Myagyy8ZRqsACNCFGnvp, Notional: 4.968963954035 + {TokenChain: 1, TokenAddress: "897658557d211722ba678ad99276eb14d9567f0a792e3ba70c894785c742bfae", Symbol: "", CoingeckoID: "green-satoshi-token", Decimals: 9}, // Addr: AFbX8oGjGpmVFywbVouvhQSRmiW2aR1mohfahi4Y2AdB, Notional: 25.72731265634229 + {TokenChain: 1, TokenAddress: "0a732093918561f7dd7fcbec4abd8513deca1a967f7ad7a39d63b41ed893808b", Symbol: "HNT", CoingeckoID: "helium", Decimals: 8}, // Addr: hntyVP6YFm1Hg25TN9WGLqM12b8TQmcknKrdu1oxWux, Notional: 2.96e-8 + {TokenChain: 1, TokenAddress: "0c00d0afeb8614da7f19aba02d40f18c692585f65020dfced3d5e5f9a9c0c4e1", Symbol: "ORCA", CoingeckoID: "orca", Decimals: 6}, // Addr: orcaEKTdK7LKz57vaAYr9QeNsVEPfiu6QeMU1kektZE, Notional: 20.4397137373 {TokenChain: 1, TokenAddress: "a2b04fe6f429ea28555be7b6dbba72479b6694ea96e93082996e9be877bc920a", Symbol: "TOX", CoingeckoID: "trollbox", Decimals: 9}, // Addr: Bx4ykEMurwPQBAFNvthGj73fMBVTvHa8e9cbAyaK4ZSh, Notional: 0.00007 - {TokenChain: 1, TokenAddress: "edcc10dafe9e4643d0397fb1ffa280b7a3c28090ebfe4816c3e0f39b9d7ca411", Symbol: "SBONK", CoingeckoID: "shibonk-311f81df-a4ea-4f31-9e61-df0af8211bd7", Decimals: 9}, // Addr: H1G6sZ1WDoMmMCFqBKAbg9gkQPCo1sKQtaJWz9dHmqZr, Notional: 1.2034930042523702 - {TokenChain: 1, TokenAddress: "0ec49e1c77e79828f9ae8a051b662e2088c728069cedb70fef8521b94acf74f8", Symbol: "", CoingeckoID: "zebec-protocol", Decimals: 9}, // Addr: zebeczgi5fSEtbpfQKVZKCJ3WgYXxjkMUkNNx7fLKAF, Notional: 11547.684728774102 - {TokenChain: 1, TokenAddress: "63ef9d2e6be295552062ac55bdd693bea2bb7f6e6221edc9d308d843d293650b", Symbol: "SOLR", CoingeckoID: "solrazr", Decimals: 6}, // Addr: 7j7H7sgsnNDeCngAPjpaCN4aaaru4HS7NAFYSEUyzJ3k, Notional: 0.01252813 - {TokenChain: 1, TokenAddress: "37998ccbf2d0458b615cbcc6b1a367c4749e9fef7306622e1b1b58910120bc9a", Symbol: "RAY", CoingeckoID: "raydium", Decimals: 6}, // Addr: 4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R, Notional: 7173.601601085908 - {TokenChain: 1, TokenAddress: "0545d1ee9805764e58b3ef5bcb54177517dfe7980e6e44e67a628bdb9d2a7bd1", Symbol: "MNGO", CoingeckoID: "mango-markets", Decimals: 6}, // Addr: MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac, Notional: 0.00873529 - {TokenChain: 1, TokenAddress: "17e700a49c421ef60ab1bb731357d11093c809d0056852d3e9e1e6c2653c81e9", Symbol: "", CoingeckoID: "plutonian-dao", Decimals: 6}, // Addr: 2cJgFtnqjaoiu9fKVX3fny4Z4pRzuaqfJ3PBTMk2D9ur, Notional: 0.875507 - {TokenChain: 1, TokenAddress: "33660fff0fbce64c4da91c3b3e6e77e58d059df2e05e6c53608de170455ba938", Symbol: "SCT", CoingeckoID: "solclout", Decimals: 9}, // Addr: 4Te4KJgjtnZe4aE2zne8G4NPfrPjCwDmaiEx9rKnyDVZ, Notional: 43830.993048834 - {TokenChain: 1, TokenAddress: "0cea8ee4d02b332af25488b03f6b02b11cd5ca4b7f051ee72575c50b55addd40", Symbol: "sRLY", CoingeckoID: "rally-solana", Decimals: 9}, // Addr: sRLY3migNrkC1HLgqotpvi66qGkdNedqPZ9TJpAQhyh, Notional: 90.19158987109336 - {TokenChain: 1, TokenAddress: "05be68ae2977ce39f15086f2c761b24cf054a40b22a2a5b33ef583c50f1cfdb7", Symbol: "", CoingeckoID: "prism", Decimals: 6}, // Addr: PRSMNsEPqhGVCH1TtWiJqPjJyh2cKrLostPZTNy1o5x, Notional: 9.568155801168981 - {TokenChain: 1, TokenAddress: "c7dc3552acd085ffa989b81b21e5e0bcbccbb1ec87835f0db12fabbad666ddf6", Symbol: "MEDIA", CoingeckoID: "media-network", Decimals: 6}, // Addr: ETAtLmCmsoiEEKfNrHKJ2kYy3MoABhU6NQvpSfij5tDs, Notional: 15.047372800000002 - {TokenChain: 1, TokenAddress: "9ed00a9e2b184c6c0b6d9629c2648efe56c512456e354538bb4efad332ea5f30", Symbol: "", CoingeckoID: "deapcoin", Decimals: 6}, // Addr: BgwQjVNMWvt2d8CN51CsbniwRWyZ9H9HfHkEsvikeVuZ, Notional: 3.5492399999999997 + {TokenChain: 1, TokenAddress: "edcc10dafe9e4643d0397fb1ffa280b7a3c28090ebfe4816c3e0f39b9d7ca411", Symbol: "SBONK", CoingeckoID: "shibonk-311f81df-a4ea-4f31-9e61-df0af8211bd7", Decimals: 9}, // Addr: H1G6sZ1WDoMmMCFqBKAbg9gkQPCo1sKQtaJWz9dHmqZr, Notional: 1.1756277826732502 + {TokenChain: 1, TokenAddress: "0ec49e1c77e79828f9ae8a051b662e2088c728069cedb70fef8521b94acf74f8", Symbol: "", CoingeckoID: "zebec-protocol", Decimals: 9}, // Addr: zebeczgi5fSEtbpfQKVZKCJ3WgYXxjkMUkNNx7fLKAF, Notional: 2099.413964518063 + {TokenChain: 1, TokenAddress: "63ef9d2e6be295552062ac55bdd693bea2bb7f6e6221edc9d308d843d293650b", Symbol: "SOLR", CoingeckoID: "solrazr", Decimals: 6}, // Addr: 7j7H7sgsnNDeCngAPjpaCN4aaaru4HS7NAFYSEUyzJ3k, Notional: 0.01203639 + {TokenChain: 1, TokenAddress: "37998ccbf2d0458b615cbcc6b1a367c4749e9fef7306622e1b1b58910120bc9a", Symbol: "RAY", CoingeckoID: "raydium", Decimals: 6}, // Addr: 4k3Dyjzvzp8eMZWUXbBCjEvwSkkk59S5iCNLY3QrkX6R, Notional: 6199.774054038089 + {TokenChain: 1, TokenAddress: "0545d1ee9805764e58b3ef5bcb54177517dfe7980e6e44e67a628bdb9d2a7bd1", Symbol: "MNGO", CoingeckoID: "mango-markets", Decimals: 6}, // Addr: MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac, Notional: 0.00799851 + {TokenChain: 1, TokenAddress: "17e700a49c421ef60ab1bb731357d11093c809d0056852d3e9e1e6c2653c81e9", Symbol: "", CoingeckoID: "plutonian-dao", Decimals: 6}, // Addr: 2cJgFtnqjaoiu9fKVX3fny4Z4pRzuaqfJ3PBTMk2D9ur, Notional: 0.367108 + {TokenChain: 1, TokenAddress: "33660fff0fbce64c4da91c3b3e6e77e58d059df2e05e6c53608de170455ba938", Symbol: "SCT", CoingeckoID: "solclout", Decimals: 9}, // Addr: 4Te4KJgjtnZe4aE2zne8G4NPfrPjCwDmaiEx9rKnyDVZ, Notional: 36371.95620525874 + {TokenChain: 1, TokenAddress: "0cea8ee4d02b332af25488b03f6b02b11cd5ca4b7f051ee72575c50b55addd40", Symbol: "sRLY", CoingeckoID: "rally-solana", Decimals: 9}, // Addr: sRLY3migNrkC1HLgqotpvi66qGkdNedqPZ9TJpAQhyh, Notional: 81.60829877407079 + {TokenChain: 1, TokenAddress: "05be68ae2977ce39f15086f2c761b24cf054a40b22a2a5b33ef583c50f1cfdb7", Symbol: "", CoingeckoID: "prism", Decimals: 6}, // Addr: PRSMNsEPqhGVCH1TtWiJqPjJyh2cKrLostPZTNy1o5x, Notional: 10.458240945065521 + {TokenChain: 1, TokenAddress: "c7dc3552acd085ffa989b81b21e5e0bcbccbb1ec87835f0db12fabbad666ddf6", Symbol: "MEDIA", CoingeckoID: "media-network", Decimals: 6}, // Addr: ETAtLmCmsoiEEKfNrHKJ2kYy3MoABhU6NQvpSfij5tDs, Notional: 12.593996800000001 + {TokenChain: 1, TokenAddress: "9ed00a9e2b184c6c0b6d9629c2648efe56c512456e354538bb4efad332ea5f30", Symbol: "", CoingeckoID: "deapcoin", Decimals: 6}, // Addr: BgwQjVNMWvt2d8CN51CsbniwRWyZ9H9HfHkEsvikeVuZ, Notional: 2.11698 {TokenChain: 1, TokenAddress: "faf2d6df73cb4778b625966d4fba883fd424a80497d5e31c934352ade1d1bdc9", Symbol: "", CoingeckoID: "dead-knight", Decimals: 9}, // Addr: HtbhBYdcfXbbD2JiH6jtsTt2m2FXjn7h4k6iXfz98k5W, Notional: 0.0087984375 - {TokenChain: 1, TokenAddress: "c2667f39a3a7b6febb2f995eb4d1b739f45fe2edd645403c3e52e677e6bd6852", Symbol: "WOO", CoingeckoID: "woo-network", Decimals: 6}, // Addr: E5rk3nmgLUuKUiS94gg4bpWwWwyjCMtddsAXkTFLtHEy, Notional: 397.85207091819 - {TokenChain: 1, TokenAddress: "067d3988ce882945c63a0717a92538addd9a37550ce5cd711f76ca74a4c89786", Symbol: "", CoingeckoID: "solcial", Decimals: 9}, // Addr: SLCLww7nc1PD2gQPQdGayHviVVcpMthnqUz2iWKhNQV, Notional: 0.0068336815382025 - {TokenChain: 1, TokenAddress: "883977f594221f16fd8037db6cd49393cb7ccb597ef5513fee423975372ff5b3", Symbol: "", CoingeckoID: "racefi", Decimals: 6}, // Addr: AAmGoPDFLG6bE82BgZWjVi8k95tj9Tf3vUN7WvtUm2BU, Notional: 1740.37763997308 - {TokenChain: 1, TokenAddress: "48972c3e59cc0c7a094c2948f847381cfef470e1ddf0711f0c858070711876f3", Symbol: "WAG", CoingeckoID: "waggle-network", Decimals: 9}, // Addr: 5tN42n9vMi6ubp67Uy4NnmM5DMZYN8aS8GeB3bEDHr6E, Notional: 0.014930351999999997 + {TokenChain: 1, TokenAddress: "c2667f39a3a7b6febb2f995eb4d1b739f45fe2edd645403c3e52e677e6bd6852", Symbol: "WOO", CoingeckoID: "woo-network", Decimals: 6}, // Addr: E5rk3nmgLUuKUiS94gg4bpWwWwyjCMtddsAXkTFLtHEy, Notional: 371.00998287339 + {TokenChain: 1, TokenAddress: "067d3988ce882945c63a0717a92538addd9a37550ce5cd711f76ca74a4c89786", Symbol: "", CoingeckoID: "solcial", Decimals: 9}, // Addr: SLCLww7nc1PD2gQPQdGayHviVVcpMthnqUz2iWKhNQV, Notional: 0.0118364087517525 + {TokenChain: 1, TokenAddress: "883977f594221f16fd8037db6cd49393cb7ccb597ef5513fee423975372ff5b3", Symbol: "", CoingeckoID: "racefi", Decimals: 6}, // Addr: AAmGoPDFLG6bE82BgZWjVi8k95tj9Tf3vUN7WvtUm2BU, Notional: 314.65024804897996 + {TokenChain: 1, TokenAddress: "48972c3e59cc0c7a094c2948f847381cfef470e1ddf0711f0c858070711876f3", Symbol: "WAG", CoingeckoID: "waggle-network", Decimals: 9}, // Addr: 5tN42n9vMi6ubp67Uy4NnmM5DMZYN8aS8GeB3bEDHr6E, Notional: 0.002165613 {TokenChain: 1, TokenAddress: "d9299d4dd5f2e8021a5f9d220ee6499ed7ce916b4455042a172fd08cee33065e", Symbol: "TGT", CoingeckoID: "twirl-governance-token", Decimals: 6}, // Addr: FciGvHj9FjgSGgCBF1b9HY814FM9D28NijDd5SJrKvPo, Notional: 0.010546851 - {TokenChain: 1, TokenAddress: "ce010e60afedb22717bd63192f54145a3f965a33bb82d2c7029eb2ce1e208264", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB, Notional: 1332039.0710718206 - {TokenChain: 1, TokenAddress: "e66b5c6e86ec048a73a370e0588e1dcbaa16f532b8e5790eb830386b3ae947fc", Symbol: "", CoingeckoID: "galaxy-war", Decimals: 6}, // Addr: GWTipxSJVPmmW2wCjBdkbnEJbCRCyrhL2x9zuHRPPTj1, Notional: 2.40816484985286 - {TokenChain: 1, TokenAddress: "6dbb85629db6a38eeb2fec793974b4c7e9c5fdc9e70165303b4f73106e5e62ba", Symbol: "", CoingeckoID: "rope-token", Decimals: 9}, // Addr: 8PMHT4swUMtBzgHnh5U564N5sjPSiUz2cjEQzFnnP1Fo, Notional: 0.00780288 - {TokenChain: 1, TokenAddress: "90eb19122682b9b340f9afd6717bcc7770812215c2286d3d3051dff49288b17e", Symbol: "BOT", CoingeckoID: "starbots", Decimals: 8}, // Addr: AkhdZGVbJXPuQZ53u2LrimCjkRP6ZyxG1SoM85T98eE1, Notional: 703.0746784379194 - {TokenChain: 1, TokenAddress: "4262f09434e938b2714803d3aa425d1d543a735ba324109087760d83deae653d", Symbol: "SPWN", CoingeckoID: "bitspawn", Decimals: 9}, // Addr: 5U9QqCPhqXAJcEv9uyzFJd5zhN93vuPk1aNNkXnUfPnt, Notional: 0.008932 - {TokenChain: 1, TokenAddress: "b7db4e83eb727f1187bd7a50303f5b4e4e943503da8571ad6564a51131504792", Symbol: "", CoingeckoID: "wrapped-usdt-allbridge-from-polygon", Decimals: 6}, // Addr: DNhZkUaxHXYvpxZ7LNnHtss8sQgdAfd1ZYS1fB7LKWUZ, Notional: 42.192769846608996 - {TokenChain: 1, TokenAddress: "3a0147829f94ff731beb78f4bf79f8247eb6db6ff78cbdbd778004547c3cfb15", Symbol: "", CoingeckoID: "playground-waves-floor-index", Decimals: 2}, // Addr: 4uRn7vxRPWYP4HuAa4UNXwEPLRL8oQ71YByMhr6yBnL4, Notional: 20.65875856 - {TokenChain: 1, TokenAddress: "05718b04572312d73aa71deaec43c89d77844b0b7ff9e3e72da8510182627455", Symbol: "BLOCK", CoingeckoID: "blockasset", Decimals: 6}, // Addr: NFTUkR4u7wKxy9QLaX2TGvd9oZSWoMo4jqSJqdMb7Nk, Notional: 716695.5504912827 - {TokenChain: 1, TokenAddress: "dd40a2f6f423e4c3990a83eac3d9d9c1fe625b36cbc5e4a6d553544552a867ee", Symbol: "BRZ", CoingeckoID: "brz", Decimals: 4}, // Addr: FtgGSFADXBtroxq8VCausXRr2of47QBf5AS1NtZCu4GD, Notional: 40609.2233594824 - {TokenChain: 1, TokenAddress: "06a1ec5bd82ad9c032a9f7d466ba2c728b0ef36a8b773ed219d69650d3472bd6", Symbol: "", CoingeckoID: "step-finance", Decimals: 9}, // Addr: StepAscQoEioFxxWGnh2sLBDFp9d8rvKz2Yp39iDpyT, Notional: 1.0497499926341636 - {TokenChain: 1, TokenAddress: "45a5161476cc9df6ef8583b581a3111b4416ebcea65f4eca5bb961124c3399df", Symbol: "", CoingeckoID: "xhashtag", Decimals: 6}, // Addr: 5gs8nf4wojB5EXgDUWNLwXpknzgV2YWDhveAeBZpVLbp, Notional: 12287.459741142837 - {TokenChain: 1, TokenAddress: "0537996f2699674fb7086e468fb33b4fde1449f47a8befd8b342bf6b33cff372", Symbol: "MNDE", CoingeckoID: "marinade", Decimals: 9}, // Addr: MNDEFzGvMt87ueuHvVU9VcTqsAP5b3fTGPsHuuPA5ey, Notional: 2.64045566454726 - {TokenChain: 1, TokenAddress: "485493b637792cca16fe9d53fc4879c23dbf52cf6d9af4e61fe92df15c17c98d", Symbol: "", CoingeckoID: "bamboo-coin", Decimals: 9}, // Addr: 5sM9xxcBTM9rWza6nEgq2cShA87JjTBx1Cu82LjgmaEg, Notional: 0.2657625 - {TokenChain: 1, TokenAddress: "c261d86cf5cf877128ba1f5652e5f3dda599270c1556a15bc0a9aacf8063e563", Symbol: "RIN", CoingeckoID: "aldrin", Decimals: 9}, // Addr: E5ndSkaB17Dm7CsD22dvcjfrYSDLCxFcMd6z8ddCk5wp, Notional: 0.04272355 - {TokenChain: 1, TokenAddress: "08742da77f532cb2337402e2ab66187b63a2907c9a62107dab7013a28deb4657", Symbol: "ABR", CoingeckoID: "allbridge", Decimals: 9}, // Addr: a11bdAAuV8iB2fu7X6AxAvDTo1QZ8FXB3kk5eecdasp, Notional: 0.66812935951908 - {TokenChain: 1, TokenAddress: "f23cba7173364712aaa6114393f2c187b8d8b5194abaa872ada605fa8820b61f", Symbol: "", CoingeckoID: "atlas-dex", Decimals: 9}, // Addr: HJbNXx2YMRxgfUJ6K4qeWtjatMK5KYQT1QnsCdDWywNv, Notional: 0.12097768848686401 - {TokenChain: 1, TokenAddress: "8c77f3661d6b4a8ef39dbc5340eead8c3cbe0b45099840e8263d8725b587b073", Symbol: "ATLAS", CoingeckoID: "star-atlas", Decimals: 8}, // Addr: ATLASXmbPQxBUYbxPsV97usA3fPQYEqzQBUHgiFCUsXx, Notional: 52169.01012766288 - {TokenChain: 1, TokenAddress: "35fe161e6828028ece9caa2d89bcd7a1fd1bf140ad838d0c17d7b57c9b1aa238", Symbol: "SNY", CoingeckoID: "synthetify-token", Decimals: 6}, // Addr: 4dmKkXNHdgYsXqBHCuMikNQWwVomZURhYvkkX5c4pQ7y, Notional: 2.3868e-8 - {TokenChain: 1, TokenAddress: "87c9ce6b6344187c4b75fa01dd4334d8bb826a9214fefe9d39cce5fad29b6faa", Symbol: "", CoingeckoID: "bilira", Decimals: 6}, // Addr: A94X2fRy3wydNShU4dRaDyap2UuoeWJGWyATtyp61WZf, Notional: 7.5930078 - {TokenChain: 1, TokenAddress: "063ba2f4697205f531b6de49bb9605fd2ca6a9ddf243bed251fda6552ef0e571", Symbol: "", CoingeckoID: "rollbit-coin", Decimals: 2}, // Addr: RLBxxFkseAZ4RgJH3Sqn8jXxhmGoz9jWxDNJMh8pL7a, Notional: 7.751615699999999 - {TokenChain: 1, TokenAddress: "bc07c56e60ad3d3f177382eac6548fba1fd32cfd90ca02b3e7cfa185fdce7398", Symbol: "Bonk", CoingeckoID: "bonk", Decimals: 5}, // Addr: DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263, Notional: 81461.25843972928 - {TokenChain: 1, TokenAddress: "8268e9a9a1444c2ba5c77a51936856b072e43fefcff5e4b01e99623c8ebb7749", Symbol: "BTC", CoingeckoID: "wrapped-bitcoin-sollet", Decimals: 6}, // Addr: 9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E, Notional: 3600.2750737799997 - {TokenChain: 1, TokenAddress: "a9b7b4c191b9fcd8a101e517de4a2bc44ae7df4ff6595f62cb4bf9c5c3b01fd2", Symbol: "CRWNY", CoingeckoID: "crowny-token", Decimals: 6}, // Addr: CRWNYkqdgvhGGae9CKfNka58j6QQkaD5bLhKXvUYqnc1, Notional: 0.0085634 - {TokenChain: 1, TokenAddress: "b5f7e08966fa2f997abc90d7a7cde1bc733f567b9eafc3007e80a3174726b6f6", Symbol: "", CoingeckoID: "defi-land", Decimals: 9}, // Addr: DFL1zNkaGPWm1BqAVqRjCZvHmwTFrEaJtbzJWgseoNJh, Notional: 10.268200657844814 - {TokenChain: 1, TokenAddress: "db532dd1df8e6c87ca70695ddf92f8d86e621d0d86de69c3058de9b29ee22647", Symbol: "", CoingeckoID: "monkeyball", Decimals: 6}, // Addr: Fm9rHUTF5v3hwMLbStjZXqNBBoZyGriQaFM6sTFz3K8A, Notional: 0.2751576327744 + {TokenChain: 1, TokenAddress: "ce010e60afedb22717bd63192f54145a3f965a33bb82d2c7029eb2ce1e208264", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB, Notional: 1342252.660316 + {TokenChain: 1, TokenAddress: "e66b5c6e86ec048a73a370e0588e1dcbaa16f532b8e5790eb830386b3ae947fc", Symbol: "", CoingeckoID: "galaxy-war", Decimals: 6}, // Addr: GWTipxSJVPmmW2wCjBdkbnEJbCRCyrhL2x9zuHRPPTj1, Notional: 6.86887716782673 + {TokenChain: 1, TokenAddress: "6dbb85629db6a38eeb2fec793974b4c7e9c5fdc9e70165303b4f73106e5e62ba", Symbol: "", CoingeckoID: "rope-token", Decimals: 9}, // Addr: 8PMHT4swUMtBzgHnh5U564N5sjPSiUz2cjEQzFnnP1Fo, Notional: 0.00690007 + {TokenChain: 1, TokenAddress: "90eb19122682b9b340f9afd6717bcc7770812215c2286d3d3051dff49288b17e", Symbol: "BOT", CoingeckoID: "starbots", Decimals: 8}, // Addr: AkhdZGVbJXPuQZ53u2LrimCjkRP6ZyxG1SoM85T98eE1, Notional: 405.50521078474765 + {TokenChain: 1, TokenAddress: "4262f09434e938b2714803d3aa425d1d543a735ba324109087760d83deae653d", Symbol: "SPWN", CoingeckoID: "bitspawn", Decimals: 9}, // Addr: 5U9QqCPhqXAJcEv9uyzFJd5zhN93vuPk1aNNkXnUfPnt, Notional: 0.002111 + {TokenChain: 1, TokenAddress: "b7db4e83eb727f1187bd7a50303f5b4e4e943503da8571ad6564a51131504792", Symbol: "", CoingeckoID: "wrapped-usdt-allbridge-from-polygon", Decimals: 6}, // Addr: DNhZkUaxHXYvpxZ7LNnHtss8sQgdAfd1ZYS1fB7LKWUZ, Notional: 42.279142506 + {TokenChain: 1, TokenAddress: "3a0147829f94ff731beb78f4bf79f8247eb6db6ff78cbdbd778004547c3cfb15", Symbol: "", CoingeckoID: "playground-waves-floor-index", Decimals: 2}, // Addr: 4uRn7vxRPWYP4HuAa4UNXwEPLRL8oQ71YByMhr6yBnL4, Notional: 17.4236716 + {TokenChain: 1, TokenAddress: "05718b04572312d73aa71deaec43c89d77844b0b7ff9e3e72da8510182627455", Symbol: "BLOCK", CoingeckoID: "blockasset", Decimals: 6}, // Addr: NFTUkR4u7wKxy9QLaX2TGvd9oZSWoMo4jqSJqdMb7Nk, Notional: 641855.2628293643 + {TokenChain: 1, TokenAddress: "dd40a2f6f423e4c3990a83eac3d9d9c1fe625b36cbc5e4a6d553544552a867ee", Symbol: "BRZ", CoingeckoID: "brz", Decimals: 4}, // Addr: FtgGSFADXBtroxq8VCausXRr2of47QBf5AS1NtZCu4GD, Notional: 5238.1939921274 + {TokenChain: 1, TokenAddress: "06a1ec5bd82ad9c032a9f7d466ba2c728b0ef36a8b773ed219d69650d3472bd6", Symbol: "", CoingeckoID: "step-finance", Decimals: 9}, // Addr: StepAscQoEioFxxWGnh2sLBDFp9d8rvKz2Yp39iDpyT, Notional: 1.8438903128479514 + {TokenChain: 1, TokenAddress: "45a5161476cc9df6ef8583b581a3111b4416ebcea65f4eca5bb961124c3399df", Symbol: "", CoingeckoID: "xhashtag", Decimals: 6}, // Addr: 5gs8nf4wojB5EXgDUWNLwXpknzgV2YWDhveAeBZpVLbp, Notional: 13106.190538945999 + {TokenChain: 1, TokenAddress: "0537996f2699674fb7086e468fb33b4fde1449f47a8befd8b342bf6b33cff372", Symbol: "MNDE", CoingeckoID: "marinade", Decimals: 9}, // Addr: MNDEFzGvMt87ueuHvVU9VcTqsAP5b3fTGPsHuuPA5ey, Notional: 2.228630848490938 + {TokenChain: 1, TokenAddress: "485493b637792cca16fe9d53fc4879c23dbf52cf6d9af4e61fe92df15c17c98d", Symbol: "", CoingeckoID: "bamboo-coin", Decimals: 9}, // Addr: 5sM9xxcBTM9rWza6nEgq2cShA87JjTBx1Cu82LjgmaEg, Notional: 0.2071803 + {TokenChain: 1, TokenAddress: "c261d86cf5cf877128ba1f5652e5f3dda599270c1556a15bc0a9aacf8063e563", Symbol: "RIN", CoingeckoID: "aldrin", Decimals: 9}, // Addr: E5ndSkaB17Dm7CsD22dvcjfrYSDLCxFcMd6z8ddCk5wp, Notional: 0.0462604 + {TokenChain: 1, TokenAddress: "8b7a5bd48982a26d6436cb99d7a2c7ea90e46d38625a0bdb74e1cc5886a7b703", Symbol: "", CoingeckoID: "apricot", Decimals: 6}, // Addr: APTtJyaRX5yGTsJU522N4VYWg3vCvSb65eam5GrPT5Rt, Notional: 0.45407628855664 + {TokenChain: 1, TokenAddress: "08742da77f532cb2337402e2ab66187b63a2907c9a62107dab7013a28deb4657", Symbol: "ABR", CoingeckoID: "allbridge", Decimals: 9}, // Addr: a11bdAAuV8iB2fu7X6AxAvDTo1QZ8FXB3kk5eecdasp, Notional: 0.54180454010844 + {TokenChain: 1, TokenAddress: "f23cba7173364712aaa6114393f2c187b8d8b5194abaa872ada605fa8820b61f", Symbol: "", CoingeckoID: "atlas-dex", Decimals: 9}, // Addr: HJbNXx2YMRxgfUJ6K4qeWtjatMK5KYQT1QnsCdDWywNv, Notional: 0.124486983127452 + {TokenChain: 1, TokenAddress: "8c77f3661d6b4a8ef39dbc5340eead8c3cbe0b45099840e8263d8725b587b073", Symbol: "ATLAS", CoingeckoID: "star-atlas", Decimals: 8}, // Addr: ATLASXmbPQxBUYbxPsV97usA3fPQYEqzQBUHgiFCUsXx, Notional: 77052.29725848716 + {TokenChain: 1, TokenAddress: "35fe161e6828028ece9caa2d89bcd7a1fd1bf140ad838d0c17d7b57c9b1aa238", Symbol: "SNY", CoingeckoID: "synthetify-token", Decimals: 6}, // Addr: 4dmKkXNHdgYsXqBHCuMikNQWwVomZURhYvkkX5c4pQ7y, Notional: 1.6136e-8 + {TokenChain: 1, TokenAddress: "87c9ce6b6344187c4b75fa01dd4334d8bb826a9214fefe9d39cce5fad29b6faa", Symbol: "", CoingeckoID: "bilira", Decimals: 6}, // Addr: A94X2fRy3wydNShU4dRaDyap2UuoeWJGWyATtyp61WZf, Notional: 7.445138399999999 + {TokenChain: 1, TokenAddress: "063ba2f4697205f531b6de49bb9605fd2ca6a9ddf243bed251fda6552ef0e571", Symbol: "", CoingeckoID: "rollbit-coin", Decimals: 2}, // Addr: RLBxxFkseAZ4RgJH3Sqn8jXxhmGoz9jWxDNJMh8pL7a, Notional: 15.910445 + {TokenChain: 1, TokenAddress: "bc07c56e60ad3d3f177382eac6548fba1fd32cfd90ca02b3e7cfa185fdce7398", Symbol: "Bonk", CoingeckoID: "bonk", Decimals: 5}, // Addr: DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263, Notional: 82001.23816431338 + {TokenChain: 1, TokenAddress: "8268e9a9a1444c2ba5c77a51936856b072e43fefcff5e4b01e99623c8ebb7749", Symbol: "BTC", CoingeckoID: "wrapped-bitcoin-sollet", Decimals: 6}, // Addr: 9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E, Notional: 2136.03260486 + {TokenChain: 1, TokenAddress: "a9b7b4c191b9fcd8a101e517de4a2bc44ae7df4ff6595f62cb4bf9c5c3b01fd2", Symbol: "CRWNY", CoingeckoID: "crowny-token", Decimals: 6}, // Addr: CRWNYkqdgvhGGae9CKfNka58j6QQkaD5bLhKXvUYqnc1, Notional: 0.027911400000000003 + {TokenChain: 1, TokenAddress: "b5f7e08966fa2f997abc90d7a7cde1bc733f567b9eafc3007e80a3174726b6f6", Symbol: "", CoingeckoID: "defi-land", Decimals: 9}, // Addr: DFL1zNkaGPWm1BqAVqRjCZvHmwTFrEaJtbzJWgseoNJh, Notional: 7.132340548345625 + {TokenChain: 1, TokenAddress: "db532dd1df8e6c87ca70695ddf92f8d86e621d0d86de69c3058de9b29ee22647", Symbol: "", CoingeckoID: "monkeyball", Decimals: 6}, // Addr: Fm9rHUTF5v3hwMLbStjZXqNBBoZyGriQaFM6sTFz3K8A, Notional: 0.22968074265096 {TokenChain: 1, TokenAddress: "d6de2876953718f8ae61f7a6da3b0869cc770dbe30d86458f46467d8ed1bf499", Symbol: "", CoingeckoID: "synex-coin", Decimals: 9}, // Addr: FTkj421DxbS1wajE74J34BJ5a1o9ccA97PkK6mYq9hNQ, Notional: 0.018503000000000002 - {TokenChain: 1, TokenAddress: "dbef5aa1e0f0042edd619a2f68fd3e4df833325dd2037fcc6bb3b6ed0cb7508e", Symbol: "", CoingeckoID: "famous-fox-federation", Decimals: 0}, // Addr: FoXyMu5xwXre7zEoSvzViRk3nGawHUp9kUh97y2NDhcq, Notional: 11.35471656 - {TokenChain: 1, TokenAddress: "f51829ba389a574812109c6de6051e77c7a003ba666a26d13d30c51c51f7e94e", Symbol: "", CoingeckoID: "visiongame", Decimals: 9}, // Addr: HVkFqcMHevVPb4XKrf4XowjEaVVsBoqJ2U1EG59Dfk5j, Notional: 1.22638479 - {TokenChain: 1, TokenAddress: "0e56395e3c860143802e9b94a02cc6d04f75fec72a3fbb715268355e0cd7cd89", Symbol: "SLIM", CoingeckoID: "solanium", Decimals: 6}, // Addr: xxxxa1sKNGwFtw2kFn8XauW9xq8hBZ5kVtcSesTT9fW, Notional: 1.5085420563644998 - {TokenChain: 1, TokenAddress: "6271cb7119476b9dce00d815c8ff315fc8bf7d2848633d34942adfd535f2defe", Symbol: "stSOL", CoingeckoID: "lido-staked-sol", Decimals: 9}, // Addr: 7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj, Notional: 18268.627174892797 + {TokenChain: 1, TokenAddress: "dbef5aa1e0f0042edd619a2f68fd3e4df833325dd2037fcc6bb3b6ed0cb7508e", Symbol: "", CoingeckoID: "famous-fox-federation", Decimals: 0}, // Addr: FoXyMu5xwXre7zEoSvzViRk3nGawHUp9kUh97y2NDhcq, Notional: 16.44189752 + {TokenChain: 1, TokenAddress: "f51829ba389a574812109c6de6051e77c7a003ba666a26d13d30c51c51f7e94e", Symbol: "", CoingeckoID: "visiongame", Decimals: 9}, // Addr: HVkFqcMHevVPb4XKrf4XowjEaVVsBoqJ2U1EG59Dfk5j, Notional: 0.56951529 + {TokenChain: 1, TokenAddress: "0e56395e3c860143802e9b94a02cc6d04f75fec72a3fbb715268355e0cd7cd89", Symbol: "SLIM", CoingeckoID: "solanium", Decimals: 6}, // Addr: xxxxa1sKNGwFtw2kFn8XauW9xq8hBZ5kVtcSesTT9fW, Notional: 1.7845341817769997 + {TokenChain: 1, TokenAddress: "6271cb7119476b9dce00d815c8ff315fc8bf7d2848633d34942adfd535f2defe", Symbol: "stSOL", CoingeckoID: "lido-staked-sol", Decimals: 9}, // Addr: 7dHbWXmci3dT8UFYWYZweBLXgycu7Y3iL6trKn1Y7ARj, Notional: 23344.663022089197 {TokenChain: 1, TokenAddress: "c52e93ce650a3e02a70273e400132ed89b3bd67f2b839d4848593282bdec3ea0", Symbol: "", CoingeckoID: "bitmon", Decimals: 9}, // Addr: EGiWZhNk3vUNJr35MbL2tY5YD6D81VVZghR2LgEFyXZh, Notional: 0.0743617047034104 - {TokenChain: 1, TokenAddress: "061391c556ba0106d4b1b2ccf939d47caf9fb30639a58bf9cc315d024f1cb458", Symbol: "", CoingeckoID: "tudabirds", Decimals: 9}, // Addr: Qikhhhg9Ta3Jg7WoDFbSYuCAE14hx9hPvdz1zVp3zUw, Notional: 0.51652425 - {TokenChain: 1, TokenAddress: "0b62ba074f722c9d4114f2d8f70a00c66002337b9bf90c873657a6d201db4c80", Symbol: "mSOL", CoingeckoID: "msol", Decimals: 9}, // Addr: mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So, Notional: 3.6934201635 - {TokenChain: 2, TokenAddress: "0000000000000000000000001045f5ccb01daea4f8eab055f5fcbb7c0e7c89f0", Symbol: "DFIAT", CoingeckoID: "defiato", Decimals: 18}, // Addr: 0x1045f5ccb01daea4f8eab055f5fcbb7c0e7c89f0, Notional: 3828.6515237947547 - {TokenChain: 2, TokenAddress: "0000000000000000000000007777777777697cfeecf846a76326da79cc606517", Symbol: "SIG", CoingeckoID: "xsigma", Decimals: 18}, // Addr: 0x7777777777697cfeecf846a76326da79cc606517, Notional: 0.456876 - {TokenChain: 2, TokenAddress: "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48, Notional: 58148702.84909685 - {TokenChain: 2, TokenAddress: "00000000000000000000000019062190b1925b5b6689d7073fdfc8c2976ef8cb", Symbol: "BZZ", CoingeckoID: "swarm-bzz", Decimals: 16}, // Addr: 0x19062190b1925b5b6689d7073fdfc8c2976ef8cb, Notional: 2.8841800000000003e-9 - {TokenChain: 2, TokenAddress: "00000000000000000000000027702a26126e0b3702af63ee09ac4d1a084ef628", Symbol: "ALEPH", CoingeckoID: "aleph", Decimals: 18}, // Addr: 0x27702a26126e0b3702af63ee09ac4d1a084ef628, Notional: 682088.3689684849 - {TokenChain: 2, TokenAddress: "000000000000000000000000d417144312dbf50465b1c641d016962017ef6240", Symbol: "CQT", CoingeckoID: "covalent", Decimals: 18}, // Addr: 0xd417144312dbf50465b1c641d016962017ef6240, Notional: 9913943.359914295 - {TokenChain: 2, TokenAddress: "0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", Symbol: "AAVE", CoingeckoID: "aave", Decimals: 18}, // Addr: 0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9, Notional: 70212.318590148 - {TokenChain: 2, TokenAddress: "0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x6b175474e89094c44da98b954eedeac495271d0f, Notional: 3951624.94078329 - {TokenChain: 2, TokenAddress: "00000000000000000000000009a3ecafa817268f77be1283176b946c4ff2e608", Symbol: "MIR", CoingeckoID: "mirror-protocol", Decimals: 18}, // Addr: 0x09a3ecafa817268f77be1283176b946c4ff2e608, Notional: 160.40873733382654 - {TokenChain: 2, TokenAddress: "000000000000000000000000cc503242b574bc01145da7e2a743b43fb395ec91", Symbol: "ROVI", CoingeckoID: "rovi-protocol", Decimals: 18}, // Addr: 0xcc503242b574bc01145da7e2a743b43fb395ec91, Notional: 11.335725240000002 - {TokenChain: 2, TokenAddress: "000000000000000000000000ed35af169af46a02ee13b9d79eb57d6d68c1749e", Symbol: "OMI", CoingeckoID: "ecomi", Decimals: 18}, // Addr: 0xed35af169af46a02ee13b9d79eb57d6d68c1749e, Notional: 12.447000000000001 - {TokenChain: 2, TokenAddress: "000000000000000000000000725c263e32c72ddc3a19bea12c5a0479a81ee688", Symbol: "BMI", CoingeckoID: "bridge-mutual", Decimals: 18}, // Addr: 0x725c263e32c72ddc3a19bea12c5a0479a81ee688, Notional: 11797.118647926885 - {TokenChain: 2, TokenAddress: "00000000000000000000000010633216e7e8281e33c86f02bf8e565a635d9770", Symbol: "DVI", CoingeckoID: "dvision-network", Decimals: 18}, // Addr: 0x10633216e7e8281e33c86f02bf8e565a635d9770, Notional: 1.039051 - {TokenChain: 2, TokenAddress: "0000000000000000000000002370f9d504c7a6e775bf6e14b3f12846b594cd53", Symbol: "JPYC", CoingeckoID: "jpyc", Decimals: 18}, // Addr: 0x2370f9d504c7a6e775bf6e14b3f12846b594cd53, Notional: 8.08746 - {TokenChain: 2, TokenAddress: "000000000000000000000000bd2f0cd039e0bfcf88901c98c0bfac5ab27566e3", Symbol: "DSD", CoingeckoID: "dynamic-set-dollar", Decimals: 18}, // Addr: 0xbd2f0cd039e0bfcf88901c98c0bfac5ab27566e3, Notional: 18.150098303765844 - {TokenChain: 2, TokenAddress: "000000000000000000000000d4c435f5b09f855c3317c8524cb1f586e42795fa", Symbol: "CND", CoingeckoID: "cindicator", Decimals: 18}, // Addr: 0xd4c435f5b09f855c3317c8524cb1f586e42795fa, Notional: 0.00529232 - {TokenChain: 2, TokenAddress: "000000000000000000000000cfa0885131f602d11d4da248d2c65a62063567a9", Symbol: "TORG", CoingeckoID: "torg", Decimals: 18}, // Addr: 0xcfa0885131f602d11d4da248d2c65a62063567a9, Notional: 4.001089502565 - {TokenChain: 2, TokenAddress: "000000000000000000000000f0d33beda4d734c72684b5f9abbebf715d0a7935", Symbol: "NTX", CoingeckoID: "nunet", Decimals: 6}, // Addr: 0xf0d33beda4d734c72684b5f9abbebf715d0a7935, Notional: 11.1114326015 - {TokenChain: 2, TokenAddress: "000000000000000000000000c5102fe9359fd9a28f877a67e36b0f050d81a3cc", Symbol: "HOP", CoingeckoID: "hop-protocol", Decimals: 18}, // Addr: 0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc, Notional: 1.7646 - {TokenChain: 2, TokenAddress: "000000000000000000000000db726152680ece3c9291f1016f1d36f3995f6941", Symbol: "MEDIA", CoingeckoID: "media-network", Decimals: 6}, // Addr: 0xdb726152680ece3c9291f1016f1d36f3995f6941, Notional: 7.36 - {TokenChain: 2, TokenAddress: "000000000000000000000000d2877702675e6ceb975b4a1dff9fb7baf4c91ea9", Symbol: "LUNA", CoingeckoID: "wrapped-terra", Decimals: 18}, // Addr: 0xd2877702675e6ceb975b4a1dff9fb7baf4c91ea9, Notional: 2.29882762345374 - {TokenChain: 2, TokenAddress: "000000000000000000000000ac51066d7bec65dc4589368da368b212745d63e8", Symbol: "ALICE", CoingeckoID: "my-neighbor-alice", Decimals: 6}, // Addr: 0xac51066d7bec65dc4589368da368b212745d63e8, Notional: 1.866896 - {TokenChain: 2, TokenAddress: "0000000000000000000000005f98805a4e8be255a32880fdec7f6728c6568ba0", Symbol: "LUSD", CoingeckoID: "liquity-usd", Decimals: 18}, // Addr: 0x5f98805a4e8be255a32880fdec7f6728c6568ba0, Notional: 2 - {TokenChain: 2, TokenAddress: "000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52", Symbol: "CRV", CoingeckoID: "curve-dao-token", Decimals: 18}, // Addr: 0xd533a949740bb3306d119cc777fa900ba034cd52, Notional: 20060.369300890987 - {TokenChain: 2, TokenAddress: "0000000000000000000000004740735aa98dc8aa232bd049f8f0210458e7fca3", Symbol: "RDT", CoingeckoID: "ridotto", Decimals: 18}, // Addr: 0x4740735aa98dc8aa232bd049f8f0210458e7fca3, Notional: 1.6732616487 - {TokenChain: 2, TokenAddress: "0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2", Symbol: "SUSHI", CoingeckoID: "sushi", Decimals: 18}, // Addr: 0x6b3595068778dd592e39a122f4f5a5cf09c90fe2, Notional: 2880937.7573264227 - {TokenChain: 2, TokenAddress: "000000000000000000000000a1d6df714f91debf4e0802a542e13067f31b8262", Symbol: "RFOX", CoingeckoID: "redfox-labs-2", Decimals: 18}, // Addr: 0xa1d6df714f91debf4e0802a542e13067f31b8262, Notional: 639.59067871 - {TokenChain: 2, TokenAddress: "00000000000000000000000085eee30c52b0b379b046fb0f85f4f3dc3009afec", Symbol: "KEEP", CoingeckoID: "keep-network", Decimals: 18}, // Addr: 0x85eee30c52b0b379b046fb0f85f4f3dc3009afec, Notional: 55011.00904546912 - {TokenChain: 2, TokenAddress: "00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb8", Symbol: "XEN", CoingeckoID: "xen-crypto", Decimals: 18}, // Addr: 0x06450dee7fd2fb8e39061434babcfc05599a6fb8, Notional: 0.00830463634 - {TokenChain: 2, TokenAddress: "0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933", Symbol: "PEPE", CoingeckoID: "pepe", Decimals: 18}, // Addr: 0x6982508145454ce325ddbe47a25d4ec3d2311933, Notional: 0.00631838 - {TokenChain: 2, TokenAddress: "00000000000000000000000015d4c048f83bd7e37d49ea4c83a07267ec4203da", Symbol: "GALA", CoingeckoID: "gala", Decimals: 8}, // Addr: 0x15d4c048f83bd7e37d49ea4c83a07267ec4203da, Notional: 11833.29656964 - {TokenChain: 2, TokenAddress: "0000000000000000000000005a98fcbea516cf06857215779fd812ca3bef1b32", Symbol: "LDO", CoingeckoID: "lido-dao", Decimals: 18}, // Addr: 0x5a98fcbea516cf06857215779fd812ca3bef1b32, Notional: 1548669.4415718138 - {TokenChain: 2, TokenAddress: "000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899", Symbol: "OHM", CoingeckoID: "olympus-v1", Decimals: 9}, // Addr: 0x383518188c0c6d7730d91b2c03a03c837814a899, Notional: 2.911 - {TokenChain: 2, TokenAddress: "000000000000000000000000e516d78d784c77d479977be58905b3f2b1111126", Symbol: "SPWN", CoingeckoID: "bitspawn", Decimals: 18}, // Addr: 0xe516d78d784c77d479977be58905b3f2b1111126, Notional: 9.695115209130797 - {TokenChain: 2, TokenAddress: "000000000000000000000000b1f66997a5760428d3a87d68b90bfe0ae64121cc", Symbol: "LUA", CoingeckoID: "lua-token", Decimals: 18}, // Addr: 0xb1f66997a5760428d3a87d68b90bfe0ae64121cc, Notional: 45534.57038068 - {TokenChain: 2, TokenAddress: "000000000000000000000000cafe001067cdef266afb7eb5a286dcfd277f3de5", Symbol: "PSP", CoingeckoID: "paraswap", Decimals: 18}, // Addr: 0xcafe001067cdef266afb7eb5a286dcfd277f3de5, Notional: 0.0248827723504428 - {TokenChain: 2, TokenAddress: "000000000000000000000000d46ba6d942050d489dbd938a2c909a5d5039a161", Symbol: "AMPL", CoingeckoID: "ampleforth", Decimals: 9}, // Addr: 0xd46ba6d942050d489dbd938a2c909a5d5039a161, Notional: 571.8238450284 - {TokenChain: 2, TokenAddress: "0000000000000000000000005b52bfb8062ce664d74bbcd4cd6dc7df53fd7233", Symbol: "ZENIQ", CoingeckoID: "zeniq", Decimals: 18}, // Addr: 0x5b52bfb8062ce664d74bbcd4cd6dc7df53fd7233, Notional: 7.784877878804909 - {TokenChain: 2, TokenAddress: "0000000000000000000000008cc0f052fff7ead7f2edcccac895502e884a8a71", Symbol: "ARTH", CoingeckoID: "arth", Decimals: 18}, // Addr: 0x8cc0f052fff7ead7f2edcccac895502e884a8a71, Notional: 9.7 - {TokenChain: 2, TokenAddress: "0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984", Symbol: "UNI", CoingeckoID: "uniswap", Decimals: 18}, // Addr: 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984, Notional: 3691312.9222401422 - {TokenChain: 2, TokenAddress: "000000000000000000000000e7f72bc0252ca7b16dbb72eeee1afcdb2429f2dd", Symbol: "NFTL", CoingeckoID: "nftlaunch", Decimals: 18}, // Addr: 0xe7f72bc0252ca7b16dbb72eeee1afcdb2429f2dd, Notional: 3.3226677000000002 - {TokenChain: 2, TokenAddress: "0000000000000000000000000f5d2fb29fb7d3cfee444a200298f468908cc942", Symbol: "MANA", CoingeckoID: "decentraland", Decimals: 18}, // Addr: 0x0f5d2fb29fb7d3cfee444a200298f468908cc942, Notional: 61103.07744470231 - {TokenChain: 2, TokenAddress: "0000000000000000000000006de037ef9ad2725eb40118bb1702ebb27e4aeb24", Symbol: "RNDR", CoingeckoID: "render-token", Decimals: 18}, // Addr: 0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24, Notional: 1141.5766670946 - {TokenChain: 2, TokenAddress: "000000000000000000000000c0a4df35568f116c370e6a6a6022ceb908eeddac", Symbol: "UMEE", CoingeckoID: "umee", Decimals: 6}, // Addr: 0xc0a4df35568f116c370e6a6a6022ceb908eeddac, Notional: 3.8004800000000003 - {TokenChain: 2, TokenAddress: "0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce8", Symbol: "agEUR", CoingeckoID: "ageur", Decimals: 18}, // Addr: 0x1a7e4e63778b4f12a199c062f3efdd288afcbce8, Notional: 22684.9746812917 - {TokenChain: 2, TokenAddress: "00000000000000000000000003be5c903c727ee2c8c4e9bc0acc860cca4715e2", Symbol: "CAPS", CoingeckoID: "coin-capsule", Decimals: 18}, // Addr: 0x03be5c903c727ee2c8c4e9bc0acc860cca4715e2, Notional: 5128.513399798006 - {TokenChain: 2, TokenAddress: "000000000000000000000000152649ea73beab28c5b49b26eb48f7ead6d4c898", Symbol: "Cake", CoingeckoID: "pancakeswap-token", Decimals: 18}, // Addr: 0x152649ea73beab28c5b49b26eb48f7ead6d4c898, Notional: 3.0407137723 - {TokenChain: 2, TokenAddress: "0000000000000000000000001fee5588cb1de19c70b6ad5399152d8c643fae7b", Symbol: "PHTK", CoingeckoID: "phuntoken", Decimals: 18}, // Addr: 0x1fee5588cb1de19c70b6ad5399152d8c643fae7b, Notional: 0.62661 - {TokenChain: 2, TokenAddress: "0000000000000000000000004691937a7508860f876c9c0a2a617e7d9e945d4b", Symbol: "WOO", CoingeckoID: "woo-network", Decimals: 18}, // Addr: 0x4691937a7508860f876c9c0a2a617e7d9e945d4b, Notional: 3.98414 - {TokenChain: 2, TokenAddress: "0000000000000000000000004da34f8264cb33a5c9f17081b9ef5ff6091116f4", Symbol: "ELFI", CoingeckoID: "elyfi", Decimals: 18}, // Addr: 0x4da34f8264cb33a5c9f17081b9ef5ff6091116f4, Notional: 290866.2352581707 - {TokenChain: 2, TokenAddress: "0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0", Symbol: "FXS", CoingeckoID: "frax-share", Decimals: 18}, // Addr: 0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0, Notional: 593716.935967478 - {TokenChain: 2, TokenAddress: "000000000000000000000000caabcaa4ca42e1d86de1a201c818639def0ba7a7", Symbol: "TALK", CoingeckoID: "talken", Decimals: 18}, // Addr: 0xcaabcaa4ca42e1d86de1a201c818639def0ba7a7, Notional: 0.48959 - {TokenChain: 2, TokenAddress: "000000000000000000000000df574c24545e5ffecb9a659c229253d4111d87e1", Symbol: "HUSD", CoingeckoID: "husd", Decimals: 8}, // Addr: 0xdf574c24545e5ffecb9a659c229253d4111d87e1, Notional: 338.6332643020968 - {TokenChain: 2, TokenAddress: "000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f", Symbol: "SNX", CoingeckoID: "havven", Decimals: 18}, // Addr: 0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f, Notional: 54.5343377796 - {TokenChain: 2, TokenAddress: "00000000000000000000000000a8b738e453ffd858a7edf03bccfe20412f0eb0", Symbol: "ALBT", CoingeckoID: "allianceblock", Decimals: 18}, // Addr: 0x00a8b738e453ffd858a7edf03bccfe20412f0eb0, Notional: 0.32142016548760555 - {TokenChain: 2, TokenAddress: "0000000000000000000000000f51bb10119727a7e5ea3538074fb341f56b09ad", Symbol: "DAO", CoingeckoID: "dao-maker", Decimals: 18}, // Addr: 0x0f51bb10119727a7e5ea3538074fb341f56b09ad, Notional: 318.53617850163533 - {TokenChain: 2, TokenAddress: "0000000000000000000000004a220e6096b25eadb88358cb44068a3248254675", Symbol: "QNT", CoingeckoID: "quant-network", Decimals: 18}, // Addr: 0x4a220e6096b25eadb88358cb44068a3248254675, Notional: 5.224 - {TokenChain: 2, TokenAddress: "000000000000000000000000f7413489c474ca4399eee604716c72879eea3615", Symbol: "APYS", CoingeckoID: "apyswap", Decimals: 18}, // Addr: 0xf7413489c474ca4399eee604716c72879eea3615, Notional: 1.012991111070168 - {TokenChain: 2, TokenAddress: "000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e", Symbol: "aWETH", CoingeckoID: "aave-weth", Decimals: 18}, // Addr: 0x030ba81f1c18d280636f32af80b9aad02cf0854e, Notional: 549.4768828904 - {TokenChain: 2, TokenAddress: "000000000000000000000000249e38ea4102d0cf8264d3701f1a0e39c4f2dc3b", Symbol: "UFO", CoingeckoID: "ufo-gaming", Decimals: 18}, // Addr: 0x249e38ea4102d0cf8264d3701f1a0e39c4f2dc3b, Notional: 24.80660587037862 - {TokenChain: 2, TokenAddress: "0000000000000000000000008ab7404063ec4dbcfd4598215992dc3f8ec853d7", Symbol: "AKRO", CoingeckoID: "akropolis", Decimals: 18}, // Addr: 0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7, Notional: 7164.36264159139 - {TokenChain: 2, TokenAddress: "000000000000000000000000cc8fa225d80b9c7d42f96e9570156c65d6caaa25", Symbol: "SLP", CoingeckoID: "smooth-love-potion", Decimals: 0}, // Addr: 0xcc8fa225d80b9c7d42f96e9570156c65d6caaa25, Notional: 3149.0138064 - {TokenChain: 2, TokenAddress: "000000000000000000000000ac57de9c1a09fec648e93eb98875b212db0d460b", Symbol: "BabyDoge", CoingeckoID: "baby-doge-coin", Decimals: 9}, // Addr: 0xac57de9c1a09fec648e93eb98875b212db0d460b, Notional: 187.85576482121633 - {TokenChain: 2, TokenAddress: "000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84", Symbol: "stETH", CoingeckoID: "staked-ether", Decimals: 18}, // Addr: 0xae7ab96520de3a18e5e111b5eaab095312d7fe84, Notional: 4173.540803458 - {TokenChain: 2, TokenAddress: "000000000000000000000000de5ea375ffbdc8b25a80fe13d631e8ba0ab4bb02", Symbol: "GERA", CoingeckoID: "gera-coin", Decimals: 18}, // Addr: 0xde5ea375ffbdc8b25a80fe13d631e8ba0ab4bb02, Notional: 20.129680452717555 - {TokenChain: 2, TokenAddress: "0000000000000000000000008770b7dd89e5f759ee3b226e0c45e890f87ddc48", Symbol: "MIRL", CoingeckoID: "made-in-real-life", Decimals: 18}, // Addr: 0x8770b7dd89e5f759ee3b226e0c45e890f87ddc48, Notional: 34520.70708428155 - {TokenChain: 2, TokenAddress: "000000000000000000000000485d17a6f1b8780392d53d64751824253011a260", Symbol: "TIME", CoingeckoID: "chronobank", Decimals: 8}, // Addr: 0x485d17a6f1b8780392d53d64751824253011a260, Notional: 15.678000000000003 - {TokenChain: 2, TokenAddress: "0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0", Symbol: "MATIC", CoingeckoID: "matic-network", Decimals: 18}, // Addr: 0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0, Notional: 18702.569142765475 - {TokenChain: 2, TokenAddress: "000000000000000000000000e28b3b32b6c345a34ff64674606124dd5aceca30", Symbol: "INJ", CoingeckoID: "injective-protocol", Decimals: 18}, // Addr: 0xe28b3b32b6c345a34ff64674606124dd5aceca30, Notional: 68579.98180071921 - {TokenChain: 2, TokenAddress: "0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39", Symbol: "HEX", CoingeckoID: "hex", Decimals: 8}, // Addr: 0x2b591e99afe9f32eaa6214f7b7629768c40eeb39, Notional: 0.00521215 - {TokenChain: 2, TokenAddress: "0000000000000000000000005f944b0c4315cb7c3a846b025ab4045da44abf6c", Symbol: "GCAKE", CoingeckoID: "pancake-games", Decimals: 18}, // Addr: 0x5f944b0c4315cb7c3a846b025ab4045da44abf6c, Notional: 0.32349187179698347 - {TokenChain: 2, TokenAddress: "00000000000000000000000092d6c1e31e14520e676a687f0a93788b716beff5", Symbol: "DYDX", CoingeckoID: "dydx", Decimals: 18}, // Addr: 0x92d6c1e31e14520e676a687f0a93788b716beff5, Notional: 49827.6699097716 - {TokenChain: 2, TokenAddress: "000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6", Symbol: "SPELL", CoingeckoID: "spell-token", Decimals: 18}, // Addr: 0x090185f2135308bad17527004364ebcc2d37e5f6, Notional: 0.00046727 - {TokenChain: 2, TokenAddress: "0000000000000000000000004fabb145d64652a948d72533023f6e7a623c7c53", Symbol: "BUSD", CoingeckoID: "binance-usd", Decimals: 18}, // Addr: 0x4fabb145d64652a948d72533023f6e7a623c7c53, Notional: 6977.81353871602 - {TokenChain: 2, TokenAddress: "0000000000000000000000001abaea1f7c830bd89acc67ec4af516284b1bc33c", Symbol: "EUROC", CoingeckoID: "euro-coin", Decimals: 6}, // Addr: 0x1abaea1f7c830bd89acc67ec4af516284b1bc33c, Notional: 5.570365248999999 - {TokenChain: 2, TokenAddress: "000000000000000000000000f1182229b71e79e504b1d2bf076c15a277311e05", Symbol: "LBR", CoingeckoID: "lybra-finance", Decimals: 18}, // Addr: 0xf1182229b71e79e504b1d2bf076c15a277311e05, Notional: 0.127 - {TokenChain: 2, TokenAddress: "000000000000000000000000888888888889c00c67689029d7856aac1065ec11", Symbol: "OPIUM", CoingeckoID: "opium", Decimals: 18}, // Addr: 0x888888888889c00c67689029d7856aac1065ec11, Notional: 0.7392700000000001 - {TokenChain: 2, TokenAddress: "0000000000000000000000007a58c0be72be218b41c608b7fe7c5bb630736c71", Symbol: "PEOPLE", CoingeckoID: "constitutiondao", Decimals: 18}, // Addr: 0x7a58c0be72be218b41c608b7fe7c5bb630736c71, Notional: 5839.381946983495 - {TokenChain: 2, TokenAddress: "000000000000000000000000ae1eaae3f627aaca434127644371b67b18444051", Symbol: "YOP", CoingeckoID: "yield-optimization-platform", Decimals: 8}, // Addr: 0xae1eaae3f627aaca434127644371b67b18444051, Notional: 0.08988449999999999 - {TokenChain: 2, TokenAddress: "000000000000000000000000949d48eca67b17269629c7194f4b727d4ef9e5d6", Symbol: "MC", CoingeckoID: "merit-circle", Decimals: 18}, // Addr: 0x949d48eca67b17269629c7194f4b727d4ef9e5d6, Notional: 12.825192099999999 - {TokenChain: 2, TokenAddress: "0000000000000000000000007ddc52c4de30e94be3a6a0a2b259b2850f421989", Symbol: "GMT", CoingeckoID: "gmt-token", Decimals: 18}, // Addr: 0x7ddc52c4de30e94be3a6a0a2b259b2850f421989, Notional: 187.82753948994343 - {TokenChain: 2, TokenAddress: "000000000000000000000000bcca60bb61934080951369a648fb03df4f96263c", Symbol: "aUSDC", CoingeckoID: "aave-usdc", Decimals: 6}, // Addr: 0xbcca60bb61934080951369a648fb03df4f96263c, Notional: 7.029462310999999 - {TokenChain: 2, TokenAddress: "000000000000000000000000d38e031f4529a07996aab977d2b79f0e00656c56", Symbol: "wTBT", CoingeckoID: "wtbt", Decimals: 18}, // Addr: 0xd38e031f4529a07996aab977d2b79f0e00656c56, Notional: 281934.9775710875 - {TokenChain: 2, TokenAddress: "00000000000000000000000066c0dded8433c9ea86c8cf91237b14e10b4d70b7", Symbol: "Mars", CoingeckoID: "mars", Decimals: 18}, // Addr: 0x66c0dded8433c9ea86c8cf91237b14e10b4d70b7, Notional: 24.45929854194891 - {TokenChain: 2, TokenAddress: "00000000000000000000000070e8de73ce538da2beed35d14187f6959a8eca96", Symbol: "XSGD", CoingeckoID: "xsgd", Decimals: 6}, // Addr: 0x70e8de73ce538da2beed35d14187f6959a8eca96, Notional: 3389.0991658299995 - {TokenChain: 2, TokenAddress: "000000000000000000000000ffbf315f70e458e49229654dea4ce192d26f9b25", Symbol: "VOLT", CoingeckoID: "voltage", Decimals: 18}, // Addr: 0xffbf315f70e458e49229654dea4ce192d26f9b25, Notional: 0.617492 - {TokenChain: 2, TokenAddress: "00000000000000000000000070401dfd142a16dc7031c56e862fc88cb9537ce0", Symbol: "BIRD", CoingeckoID: "bird-money", Decimals: 18}, // Addr: 0x70401dfd142a16dc7031c56e862fc88cb9537ce0, Notional: 116.71 - {TokenChain: 2, TokenAddress: "0000000000000000000000009fda7ceec4c18008096c2fe2b85f05dc300f94d0", Symbol: "GAJ", CoingeckoID: "gaj", Decimals: 18}, // Addr: 0x9fda7ceec4c18008096c2fe2b85f05dc300f94d0, Notional: 20.391150469248732 - {TokenChain: 2, TokenAddress: "000000000000000000000000aaaebe6fe48e54f431b0c390cfaf0b017d09d42d", Symbol: "CEL", CoingeckoID: "celsius-degree-token", Decimals: 4}, // Addr: 0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d, Notional: 8759.1979810302 - {TokenChain: 2, TokenAddress: "000000000000000000000000f17e65822b568b3903685a7c9f496cf7656cc6c2", Symbol: "BICO", CoingeckoID: "biconomy", Decimals: 18}, // Addr: 0xf17e65822b568b3903685a7c9f496cf7656cc6c2, Notional: 397285.3424595434 - {TokenChain: 2, TokenAddress: "00000000000000000000000033d0568941c0c64ff7e0fb4fba0b11bd37deed9f", Symbol: "RAMP", CoingeckoID: "ramp", Decimals: 18}, // Addr: 0x33d0568941c0c64ff7e0fb4fba0b11bd37deed9f, Notional: 0.4002525 - {TokenChain: 2, TokenAddress: "0000000000000000000000000bc529c00c6401aef6d220be8c6ea1667f6ad93e", Symbol: "YFI", CoingeckoID: "yearn-finance", Decimals: 18}, // Addr: 0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e, Notional: 449305.1898058301 - {TokenChain: 2, TokenAddress: "00000000000000000000000046cca329970b33e1a007dd4ef0594a1cedb3e72a", Symbol: "YESP", CoingeckoID: "yesports", Decimals: 18}, // Addr: 0x46cca329970b33e1a007dd4ef0594a1cedb3e72a, Notional: 162.83831608780397 - {TokenChain: 2, TokenAddress: "00000000000000000000000030d20208d987713f46dfd34ef128bb16c404d10f", Symbol: "SD", CoingeckoID: "stader", Decimals: 18}, // Addr: 0x30d20208d987713f46dfd34ef128bb16c404d10f, Notional: 526801.2304798821 - {TokenChain: 2, TokenAddress: "0000000000000000000000001494ca1f11d487c2bbe4543e90080aeba4ba3c2b", Symbol: "DPI", CoingeckoID: "defipulse-index", Decimals: 18}, // Addr: 0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b, Notional: 2.4169925728 - {TokenChain: 2, TokenAddress: "0000000000000000000000002ba592f78db6436527729929aaf6c908497cb200", Symbol: "CREAM", CoingeckoID: "cream-2", Decimals: 18}, // Addr: 0x2ba592f78db6436527729929aaf6c908497cb200, Notional: 39688.863934618 - {TokenChain: 2, TokenAddress: "00000000000000000000000045804880de22913dafe09f4980848ece6ecbaf78", Symbol: "PAXG", CoingeckoID: "pax-gold", Decimals: 18}, // Addr: 0x45804880de22913dafe09f4980848ece6ecbaf78, Notional: 845753.88126348 - {TokenChain: 2, TokenAddress: "0000000000000000000000009b83f827928abdf18cf1f7e67053572b9bceff3a", Symbol: "ARTEM", CoingeckoID: "artem", Decimals: 18}, // Addr: 0x9b83f827928abdf18cf1f7e67053572b9bceff3a, Notional: 13016.522945868497 - {TokenChain: 2, TokenAddress: "000000000000000000000000111111111117dc0aa78b770fa6a738034120c302", Symbol: "1INCH", CoingeckoID: "1inch", Decimals: 18}, // Addr: 0x111111111117dc0aa78b770fa6a738034120c302, Notional: 302523.11370934953 - {TokenChain: 2, TokenAddress: "000000000000000000000000476c5e26a75bd202a9683ffd34359c0cc15be0ff", Symbol: "SRM", CoingeckoID: "serum", Decimals: 6}, // Addr: 0x476c5e26a75bd202a9683ffd34359c0cc15be0ff, Notional: 273350.6201017001 - {TokenChain: 2, TokenAddress: "00000000000000000000000069a95185ee2a045cdc4bcd1b1df10710395e4e23", Symbol: "POOLZ", CoingeckoID: "poolz-finance", Decimals: 18}, // Addr: 0x69a95185ee2a045cdc4bcd1b1df10710395e4e23, Notional: 0.07019498178 - {TokenChain: 2, TokenAddress: "0000000000000000000000007659ce147d0e714454073a5dd7003544234b6aa0", Symbol: "XCAD", CoingeckoID: "xcad-network", Decimals: 18}, // Addr: 0x7659ce147d0e714454073a5dd7003544234b6aa0, Notional: 9179993.159751387 - {TokenChain: 2, TokenAddress: "00000000000000000000000065e6b60ea01668634d68d0513fe814679f925bad", Symbol: "PIXEL", CoingeckoID: "pixelverse", Decimals: 18}, // Addr: 0x65e6b60ea01668634d68d0513fe814679f925bad, Notional: 38152.649925649246 - {TokenChain: 2, TokenAddress: "000000000000000000000000ff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa", Symbol: "ORBS", CoingeckoID: "orbs", Decimals: 18}, // Addr: 0xff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa, Notional: 5100.024007001013 - {TokenChain: 2, TokenAddress: "0000000000000000000000006fc13eace26590b80cccab1ba5d51890577d83b2", Symbol: "UMB", CoingeckoID: "umbrella-network", Decimals: 18}, // Addr: 0x6fc13eace26590b80cccab1ba5d51890577d83b2, Notional: 1.1955835179147913 - {TokenChain: 2, TokenAddress: "000000000000000000000000df09a216fac5adc3e640db418c0b956076509503", Symbol: "PKN", CoingeckoID: "poken", Decimals: 18}, // Addr: 0xdf09a216fac5adc3e640db418c0b956076509503, Notional: 57.50394361920001 + {TokenChain: 1, TokenAddress: "061391c556ba0106d4b1b2ccf939d47caf9fb30639a58bf9cc315d024f1cb458", Symbol: "", CoingeckoID: "tudabirds", Decimals: 9}, // Addr: Qikhhhg9Ta3Jg7WoDFbSYuCAE14hx9hPvdz1zVp3zUw, Notional: 0.5146405 + {TokenChain: 1, TokenAddress: "0b62ba074f722c9d4114f2d8f70a00c66002337b9bf90c873657a6d201db4c80", Symbol: "mSOL", CoingeckoID: "msol", Decimals: 9}, // Addr: mSoLzYCxHdYgdzU16g5QSh3i5K3z3KZK7ytfqcJm7So, Notional: 4.810697554 + {TokenChain: 2, TokenAddress: "0000000000000000000000001045f5ccb01daea4f8eab055f5fcbb7c0e7c89f0", Symbol: "DFIAT", CoingeckoID: "defiato", Decimals: 18}, // Addr: 0x1045f5ccb01daea4f8eab055f5fcbb7c0e7c89f0, Notional: 3267.7225598399605 + {TokenChain: 2, TokenAddress: "0000000000000000000000006731827cb6879a2091ce3ab3423f7bf20539b579", Symbol: "MPWR", CoingeckoID: "clubrare-empower", Decimals: 18}, // Addr: 0x6731827cb6879a2091ce3ab3423f7bf20539b579, Notional: 0.00159644 + {TokenChain: 2, TokenAddress: "0000000000000000000000007777777777697cfeecf846a76326da79cc606517", Symbol: "SIG", CoingeckoID: "xsigma", Decimals: 18}, // Addr: 0x7777777777697cfeecf846a76326da79cc606517, Notional: 0.273628 + {TokenChain: 2, TokenAddress: "000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48, Notional: 80281064.4493117 + {TokenChain: 2, TokenAddress: "00000000000000000000000019062190b1925b5b6689d7073fdfc8c2976ef8cb", Symbol: "BZZ", CoingeckoID: "swarm-bzz", Decimals: 16}, // Addr: 0x19062190b1925b5b6689d7073fdfc8c2976ef8cb, Notional: 2.62383e-9 + {TokenChain: 2, TokenAddress: "00000000000000000000000027702a26126e0b3702af63ee09ac4d1a084ef628", Symbol: "ALEPH", CoingeckoID: "aleph", Decimals: 18}, // Addr: 0x27702a26126e0b3702af63ee09ac4d1a084ef628, Notional: 447585.217843697 + {TokenChain: 2, TokenAddress: "000000000000000000000000aa7a9ca87d3694b5755f213b5d04094b8d0f0a6f", Symbol: "TRAC", CoingeckoID: "origintrail", Decimals: 18}, // Addr: 0xaa7a9ca87d3694b5755f213b5d04094b8d0f0a6f, Notional: 40578.769863123416 + {TokenChain: 2, TokenAddress: "000000000000000000000000d417144312dbf50465b1c641d016962017ef6240", Symbol: "CQT", CoingeckoID: "covalent", Decimals: 18}, // Addr: 0xd417144312dbf50465b1c641d016962017ef6240, Notional: 14172833.665609542 + {TokenChain: 2, TokenAddress: "0000000000000000000000007fc66500c84a76ad7e9c93437bfc5ac33e2ddae9", Symbol: "AAVE", CoingeckoID: "aave", Decimals: 18}, // Addr: 0x7fc66500c84a76ad7e9c93437bfc5ac33e2ddae9, Notional: 922.5207019512 + {TokenChain: 2, TokenAddress: "0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x6b175474e89094c44da98b954eedeac495271d0f, Notional: 4150835.3755991394 + {TokenChain: 2, TokenAddress: "00000000000000000000000009a3ecafa817268f77be1283176b946c4ff2e608", Symbol: "MIR", CoingeckoID: "mirror-protocol", Decimals: 18}, // Addr: 0x09a3ecafa817268f77be1283176b946c4ff2e608, Notional: 82.85564663004263 + {TokenChain: 2, TokenAddress: "000000000000000000000000cc503242b574bc01145da7e2a743b43fb395ec91", Symbol: "ROVI", CoingeckoID: "rovi-protocol", Decimals: 18}, // Addr: 0xcc503242b574bc01145da7e2a743b43fb395ec91, Notional: 18.47030472 + {TokenChain: 2, TokenAddress: "000000000000000000000000ed35af169af46a02ee13b9d79eb57d6d68c1749e", Symbol: "OMI", CoingeckoID: "ecomi", Decimals: 18}, // Addr: 0xed35af169af46a02ee13b9d79eb57d6d68c1749e, Notional: 16.789 + {TokenChain: 2, TokenAddress: "000000000000000000000000725c263e32c72ddc3a19bea12c5a0479a81ee688", Symbol: "BMI", CoingeckoID: "bridge-mutual", Decimals: 18}, // Addr: 0x725c263e32c72ddc3a19bea12c5a0479a81ee688, Notional: 7776.940859837999 + {TokenChain: 2, TokenAddress: "00000000000000000000000010633216e7e8281e33c86f02bf8e565a635d9770", Symbol: "DVI", CoingeckoID: "dvision-network", Decimals: 18}, // Addr: 0x10633216e7e8281e33c86f02bf8e565a635d9770, Notional: 1.0080850000000001 + {TokenChain: 2, TokenAddress: "0000000000000000000000002370f9d504c7a6e775bf6e14b3f12846b594cd53", Symbol: "JPYC", CoingeckoID: "jpyc", Decimals: 18}, // Addr: 0x2370f9d504c7a6e775bf6e14b3f12846b594cd53, Notional: 9.19863 + {TokenChain: 2, TokenAddress: "000000000000000000000000bd2f0cd039e0bfcf88901c98c0bfac5ab27566e3", Symbol: "DSD", CoingeckoID: "dynamic-set-dollar", Decimals: 18}, // Addr: 0xbd2f0cd039e0bfcf88901c98c0bfac5ab27566e3, Notional: 13.453689879628266 + {TokenChain: 2, TokenAddress: "000000000000000000000000d4c435f5b09f855c3317c8524cb1f586e42795fa", Symbol: "CND", CoingeckoID: "cindicator", Decimals: 18}, // Addr: 0xd4c435f5b09f855c3317c8524cb1f586e42795fa, Notional: 0.00338464 + {TokenChain: 2, TokenAddress: "000000000000000000000000cfa0885131f602d11d4da248d2c65a62063567a9", Symbol: "TORG", CoingeckoID: "torg", Decimals: 18}, // Addr: 0xcfa0885131f602d11d4da248d2c65a62063567a9, Notional: 2.76144655842 + {TokenChain: 2, TokenAddress: "000000000000000000000000f0d33beda4d734c72684b5f9abbebf715d0a7935", Symbol: "NTX", CoingeckoID: "nunet", Decimals: 6}, // Addr: 0xf0d33beda4d734c72684b5f9abbebf715d0a7935, Notional: 8.0979971163 + {TokenChain: 2, TokenAddress: "000000000000000000000000c5102fe9359fd9a28f877a67e36b0f050d81a3cc", Symbol: "HOP", CoingeckoID: "hop-protocol", Decimals: 18}, // Addr: 0xc5102fe9359fd9a28f877a67e36b0f050d81a3cc, Notional: 1.1300076 + {TokenChain: 2, TokenAddress: "000000000000000000000000db726152680ece3c9291f1016f1d36f3995f6941", Symbol: "MEDIA", CoingeckoID: "media-network", Decimals: 6}, // Addr: 0xdb726152680ece3c9291f1016f1d36f3995f6941, Notional: 6.16 + {TokenChain: 2, TokenAddress: "00000000000000000000000065ef703f5594d2573eb71aaf55bc0cb548492df4", Symbol: "MULTI", CoingeckoID: "multichain", Decimals: 18}, // Addr: 0x65ef703f5594d2573eb71aaf55bc0cb548492df4, Notional: 1292.8774421885998 + {TokenChain: 2, TokenAddress: "000000000000000000000000d2877702675e6ceb975b4a1dff9fb7baf4c91ea9", Symbol: "LUNA", CoingeckoID: "wrapped-terra", Decimals: 18}, // Addr: 0xd2877702675e6ceb975b4a1dff9fb7baf4c91ea9, Notional: 1.6658044409933048 + {TokenChain: 2, TokenAddress: "000000000000000000000000ac51066d7bec65dc4589368da368b212745d63e8", Symbol: "ALICE", CoingeckoID: "my-neighbor-alice", Decimals: 6}, // Addr: 0xac51066d7bec65dc4589368da368b212745d63e8, Notional: 1.52724 + {TokenChain: 2, TokenAddress: "0000000000000000000000005f98805a4e8be255a32880fdec7f6728c6568ba0", Symbol: "LUSD", CoingeckoID: "liquity-usd", Decimals: 18}, // Addr: 0x5f98805a4e8be255a32880fdec7f6728c6568ba0, Notional: 1.98991 + {TokenChain: 2, TokenAddress: "000000000000000000000000d533a949740bb3306d119cc777fa900ba034cd52", Symbol: "CRV", CoingeckoID: "curve-dao-token", Decimals: 18}, // Addr: 0xd533a949740bb3306d119cc777fa900ba034cd52, Notional: 17301.12555487081 + {TokenChain: 2, TokenAddress: "0000000000000000000000004740735aa98dc8aa232bd049f8f0210458e7fca3", Symbol: "RDT", CoingeckoID: "ridotto", Decimals: 18}, // Addr: 0x4740735aa98dc8aa232bd049f8f0210458e7fca3, Notional: 1.1142999913 + {TokenChain: 2, TokenAddress: "0000000000000000000000006b3595068778dd592e39a122f4f5a5cf09c90fe2", Symbol: "SUSHI", CoingeckoID: "sushi", Decimals: 18}, // Addr: 0x6b3595068778dd592e39a122f4f5a5cf09c90fe2, Notional: 398045.00793852203 + {TokenChain: 2, TokenAddress: "000000000000000000000000a1d6df714f91debf4e0802a542e13067f31b8262", Symbol: "RFOX", CoingeckoID: "redfox-labs-2", Decimals: 18}, // Addr: 0xa1d6df714f91debf4e0802a542e13067f31b8262, Notional: 560.95684903 + {TokenChain: 2, TokenAddress: "00000000000000000000000085eee30c52b0b379b046fb0f85f4f3dc3009afec", Symbol: "KEEP", CoingeckoID: "keep-network", Decimals: 18}, // Addr: 0x85eee30c52b0b379b046fb0f85f4f3dc3009afec, Notional: 36660.45939469872 + {TokenChain: 2, TokenAddress: "00000000000000000000000006450dee7fd2fb8e39061434babcfc05599a6fb8", Symbol: "XEN", CoingeckoID: "xen-crypto", Decimals: 18}, // Addr: 0x06450dee7fd2fb8e39061434babcfc05599a6fb8, Notional: 0.00661554894 + {TokenChain: 2, TokenAddress: "000000000000000000000000e4ab0be415e277d82c38625b72bd7dea232c2e7d", Symbol: "XRP20", CoingeckoID: "xrp20", Decimals: 18}, // Addr: 0xe4ab0be415e277d82c38625b72bd7dea232c2e7d, Notional: 27181.86455275761 + {TokenChain: 2, TokenAddress: "0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933", Symbol: "PEPE", CoingeckoID: "pepe", Decimals: 18}, // Addr: 0x6982508145454ce325ddbe47a25d4ec3d2311933, Notional: 247.75757427175748 + {TokenChain: 2, TokenAddress: "00000000000000000000000015d4c048f83bd7e37d49ea4c83a07267ec4203da", Symbol: "GALA", CoingeckoID: "gala", Decimals: 8}, // Addr: 0x15d4c048f83bd7e37d49ea4c83a07267ec4203da, Notional: 7174.087782240001 + {TokenChain: 2, TokenAddress: "00000000000000000000000012bb890508c125661e03b09ec06e404bc9289040", Symbol: "RACA", CoingeckoID: "radio-caca", Decimals: 18}, // Addr: 0x12bb890508c125661e03b09ec06e404bc9289040, Notional: 69.61078291422729 + {TokenChain: 2, TokenAddress: "0000000000000000000000005a98fcbea516cf06857215779fd812ca3bef1b32", Symbol: "LDO", CoingeckoID: "lido-dao", Decimals: 18}, // Addr: 0x5a98fcbea516cf06857215779fd812ca3bef1b32, Notional: 1467019.8599214633 + {TokenChain: 2, TokenAddress: "000000000000000000000000383518188c0c6d7730d91b2c03a03c837814a899", Symbol: "OHM", CoingeckoID: "olympus-v1", Decimals: 9}, // Addr: 0x383518188c0c6d7730d91b2c03a03c837814a899, Notional: 3.3775 + {TokenChain: 2, TokenAddress: "000000000000000000000000e516d78d784c77d479977be58905b3f2b1111126", Symbol: "SPWN", CoingeckoID: "bitspawn", Decimals: 18}, // Addr: 0xe516d78d784c77d479977be58905b3f2b1111126, Notional: 2.2913555985753598 + {TokenChain: 2, TokenAddress: "000000000000000000000000b1f66997a5760428d3a87d68b90bfe0ae64121cc", Symbol: "LUA", CoingeckoID: "lua-token", Decimals: 18}, // Addr: 0xb1f66997a5760428d3a87d68b90bfe0ae64121cc, Notional: 47950.743753400006 + {TokenChain: 2, TokenAddress: "000000000000000000000000cafe001067cdef266afb7eb5a286dcfd277f3de5", Symbol: "PSP", CoingeckoID: "paraswap", Decimals: 18}, // Addr: 0xcafe001067cdef266afb7eb5a286dcfd277f3de5, Notional: 0.0214638880036836 + {TokenChain: 2, TokenAddress: "000000000000000000000000d46ba6d942050d489dbd938a2c909a5d5039a161", Symbol: "AMPL", CoingeckoID: "ampleforth", Decimals: 9}, // Addr: 0xd46ba6d942050d489dbd938a2c909a5d5039a161, Notional: 626.999830075 + {TokenChain: 2, TokenAddress: "0000000000000000000000005b52bfb8062ce664d74bbcd4cd6dc7df53fd7233", Symbol: "ZENIQ", CoingeckoID: "zeniq", Decimals: 18}, // Addr: 0x5b52bfb8062ce664d74bbcd4cd6dc7df53fd7233, Notional: 8.117844744227197 + {TokenChain: 2, TokenAddress: "0000000000000000000000008cc0f052fff7ead7f2edcccac895502e884a8a71", Symbol: "ARTH", CoingeckoID: "arth", Decimals: 18}, // Addr: 0x8cc0f052fff7ead7f2edcccac895502e884a8a71, Notional: 9.8 + {TokenChain: 2, TokenAddress: "0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984", Symbol: "UNI", CoingeckoID: "uniswap", Decimals: 18}, // Addr: 0x1f9840a85d5af5bf1d1762f925bdaddc4201f984, Notional: 253719.9863687125 + {TokenChain: 2, TokenAddress: "000000000000000000000000e7f72bc0252ca7b16dbb72eeee1afcdb2429f2dd", Symbol: "NFTL", CoingeckoID: "nftlaunch", Decimals: 18}, // Addr: 0xe7f72bc0252ca7b16dbb72eeee1afcdb2429f2dd, Notional: 3.4683905 + {TokenChain: 2, TokenAddress: "0000000000000000000000000f5d2fb29fb7d3cfee444a200298f468908cc942", Symbol: "MANA", CoingeckoID: "decentraland", Decimals: 18}, // Addr: 0x0f5d2fb29fb7d3cfee444a200298f468908cc942, Notional: 50672.31604026055 + {TokenChain: 2, TokenAddress: "0000000000000000000000006de037ef9ad2725eb40118bb1702ebb27e4aeb24", Symbol: "RNDR", CoingeckoID: "render-token", Decimals: 18}, // Addr: 0x6de037ef9ad2725eb40118bb1702ebb27e4aeb24, Notional: 1309.2658950293999 + {TokenChain: 2, TokenAddress: "000000000000000000000000c0a4df35568f116c370e6a6a6022ceb908eeddac", Symbol: "UMEE", CoingeckoID: "umee", Decimals: 6}, // Addr: 0xc0a4df35568f116c370e6a6a6022ceb908eeddac, Notional: 1.86278 + {TokenChain: 2, TokenAddress: "0000000000000000000000001a7e4e63778b4f12a199c062f3efdd288afcbce8", Symbol: "agEUR", CoingeckoID: "ageur", Decimals: 18}, // Addr: 0x1a7e4e63778b4f12a199c062f3efdd288afcbce8, Notional: 21887.4770162721 + {TokenChain: 2, TokenAddress: "00000000000000000000000003be5c903c727ee2c8c4e9bc0acc860cca4715e2", Symbol: "CAPS", CoingeckoID: "coin-capsule", Decimals: 18}, // Addr: 0x03be5c903c727ee2c8c4e9bc0acc860cca4715e2, Notional: 4890.469548876954 + {TokenChain: 2, TokenAddress: "000000000000000000000000152649ea73beab28c5b49b26eb48f7ead6d4c898", Symbol: "Cake", CoingeckoID: "pancakeswap-token", Decimals: 18}, // Addr: 0x152649ea73beab28c5b49b26eb48f7ead6d4c898, Notional: 2.3157753895 + {TokenChain: 2, TokenAddress: "0000000000000000000000001fee5588cb1de19c70b6ad5399152d8c643fae7b", Symbol: "PHTK", CoingeckoID: "phuntoken", Decimals: 18}, // Addr: 0x1fee5588cb1de19c70b6ad5399152d8c643fae7b, Notional: 0.61817 + {TokenChain: 2, TokenAddress: "0000000000000000000000004691937a7508860f876c9c0a2a617e7d9e945d4b", Symbol: "WOO", CoingeckoID: "woo-network", Decimals: 18}, // Addr: 0x4691937a7508860f876c9c0a2a617e7d9e945d4b, Notional: 3.71534 + {TokenChain: 2, TokenAddress: "0000000000000000000000004da34f8264cb33a5c9f17081b9ef5ff6091116f4", Symbol: "ELFI", CoingeckoID: "elyfi", Decimals: 18}, // Addr: 0x4da34f8264cb33a5c9f17081b9ef5ff6091116f4, Notional: 208280.42888133234 + {TokenChain: 2, TokenAddress: "0000000000000000000000003432b6a60d23ca0dfca7761b7ab56459d9c964d0", Symbol: "FXS", CoingeckoID: "frax-share", Decimals: 18}, // Addr: 0x3432b6a60d23ca0dfca7761b7ab56459d9c964d0, Notional: 567102.0388379014 + {TokenChain: 2, TokenAddress: "000000000000000000000000caabcaa4ca42e1d86de1a201c818639def0ba7a7", Symbol: "TALK", CoingeckoID: "talken", Decimals: 18}, // Addr: 0xcaabcaa4ca42e1d86de1a201c818639def0ba7a7, Notional: 0.266845 + {TokenChain: 2, TokenAddress: "000000000000000000000000df574c24545e5ffecb9a659c229253d4111d87e1", Symbol: "HUSD", CoingeckoID: "husd", Decimals: 8}, // Addr: 0xdf574c24545e5ffecb9a659c229253d4111d87e1, Notional: 328.0906490555198 + {TokenChain: 2, TokenAddress: "000000000000000000000000c011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f", Symbol: "SNX", CoingeckoID: "havven", Decimals: 18}, // Addr: 0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f, Notional: 47.17653030140001 + {TokenChain: 2, TokenAddress: "00000000000000000000000000a8b738e453ffd858a7edf03bccfe20412f0eb0", Symbol: "ALBT", CoingeckoID: "allianceblock", Decimals: 18}, // Addr: 0x00a8b738e453ffd858a7edf03bccfe20412f0eb0, Notional: 0.15636360898833837 + {TokenChain: 2, TokenAddress: "0000000000000000000000000f51bb10119727a7e5ea3538074fb341f56b09ad", Symbol: "DAO", CoingeckoID: "dao-maker", Decimals: 18}, // Addr: 0x0f51bb10119727a7e5ea3538074fb341f56b09ad, Notional: 214.2773076953269 + {TokenChain: 2, TokenAddress: "0000000000000000000000004a220e6096b25eadb88358cb44068a3248254675", Symbol: "QNT", CoingeckoID: "quant-network", Decimals: 18}, // Addr: 0x4a220e6096b25eadb88358cb44068a3248254675, Notional: 4.715 + {TokenChain: 2, TokenAddress: "000000000000000000000000f7413489c474ca4399eee604716c72879eea3615", Symbol: "APYS", CoingeckoID: "apyswap", Decimals: 18}, // Addr: 0xf7413489c474ca4399eee604716c72879eea3615, Notional: 1.035740294718744 + {TokenChain: 2, TokenAddress: "000000000000000000000000030ba81f1c18d280636f32af80b9aad02cf0854e", Symbol: "aWETH", CoingeckoID: "aave-weth", Decimals: 18}, // Addr: 0x030ba81f1c18d280636f32af80b9aad02cf0854e, Notional: 503.2598740784 + {TokenChain: 2, TokenAddress: "000000000000000000000000249e38ea4102d0cf8264d3701f1a0e39c4f2dc3b", Symbol: "UFO", CoingeckoID: "ufo-gaming", Decimals: 18}, // Addr: 0x249e38ea4102d0cf8264d3701f1a0e39c4f2dc3b, Notional: 29.36960835456415 + {TokenChain: 2, TokenAddress: "0000000000000000000000008ab7404063ec4dbcfd4598215992dc3f8ec853d7", Symbol: "AKRO", CoingeckoID: "akropolis", Decimals: 18}, // Addr: 0x8ab7404063ec4dbcfd4598215992dc3f8ec853d7, Notional: 201.283861556574 + {TokenChain: 2, TokenAddress: "000000000000000000000000cc8fa225d80b9c7d42f96e9570156c65d6caaa25", Symbol: "SLP", CoingeckoID: "smooth-love-potion", Decimals: 0}, // Addr: 0xcc8fa225d80b9c7d42f96e9570156c65d6caaa25, Notional: 2922.2462136 + {TokenChain: 2, TokenAddress: "000000000000000000000000ac57de9c1a09fec648e93eb98875b212db0d460b", Symbol: "BabyDoge", CoingeckoID: "baby-doge-coin", Decimals: 9}, // Addr: 0xac57de9c1a09fec648e93eb98875b212db0d460b, Notional: 179.29602289282894 + {TokenChain: 2, TokenAddress: "000000000000000000000000ae7ab96520de3a18e5e111b5eaab095312d7fe84", Symbol: "stETH", CoingeckoID: "staked-ether", Decimals: 18}, // Addr: 0xae7ab96520de3a18e5e111b5eaab095312d7fe84, Notional: 3789.160476144 + {TokenChain: 2, TokenAddress: "000000000000000000000000de5ea375ffbdc8b25a80fe13d631e8ba0ab4bb02", Symbol: "GERA", CoingeckoID: "gera-coin", Decimals: 18}, // Addr: 0xde5ea375ffbdc8b25a80fe13d631e8ba0ab4bb02, Notional: 0.7331493322287667 + {TokenChain: 2, TokenAddress: "0000000000000000000000008770b7dd89e5f759ee3b226e0c45e890f87ddc48", Symbol: "MIRL", CoingeckoID: "made-in-real-life", Decimals: 18}, // Addr: 0x8770b7dd89e5f759ee3b226e0c45e890f87ddc48, Notional: 24542.468647075508 + {TokenChain: 2, TokenAddress: "000000000000000000000000485d17a6f1b8780392d53d64751824253011a260", Symbol: "TIME", CoingeckoID: "chronobank", Decimals: 8}, // Addr: 0x485d17a6f1b8780392d53d64751824253011a260, Notional: 12.843 + {TokenChain: 2, TokenAddress: "0000000000000000000000007d1afa7b718fb893db30a3abc0cfc608aacfebb0", Symbol: "MATIC", CoingeckoID: "matic-network", Decimals: 18}, // Addr: 0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0, Notional: 17044.47225104108 + {TokenChain: 2, TokenAddress: "000000000000000000000000e28b3b32b6c345a34ff64674606124dd5aceca30", Symbol: "INJ", CoingeckoID: "injective-protocol", Decimals: 18}, // Addr: 0xe28b3b32b6c345a34ff64674606124dd5aceca30, Notional: 88635.72785937149 + {TokenChain: 2, TokenAddress: "0000000000000000000000002b591e99afe9f32eaa6214f7b7629768c40eeb39", Symbol: "HEX", CoingeckoID: "hex", Decimals: 8}, // Addr: 0x2b591e99afe9f32eaa6214f7b7629768c40eeb39, Notional: 0.0082064 + {TokenChain: 2, TokenAddress: "0000000000000000000000005f944b0c4315cb7c3a846b025ab4045da44abf6c", Symbol: "GCAKE", CoingeckoID: "pancake-games", Decimals: 18}, // Addr: 0x5f944b0c4315cb7c3a846b025ab4045da44abf6c, Notional: 0.1258225842277131 + {TokenChain: 2, TokenAddress: "00000000000000000000000092d6c1e31e14520e676a687f0a93788b716beff5", Symbol: "DYDX", CoingeckoID: "dydx", Decimals: 18}, // Addr: 0x92d6c1e31e14520e676a687f0a93788b716beff5, Notional: 53669.378640444 + {TokenChain: 2, TokenAddress: "000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6", Symbol: "SPELL", CoingeckoID: "spell-token", Decimals: 18}, // Addr: 0x090185f2135308bad17527004364ebcc2d37e5f6, Notional: 0.00045225 + {TokenChain: 2, TokenAddress: "0000000000000000000000004fabb145d64652a948d72533023f6e7a623c7c53", Symbol: "BUSD", CoingeckoID: "binance-usd", Decimals: 18}, // Addr: 0x4fabb145d64652a948d72533023f6e7a623c7c53, Notional: 7535.73944188065 + {TokenChain: 2, TokenAddress: "0000000000000000000000001abaea1f7c830bd89acc67ec4af516284b1bc33c", Symbol: "EUROC", CoingeckoID: "euro-coin", Decimals: 6}, // Addr: 0x1abaea1f7c830bd89acc67ec4af516284b1bc33c, Notional: 5.387563836999999 + {TokenChain: 2, TokenAddress: "000000000000000000000000f1182229b71e79e504b1d2bf076c15a277311e05", Symbol: "LBR", CoingeckoID: "lybra-finance", Decimals: 18}, // Addr: 0xf1182229b71e79e504b1d2bf076c15a277311e05, Notional: 0.0952057 + {TokenChain: 2, TokenAddress: "000000000000000000000000888888888889c00c67689029d7856aac1065ec11", Symbol: "OPIUM", CoingeckoID: "opium", Decimals: 18}, // Addr: 0x888888888889c00c67689029d7856aac1065ec11, Notional: 0.4880246 + {TokenChain: 2, TokenAddress: "0000000000000000000000007a58c0be72be218b41c608b7fe7c5bb630736c71", Symbol: "PEOPLE", CoingeckoID: "constitutiondao", Decimals: 18}, // Addr: 0x7a58c0be72be218b41c608b7fe7c5bb630736c71, Notional: 5521.0736348459795 + {TokenChain: 2, TokenAddress: "000000000000000000000000ae1eaae3f627aaca434127644371b67b18444051", Symbol: "YOP", CoingeckoID: "yield-optimization-platform", Decimals: 8}, // Addr: 0xae1eaae3f627aaca434127644371b67b18444051, Notional: 0.076857 + {TokenChain: 2, TokenAddress: "000000000000000000000000949d48eca67b17269629c7194f4b727d4ef9e5d6", Symbol: "MC", CoingeckoID: "merit-circle", Decimals: 18}, // Addr: 0x949d48eca67b17269629c7194f4b727d4ef9e5d6, Notional: 30.678259999999998 + {TokenChain: 2, TokenAddress: "0000000000000000000000007ddc52c4de30e94be3a6a0a2b259b2850f421989", Symbol: "GMT", CoingeckoID: "gmt-token", Decimals: 18}, // Addr: 0x7ddc52c4de30e94be3a6a0a2b259b2850f421989, Notional: 152.10260382562356 + {TokenChain: 2, TokenAddress: "000000000000000000000000bcca60bb61934080951369a648fb03df4f96263c", Symbol: "aUSDC", CoingeckoID: "aave-usdc", Decimals: 6}, // Addr: 0xbcca60bb61934080951369a648fb03df4f96263c, Notional: 7.022453874 + {TokenChain: 2, TokenAddress: "0000000000000000000000000a638f07acc6969abf392bb009f216d22adea36d", Symbol: "BKN", CoingeckoID: "brickken", Decimals: 18}, // Addr: 0x0a638f07acc6969abf392bb009f216d22adea36d, Notional: 981860.9800419256 + {TokenChain: 2, TokenAddress: "000000000000000000000000d38e031f4529a07996aab977d2b79f0e00656c56", Symbol: "wTBT", CoingeckoID: "wtbt", Decimals: 18}, // Addr: 0xd38e031f4529a07996aab977d2b79f0e00656c56, Notional: 109680.91356261322 + {TokenChain: 2, TokenAddress: "00000000000000000000000066c0dded8433c9ea86c8cf91237b14e10b4d70b7", Symbol: "Mars", CoingeckoID: "mars", Decimals: 18}, // Addr: 0x66c0dded8433c9ea86c8cf91237b14e10b4d70b7, Notional: 12.95954812300448 + {TokenChain: 2, TokenAddress: "00000000000000000000000070e8de73ce538da2beed35d14187f6959a8eca96", Symbol: "XSGD", CoingeckoID: "xsgd", Decimals: 6}, // Addr: 0x70e8de73ce538da2beed35d14187f6959a8eca96, Notional: 2587.7132399713 + {TokenChain: 2, TokenAddress: "000000000000000000000000ffbf315f70e458e49229654dea4ce192d26f9b25", Symbol: "VOLT", CoingeckoID: "voltage", Decimals: 18}, // Addr: 0xffbf315f70e458e49229654dea4ce192d26f9b25, Notional: 0.347074 + {TokenChain: 2, TokenAddress: "00000000000000000000000070401dfd142a16dc7031c56e862fc88cb9537ce0", Symbol: "BIRD", CoingeckoID: "bird-money", Decimals: 18}, // Addr: 0x70401dfd142a16dc7031c56e862fc88cb9537ce0, Notional: 93.06 + {TokenChain: 2, TokenAddress: "0000000000000000000000009fda7ceec4c18008096c2fe2b85f05dc300f94d0", Symbol: "GAJ", CoingeckoID: "gaj", Decimals: 18}, // Addr: 0x9fda7ceec4c18008096c2fe2b85f05dc300f94d0, Notional: 19.390663214592504 + {TokenChain: 2, TokenAddress: "000000000000000000000000aaaebe6fe48e54f431b0c390cfaf0b017d09d42d", Symbol: "CEL", CoingeckoID: "celsius-degree-token", Decimals: 4}, // Addr: 0xaaaebe6fe48e54f431b0c390cfaf0b017d09d42d, Notional: 8735.7731229372 + {TokenChain: 2, TokenAddress: "000000000000000000000000f17e65822b568b3903685a7c9f496cf7656cc6c2", Symbol: "BICO", CoingeckoID: "biconomy", Decimals: 18}, // Addr: 0xf17e65822b568b3903685a7c9f496cf7656cc6c2, Notional: 390075.3037068151 + {TokenChain: 2, TokenAddress: "00000000000000000000000033d0568941c0c64ff7e0fb4fba0b11bd37deed9f", Symbol: "RAMP", CoingeckoID: "ramp", Decimals: 18}, // Addr: 0x33d0568941c0c64ff7e0fb4fba0b11bd37deed9f, Notional: 0.68305 + {TokenChain: 2, TokenAddress: "0000000000000000000000000bc529c00c6401aef6d220be8c6ea1667f6ad93e", Symbol: "YFI", CoingeckoID: "yearn-finance", Decimals: 18}, // Addr: 0x0bc529c00c6401aef6d220be8c6ea1667f6ad93e, Notional: 186878.1125811875 + {TokenChain: 2, TokenAddress: "00000000000000000000000046cca329970b33e1a007dd4ef0594a1cedb3e72a", Symbol: "YESP", CoingeckoID: "yesports", Decimals: 18}, // Addr: 0x46cca329970b33e1a007dd4ef0594a1cedb3e72a, Notional: 49.972031211032 + {TokenChain: 2, TokenAddress: "00000000000000000000000030d20208d987713f46dfd34ef128bb16c404d10f", Symbol: "SD", CoingeckoID: "stader", Decimals: 18}, // Addr: 0x30d20208d987713f46dfd34ef128bb16c404d10f, Notional: 346168.6168603193 + {TokenChain: 2, TokenAddress: "0000000000000000000000001494ca1f11d487c2bbe4543e90080aeba4ba3c2b", Symbol: "DPI", CoingeckoID: "defipulse-index", Decimals: 18}, // Addr: 0x1494ca1f11d487c2bbe4543e90080aeba4ba3c2b, Notional: 2.10020525 + {TokenChain: 2, TokenAddress: "0000000000000000000000002ba592f78db6436527729929aaf6c908497cb200", Symbol: "CREAM", CoingeckoID: "cream-2", Decimals: 18}, // Addr: 0x2ba592f78db6436527729929aaf6c908497cb200, Notional: 157.994609793 + {TokenChain: 2, TokenAddress: "00000000000000000000000045804880de22913dafe09f4980848ece6ecbaf78", Symbol: "PAXG", CoingeckoID: "pax-gold", Decimals: 18}, // Addr: 0x45804880de22913dafe09f4980848ece6ecbaf78, Notional: 6008.336137585001 + {TokenChain: 2, TokenAddress: "0000000000000000000000009b83f827928abdf18cf1f7e67053572b9bceff3a", Symbol: "ARTEM", CoingeckoID: "artem", Decimals: 18}, // Addr: 0x9b83f827928abdf18cf1f7e67053572b9bceff3a, Notional: 13491.314403526032 + {TokenChain: 2, TokenAddress: "000000000000000000000000111111111117dc0aa78b770fa6a738034120c302", Symbol: "1INCH", CoingeckoID: "1inch", Decimals: 18}, // Addr: 0x111111111117dc0aa78b770fa6a738034120c302, Notional: 237530.24365652178 + {TokenChain: 2, TokenAddress: "000000000000000000000000476c5e26a75bd202a9683ffd34359c0cc15be0ff", Symbol: "SRM", CoingeckoID: "serum", Decimals: 6}, // Addr: 0x476c5e26a75bd202a9683ffd34359c0cc15be0ff, Notional: 104354.39443220016 + {TokenChain: 2, TokenAddress: "00000000000000000000000069a95185ee2a045cdc4bcd1b1df10710395e4e23", Symbol: "POOLZ", CoingeckoID: "poolz-finance", Decimals: 18}, // Addr: 0x69a95185ee2a045cdc4bcd1b1df10710395e4e23, Notional: 0.0561594006 + {TokenChain: 2, TokenAddress: "000000000000000000000000a150db9b1fa65b44799d4dd949d922c0a33ee606", Symbol: "DRC", CoingeckoID: "digital-reserve-currency", Decimals: 0}, // Addr: 0xa150db9b1fa65b44799d4dd949d922c0a33ee606, Notional: 6.2238066 + {TokenChain: 2, TokenAddress: "0000000000000000000000007659ce147d0e714454073a5dd7003544234b6aa0", Symbol: "XCAD", CoingeckoID: "xcad-network", Decimals: 18}, // Addr: 0x7659ce147d0e714454073a5dd7003544234b6aa0, Notional: 6453697.642482769 + {TokenChain: 2, TokenAddress: "00000000000000000000000065e6b60ea01668634d68d0513fe814679f925bad", Symbol: "PIXEL", CoingeckoID: "pixelverse", Decimals: 18}, // Addr: 0x65e6b60ea01668634d68d0513fe814679f925bad, Notional: 37556.79507862073 + {TokenChain: 2, TokenAddress: "000000000000000000000000ff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa", Symbol: "ORBS", CoingeckoID: "orbs", Decimals: 18}, // Addr: 0xff56cc6b1e6ded347aa0b7676c85ab0b3d08b0fa, Notional: 7549.458178184998 + {TokenChain: 2, TokenAddress: "0000000000000000000000006fc13eace26590b80cccab1ba5d51890577d83b2", Symbol: "UMB", CoingeckoID: "umbrella-network", Decimals: 18}, // Addr: 0x6fc13eace26590b80cccab1ba5d51890577d83b2, Notional: 0.8824953472655125 + {TokenChain: 2, TokenAddress: "000000000000000000000000df09a216fac5adc3e640db418c0b956076509503", Symbol: "PKN", CoingeckoID: "poken", Decimals: 18}, // Addr: 0xdf09a216fac5adc3e640db418c0b956076509503, Notional: 37.752519398400004 {TokenChain: 2, TokenAddress: "00000000000000000000000005d3606d5c81eb9b7b18530995ec9b29da05faba", Symbol: "TOMOE", CoingeckoID: "tomoe", Decimals: 18}, // Addr: 0x05d3606d5c81eb9b7b18530995ec9b29da05faba, Notional: 141000 - {TokenChain: 2, TokenAddress: "0000000000000000000000003b484b82567a09e2588a13d54d032153f0c0aee0", Symbol: "SOS", CoingeckoID: "opendao", Decimals: 18}, // Addr: 0x3b484b82567a09e2588a13d54d032153f0c0aee0, Notional: 41.67398886828747 - {TokenChain: 2, TokenAddress: "0000000000000000000000002ad9addd0d97ec3cdba27f92bf6077893b76ab0b", Symbol: "PLANET", CoingeckoID: "planet-token", Decimals: 18}, // Addr: 0x2ad9addd0d97ec3cdba27f92bf6077893b76ab0b, Notional: 970011.8859110435 - {TokenChain: 2, TokenAddress: "000000000000000000000000bb0e17ef65f82ab018d8edd776e8dd940327b28b", Symbol: "AXS", CoingeckoID: "axie-infinity", Decimals: 18}, // Addr: 0xbb0e17ef65f82ab018d8edd776e8dd940327b28b, Notional: 13459.750458041999 - {TokenChain: 2, TokenAddress: "000000000000000000000000e74dc43867e0cbeb208f1a012fc60dcbbf0e3044", Symbol: "CWAP", CoingeckoID: "defire", Decimals: 18}, // Addr: 0xe74dc43867e0cbeb208f1a012fc60dcbbf0e3044, Notional: 0.0136917 - {TokenChain: 2, TokenAddress: "000000000000000000000000aee433adebe0fbb88daa47ef0c1a513caa52ef02", Symbol: "TOON", CoingeckoID: "pontoon", Decimals: 18}, // Addr: 0xaee433adebe0fbb88daa47ef0c1a513caa52ef02, Notional: 22.209686053137094 - {TokenChain: 2, TokenAddress: "000000000000000000000000fb5c6815ca3ac72ce9f5006869ae67f18bf77006", Symbol: "PSTAKE", CoingeckoID: "pstake-finance", Decimals: 18}, // Addr: 0xfb5c6815ca3ac72ce9f5006869ae67f18bf77006, Notional: 38.697853425000005 - {TokenChain: 2, TokenAddress: "000000000000000000000000a47c8bf37f92abed4a126bda807a7b7498661acd", Symbol: "UST", CoingeckoID: "wrapped-ust", Decimals: 18}, // Addr: 0xa47c8bf37f92abed4a126bda807a7b7498661acd, Notional: 5.327380804626199 - {TokenChain: 2, TokenAddress: "0000000000000000000000003301ee63fb29f863f2333bd4466acb46cd8323e6", Symbol: "AKITA", CoingeckoID: "akita-inu", Decimals: 18}, // Addr: 0x3301ee63fb29f863f2333bd4466acb46cd8323e6, Notional: 23.962743855136264 - {TokenChain: 2, TokenAddress: "000000000000000000000000db0170e2d0c1cc1b2e7a90313d9b9afa4f250289", Symbol: "ADAPAD", CoingeckoID: "adapad", Decimals: 18}, // Addr: 0xdb0170e2d0c1cc1b2e7a90313d9b9afa4f250289, Notional: 14.669538756858335 - {TokenChain: 2, TokenAddress: "000000000000000000000000362bc847a3a9637d3af6624eec853618a43ed7d2", Symbol: "PRQ", CoingeckoID: "parsiq", Decimals: 18}, // Addr: 0x362bc847a3a9637d3af6624eec853618a43ed7d2, Notional: 108.825547331774 - {TokenChain: 2, TokenAddress: "000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0xdac17f958d2ee523a2206206994597c13d831ec7, Notional: 23427112.874447484 - {TokenChain: 2, TokenAddress: "0000000000000000000000000c572544a4ee47904d54aaa6a970af96b6f00e1b", Symbol: "WAS", CoingeckoID: "wasder", Decimals: 18}, // Addr: 0x0c572544a4ee47904d54aaa6a970af96b6f00e1b, Notional: 19310.066968354982 - {TokenChain: 2, TokenAddress: "0000000000000000000000003845badade8e6dff049820680d1f14bd3903a5d0", Symbol: "SAND", CoingeckoID: "the-sandbox", Decimals: 18}, // Addr: 0x3845badade8e6dff049820680d1f14bd3903a5d0, Notional: 43225.98384830889 - {TokenChain: 2, TokenAddress: "00000000000000000000000021bfbda47a0b4b5b1248c767ee49f7caa9b23697", Symbol: "OVR", CoingeckoID: "ovr", Decimals: 18}, // Addr: 0x21bfbda47a0b4b5b1248c767ee49f7caa9b23697, Notional: 40.727399999999996 - {TokenChain: 2, TokenAddress: "00000000000000000000000051fe2e572e97bfeb1d719809d743ec2675924edc", Symbol: "VPAD", CoingeckoID: "vlaunch", Decimals: 18}, // Addr: 0x51fe2e572e97bfeb1d719809d743ec2675924edc, Notional: 3.600622812 - {TokenChain: 2, TokenAddress: "000000000000000000000000389999216860ab8e0175387a0c90e5c52522c945", Symbol: "FEG", CoingeckoID: "feg-token", Decimals: 9}, // Addr: 0x389999216860ab8e0175387a0c90e5c52522c945, Notional: 1.881682603923513 - {TokenChain: 2, TokenAddress: "0000000000000000000000009be89d2a4cd102d8fecc6bf9da793be995c22541", Symbol: "BBTC", CoingeckoID: "binance-wrapped-btc", Decimals: 8}, // Addr: 0x9be89d2a4cd102d8fecc6bf9da793be995c22541, Notional: 621.3288192 - {TokenChain: 2, TokenAddress: "0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599", Symbol: "WBTC", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599, Notional: 17152420.52404845 - {TokenChain: 2, TokenAddress: "000000000000000000000000aa2ce7ae64066175e0b90497ce7d9c190c315db4", Symbol: "Suter", CoingeckoID: "suterusu", Decimals: 18}, // Addr: 0xaa2ce7ae64066175e0b90497ce7d9c190c315db4, Notional: 25.83179829237 - {TokenChain: 2, TokenAddress: "0000000000000000000000006b4c7a5e3f0b99fcd83e9c089bddd6c7fce5c611", Symbol: "MM", CoingeckoID: "million", Decimals: 18}, // Addr: 0x6b4c7a5e3f0b99fcd83e9c089bddd6c7fce5c611, Notional: 100.08723230679999 - {TokenChain: 2, TokenAddress: "000000000000000000000000d084b83c305dafd76ae3e1b4e1f1fe2ecccb3988", Symbol: "TVK", CoingeckoID: "the-virtua-kolect", Decimals: 18}, // Addr: 0xd084b83c305dafd76ae3e1b4e1f1fe2ecccb3988, Notional: 0.1227675958692939 - {TokenChain: 2, TokenAddress: "000000000000000000000000394a16744dcd805bb0ca7252e70691f0dcac56aa", Symbol: "TRZ", CoingeckoID: "trazable", Decimals: 18}, // Addr: 0x394a16744dcd805bb0ca7252e70691f0dcac56aa, Notional: 66.82009145472347 - {TokenChain: 2, TokenAddress: "00000000000000000000000004969cd041c0cafb6ac462bd65b536a5bdb3a670", Symbol: "wOMI", CoingeckoID: "wrapped-ecomi", Decimals: 18}, // Addr: 0x04969cd041c0cafb6ac462bd65b536a5bdb3a670, Notional: 12.183087653848636 - {TokenChain: 2, TokenAddress: "000000000000000000000000d3e4ba569045546d09cf021ecc5dfe42b1d7f6e4", Symbol: "MNW", CoingeckoID: "morpheus-network", Decimals: 18}, // Addr: 0xd3e4ba569045546d09cf021ecc5dfe42b1d7f6e4, Notional: 1534.15 - {TokenChain: 2, TokenAddress: "000000000000000000000000d2be3722b17b616c51ed9b8944a227d1ce579c24", Symbol: "DTUBE", CoingeckoID: "dtube-coin", Decimals: 2}, // Addr: 0xd2be3722b17b616c51ed9b8944a227d1ce579c24, Notional: 0.03230928 - {TokenChain: 2, TokenAddress: "000000000000000000000000cb8fb2438a805664cd8c3e640b85ac473da5be87", Symbol: "CTI", CoingeckoID: "clintex-cti", Decimals: 18}, // Addr: 0xcb8fb2438a805664cd8c3e640b85ac473da5be87, Notional: 88273.69447336798 - {TokenChain: 2, TokenAddress: "000000000000000000000000e3818504c1b32bf1557b16c238b2e01fd3149c17", Symbol: "PLR", CoingeckoID: "pillar", Decimals: 18}, // Addr: 0xe3818504c1b32bf1557b16c238b2e01fd3149c17, Notional: 5.535413883352495 - {TokenChain: 2, TokenAddress: "000000000000000000000000f1f955016ecbcd7321c7266bccfb96c68ea5e49b", Symbol: "RLY", CoingeckoID: "rally-2", Decimals: 18}, // Addr: 0xf1f955016ecbcd7321c7266bccfb96c68ea5e49b, Notional: 237517.1752618442 - {TokenChain: 2, TokenAddress: "0000000000000000000000008530b66ca3ddf50e0447eae8ad7ea7d5e62762ed", Symbol: "METADOGE", CoingeckoID: "meta-doge", Decimals: 18}, // Addr: 0x8530b66ca3ddf50e0447eae8ad7ea7d5e62762ed, Notional: 6.2341500000000005 - {TokenChain: 2, TokenAddress: "0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", Symbol: "wstETH", CoingeckoID: "wrapped-steth", Decimals: 18}, // Addr: 0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0, Notional: 250928.8890975148 - {TokenChain: 2, TokenAddress: "0000000000000000000000007968bc6a03017ea2de509aaa816f163db0f35148", Symbol: "HGET", CoingeckoID: "hedget", Decimals: 6}, // Addr: 0x7968bc6a03017ea2de509aaa816f163db0f35148, Notional: 3035.015725280756 - {TokenChain: 2, TokenAddress: "000000000000000000000000da9fdab21bc4a5811134a6e0ba6ca06624e67c07", Symbol: "QUIDD", CoingeckoID: "quidd", Decimals: 18}, // Addr: 0xda9fdab21bc4a5811134a6e0ba6ca06624e67c07, Notional: 0.614282 - {TokenChain: 2, TokenAddress: "000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca", Symbol: "LINK", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0x514910771af9ca656af840dff83e8264ecf986ca, Notional: 4226476.448762478 - {TokenChain: 2, TokenAddress: "000000000000000000000000b19dd661f076998e3b0456935092a233e12c2280", Symbol: "UM", CoingeckoID: "continuum-world", Decimals: 18}, // Addr: 0xb19dd661f076998e3b0456935092a233e12c2280, Notional: 2.1931890685068156 - {TokenChain: 2, TokenAddress: "000000000000000000000000c477d038d5420c6a9e0b031712f61c5120090de9", Symbol: "BOSON", CoingeckoID: "boson-protocol", Decimals: 18}, // Addr: 0xc477d038d5420c6a9e0b031712f61c5120090de9, Notional: 135.87043448708033 - {TokenChain: 2, TokenAddress: "0000000000000000000000000f3adc247e91c3c50bc08721355a41037e89bc20", Symbol: "ANC", CoingeckoID: "anchor-protocol", Decimals: 18}, // Addr: 0x0f3adc247e91c3c50bc08721355a41037e89bc20, Notional: 20.416166355259765 - {TokenChain: 2, TokenAddress: "000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888", Symbol: "COMP", CoingeckoID: "compound-governance-token", Decimals: 18}, // Addr: 0xc00e94cb662c3520282e6f5717214004a7f26888, Notional: 424900.6151897853 - {TokenChain: 2, TokenAddress: "000000000000000000000000f8c3527cc04340b208c854e985240c02f7b7793f", Symbol: "FRONT", CoingeckoID: "frontier-token", Decimals: 18}, // Addr: 0xf8c3527cc04340b208c854e985240c02f7b7793f, Notional: 226103.29090729213 - {TokenChain: 2, TokenAddress: "000000000000000000000000965b85d4674f64422c4898c8f8083187f02b32c0", Symbol: "SFIL", CoingeckoID: "filecoin-standard-full-hashrate", Decimals: 8}, // Addr: 0x965b85d4674f64422c4898c8f8083187f02b32c0, Notional: 3.46414536 - {TokenChain: 2, TokenAddress: "000000000000000000000000bba39fd2935d5769116ce38d46a71bde9cf03099", Symbol: "CHO", CoingeckoID: "choise", Decimals: 18}, // Addr: 0xbba39fd2935d5769116ce38d46a71bde9cf03099, Notional: 137241.21918037912 - {TokenChain: 2, TokenAddress: "000000000000000000000000cbd55d4ffc43467142761a764763652b48b969ff", Symbol: "ASTRO", CoingeckoID: "astrotools", Decimals: 18}, // Addr: 0xcbd55d4ffc43467142761a764763652b48b969ff, Notional: 6.359073320240463 - {TokenChain: 2, TokenAddress: "00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f3", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3, Notional: 465.2545501197244 - {TokenChain: 2, TokenAddress: "0000000000000000000000006e9730ecffbed43fd876a264c982e254ef05a0de", Symbol: "NORD", CoingeckoID: "nord-finance", Decimals: 18}, // Addr: 0x6e9730ecffbed43fd876a264c982e254ef05a0de, Notional: 1.25968 - {TokenChain: 2, TokenAddress: "000000000000000000000000fc05987bd2be489accf0f509e44b0145d68240f7", Symbol: "ESS", CoingeckoID: "essentia", Decimals: 18}, // Addr: 0xfc05987bd2be489accf0f509e44b0145d68240f7, Notional: 0.00039745 - {TokenChain: 2, TokenAddress: "00000000000000000000000020e7125677311fca903a8897042b9983f22ea295", Symbol: "FWT", CoingeckoID: "freeway", Decimals: 18}, // Addr: 0x20e7125677311fca903a8897042b9983f22ea295, Notional: 0.043811681991425995 - {TokenChain: 2, TokenAddress: "0000000000000000000000002c537e5624e4af88a7ae4060c022609376c8d0eb", Symbol: "TRYB", CoingeckoID: "bilira", Decimals: 6}, // Addr: 0x2c537e5624e4af88a7ae4060c022609376c8d0eb, Notional: 242.72934660833764 + {TokenChain: 2, TokenAddress: "0000000000000000000000003b484b82567a09e2588a13d54d032153f0c0aee0", Symbol: "SOS", CoingeckoID: "opendao", Decimals: 18}, // Addr: 0x3b484b82567a09e2588a13d54d032153f0c0aee0, Notional: 17.68012664001508 + {TokenChain: 2, TokenAddress: "0000000000000000000000002ad9addd0d97ec3cdba27f92bf6077893b76ab0b", Symbol: "PLANET", CoingeckoID: "planet-token", Decimals: 18}, // Addr: 0x2ad9addd0d97ec3cdba27f92bf6077893b76ab0b, Notional: 1261580.971559884 + {TokenChain: 2, TokenAddress: "000000000000000000000000bb0e17ef65f82ab018d8edd776e8dd940327b28b", Symbol: "AXS", CoingeckoID: "axie-infinity", Decimals: 18}, // Addr: 0xbb0e17ef65f82ab018d8edd776e8dd940327b28b, Notional: 10097.640873937002 + {TokenChain: 2, TokenAddress: "000000000000000000000000e74dc43867e0cbeb208f1a012fc60dcbbf0e3044", Symbol: "CWAP", CoingeckoID: "defire", Decimals: 18}, // Addr: 0xe74dc43867e0cbeb208f1a012fc60dcbbf0e3044, Notional: 0.01120738 + {TokenChain: 2, TokenAddress: "000000000000000000000000aee433adebe0fbb88daa47ef0c1a513caa52ef02", Symbol: "TOON", CoingeckoID: "pontoon", Decimals: 18}, // Addr: 0xaee433adebe0fbb88daa47ef0c1a513caa52ef02, Notional: 15.910175129777432 + {TokenChain: 2, TokenAddress: "000000000000000000000000fb5c6815ca3ac72ce9f5006869ae67f18bf77006", Symbol: "PSTAKE", CoingeckoID: "pstake-finance", Decimals: 18}, // Addr: 0xfb5c6815ca3ac72ce9f5006869ae67f18bf77006, Notional: 23.48823268 + {TokenChain: 2, TokenAddress: "000000000000000000000000a47c8bf37f92abed4a126bda807a7b7498661acd", Symbol: "UST", CoingeckoID: "wrapped-ust", Decimals: 18}, // Addr: 0xa47c8bf37f92abed4a126bda807a7b7498661acd, Notional: 4.087150141651313 + {TokenChain: 2, TokenAddress: "0000000000000000000000003301ee63fb29f863f2333bd4466acb46cd8323e6", Symbol: "AKITA", CoingeckoID: "akita-inu", Decimals: 18}, // Addr: 0x3301ee63fb29f863f2333bd4466acb46cd8323e6, Notional: 33.729367450186835 + {TokenChain: 2, TokenAddress: "000000000000000000000000db0170e2d0c1cc1b2e7a90313d9b9afa4f250289", Symbol: "ADAPAD", CoingeckoID: "adapad", Decimals: 18}, // Addr: 0xdb0170e2d0c1cc1b2e7a90313d9b9afa4f250289, Notional: 18.813060013684485 + {TokenChain: 2, TokenAddress: "000000000000000000000000362bc847a3a9637d3af6624eec853618a43ed7d2", Symbol: "PRQ", CoingeckoID: "parsiq", Decimals: 18}, // Addr: 0x362bc847a3a9637d3af6624eec853618a43ed7d2, Notional: 59.31105286291718 + {TokenChain: 2, TokenAddress: "000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0xdac17f958d2ee523a2206206994597c13d831ec7, Notional: 28224716.061134 + {TokenChain: 2, TokenAddress: "0000000000000000000000000c572544a4ee47904d54aaa6a970af96b6f00e1b", Symbol: "WAS", CoingeckoID: "wasder", Decimals: 18}, // Addr: 0x0c572544a4ee47904d54aaa6a970af96b6f00e1b, Notional: 4462.935589569807 + {TokenChain: 2, TokenAddress: "0000000000000000000000003845badade8e6dff049820680d1f14bd3903a5d0", Symbol: "SAND", CoingeckoID: "the-sandbox", Decimals: 18}, // Addr: 0x3845badade8e6dff049820680d1f14bd3903a5d0, Notional: 35136.05461542141 + {TokenChain: 2, TokenAddress: "00000000000000000000000021bfbda47a0b4b5b1248c767ee49f7caa9b23697", Symbol: "OVR", CoingeckoID: "ovr", Decimals: 18}, // Addr: 0x21bfbda47a0b4b5b1248c767ee49f7caa9b23697, Notional: 31.834500000000002 + {TokenChain: 2, TokenAddress: "00000000000000000000000051fe2e572e97bfeb1d719809d743ec2675924edc", Symbol: "VPAD", CoingeckoID: "vlaunch", Decimals: 18}, // Addr: 0x51fe2e572e97bfeb1d719809d743ec2675924edc, Notional: 2.4005992940000005 + {TokenChain: 2, TokenAddress: "000000000000000000000000389999216860ab8e0175387a0c90e5c52522c945", Symbol: "FEG", CoingeckoID: "feg-token", Decimals: 9}, // Addr: 0x389999216860ab8e0175387a0c90e5c52522c945, Notional: 1.6474346034350804 + {TokenChain: 2, TokenAddress: "0000000000000000000000009be89d2a4cd102d8fecc6bf9da793be995c22541", Symbol: "BBTC", CoingeckoID: "binance-wrapped-btc", Decimals: 8}, // Addr: 0x9be89d2a4cd102d8fecc6bf9da793be995c22541, Notional: 652.9232534 + {TokenChain: 2, TokenAddress: "0000000000000000000000002260fac5e5542a773aa44fbcfedf7c193bc2c599", Symbol: "WBTC", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x2260fac5e5542a773aa44fbcfedf7c193bc2c599, Notional: 17883731.0822109 + {TokenChain: 2, TokenAddress: "00000000000000000000000033e80a92a9ea73dd02f6e732d1702d58c68388ca", Symbol: "XB", CoingeckoID: "xbanking", Decimals: 2}, // Addr: 0x33e80a92a9ea73dd02f6e732d1702d58c68388ca, Notional: 1028.613375 + {TokenChain: 2, TokenAddress: "000000000000000000000000aa2ce7ae64066175e0b90497ce7d9c190c315db4", Symbol: "Suter", CoingeckoID: "suterusu", Decimals: 18}, // Addr: 0xaa2ce7ae64066175e0b90497ce7d9c190c315db4, Notional: 25.484084470075 + {TokenChain: 2, TokenAddress: "0000000000000000000000006b4c7a5e3f0b99fcd83e9c089bddd6c7fce5c611", Symbol: "MM", CoingeckoID: "million", Decimals: 18}, // Addr: 0x6b4c7a5e3f0b99fcd83e9c089bddd6c7fce5c611, Notional: 114.0658960368 + {TokenChain: 2, TokenAddress: "000000000000000000000000d084b83c305dafd76ae3e1b4e1f1fe2ecccb3988", Symbol: "TVK", CoingeckoID: "the-virtua-kolect", Decimals: 18}, // Addr: 0xd084b83c305dafd76ae3e1b4e1f1fe2ecccb3988, Notional: 0.10175635261023329 + {TokenChain: 2, TokenAddress: "000000000000000000000000394a16744dcd805bb0ca7252e70691f0dcac56aa", Symbol: "TRZ", CoingeckoID: "trazable", Decimals: 18}, // Addr: 0x394a16744dcd805bb0ca7252e70691f0dcac56aa, Notional: 44.31274250042867 + {TokenChain: 2, TokenAddress: "00000000000000000000000004969cd041c0cafb6ac462bd65b536a5bdb3a670", Symbol: "wOMI", CoingeckoID: "wrapped-ecomi", Decimals: 18}, // Addr: 0x04969cd041c0cafb6ac462bd65b536a5bdb3a670, Notional: 19.10588112382692 + {TokenChain: 2, TokenAddress: "0000000000000000000000003a856d4effa670c54585a5d523e96513e148e95d", Symbol: "TRIAS", CoingeckoID: "trias-token", Decimals: 18}, // Addr: 0x3a856d4effa670c54585a5d523e96513e148e95d, Notional: 36.3 + {TokenChain: 2, TokenAddress: "000000000000000000000000d3e4ba569045546d09cf021ecc5dfe42b1d7f6e4", Symbol: "MNW", CoingeckoID: "morpheus-network", Decimals: 18}, // Addr: 0xd3e4ba569045546d09cf021ecc5dfe42b1d7f6e4, Notional: 33.300000000000004 + {TokenChain: 2, TokenAddress: "000000000000000000000000d2be3722b17b616c51ed9b8944a227d1ce579c24", Symbol: "DTUBE", CoingeckoID: "dtube-coin", Decimals: 2}, // Addr: 0xd2be3722b17b616c51ed9b8944a227d1ce579c24, Notional: 0.03148272 + {TokenChain: 2, TokenAddress: "00000000000000000000000024249b5a869a445c9b0ce269a08d73c618df9d21", Symbol: "ETHEREUM", CoingeckoID: "harrypottertrumphomersimpson777inu", Decimals: 8}, // Addr: 0x24249b5a869a445c9b0ce269a08d73c618df9d21, Notional: 7.227157 + {TokenChain: 2, TokenAddress: "000000000000000000000000cb8fb2438a805664cd8c3e640b85ac473da5be87", Symbol: "CTI", CoingeckoID: "clintex-cti", Decimals: 18}, // Addr: 0xcb8fb2438a805664cd8c3e640b85ac473da5be87, Notional: 67444.4372853859 + {TokenChain: 2, TokenAddress: "000000000000000000000000e3818504c1b32bf1557b16c238b2e01fd3149c17", Symbol: "PLR", CoingeckoID: "pillar", Decimals: 18}, // Addr: 0xe3818504c1b32bf1557b16c238b2e01fd3149c17, Notional: 4.210122411568652 + {TokenChain: 2, TokenAddress: "000000000000000000000000f1f955016ecbcd7321c7266bccfb96c68ea5e49b", Symbol: "RLY", CoingeckoID: "rally-2", Decimals: 18}, // Addr: 0xf1f955016ecbcd7321c7266bccfb96c68ea5e49b, Notional: 219719.37747726945 + {TokenChain: 2, TokenAddress: "0000000000000000000000008530b66ca3ddf50e0447eae8ad7ea7d5e62762ed", Symbol: "METADOGE", CoingeckoID: "meta-doge", Decimals: 18}, // Addr: 0x8530b66ca3ddf50e0447eae8ad7ea7d5e62762ed, Notional: 4.977475 + {TokenChain: 2, TokenAddress: "0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0", Symbol: "wstETH", CoingeckoID: "wrapped-steth", Decimals: 18}, // Addr: 0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0, Notional: 1523674.9386862956 + {TokenChain: 2, TokenAddress: "0000000000000000000000007968bc6a03017ea2de509aaa816f163db0f35148", Symbol: "HGET", CoingeckoID: "hedget", Decimals: 6}, // Addr: 0x7968bc6a03017ea2de509aaa816f163db0f35148, Notional: 2910.961792423764 + {TokenChain: 2, TokenAddress: "000000000000000000000000da9fdab21bc4a5811134a6e0ba6ca06624e67c07", Symbol: "QUIDD", CoingeckoID: "quidd", Decimals: 18}, // Addr: 0xda9fdab21bc4a5811134a6e0ba6ca06624e67c07, Notional: 0.63457 + {TokenChain: 2, TokenAddress: "000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca", Symbol: "LINK", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0x514910771af9ca656af840dff83e8264ecf986ca, Notional: 1558200.1991221667 + {TokenChain: 2, TokenAddress: "0000000000000000000000008353b92201f19b4812eee32efd325f7ede123718", Symbol: "SCM", CoingeckoID: "scamfari", Decimals: 18}, // Addr: 0x8353b92201f19b4812eee32efd325f7ede123718, Notional: 7250.562510000001 + {TokenChain: 2, TokenAddress: "0000000000000000000000008f006d1e1d9dc6c98996f50a4c810f17a47fbf19", Symbol: "NSFW", CoingeckoID: "pleasure-coin", Decimals: 18}, // Addr: 0x8f006d1e1d9dc6c98996f50a4c810f17a47fbf19, Notional: 1076.9040020775506 + {TokenChain: 2, TokenAddress: "000000000000000000000000b19dd661f076998e3b0456935092a233e12c2280", Symbol: "UM", CoingeckoID: "continuum-world", Decimals: 18}, // Addr: 0xb19dd661f076998e3b0456935092a233e12c2280, Notional: 0.9221357048634137 + {TokenChain: 2, TokenAddress: "000000000000000000000000c477d038d5420c6a9e0b031712f61c5120090de9", Symbol: "BOSON", CoingeckoID: "boson-protocol", Decimals: 18}, // Addr: 0xc477d038d5420c6a9e0b031712f61c5120090de9, Notional: 174.11569517455277 + {TokenChain: 2, TokenAddress: "0000000000000000000000000f3adc247e91c3c50bc08721355a41037e89bc20", Symbol: "ANC", CoingeckoID: "anchor-protocol", Decimals: 18}, // Addr: 0x0f3adc247e91c3c50bc08721355a41037e89bc20, Notional: 21.662074667154943 + {TokenChain: 2, TokenAddress: "000000000000000000000000c00e94cb662c3520282e6f5717214004a7f26888", Symbol: "COMP", CoingeckoID: "compound-governance-token", Decimals: 18}, // Addr: 0xc00e94cb662c3520282e6f5717214004a7f26888, Notional: 262994.29167812853 + {TokenChain: 2, TokenAddress: "000000000000000000000000f8c3527cc04340b208c854e985240c02f7b7793f", Symbol: "FRONT", CoingeckoID: "frontier-token", Decimals: 18}, // Addr: 0xf8c3527cc04340b208c854e985240c02f7b7793f, Notional: 1041.3925302569828 + {TokenChain: 2, TokenAddress: "000000000000000000000000965b85d4674f64422c4898c8f8083187f02b32c0", Symbol: "SFIL", CoingeckoID: "filecoin-standard-full-hashrate", Decimals: 8}, // Addr: 0x965b85d4674f64422c4898c8f8083187f02b32c0, Notional: 2.3417294419999997 + {TokenChain: 2, TokenAddress: "000000000000000000000000bba39fd2935d5769116ce38d46a71bde9cf03099", Symbol: "CHO", CoingeckoID: "choise", Decimals: 18}, // Addr: 0xbba39fd2935d5769116ce38d46a71bde9cf03099, Notional: 61104.873883952314 + {TokenChain: 2, TokenAddress: "000000000000000000000000cbd55d4ffc43467142761a764763652b48b969ff", Symbol: "ASTRO", CoingeckoID: "astrotools", Decimals: 18}, // Addr: 0xcbd55d4ffc43467142761a764763652b48b969ff, Notional: 5.5463463276393385 + {TokenChain: 2, TokenAddress: "00000000000000000000000099d8a9c45b2eca8864373a26d1459e3dff1e17f3", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0x99d8a9c45b2eca8864373a26d1459e3dff1e17f3, Notional: 474.34087624614 + {TokenChain: 2, TokenAddress: "0000000000000000000000006e9730ecffbed43fd876a264c982e254ef05a0de", Symbol: "NORD", CoingeckoID: "nord-finance", Decimals: 18}, // Addr: 0x6e9730ecffbed43fd876a264c982e254ef05a0de, Notional: 1.0667600000000002 + {TokenChain: 2, TokenAddress: "000000000000000000000000fc05987bd2be489accf0f509e44b0145d68240f7", Symbol: "ESS", CoingeckoID: "essentia", Decimals: 18}, // Addr: 0xfc05987bd2be489accf0f509e44b0145d68240f7, Notional: 0.00064911 + {TokenChain: 2, TokenAddress: "00000000000000000000000020e7125677311fca903a8897042b9983f22ea295", Symbol: "FWT", CoingeckoID: "freeway", Decimals: 18}, // Addr: 0x20e7125677311fca903a8897042b9983f22ea295, Notional: 0.0087611739763698 + {TokenChain: 2, TokenAddress: "0000000000000000000000002c537e5624e4af88a7ae4060c022609376c8d0eb", Symbol: "TRYB", CoingeckoID: "bilira", Decimals: 6}, // Addr: 0x2c537e5624e4af88a7ae4060c022609376c8d0eb, Notional: 238.0023341001499 {TokenChain: 2, TokenAddress: "000000000000000000000000309627af60f0926daa6041b8279484312f2bf060", Symbol: "USDB", CoingeckoID: "usd-bancor", Decimals: 18}, // Addr: 0x309627af60f0926daa6041b8279484312f2bf060, Notional: 0.00000246177 - {TokenChain: 2, TokenAddress: "00000000000000000000000095ad61b0a150d79219dcf64e1e6cc01f0b64c4ce", Symbol: "SHIB", CoingeckoID: "shiba-inu", Decimals: 18}, // Addr: 0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce, Notional: 77197.5215526278 - {TokenChain: 2, TokenAddress: "0000000000000000000000004e15361fd6b4bb609fa63c81a2be19d873717870", Symbol: "FTM", CoingeckoID: "wrapped-fantom", Decimals: 18}, // Addr: 0x4e15361fd6b4bb609fa63c81a2be19d873717870, Notional: 197.8006599543096 - {TokenChain: 2, TokenAddress: "000000000000000000000000f16e81dce15b08f326220742020379b855b87df9", Symbol: "ICE", CoingeckoID: "ice-token", Decimals: 18}, // Addr: 0xf16e81dce15b08f326220742020379b855b87df9, Notional: 0.661276 - {TokenChain: 2, TokenAddress: "0000000000000000000000003506424f91fd33084466f402d5d97f05f8e3b4af", Symbol: "CHZ", CoingeckoID: "chiliz", Decimals: 18}, // Addr: 0x3506424f91fd33084466f402d5d97f05f8e3b4af, Notional: 27494.591695205923 - {TokenChain: 2, TokenAddress: "0000000000000000000000003d371413dd5489f3a04c07c0c2ce369c20986ceb", Symbol: "YOUC", CoingeckoID: "youcash", Decimals: 10}, // Addr: 0x3d371413dd5489f3a04c07c0c2ce369c20986ceb, Notional: 12229.501855386441 - {TokenChain: 2, TokenAddress: "0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f", Symbol: "gOHM", CoingeckoID: "governance-ohm", Decimals: 18}, // Addr: 0x0ab87046fbb341d058f17cbc4c1133f25a20a52f, Notional: 471.53559274950004 - {TokenChain: 2, TokenAddress: "00000000000000000000000040d1f63b5d2048e67e9bedb1b4c2f1a9fb4b6817", Symbol: "GOLD", CoingeckoID: "golden-goose", Decimals: 18}, // Addr: 0x40d1f63b5d2048e67e9bedb1b4c2f1a9fb4b6817, Notional: 0.0000732083775 - {TokenChain: 2, TokenAddress: "0000000000000000000000006149c26cd2f7b5ccdb32029af817123f6e37df5b", Symbol: "LPOOL", CoingeckoID: "launchpool", Decimals: 18}, // Addr: 0x6149c26cd2f7b5ccdb32029af817123f6e37df5b, Notional: 0.176419 - {TokenChain: 2, TokenAddress: "000000000000000000000000f418588522d5dd018b425e472991e52ebbeeeeee", Symbol: "PUSH", CoingeckoID: "ethereum-push-notification-service", Decimals: 18}, // Addr: 0xf418588522d5dd018b425e472991e52ebbeeeeee, Notional: 0.224514 - {TokenChain: 2, TokenAddress: "00000000000000000000000072b886d09c117654ab7da13a14d603001de0b777", Symbol: "XDEFI", CoingeckoID: "xdefi", Decimals: 18}, // Addr: 0x72b886d09c117654ab7da13a14d603001de0b777, Notional: 134609.40794948727 - {TokenChain: 2, TokenAddress: "000000000000000000000000f3ae5d769e153ef72b4e3591ac004e89f48107a1", Symbol: "DPR", CoingeckoID: "deeper-network", Decimals: 18}, // Addr: 0xf3ae5d769e153ef72b4e3591ac004e89f48107a1, Notional: 77.28173104956542 - {TokenChain: 2, TokenAddress: "0000000000000000000000001a3496c18d558bd9c6c8f609e1b129f67ab08163", Symbol: "DEP", CoingeckoID: "deapcoin", Decimals: 18}, // Addr: 0x1a3496c18d558bd9c6c8f609e1b129f67ab08163, Notional: 0.00118308 - {TokenChain: 2, TokenAddress: "000000000000000000000000d69f306549e9d96f183b1aeca30b8f4353c2ecc3", Symbol: "MCHC", CoingeckoID: "mch-coin", Decimals: 18}, // Addr: 0xd69f306549e9d96f183b1aeca30b8f4353c2ecc3, Notional: 468.094880767279 - {TokenChain: 2, TokenAddress: "00000000000000000000000003ab458634910aad20ef5f1c8ee96f1d6ac54919", Symbol: "RAI", CoingeckoID: "rai", Decimals: 18}, // Addr: 0x03ab458634910aad20ef5f1c8ee96f1d6ac54919, Notional: 8.25 - {TokenChain: 2, TokenAddress: "000000000000000000000000761d38e5ddf6ccf6cf7c55759d5210750b5d60f3", Symbol: "ELON", CoingeckoID: "dogelon-mars", Decimals: 18}, // Addr: 0x761d38e5ddf6ccf6cf7c55759d5210750b5d60f3, Notional: 836.7981064319912 - {TokenChain: 2, TokenAddress: "00000000000000000000000018084fba666a33d37592fa2633fd49a74dd93a88", Symbol: "tBTC", CoingeckoID: "tbtc", Decimals: 18}, // Addr: 0x18084fba666a33d37592fa2633fd49a74dd93a88, Notional: 5158580.288152199 - {TokenChain: 2, TokenAddress: "000000000000000000000000f6e06b54855eff198a2d9a8686113665499a6134", Symbol: "Celt", CoingeckoID: "celestial", Decimals: 18}, // Addr: 0xf6e06b54855eff198a2d9a8686113665499a6134, Notional: 0.09774009000000002 - {TokenChain: 2, TokenAddress: "000000000000000000000000221657776846890989a759ba2973e427dff5c9bb", Symbol: "REPv2", CoingeckoID: "augur", Decimals: 18}, // Addr: 0x221657776846890989a759ba2973e427dff5c9bb, Notional: 1.55 - {TokenChain: 2, TokenAddress: "0000000000000000000000009fa69536d1cda4a04cfb50688294de75b505a9ae", Symbol: "DERC", CoingeckoID: "derace", Decimals: 18}, // Addr: 0x9fa69536d1cda4a04cfb50688294de75b505a9ae, Notional: 15.7177 - {TokenChain: 2, TokenAddress: "00000000000000000000000033f391f4c4fe802b70b77ae37670037a92114a7c", Symbol: "BURP", CoingeckoID: "burp", Decimals: 18}, // Addr: 0x33f391f4c4fe802b70b77ae37670037a92114a7c, Notional: 0.6046101279004708 - {TokenChain: 2, TokenAddress: "0000000000000000000000003593d125a4f7849a1b059e64f4517a86dd60c95d", Symbol: "OM", CoingeckoID: "mantra-dao", Decimals: 18}, // Addr: 0x3593d125a4f7849a1b059e64f4517a86dd60c95d, Notional: 37.487077958084335 - {TokenChain: 2, TokenAddress: "000000000000000000000000c944e90c64b2c07662a292be6244bdf05cda44a7", Symbol: "GRT", CoingeckoID: "the-graph", Decimals: 18}, // Addr: 0xc944e90c64b2c07662a292be6244bdf05cda44a7, Notional: 80686.34794257452 - {TokenChain: 2, TokenAddress: "0000000000000000000000004bd70556ae3f8a6ec6c4080a0c327b24325438f3", Symbol: "HXRO", CoingeckoID: "hxro", Decimals: 18}, // Addr: 0x4bd70556ae3f8a6ec6c4080a0c327b24325438f3, Notional: 64017311.16611458 - {TokenChain: 2, TokenAddress: "00000000000000000000000087edffde3e14c7a66c9b9724747a1c5696b742e6", Symbol: "SWAG", CoingeckoID: "swag-finance", Decimals: 18}, // Addr: 0x87edffde3e14c7a66c9b9724747a1c5696b742e6, Notional: 76.53735297 - {TokenChain: 2, TokenAddress: "0000000000000000000000004674672bcddda2ea5300f5207e1158185c944bc0", Symbol: "GXT", CoingeckoID: "gem-exchange-and-trading", Decimals: 18}, // Addr: 0x4674672bcddda2ea5300f5207e1158185c944bc0, Notional: 118344.06849381096 - {TokenChain: 2, TokenAddress: "000000000000000000000000f629cbd94d3791c9250152bd8dfbdf380e2a3b9c", Symbol: "ENJ", CoingeckoID: "enjincoin", Decimals: 18}, // Addr: 0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c, Notional: 555.3150315020399 - {TokenChain: 2, TokenAddress: "00000000000000000000000058b6a8a3302369daec383334672404ee733ab239", Symbol: "LPT", CoingeckoID: "livepeer", Decimals: 18}, // Addr: 0x58b6a8a3302369daec383334672404ee733ab239, Notional: 8.0720929688 - {TokenChain: 2, TokenAddress: "00000000000000000000000022c5543d1a35178cb03b33f929a959145e538532", Symbol: "WAL", CoingeckoID: "the-wasted-lands", Decimals: 18}, // Addr: 0x22c5543d1a35178cb03b33f929a959145e538532, Notional: 9.723774709894673 - {TokenChain: 2, TokenAddress: "0000000000000000000000002781246fe707bb15cee3e5ea354e2154a2877b16", Symbol: "EL", CoingeckoID: "elysia", Decimals: 18}, // Addr: 0x2781246fe707bb15cee3e5ea354e2154a2877b16, Notional: 21281.982995113573 - {TokenChain: 2, TokenAddress: "0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381", Symbol: "APE", CoingeckoID: "apecoin", Decimals: 18}, // Addr: 0x4d224452801aced8b2f0aebe155379bb5d594381, Notional: 121.02774888300002 - {TokenChain: 2, TokenAddress: "00000000000000000000000018aaa7115705e8be94bffebde57af9bfc265b998", Symbol: "AUDIO", CoingeckoID: "audius", Decimals: 18}, // Addr: 0x18aaa7115705e8be94bffebde57af9bfc265b998, Notional: 3491682.3785606045 - {TokenChain: 2, TokenAddress: "000000000000000000000000fd09911130e6930bf87f2b0554c44f400bd80d3e", Symbol: "ETHIX", CoingeckoID: "ethichub", Decimals: 18}, // Addr: 0xfd09911130e6930bf87f2b0554c44f400bd80d3e, Notional: 1780808.9775989074 - {TokenChain: 2, TokenAddress: "0000000000000000000000000316eb71485b0ab14103307bf65a021042c6d380", Symbol: "HBTC", CoingeckoID: "huobi-btc", Decimals: 18}, // Addr: 0x0316eb71485b0ab14103307bf65a021042c6d380, Notional: 5793.6179868 - {TokenChain: 2, TokenAddress: "0000000000000000000000009d71ce49ab8a0e6d2a1e7bfb89374c9392fd6804", Symbol: "Nvir", CoingeckoID: "nvirworld", Decimals: 18}, // Addr: 0x9d71ce49ab8a0e6d2a1e7bfb89374c9392fd6804, Notional: 116.18834999999999 - {TokenChain: 2, TokenAddress: "000000000000000000000000ae6e307c3fe9e922e5674dbd7f830ed49c014c6b", Symbol: "CREDI", CoingeckoID: "credefi", Decimals: 18}, // Addr: 0xae6e307c3fe9e922e5674dbd7f830ed49c014c6b, Notional: 19677.97950796326 - {TokenChain: 2, TokenAddress: "0000000000000000000000001796ae0b0fa4862485106a0de9b654efe301d0b2", Symbol: "PMON", CoingeckoID: "polychain-monsters", Decimals: 18}, // Addr: 0x1796ae0b0fa4862485106a0de9b654efe301d0b2, Notional: 18.15041609072571 - {TokenChain: 2, TokenAddress: "0000000000000000000000006911f552842236bd9e8ea8ddbb3fb414e2c5fa9d", Symbol: "SNP", CoingeckoID: "synapse-network", Decimals: 18}, // Addr: 0x6911f552842236bd9e8ea8ddbb3fb414e2c5fa9d, Notional: 37.39321703476399 - {TokenChain: 2, TokenAddress: "000000000000000000000000ea068fba19ce95f12d252ad8cb2939225c4ea02d", Symbol: "FIEF", CoingeckoID: "fief", Decimals: 18}, // Addr: 0xea068fba19ce95f12d252ad8cb2939225c4ea02d, Notional: 72756.68001637088 - {TokenChain: 2, TokenAddress: "00000000000000000000000097a9bac06f90940bce9caec2b880ff17707519e4", Symbol: "MNTO", CoingeckoID: "minato", Decimals: 18}, // Addr: 0x97a9bac06f90940bce9caec2b880ff17707519e4, Notional: 120.542603064 - {TokenChain: 2, TokenAddress: "000000000000000000000000eb4c2781e4eba804ce9a9803c67d0893436bb27d", Symbol: "renBTC", CoingeckoID: "renbtc", Decimals: 8}, // Addr: 0xeb4c2781e4eba804ce9a9803c67d0893436bb27d, Notional: 28.452 - {TokenChain: 2, TokenAddress: "00000000000000000000000008389495d7456e1951ddf7c3a1314a4bfb646d8b", Symbol: "CRPT", CoingeckoID: "crypterium", Decimals: 18}, // Addr: 0x08389495d7456e1951ddf7c3a1314a4bfb646d8b, Notional: 2.904892 - {TokenChain: 2, TokenAddress: "000000000000000000000000d1ba9bac957322d6e8c07a160a3a8da11a0d2867", Symbol: "HMT", CoingeckoID: "human-protocol", Decimals: 18}, // Addr: 0xd1ba9bac957322d6e8c07a160a3a8da11a0d2867, Notional: 37.487039589999995 - {TokenChain: 2, TokenAddress: "000000000000000000000000420412e765bfa6d85aaac94b4f7b708c89be2e2b", Symbol: "BRZ", CoingeckoID: "brz", Decimals: 4}, // Addr: 0x420412e765bfa6d85aaac94b4f7b708c89be2e2b, Notional: 21.499152 - {TokenChain: 2, TokenAddress: "000000000000000000000000e53ec727dbdeb9e2d5456c3be40cff031ab40a55", Symbol: "SUPER", CoingeckoID: "superfarm", Decimals: 18}, // Addr: 0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55, Notional: 9.0682 - {TokenChain: 2, TokenAddress: "000000000000000000000000138c2f1123cf3f82e4596d097c118eac6684940b", Symbol: "ALPHA", CoingeckoID: "alphacoin", Decimals: 18}, // Addr: 0x138c2f1123cf3f82e4596d097c118eac6684940b, Notional: 0.10180269 - {TokenChain: 2, TokenAddress: "000000000000000000000000e0b9a2c3e9f40cf74b2c7f591b2b0cca055c3112", Symbol: "GS", CoingeckoID: "genesis-shards", Decimals: 18}, // Addr: 0xe0b9a2c3e9f40cf74b2c7f591b2b0cca055c3112, Notional: 0.7554416892461208 - {TokenChain: 2, TokenAddress: "0000000000000000000000001c48f86ae57291f7686349f12601910bd8d470bb", Symbol: "USDK", CoingeckoID: "usdk", Decimals: 18}, // Addr: 0x1c48f86ae57291f7686349f12601910bd8d470bb, Notional: 10813.39344273026 - {TokenChain: 2, TokenAddress: "000000000000000000000000bc396689893d065f41bc2c6ecbee5e0085233447", Symbol: "PERP", CoingeckoID: "perpetual-protocol", Decimals: 18}, // Addr: 0xbc396689893d065f41bc2c6ecbee5e0085233447, Notional: 8856.220070334539 - {TokenChain: 2, TokenAddress: "0000000000000000000000002e95cea14dd384429eb3c4331b776c4cfbb6fcd9", Symbol: "THN", CoingeckoID: "throne", Decimals: 18}, // Addr: 0x2e95cea14dd384429eb3c4331b776c4cfbb6fcd9, Notional: 0.78314364 - {TokenChain: 2, TokenAddress: "000000000000000000000000ebd9d99a3982d547c5bb4db7e3b1f9f14b67eb83", Symbol: "ID", CoingeckoID: "everid", Decimals: 18}, // Addr: 0xebd9d99a3982d547c5bb4db7e3b1f9f14b67eb83, Notional: 1304.110580812915 - {TokenChain: 2, TokenAddress: "0000000000000000000000007e9c15c43f0d6c4a12e6bdff7c7d55d0f80e3e23", Symbol: "ASTRADAO", CoingeckoID: "astra-dao", Decimals: 18}, // Addr: 0x7e9c15c43f0d6c4a12e6bdff7c7d55d0f80e3e23, Notional: 15.413210617209591 - {TokenChain: 2, TokenAddress: "000000000000000000000000e3c408bd53c31c085a1746af401a4042954ff740", Symbol: "GMT", CoingeckoID: "stepn", Decimals: 8}, // Addr: 0xe3c408bd53c31c085a1746af401a4042954ff740, Notional: 19.823935 - {TokenChain: 2, TokenAddress: "000000000000000000000000081131434f93063751813c619ecca9c4dc7862a3", Symbol: "DAR", CoingeckoID: "mines-of-dalarnia", Decimals: 6}, // Addr: 0x081131434f93063751813c619ecca9c4dc7862a3, Notional: 104.209873462943 - {TokenChain: 2, TokenAddress: "000000000000000000000000727f064a78dc734d33eec18d5370aef32ffd46e4", Symbol: "ORION", CoingeckoID: "orion-money", Decimals: 18}, // Addr: 0x727f064a78dc734d33eec18d5370aef32ffd46e4, Notional: 113436.8935987519 - {TokenChain: 2, TokenAddress: "00000000000000000000000041e5560054824ea6b0732e656e3ad64e20e94e45", Symbol: "CVC", CoingeckoID: "civic", Decimals: 8}, // Addr: 0x41e5560054824ea6b0732e656e3ad64e20e94e45, Notional: 17.007 - {TokenChain: 2, TokenAddress: "0000000000000000000000004730fb1463a6f1f44aeb45f6c5c422427f37f4d0", Symbol: "FOUR", CoingeckoID: "the-4th-pillar", Decimals: 18}, // Addr: 0x4730fb1463a6f1f44aeb45f6c5c422427f37f4d0, Notional: 4653.936038802696 - {TokenChain: 2, TokenAddress: "00000000000000000000000050d1c9771902476076ecfc8b2a83ad6b9355a4c9", Symbol: "FTX Token", CoingeckoID: "ftx-token", Decimals: 18}, // Addr: 0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9, Notional: 3742798.8356067203 - {TokenChain: 2, TokenAddress: "000000000000000000000000d13cfd3133239a3c73a9e535a5c4dadee36b395c", Symbol: "VAI", CoingeckoID: "vaiot", Decimals: 18}, // Addr: 0xd13cfd3133239a3c73a9e535a5c4dadee36b395c, Notional: 2.22372 - {TokenChain: 2, TokenAddress: "0000000000000000000000007495e5cc8f27e0bd5bd4cb86d17f0d841ca58ee4", Symbol: "ARNC", CoingeckoID: "arnoya-classic", Decimals: 18}, // Addr: 0x7495e5cc8f27e0bd5bd4cb86d17f0d841ca58ee4, Notional: 1538.56621569 - {TokenChain: 2, TokenAddress: "000000000000000000000000808507121b80c02388fad14726482e061b8da827", Symbol: "PENDLE", CoingeckoID: "pendle", Decimals: 18}, // Addr: 0x808507121b80c02388fad14726482e061b8da827, Notional: 1022911.0622779917 - {TokenChain: 2, TokenAddress: "000000000000000000000000e831f96a7a1dce1aa2eb760b1e296c6a74caa9d5", Symbol: "NEXM", CoingeckoID: "nexum", Decimals: 8}, // Addr: 0xe831f96a7a1dce1aa2eb760b1e296c6a74caa9d5, Notional: 143890.4889811247 - {TokenChain: 2, TokenAddress: "0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef", Symbol: "BAT", CoingeckoID: "basic-attention-token", Decimals: 18}, // Addr: 0x0d8775f648430679a709e98d2b0cb6250d2887ef, Notional: 64636.00891766789 - {TokenChain: 2, TokenAddress: "000000000000000000000000c4c2614e694cf534d407ee49f8e44d125e4681c4", Symbol: "CHAIN", CoingeckoID: "chain-games", Decimals: 18}, // Addr: 0xc4c2614e694cf534d407ee49f8e44d125e4681c4, Notional: 48.80877397532461 - {TokenChain: 2, TokenAddress: "0000000000000000000000006ec8a24cabdc339a06a172f8223ea557055adaa5", Symbol: "GNX", CoingeckoID: "genaro-network", Decimals: 9}, // Addr: 0x6ec8a24cabdc339a06a172f8223ea557055adaa5, Notional: 1.4751657 - {TokenChain: 2, TokenAddress: "000000000000000000000000721a1b990699ee9d90b6327faad0a3e840ae8335", Symbol: "LOOT", CoingeckoID: "loot", Decimals: 18}, // Addr: 0x721a1b990699ee9d90b6327faad0a3e840ae8335, Notional: 44.91109 - {TokenChain: 2, TokenAddress: "00000000000000000000000080d55c03180349fff4a229102f62328220a96444", Symbol: "OPUL", CoingeckoID: "opulous", Decimals: 18}, // Addr: 0x80d55c03180349fff4a229102f62328220a96444, Notional: 0.74809 - {TokenChain: 2, TokenAddress: "0000000000000000000000005de8ab7e27f6e7a1fff3e5b337584aa43961beef", Symbol: "SDEX", CoingeckoID: "smardex", Decimals: 18}, // Addr: 0x5de8ab7e27f6e7a1fff3e5b337584aa43961beef, Notional: 20352633.209856294 - {TokenChain: 2, TokenAddress: "000000000000000000000000b50721bcf8d664c30412cfbc6cf7a15145234ad1", Symbol: "ARB", CoingeckoID: "arbitrum", Decimals: 18}, // Addr: 0xb50721bcf8d664c30412cfbc6cf7a15145234ad1, Notional: 50.898321421599995 - {TokenChain: 2, TokenAddress: "0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c", Symbol: "BNT", CoingeckoID: "bancor", Decimals: 18}, // Addr: 0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c, Notional: 3.67135 - {TokenChain: 2, TokenAddress: "000000000000000000000000d7c302fc3ac829c7e896a32c4bd126f3e8bd0a1f", Symbol: "B2M", CoingeckoID: "bit2me", Decimals: 18}, // Addr: 0xd7c302fc3ac829c7e896a32c4bd126f3e8bd0a1f, Notional: 0.0038176139193426 - {TokenChain: 2, TokenAddress: "000000000000000000000000e1c7e30c42c24582888c758984f6e382096786bd", Symbol: "XCUR", CoingeckoID: "curate", Decimals: 8}, // Addr: 0xe1c7e30c42c24582888c758984f6e382096786bd, Notional: 0.03948176 - {TokenChain: 2, TokenAddress: "000000000000000000000000968f6f898a6df937fc1859b323ac2f14643e3fed", Symbol: "NWC", CoingeckoID: "newscrypto-coin", Decimals: 18}, // Addr: 0x968f6f898a6df937fc1859b323ac2f14643e3fed, Notional: 0.054841 - {TokenChain: 2, TokenAddress: "0000000000000000000000008cb1d155a5a1d5d667611b7710920fd9d1cd727f", Symbol: "AIRx", CoingeckoID: "aircoins", Decimals: 8}, // Addr: 0x8cb1d155a5a1d5d667611b7710920fd9d1cd727f, Notional: 0.0010760000000000001 - {TokenChain: 2, TokenAddress: "000000000000000000000000d49efa7bc0d339d74f487959c573d518ba3f8437", Symbol: "COLI", CoingeckoID: "shield-finance", Decimals: 18}, // Addr: 0xd49efa7bc0d339d74f487959c573d518ba3f8437, Notional: 99390.29097107126 - {TokenChain: 2, TokenAddress: "000000000000000000000000853d955acef822db058eb8505911ed77f175b99e", Symbol: "FRAX", CoingeckoID: "frax", Decimals: 18}, // Addr: 0x853d955acef822db058eb8505911ed77f175b99e, Notional: 116125.78766145189 - {TokenChain: 2, TokenAddress: "000000000000000000000000e9b7b5d5e8d2bcc78884f9f9099bfa42a9e5c1a5", Symbol: "ZENF", CoingeckoID: "zenland", Decimals: 18}, // Addr: 0xe9b7b5d5e8d2bcc78884f9f9099bfa42a9e5c1a5, Notional: 323788.83366205 - {TokenChain: 2, TokenAddress: "0000000000000000000000008ce9137d39326ad0cd6491fb5cc0cba0e089b6a9", Symbol: "SXP", CoingeckoID: "swipe", Decimals: 18}, // Addr: 0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9, Notional: 85978.06878609858 - {TokenChain: 2, TokenAddress: "000000000000000000000000d7dcd9b99787c619b4d57979521258d1a7267ad7", Symbol: "EVRY", CoingeckoID: "evrynet", Decimals: 18}, // Addr: 0xd7dcd9b99787c619b4d57979521258d1a7267ad7, Notional: 0.35170176 - {TokenChain: 2, TokenAddress: "000000000000000000000000046eee2cc3188071c02bfc1745a6b17c656e3f3d", Symbol: "RLB", CoingeckoID: "rollbit-coin", Decimals: 18}, // Addr: 0x046eee2cc3188071c02bfc1745a6b17c656e3f3d, Notional: 7.934099999999999 - {TokenChain: 2, TokenAddress: "00000000000000000000000043d4a3cd90ddd2f8f4f693170c9c8098163502ad", Symbol: "D2D", CoingeckoID: "prime", Decimals: 18}, // Addr: 0x43d4a3cd90ddd2f8f4f693170c9c8098163502ad, Notional: 1894.3772244180536 - {TokenChain: 2, TokenAddress: "0000000000000000000000001c4853ec0d55e420002c5efabc7ed8e0ba7a4121", Symbol: "Okinami", CoingeckoID: "kanagawa-nami", Decimals: 9}, // Addr: 0x1c4853ec0d55e420002c5efabc7ed8e0ba7a4121, Notional: 8.147594771619303 - {TokenChain: 2, TokenAddress: "000000000000000000000000b8e2e2101ed11e9138803cd3e06e16dd19910647", Symbol: "ARDX", CoingeckoID: "ardcoin", Decimals: 2}, // Addr: 0xb8e2e2101ed11e9138803cd3e06e16dd19910647, Notional: 6155.6999388 - {TokenChain: 2, TokenAddress: "000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df", Symbol: "ALCX", CoingeckoID: "alchemix", Decimals: 18}, // Addr: 0xdbdb4d16eda451d0503b854cf79d55697f90c8df, Notional: 0.0128 - {TokenChain: 2, TokenAddress: "000000000000000000000000d373576a9e738f37dc6882328358ff69c4caf4c6", Symbol: "ZAM", CoingeckoID: "zam-io", Decimals: 18}, // Addr: 0xd373576a9e738f37dc6882328358ff69c4caf4c6, Notional: 0.025579499999999998 - {TokenChain: 2, TokenAddress: "000000000000000000000000b8c77482e45f1f44de1745f52c74426c631bdd52", Symbol: "BNB", CoingeckoID: "binancecoin", Decimals: 18}, // Addr: 0xb8c77482e45f1f44de1745f52c74426c631bdd52, Notional: 6826.5784405076 - {TokenChain: 2, TokenAddress: "0000000000000000000000007697b462a7c4ff5f8b55bdbc2f4076c2af9cf51a", Symbol: "SARCO", CoingeckoID: "sarcophagus", Decimals: 18}, // Addr: 0x7697b462a7c4ff5f8b55bdbc2f4076c2af9cf51a, Notional: 3.23942370086164 - {TokenChain: 2, TokenAddress: "000000000000000000000000cb84d72e61e383767c4dfeb2d8ff7f4fb89abc6e", Symbol: "VEGA", CoingeckoID: "vega-protocol", Decimals: 18}, // Addr: 0xcb84d72e61e383767c4dfeb2d8ff7f4fb89abc6e, Notional: 28.522225 - {TokenChain: 2, TokenAddress: "000000000000000000000000009178997aff09a67d4caccfeb897fb79d036214", Symbol: "1SOL", CoingeckoID: "1sol", Decimals: 18}, // Addr: 0x009178997aff09a67d4caccfeb897fb79d036214, Notional: 156168.67919229344 - {TokenChain: 2, TokenAddress: "00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c2", Symbol: "ANGLE", CoingeckoID: "angle-protocol", Decimals: 18}, // Addr: 0x31429d1856ad1377a8a0079410b297e1a9e214c2, Notional: 2051.829264296216 - {TokenChain: 2, TokenAddress: "0000000000000000000000008287c7b963b405b7b8d467db9d79eec40625b13a", Symbol: "SWINGBY", CoingeckoID: "swingby", Decimals: 18}, // Addr: 0x8287c7b963b405b7b8d467db9d79eec40625b13a, Notional: 1.936608 - {TokenChain: 2, TokenAddress: "000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, Notional: 65820474.964292966 - {TokenChain: 2, TokenAddress: "0000000000000000000000001cf4592ebffd730c7dc92c1bdffdfc3b9efcf29a", Symbol: "WAVES", CoingeckoID: "waves", Decimals: 18}, // Addr: 0x1cf4592ebffd730c7dc92c1bdffdfc3b9efcf29a, Notional: 1.95966 - {TokenChain: 2, TokenAddress: "00000000000000000000000072e364f2abdc788b7e918bc238b21f109cd634d7", Symbol: "MVI", CoingeckoID: "metaverse-index", Decimals: 18}, // Addr: 0x72e364f2abdc788b7e918bc238b21f109cd634d7, Notional: 14.665167910799997 - {TokenChain: 2, TokenAddress: "000000000000000000000000dfdb7f72c1f195c5951a234e8db9806eb0635346", Symbol: "NFD", CoingeckoID: "feisty-doge-nft", Decimals: 18}, // Addr: 0xdfdb7f72c1f195c5951a234e8db9806eb0635346, Notional: 1918.4842956921666 - {TokenChain: 2, TokenAddress: "00000000000000000000000072e5390edb7727e3d4e3436451dadaff675dbcc0", Symbol: "HANU", CoingeckoID: "hanu-yokia", Decimals: 12}, // Addr: 0x72e5390edb7727e3d4e3436451dadaff675dbcc0, Notional: 10968.48 - {TokenChain: 2, TokenAddress: "0000000000000000000000008a9c67fee641579deba04928c4bc45f66e26343a", Symbol: "JRT", CoingeckoID: "jarvis-reward-token", Decimals: 18}, // Addr: 0x8a9c67fee641579deba04928c4bc45f66e26343a, Notional: 243067.8772695724 - {TokenChain: 2, TokenAddress: "000000000000000000000000a2cd3d43c775978a96bdbf12d733d5a1ed94fb18", Symbol: "XCN", CoingeckoID: "chain-2", Decimals: 18}, // Addr: 0xa2cd3d43c775978a96bdbf12d733d5a1ed94fb18, Notional: 283596.6726030172 - {TokenChain: 2, TokenAddress: "0000000000000000000000004297394c20800e8a38a619a243e9bbe7681ff24e", Symbol: "HOTCROSS", CoingeckoID: "hot-cross", Decimals: 18}, // Addr: 0x4297394c20800e8a38a619a243e9bbe7681ff24e, Notional: 2.84611 - {TokenChain: 2, TokenAddress: "000000000000000000000000900db999074d9277c5da2a43f252d74366230da0", Symbol: "GIV", CoingeckoID: "giveth", Decimals: 18}, // Addr: 0x900db999074d9277c5da2a43f252d74366230da0, Notional: 93.041 - {TokenChain: 2, TokenAddress: "000000000000000000000000a5ef74068d04ba0809b7379dd76af5ce34ab7c57", Symbol: "LUCHOW", CoingeckoID: "lunachow", Decimals: 18}, // Addr: 0xa5ef74068d04ba0809b7379dd76af5ce34ab7c57, Notional: 438.35994447561194 - {TokenChain: 2, TokenAddress: "0000000000000000000000001c98b54d673c026c8286badca3e840aaf72931a3", Symbol: "STSW", CoingeckoID: "stackswap", Decimals: 6}, // Addr: 0x1c98b54d673c026c8286badca3e840aaf72931a3, Notional: 1267.528455 - {TokenChain: 2, TokenAddress: "000000000000000000000000c18360217d8f7ab5e7c516566761ea12ce7f9d72", Symbol: "ENS", CoingeckoID: "ethereum-name-service", Decimals: 18}, // Addr: 0xc18360217d8f7ab5e7c516566761ea12ce7f9d72, Notional: 231.78573724429998 - {TokenChain: 2, TokenAddress: "00000000000000000000000008d967bb0134f2d07f7cfb6e246680c53927dd30", Symbol: "MATH", CoingeckoID: "math", Decimals: 18}, // Addr: 0x08d967bb0134f2d07f7cfb6e246680c53927dd30, Notional: 28711.120943323793 + {TokenChain: 2, TokenAddress: "00000000000000000000000095ad61b0a150d79219dcf64e1e6cc01f0b64c4ce", Symbol: "SHIB", CoingeckoID: "shiba-inu", Decimals: 18}, // Addr: 0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce, Notional: 70471.69755201436 + {TokenChain: 2, TokenAddress: "0000000000000000000000004e15361fd6b4bb609fa63c81a2be19d873717870", Symbol: "FTM", CoingeckoID: "wrapped-fantom", Decimals: 18}, // Addr: 0x4e15361fd6b4bb609fa63c81a2be19d873717870, Notional: 188.74046866156803 + {TokenChain: 2, TokenAddress: "000000000000000000000000f16e81dce15b08f326220742020379b855b87df9", Symbol: "ICE", CoingeckoID: "ice-token", Decimals: 18}, // Addr: 0xf16e81dce15b08f326220742020379b855b87df9, Notional: 0.7006999999999999 + {TokenChain: 2, TokenAddress: "00000000000000000000000006af07097c9eeb7fd685c692751d5c66db49c215", Symbol: "CHAI", CoingeckoID: "chai", Decimals: 18}, // Addr: 0x06af07097c9eeb7fd685c692751d5c66db49c215, Notional: 10655755.717959635 + {TokenChain: 2, TokenAddress: "000000000000000000000000490e3f4af13e1616ec97a8c6600c1061a8d0253e", Symbol: "TRR", CoingeckoID: "terran-coin", Decimals: 18}, // Addr: 0x490e3f4af13e1616ec97a8c6600c1061a8d0253e, Notional: 57.331849 + {TokenChain: 2, TokenAddress: "0000000000000000000000003506424f91fd33084466f402d5d97f05f8e3b4af", Symbol: "CHZ", CoingeckoID: "chiliz", Decimals: 18}, // Addr: 0x3506424f91fd33084466f402d5d97f05f8e3b4af, Notional: 22625.249246245712 + {TokenChain: 2, TokenAddress: "0000000000000000000000003d371413dd5489f3a04c07c0c2ce369c20986ceb", Symbol: "YOUC", CoingeckoID: "youcash", Decimals: 10}, // Addr: 0x3d371413dd5489f3a04c07c0c2ce369c20986ceb, Notional: 8195.296472471526 + {TokenChain: 2, TokenAddress: "0000000000000000000000000ab87046fbb341d058f17cbc4c1133f25a20a52f", Symbol: "gOHM", CoingeckoID: "governance-ohm", Decimals: 18}, // Addr: 0x0ab87046fbb341d058f17cbc4c1133f25a20a52f, Notional: 524.9982014247 + {TokenChain: 2, TokenAddress: "00000000000000000000000040d1f63b5d2048e67e9bedb1b4c2f1a9fb4b6817", Symbol: "GOLD", CoingeckoID: "golden-goose", Decimals: 18}, // Addr: 0x40d1f63b5d2048e67e9bedb1b4c2f1a9fb4b6817, Notional: 0.0002198888145 + {TokenChain: 2, TokenAddress: "0000000000000000000000006149c26cd2f7b5ccdb32029af817123f6e37df5b", Symbol: "LPOOL", CoingeckoID: "launchpool", Decimals: 18}, // Addr: 0x6149c26cd2f7b5ccdb32029af817123f6e37df5b, Notional: 0.144493 + {TokenChain: 2, TokenAddress: "000000000000000000000000f418588522d5dd018b425e472991e52ebbeeeeee", Symbol: "PUSH", CoingeckoID: "ethereum-push-notification-service", Decimals: 18}, // Addr: 0xf418588522d5dd018b425e472991e52ebbeeeeee, Notional: 0.174396 + {TokenChain: 2, TokenAddress: "00000000000000000000000072b886d09c117654ab7da13a14d603001de0b777", Symbol: "XDEFI", CoingeckoID: "xdefi", Decimals: 18}, // Addr: 0x72b886d09c117654ab7da13a14d603001de0b777, Notional: 100902.70437572042 + {TokenChain: 2, TokenAddress: "000000000000000000000000f3ae5d769e153ef72b4e3591ac004e89f48107a1", Symbol: "DPR", CoingeckoID: "deeper-network", Decimals: 18}, // Addr: 0xf3ae5d769e153ef72b4e3591ac004e89f48107a1, Notional: 49.274693025023005 + {TokenChain: 2, TokenAddress: "0000000000000000000000001a3496c18d558bd9c6c8f609e1b129f67ab08163", Symbol: "DEP", CoingeckoID: "deapcoin", Decimals: 18}, // Addr: 0x1a3496c18d558bd9c6c8f609e1b129f67ab08163, Notional: 0.00070566 + {TokenChain: 2, TokenAddress: "000000000000000000000000d69f306549e9d96f183b1aeca30b8f4353c2ecc3", Symbol: "MCHC", CoingeckoID: "mch-coin", Decimals: 18}, // Addr: 0xd69f306549e9d96f183b1aeca30b8f4353c2ecc3, Notional: 427.71434392550566 + {TokenChain: 2, TokenAddress: "00000000000000000000000003ab458634910aad20ef5f1c8ee96f1d6ac54919", Symbol: "RAI", CoingeckoID: "rai", Decimals: 18}, // Addr: 0x03ab458634910aad20ef5f1c8ee96f1d6ac54919, Notional: 8.22 + {TokenChain: 2, TokenAddress: "000000000000000000000000761d38e5ddf6ccf6cf7c55759d5210750b5d60f3", Symbol: "ELON", CoingeckoID: "dogelon-mars", Decimals: 18}, // Addr: 0x761d38e5ddf6ccf6cf7c55759d5210750b5d60f3, Notional: 1195.2810009696786 + {TokenChain: 2, TokenAddress: "00000000000000000000000018084fba666a33d37592fa2633fd49a74dd93a88", Symbol: "tBTC", CoingeckoID: "tbtc", Decimals: 18}, // Addr: 0x18084fba666a33d37592fa2633fd49a74dd93a88, Notional: 10705763.52774116 + {TokenChain: 2, TokenAddress: "000000000000000000000000f6e06b54855eff198a2d9a8686113665499a6134", Symbol: "Celt", CoingeckoID: "celestial", Decimals: 18}, // Addr: 0xf6e06b54855eff198a2d9a8686113665499a6134, Notional: 0.13193334 + {TokenChain: 2, TokenAddress: "000000000000000000000000221657776846890989a759ba2973e427dff5c9bb", Symbol: "REPv2", CoingeckoID: "augur", Decimals: 18}, // Addr: 0x221657776846890989a759ba2973e427dff5c9bb, Notional: 0.486933 + {TokenChain: 2, TokenAddress: "0000000000000000000000009fa69536d1cda4a04cfb50688294de75b505a9ae", Symbol: "DERC", CoingeckoID: "derace", Decimals: 18}, // Addr: 0x9fa69536d1cda4a04cfb50688294de75b505a9ae, Notional: 15.7153 + {TokenChain: 2, TokenAddress: "00000000000000000000000033f391f4c4fe802b70b77ae37670037a92114a7c", Symbol: "BURP", CoingeckoID: "burp", Decimals: 18}, // Addr: 0x33f391f4c4fe802b70b77ae37670037a92114a7c, Notional: 0.5522612745158535 + {TokenChain: 2, TokenAddress: "0000000000000000000000003593d125a4f7849a1b059e64f4517a86dd60c95d", Symbol: "OM", CoingeckoID: "mantra-dao", Decimals: 18}, // Addr: 0x3593d125a4f7849a1b059e64f4517a86dd60c95d, Notional: 31.921461083413586 + {TokenChain: 2, TokenAddress: "000000000000000000000000c944e90c64b2c07662a292be6244bdf05cda44a7", Symbol: "GRT", CoingeckoID: "the-graph", Decimals: 18}, // Addr: 0xc944e90c64b2c07662a292be6244bdf05cda44a7, Notional: 28979.05845909424 + {TokenChain: 2, TokenAddress: "0000000000000000000000004bd70556ae3f8a6ec6c4080a0c327b24325438f3", Symbol: "HXRO", CoingeckoID: "hxro", Decimals: 18}, // Addr: 0x4bd70556ae3f8a6ec6c4080a0c327b24325438f3, Notional: 39547546.23224161 + {TokenChain: 2, TokenAddress: "00000000000000000000000087edffde3e14c7a66c9b9724747a1c5696b742e6", Symbol: "SWAG", CoingeckoID: "swag-finance", Decimals: 18}, // Addr: 0x87edffde3e14c7a66c9b9724747a1c5696b742e6, Notional: 77.25852508 + {TokenChain: 2, TokenAddress: "000000000000000000000000f99d58e463a2e07e5692127302c20a191861b4d6", Symbol: "ANY", CoingeckoID: "anyswap", Decimals: 18}, // Addr: 0xf99d58e463a2e07e5692127302c20a191861b4d6, Notional: 17.342093768999998 + {TokenChain: 2, TokenAddress: "0000000000000000000000004674672bcddda2ea5300f5207e1158185c944bc0", Symbol: "GXT", CoingeckoID: "gem-exchange-and-trading", Decimals: 18}, // Addr: 0x4674672bcddda2ea5300f5207e1158185c944bc0, Notional: 99389.39306778347 + {TokenChain: 2, TokenAddress: "000000000000000000000000de4ee8057785a7e8e800db58f9784845a5c2cbd6", Symbol: "DEXE", CoingeckoID: "dexe", Decimals: 18}, // Addr: 0xde4ee8057785a7e8e800db58f9784845a5c2cbd6, Notional: 447482.17204025603 + {TokenChain: 2, TokenAddress: "000000000000000000000000f629cbd94d3791c9250152bd8dfbdf380e2a3b9c", Symbol: "ENJ", CoingeckoID: "enjincoin", Decimals: 18}, // Addr: 0xf629cbd94d3791c9250152bd8dfbdf380e2a3b9c, Notional: 424.16438771996997 + {TokenChain: 2, TokenAddress: "00000000000000000000000058b6a8a3302369daec383334672404ee733ab239", Symbol: "LPT", CoingeckoID: "livepeer", Decimals: 18}, // Addr: 0x58b6a8a3302369daec383334672404ee733ab239, Notional: 11.9845870098 + {TokenChain: 2, TokenAddress: "00000000000000000000000022c5543d1a35178cb03b33f929a959145e538532", Symbol: "WAL", CoingeckoID: "the-wasted-lands", Decimals: 18}, // Addr: 0x22c5543d1a35178cb03b33f929a959145e538532, Notional: 0.252693280695163 + {TokenChain: 2, TokenAddress: "0000000000000000000000002781246fe707bb15cee3e5ea354e2154a2877b16", Symbol: "EL", CoingeckoID: "elysia", Decimals: 18}, // Addr: 0x2781246fe707bb15cee3e5ea354e2154a2877b16, Notional: 19859.6287898962 + {TokenChain: 2, TokenAddress: "00000000000000000000000032353a6c91143bfd6c7d363b546e62a9a2489a20", Symbol: "AGLD", CoingeckoID: "adventure-gold", Decimals: 18}, // Addr: 0x32353a6c91143bfd6c7d363b546e62a9a2489a20, Notional: 6.09427626001074 + {TokenChain: 2, TokenAddress: "0000000000000000000000004d224452801aced8b2f0aebe155379bb5d594381", Symbol: "APE", CoingeckoID: "apecoin", Decimals: 18}, // Addr: 0x4d224452801aced8b2f0aebe155379bb5d594381, Notional: 76.70409604480001 + {TokenChain: 2, TokenAddress: "00000000000000000000000018aaa7115705e8be94bffebde57af9bfc265b998", Symbol: "AUDIO", CoingeckoID: "audius", Decimals: 18}, // Addr: 0x18aaa7115705e8be94bffebde57af9bfc265b998, Notional: 3496997.0142946434 + {TokenChain: 2, TokenAddress: "000000000000000000000000fd09911130e6930bf87f2b0554c44f400bd80d3e", Symbol: "ETHIX", CoingeckoID: "ethichub", Decimals: 18}, // Addr: 0xfd09911130e6930bf87f2b0554c44f400bd80d3e, Notional: 1883730.9131743263 + {TokenChain: 2, TokenAddress: "0000000000000000000000000316eb71485b0ab14103307bf65a021042c6d380", Symbol: "HBTC", CoingeckoID: "huobi-btc", Decimals: 18}, // Addr: 0x0316eb71485b0ab14103307bf65a021042c6d380, Notional: 4490.05519783 + {TokenChain: 2, TokenAddress: "0000000000000000000000009d71ce49ab8a0e6d2a1e7bfb89374c9392fd6804", Symbol: "Nvir", CoingeckoID: "nvirworld", Decimals: 18}, // Addr: 0x9d71ce49ab8a0e6d2a1e7bfb89374c9392fd6804, Notional: 102.10594999999999 + {TokenChain: 2, TokenAddress: "000000000000000000000000ae6e307c3fe9e922e5674dbd7f830ed49c014c6b", Symbol: "CREDI", CoingeckoID: "credefi", Decimals: 18}, // Addr: 0xae6e307c3fe9e922e5674dbd7f830ed49c014c6b, Notional: 14816.985752311153 + {TokenChain: 2, TokenAddress: "0000000000000000000000001796ae0b0fa4862485106a0de9b654efe301d0b2", Symbol: "PMON", CoingeckoID: "polychain-monsters", Decimals: 18}, // Addr: 0x1796ae0b0fa4862485106a0de9b654efe301d0b2, Notional: 11.495122640423551 + {TokenChain: 2, TokenAddress: "0000000000000000000000006911f552842236bd9e8ea8ddbb3fb414e2c5fa9d", Symbol: "SNP", CoingeckoID: "synapse-network", Decimals: 18}, // Addr: 0x6911f552842236bd9e8ea8ddbb3fb414e2c5fa9d, Notional: 41.261975188423655 + {TokenChain: 2, TokenAddress: "000000000000000000000000ea068fba19ce95f12d252ad8cb2939225c4ea02d", Symbol: "FIEF", CoingeckoID: "fief", Decimals: 18}, // Addr: 0xea068fba19ce95f12d252ad8cb2939225c4ea02d, Notional: 78835.60996605273 + {TokenChain: 2, TokenAddress: "00000000000000000000000097a9bac06f90940bce9caec2b880ff17707519e4", Symbol: "MNTO", CoingeckoID: "minato", Decimals: 18}, // Addr: 0x97a9bac06f90940bce9caec2b880ff17707519e4, Notional: 135.0308967015 + {TokenChain: 2, TokenAddress: "000000000000000000000000eb4c2781e4eba804ce9a9803c67d0893436bb27d", Symbol: "renBTC", CoingeckoID: "renbtc", Decimals: 8}, // Addr: 0xeb4c2781e4eba804ce9a9803c67d0893436bb27d, Notional: 30.990000000000002 + {TokenChain: 2, TokenAddress: "00000000000000000000000008389495d7456e1951ddf7c3a1314a4bfb646d8b", Symbol: "CRPT", CoingeckoID: "crypterium", Decimals: 18}, // Addr: 0x08389495d7456e1951ddf7c3a1314a4bfb646d8b, Notional: 1.5034378400000001 + {TokenChain: 2, TokenAddress: "000000000000000000000000d1ba9bac957322d6e8c07a160a3a8da11a0d2867", Symbol: "HMT", CoingeckoID: "human-protocol", Decimals: 18}, // Addr: 0xd1ba9bac957322d6e8c07a160a3a8da11a0d2867, Notional: 51.750699000000004 + {TokenChain: 2, TokenAddress: "000000000000000000000000420412e765bfa6d85aaac94b4f7b708c89be2e2b", Symbol: "BRZ", CoingeckoID: "brz", Decimals: 4}, // Addr: 0x420412e765bfa6d85aaac94b4f7b708c89be2e2b, Notional: 20.712324 + {TokenChain: 2, TokenAddress: "000000000000000000000000d9c2d319cd7e6177336b0a9c93c21cb48d84fb54", Symbol: "HAPI", CoingeckoID: "hapi", Decimals: 18}, // Addr: 0xd9c2d319cd7e6177336b0a9c93c21cb48d84fb54, Notional: 7.59 + {TokenChain: 2, TokenAddress: "000000000000000000000000e53ec727dbdeb9e2d5456c3be40cff031ab40a55", Symbol: "SUPER", CoingeckoID: "superfarm", Decimals: 18}, // Addr: 0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55, Notional: 7.521 + {TokenChain: 2, TokenAddress: "000000000000000000000000e6f47303032a09c8c0f8ebb713c00e6ed345e8c3", Symbol: "RISITA", CoingeckoID: "risitas", Decimals: 18}, // Addr: 0xe6f47303032a09c8c0f8ebb713c00e6ed345e8c3, Notional: 2.587168997236041 + {TokenChain: 2, TokenAddress: "000000000000000000000000138c2f1123cf3f82e4596d097c118eac6684940b", Symbol: "ALPHA", CoingeckoID: "alphacoin", Decimals: 18}, // Addr: 0x138c2f1123cf3f82e4596d097c118eac6684940b, Notional: 0.0712899 + {TokenChain: 2, TokenAddress: "000000000000000000000000e0b9a2c3e9f40cf74b2c7f591b2b0cca055c3112", Symbol: "GS", CoingeckoID: "genesis-shards", Decimals: 18}, // Addr: 0xe0b9a2c3e9f40cf74b2c7f591b2b0cca055c3112, Notional: 0.5658067953726803 + {TokenChain: 2, TokenAddress: "0000000000000000000000001c48f86ae57291f7686349f12601910bd8d470bb", Symbol: "USDK", CoingeckoID: "usdk", Decimals: 18}, // Addr: 0x1c48f86ae57291f7686349f12601910bd8d470bb, Notional: 10644.354304436498 + {TokenChain: 2, TokenAddress: "000000000000000000000000bc396689893d065f41bc2c6ecbee5e0085233447", Symbol: "PERP", CoingeckoID: "perpetual-protocol", Decimals: 18}, // Addr: 0xbc396689893d065f41bc2c6ecbee5e0085233447, Notional: 9670.14222229319 + {TokenChain: 2, TokenAddress: "0000000000000000000000002e95cea14dd384429eb3c4331b776c4cfbb6fcd9", Symbol: "THN", CoingeckoID: "throne", Decimals: 18}, // Addr: 0x2e95cea14dd384429eb3c4331b776c4cfbb6fcd9, Notional: 0.6545907 + {TokenChain: 2, TokenAddress: "000000000000000000000000ebd9d99a3982d547c5bb4db7e3b1f9f14b67eb83", Symbol: "ID", CoingeckoID: "everid", Decimals: 18}, // Addr: 0xebd9d99a3982d547c5bb4db7e3b1f9f14b67eb83, Notional: 456.0879344478151 + {TokenChain: 2, TokenAddress: "0000000000000000000000007e9c15c43f0d6c4a12e6bdff7c7d55d0f80e3e23", Symbol: "ASTRADAO", CoingeckoID: "astra-dao", Decimals: 18}, // Addr: 0x7e9c15c43f0d6c4a12e6bdff7c7d55d0f80e3e23, Notional: 14.028255460300903 + {TokenChain: 2, TokenAddress: "000000000000000000000000e3c408bd53c31c085a1746af401a4042954ff740", Symbol: "GMT", CoingeckoID: "stepn", Decimals: 8}, // Addr: 0xe3c408bd53c31c085a1746af401a4042954ff740, Notional: 16.968820859295377 + {TokenChain: 2, TokenAddress: "000000000000000000000000081131434f93063751813c619ecca9c4dc7862a3", Symbol: "DAR", CoingeckoID: "mines-of-dalarnia", Decimals: 6}, // Addr: 0x081131434f93063751813c619ecca9c4dc7862a3, Notional: 91.427216128965 + {TokenChain: 2, TokenAddress: "000000000000000000000000727f064a78dc734d33eec18d5370aef32ffd46e4", Symbol: "ORION", CoingeckoID: "orion-money", Decimals: 18}, // Addr: 0x727f064a78dc734d33eec18d5370aef32ffd46e4, Notional: 84645.5979325483 + {TokenChain: 2, TokenAddress: "00000000000000000000000041e5560054824ea6b0732e656e3ad64e20e94e45", Symbol: "CVC", CoingeckoID: "civic", Decimals: 8}, // Addr: 0x41e5560054824ea6b0732e656e3ad64e20e94e45, Notional: 17.7798 + {TokenChain: 2, TokenAddress: "0000000000000000000000004730fb1463a6f1f44aeb45f6c5c422427f37f4d0", Symbol: "FOUR", CoingeckoID: "the-4th-pillar", Decimals: 18}, // Addr: 0x4730fb1463a6f1f44aeb45f6c5c422427f37f4d0, Notional: 5299.145157533384 + {TokenChain: 2, TokenAddress: "00000000000000000000000050d1c9771902476076ecfc8b2a83ad6b9355a4c9", Symbol: "FTX Token", CoingeckoID: "ftx-token", Decimals: 18}, // Addr: 0x50d1c9771902476076ecfc8b2a83ad6b9355a4c9, Notional: 254326.895574216 + {TokenChain: 2, TokenAddress: "000000000000000000000000d13cfd3133239a3c73a9e535a5c4dadee36b395c", Symbol: "VAI", CoingeckoID: "vaiot", Decimals: 18}, // Addr: 0xd13cfd3133239a3c73a9e535a5c4dadee36b395c, Notional: 1.382535 + {TokenChain: 2, TokenAddress: "0000000000000000000000007495e5cc8f27e0bd5bd4cb86d17f0d841ca58ee4", Symbol: "ARNC", CoingeckoID: "arnoya-classic", Decimals: 18}, // Addr: 0x7495e5cc8f27e0bd5bd4cb86d17f0d841ca58ee4, Notional: 760.71414629 + {TokenChain: 2, TokenAddress: "000000000000000000000000808507121b80c02388fad14726482e061b8da827", Symbol: "PENDLE", CoingeckoID: "pendle", Decimals: 18}, // Addr: 0x808507121b80c02388fad14726482e061b8da827, Notional: 1121567.0663998432 + {TokenChain: 2, TokenAddress: "000000000000000000000000e831f96a7a1dce1aa2eb760b1e296c6a74caa9d5", Symbol: "NEXM", CoingeckoID: "nexum", Decimals: 8}, // Addr: 0xe831f96a7a1dce1aa2eb760b1e296c6a74caa9d5, Notional: 136444.13054146597 + {TokenChain: 2, TokenAddress: "0000000000000000000000000d8775f648430679a709e98d2b0cb6250d2887ef", Symbol: "BAT", CoingeckoID: "basic-attention-token", Decimals: 18}, // Addr: 0x0d8775f648430679a709e98d2b0cb6250d2887ef, Notional: 61916.8692801286 + {TokenChain: 2, TokenAddress: "000000000000000000000000c4c2614e694cf534d407ee49f8e44d125e4681c4", Symbol: "CHAIN", CoingeckoID: "chain-games", Decimals: 18}, // Addr: 0xc4c2614e694cf534d407ee49f8e44d125e4681c4, Notional: 28.865605433862857 + {TokenChain: 2, TokenAddress: "00000000000000000000000033349b282065b0284d756f0577fb39c158f935e6", Symbol: "MPL", CoingeckoID: "maple", Decimals: 18}, // Addr: 0x33349b282065b0284d756f0577fb39c158f935e6, Notional: 51935.060842978004 + {TokenChain: 2, TokenAddress: "0000000000000000000000006ec8a24cabdc339a06a172f8223ea557055adaa5", Symbol: "GNX", CoingeckoID: "genaro-network", Decimals: 9}, // Addr: 0x6ec8a24cabdc339a06a172f8223ea557055adaa5, Notional: 1.3624767 + {TokenChain: 2, TokenAddress: "000000000000000000000000721a1b990699ee9d90b6327faad0a3e840ae8335", Symbol: "LOOT", CoingeckoID: "loot", Decimals: 18}, // Addr: 0x721a1b990699ee9d90b6327faad0a3e840ae8335, Notional: 14.68427103 + {TokenChain: 2, TokenAddress: "000000000000000000000000cdf7028ceab81fa0c6971208e83fa7872994bee5", Symbol: "T", CoingeckoID: "threshold-network-token", Decimals: 18}, // Addr: 0xcdf7028ceab81fa0c6971208e83fa7872994bee5, Notional: 8081.972935196871 + {TokenChain: 2, TokenAddress: "00000000000000000000000080d55c03180349fff4a229102f62328220a96444", Symbol: "OPUL", CoingeckoID: "opulous", Decimals: 18}, // Addr: 0x80d55c03180349fff4a229102f62328220a96444, Notional: 2.14127906625828 + {TokenChain: 2, TokenAddress: "0000000000000000000000005de8ab7e27f6e7a1fff3e5b337584aa43961beef", Symbol: "SDEX", CoingeckoID: "smardex", Decimals: 18}, // Addr: 0x5de8ab7e27f6e7a1fff3e5b337584aa43961beef, Notional: 13868471.775103485 + {TokenChain: 2, TokenAddress: "000000000000000000000000b50721bcf8d664c30412cfbc6cf7a15145234ad1", Symbol: "ARB", CoingeckoID: "arbitrum", Decimals: 18}, // Addr: 0xb50721bcf8d664c30412cfbc6cf7a15145234ad1, Notional: 37.814570079460324 + {TokenChain: 2, TokenAddress: "0000000000000000000000001f573d6fb3f13d689ff844b4ce37794d79a7ff1c", Symbol: "BNT", CoingeckoID: "bancor", Decimals: 18}, // Addr: 0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c, Notional: 5.535489999999999 + {TokenChain: 2, TokenAddress: "000000000000000000000000d7c302fc3ac829c7e896a32c4bd126f3e8bd0a1f", Symbol: "B2M", CoingeckoID: "bit2me", Decimals: 18}, // Addr: 0xd7c302fc3ac829c7e896a32c4bd126f3e8bd0a1f, Notional: 0.0033356992996664996 + {TokenChain: 2, TokenAddress: "000000000000000000000000e1c7e30c42c24582888c758984f6e382096786bd", Symbol: "XCUR", CoingeckoID: "curate", Decimals: 8}, // Addr: 0xe1c7e30c42c24582888c758984f6e382096786bd, Notional: 0.02787368 + {TokenChain: 2, TokenAddress: "000000000000000000000000968f6f898a6df937fc1859b323ac2f14643e3fed", Symbol: "NWC", CoingeckoID: "newscrypto-coin", Decimals: 18}, // Addr: 0x968f6f898a6df937fc1859b323ac2f14643e3fed, Notional: 0.053977 + {TokenChain: 2, TokenAddress: "0000000000000000000000008cb1d155a5a1d5d667611b7710920fd9d1cd727f", Symbol: "AIRx", CoingeckoID: "aircoins", Decimals: 8}, // Addr: 0x8cb1d155a5a1d5d667611b7710920fd9d1cd727f, Notional: 0.00078 + {TokenChain: 2, TokenAddress: "000000000000000000000000d49efa7bc0d339d74f487959c573d518ba3f8437", Symbol: "COLI", CoingeckoID: "shield-finance", Decimals: 18}, // Addr: 0xd49efa7bc0d339d74f487959c573d518ba3f8437, Notional: 71158.23679472391 + {TokenChain: 2, TokenAddress: "000000000000000000000000853d955acef822db058eb8505911ed77f175b99e", Symbol: "FRAX", CoingeckoID: "frax", Decimals: 18}, // Addr: 0x853d955acef822db058eb8505911ed77f175b99e, Notional: 109952.7766500649 + {TokenChain: 2, TokenAddress: "000000000000000000000000e9b7b5d5e8d2bcc78884f9f9099bfa42a9e5c1a5", Symbol: "ZENF", CoingeckoID: "zenland", Decimals: 18}, // Addr: 0xe9b7b5d5e8d2bcc78884f9f9099bfa42a9e5c1a5, Notional: 391536.45375690004 + {TokenChain: 2, TokenAddress: "0000000000000000000000008ce9137d39326ad0cd6491fb5cc0cba0e089b6a9", Symbol: "SXP", CoingeckoID: "swipe", Decimals: 18}, // Addr: 0x8ce9137d39326ad0cd6491fb5cc0cba0e089b6a9, Notional: 28301.278963349116 + {TokenChain: 2, TokenAddress: "000000000000000000000000d7dcd9b99787c619b4d57979521258d1a7267ad7", Symbol: "EVRY", CoingeckoID: "evrynet", Decimals: 18}, // Addr: 0xd7dcd9b99787c619b4d57979521258d1a7267ad7, Notional: 0.30836736 + {TokenChain: 2, TokenAddress: "00000000000000000000000083e6f1e41cdd28eaceb20cb649155049fac3d5aa", Symbol: "POLS", CoingeckoID: "polkastarter", Decimals: 18}, // Addr: 0x83e6f1e41cdd28eaceb20cb649155049fac3d5aa, Notional: 0.575068 + {TokenChain: 2, TokenAddress: "000000000000000000000000046eee2cc3188071c02bfc1745a6b17c656e3f3d", Symbol: "RLB", CoingeckoID: "rollbit-coin", Decimals: 18}, // Addr: 0x046eee2cc3188071c02bfc1745a6b17c656e3f3d, Notional: 34.198499999999996 + {TokenChain: 2, TokenAddress: "00000000000000000000000043d4a3cd90ddd2f8f4f693170c9c8098163502ad", Symbol: "D2D", CoingeckoID: "prime", Decimals: 18}, // Addr: 0x43d4a3cd90ddd2f8f4f693170c9c8098163502ad, Notional: 828.9631180272762 + {TokenChain: 2, TokenAddress: "0000000000000000000000001c4853ec0d55e420002c5efabc7ed8e0ba7a4121", Symbol: "Okinami", CoingeckoID: "kanagawa-nami", Decimals: 9}, // Addr: 0x1c4853ec0d55e420002c5efabc7ed8e0ba7a4121, Notional: 9.823109680638087 + {TokenChain: 2, TokenAddress: "000000000000000000000000b8e2e2101ed11e9138803cd3e06e16dd19910647", Symbol: "ARDX", CoingeckoID: "ardcoin", Decimals: 2}, // Addr: 0xb8e2e2101ed11e9138803cd3e06e16dd19910647, Notional: 2310.4025235999998 + {TokenChain: 2, TokenAddress: "000000000000000000000000dbdb4d16eda451d0503b854cf79d55697f90c8df", Symbol: "ALCX", CoingeckoID: "alchemix", Decimals: 18}, // Addr: 0xdbdb4d16eda451d0503b854cf79d55697f90c8df, Notional: 0.012580000000000001 + {TokenChain: 2, TokenAddress: "000000000000000000000000d373576a9e738f37dc6882328358ff69c4caf4c6", Symbol: "ZAM", CoingeckoID: "zam-io", Decimals: 18}, // Addr: 0xd373576a9e738f37dc6882328358ff69c4caf4c6, Notional: 0.0160816 + {TokenChain: 2, TokenAddress: "0000000000000000000000005f48d1fd6814cd1cd38aeb895755e57d519196d1", Symbol: "WINS", CoingeckoID: "wins", Decimals: 18}, // Addr: 0x5f48d1fd6814cd1cd38aeb895755e57d519196d1, Notional: 1978211.6611808601 + {TokenChain: 2, TokenAddress: "000000000000000000000000b8c77482e45f1f44de1745f52c74426c631bdd52", Symbol: "BNB", CoingeckoID: "binancecoin", Decimals: 18}, // Addr: 0xb8c77482e45f1f44de1745f52c74426c631bdd52, Notional: 6257.841183 + {TokenChain: 2, TokenAddress: "0000000000000000000000007697b462a7c4ff5f8b55bdbc2f4076c2af9cf51a", Symbol: "SARCO", CoingeckoID: "sarcophagus", Decimals: 18}, // Addr: 0x7697b462a7c4ff5f8b55bdbc2f4076c2af9cf51a, Notional: 2.62298865627862 + {TokenChain: 2, TokenAddress: "000000000000000000000000cb84d72e61e383767c4dfeb2d8ff7f4fb89abc6e", Symbol: "VEGA", CoingeckoID: "vega-protocol", Decimals: 18}, // Addr: 0xcb84d72e61e383767c4dfeb2d8ff7f4fb89abc6e, Notional: 39.150000000000006 + {TokenChain: 2, TokenAddress: "000000000000000000000000009178997aff09a67d4caccfeb897fb79d036214", Symbol: "1SOL", CoingeckoID: "1sol", Decimals: 18}, // Addr: 0x009178997aff09a67d4caccfeb897fb79d036214, Notional: 205034.0992164073 + {TokenChain: 2, TokenAddress: "00000000000000000000000031429d1856ad1377a8a0079410b297e1a9e214c2", Symbol: "ANGLE", CoingeckoID: "angle-protocol", Decimals: 18}, // Addr: 0x31429d1856ad1377a8a0079410b297e1a9e214c2, Notional: 2448.6222628276787 + {TokenChain: 2, TokenAddress: "0000000000000000000000008287c7b963b405b7b8d467db9d79eec40625b13a", Symbol: "SWINGBY", CoingeckoID: "swingby", Decimals: 18}, // Addr: 0x8287c7b963b405b7b8d467db9d79eec40625b13a, Notional: 7.181552 + {TokenChain: 2, TokenAddress: "000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2, Notional: 38784855.80766489 + {TokenChain: 2, TokenAddress: "000000000000000000000000a3a80559bbc1989654e6b8385f5001fa1333332f", Symbol: "RZR", CoingeckoID: "raiser-token", Decimals: 18}, // Addr: 0xa3a80559bbc1989654e6b8385f5001fa1333332f, Notional: 0.88186970245044 + {TokenChain: 2, TokenAddress: "0000000000000000000000001cf4592ebffd730c7dc92c1bdffdfc3b9efcf29a", Symbol: "WAVES", CoingeckoID: "waves", Decimals: 18}, // Addr: 0x1cf4592ebffd730c7dc92c1bdffdfc3b9efcf29a, Notional: 1.60056 + {TokenChain: 2, TokenAddress: "00000000000000000000000072e364f2abdc788b7e918bc238b21f109cd634d7", Symbol: "MVI", CoingeckoID: "metaverse-index", Decimals: 18}, // Addr: 0x72e364f2abdc788b7e918bc238b21f109cd634d7, Notional: 11.766474253499998 + {TokenChain: 2, TokenAddress: "000000000000000000000000dfdb7f72c1f195c5951a234e8db9806eb0635346", Symbol: "NFD", CoingeckoID: "feisty-doge-nft", Decimals: 18}, // Addr: 0xdfdb7f72c1f195c5951a234e8db9806eb0635346, Notional: 1812.5881984138503 + {TokenChain: 2, TokenAddress: "00000000000000000000000072e5390edb7727e3d4e3436451dadaff675dbcc0", Symbol: "HANU", CoingeckoID: "hanu-yokia", Decimals: 12}, // Addr: 0x72e5390edb7727e3d4e3436451dadaff675dbcc0, Notional: 23220.36 + {TokenChain: 2, TokenAddress: "0000000000000000000000008a9c67fee641579deba04928c4bc45f66e26343a", Symbol: "JRT", CoingeckoID: "jarvis-reward-token", Decimals: 18}, // Addr: 0x8a9c67fee641579deba04928c4bc45f66e26343a, Notional: 208115.51978880403 + {TokenChain: 2, TokenAddress: "000000000000000000000000a2cd3d43c775978a96bdbf12d733d5a1ed94fb18", Symbol: "XCN", CoingeckoID: "chain-2", Decimals: 18}, // Addr: 0xa2cd3d43c775978a96bdbf12d733d5a1ed94fb18, Notional: 217861.94458649342 + {TokenChain: 2, TokenAddress: "0000000000000000000000004297394c20800e8a38a619a243e9bbe7681ff24e", Symbol: "HOTCROSS", CoingeckoID: "hot-cross", Decimals: 18}, // Addr: 0x4297394c20800e8a38a619a243e9bbe7681ff24e, Notional: 2.5697799999999997 + {TokenChain: 2, TokenAddress: "000000000000000000000000900db999074d9277c5da2a43f252d74366230da0", Symbol: "GIV", CoingeckoID: "giveth", Decimals: 18}, // Addr: 0x900db999074d9277c5da2a43f252d74366230da0, Notional: 72.3467 + {TokenChain: 2, TokenAddress: "0000000000000000000000001864ce27e9f7517047933caae530674e8c70b8a7", Symbol: "PIB", CoingeckoID: "pibble", Decimals: 18}, // Addr: 0x1864ce27e9f7517047933caae530674e8c70b8a7, Notional: 0.28024 + {TokenChain: 2, TokenAddress: "000000000000000000000000a5ef74068d04ba0809b7379dd76af5ce34ab7c57", Symbol: "LUCHOW", CoingeckoID: "lunachow", Decimals: 18}, // Addr: 0xa5ef74068d04ba0809b7379dd76af5ce34ab7c57, Notional: 419.51195353419814 + {TokenChain: 2, TokenAddress: "0000000000000000000000001c98b54d673c026c8286badca3e840aaf72931a3", Symbol: "STSW", CoingeckoID: "stackswap", Decimals: 6}, // Addr: 0x1c98b54d673c026c8286badca3e840aaf72931a3, Notional: 1364.9469348 + {TokenChain: 2, TokenAddress: "000000000000000000000000c18360217d8f7ab5e7c516566761ea12ce7f9d72", Symbol: "ENS", CoingeckoID: "ethereum-name-service", Decimals: 18}, // Addr: 0xc18360217d8f7ab5e7c516566761ea12ce7f9d72, Notional: 177.548361163 + {TokenChain: 2, TokenAddress: "00000000000000000000000008d967bb0134f2d07f7cfb6e246680c53927dd30", Symbol: "MATH", CoingeckoID: "math", Decimals: 18}, // Addr: 0x08d967bb0134f2d07f7cfb6e246680c53927dd30, Notional: 57.7659496340087 {TokenChain: 3, TokenAddress: "000000000000000000000000ab05561fadecc41babc73132847ff55a5cef2f37", Symbol: "TNS", CoingeckoID: "terra-name-service", Decimals: 6}, // Addr: terra14vz4v8adanzph278xyeggll4tfww7teh0xtw2y, Notional: 0.826261 - {TokenChain: 3, TokenAddress: "010000000000000000000000000000000000000000000000000000756c756e61", Symbol: "LUNA", CoingeckoID: "terra-luna", Decimals: 6}, // Addr: uluna, Notional: 7283576.442053166 - {TokenChain: 3, TokenAddress: "0000000000000000000000002c71557d2edfedd8330e52be500058a014d329e7", Symbol: "BTL", CoingeckoID: "bitlocus", Decimals: 6}, // Addr: terra193c42lfwmlkasvcw22l9qqzc5q2dx208tkd7wl, Notional: 242576.1809009762 - {TokenChain: 3, TokenAddress: "000000000000000000000000a21d626429c68c8c768ba0b2913895571703fd5b", Symbol: "MIR", CoingeckoID: "mirror-protocol", Decimals: 6}, // Addr: terra15gwkyepfc6xgca5t5zefzwy42uts8l2m4g40k6, Notional: 608.6354794415818 - {TokenChain: 3, TokenAddress: "0100000000000000000000000000000000000000000000000000000075757364", Symbol: "UST", CoingeckoID: "terrausd", Decimals: 6}, // Addr: uusd, Notional: 2387814.117399756 - {TokenChain: 3, TokenAddress: "0000000000000000000000008f5cd460d57ac54e111646fc569179144c7f0c28", Symbol: "PLY", CoingeckoID: "playnity", Decimals: 6}, // Addr: terra13awdgcx40tz5uygkgm79dytez3x87rpg4uhnvu, Notional: 179275.91782250197 - {TokenChain: 3, TokenAddress: "000000000000000000000000a8a9afbd2157e093e8448dd6450abec8ad79aeeb", Symbol: "ANC", CoingeckoID: "anchor-protocol", Decimals: 6}, // Addr: terra14z56l0fp2lsf86zy3hty2z47ezkhnthtr9yq76, Notional: 811.58828315379 - {TokenChain: 3, TokenAddress: "00000000000000000000000034aa51100370594b15479392149157eeb479b9a8", Symbol: "ASTRO", CoingeckoID: "astroport", Decimals: 6}, // Addr: terra1xj49zyqrwpv5k928jwfpfy2ha668nwdgkwlrg3, Notional: 0.08209486053662 - {TokenChain: 3, TokenAddress: "0000000000000000000000005b7d58fe96a636927960029ea47996db5808d015", Symbol: "XRUNE", CoingeckoID: "thorstarter", Decimals: 6}, // Addr: terra1td743l5k5cmfy7tqq202g7vkmdvq35q48u2jfm, Notional: 50.17290530181657 - {TokenChain: 4, TokenAddress: "00000000000000000000000072b7d61e8fc8cf971960dd9cfa59b8c829d91991", Symbol: "AQUA", CoingeckoID: "planet-finance", Decimals: 18}, // Addr: 0x72b7d61e8fc8cf971960dd9cfa59b8c829d91991, Notional: 2.0460141174 - {TokenChain: 4, TokenAddress: "000000000000000000000000885c5fb8f0e67b2b0cf3a437e6cc6ebc0f9f9014", Symbol: "GEMG", CoingeckoID: "gemguardian", Decimals: 18}, // Addr: 0x885c5fb8f0e67b2b0cf3a437e6cc6ebc0f9f9014, Notional: 0.19473409856072252 - {TokenChain: 4, TokenAddress: "00000000000000000000000022168882276e5d5e1da694343b41dd7726eeb288", Symbol: "WSB", CoingeckoID: "wall-street-bets-dapp", Decimals: 18}, // Addr: 0x22168882276e5d5e1da694343b41dd7726eeb288, Notional: 9.212748509841338 - {TokenChain: 4, TokenAddress: "000000000000000000000000c9ad37e9baf41377540df5a77831db98c1915128", Symbol: "GINUX", CoingeckoID: "green-shiba-inu", Decimals: 18}, // Addr: 0xc9ad37e9baf41377540df5a77831db98c1915128, Notional: 101.35292301365139 - {TokenChain: 4, TokenAddress: "0000000000000000000000000231f91e02debd20345ae8ab7d71a41f8e140ce7", Symbol: "bwJUP", CoingeckoID: "jupiter", Decimals: 18}, // Addr: 0x0231f91e02debd20345ae8ab7d71a41f8e140ce7, Notional: 0.512784 - {TokenChain: 4, TokenAddress: "0000000000000000000000008519ea49c997f50ceffa444d240fb655e89248aa", Symbol: "RAMP", CoingeckoID: "ramp", Decimals: 18}, // Addr: 0x8519ea49c997f50ceffa444d240fb655e89248aa, Notional: 56.377386018829526 - {TokenChain: 4, TokenAddress: "000000000000000000000000c0ecb8499d8da2771abcbf4091db7f65158f1468", Symbol: "SWTH", CoingeckoID: "switcheo", Decimals: 8}, // Addr: 0xc0ecb8499d8da2771abcbf4091db7f65158f1468, Notional: 0.0045597 - {TokenChain: 4, TokenAddress: "000000000000000000000000b0d502e938ed5f4df2e681fe6e419ff29631d62b", Symbol: "STG", CoingeckoID: "stargate-finance", Decimals: 18}, // Addr: 0xb0d502e938ed5f4df2e681fe6e419ff29631d62b, Notional: 1.3312650406770001 - {TokenChain: 4, TokenAddress: "0000000000000000000000005b6dcf557e2abe2323c48445e8cc948910d8c2c9", Symbol: "MIR", CoingeckoID: "mirror-protocol", Decimals: 18}, // Addr: 0x5b6dcf557e2abe2323c48445e8cc948910d8c2c9, Notional: 207.48572707391617 - {TokenChain: 4, TokenAddress: "0000000000000000000000009d7107c8e30617cadc11f9692a19c82ae8bba938", Symbol: "ROO", CoingeckoID: "lucky-roo", Decimals: 18}, // Addr: 0x9d7107c8e30617cadc11f9692a19c82ae8bba938, Notional: 0.5026256508381968 - {TokenChain: 4, TokenAddress: "0000000000000000000000001a131f7b106d58f33eaf0fe5b47db2f2045e5732", Symbol: "DEGEN", CoingeckoID: "degenreborn", Decimals: 18}, // Addr: 0x1a131f7b106d58f33eaf0fe5b47db2f2045e5732, Notional: 13504.885781090805 - {TokenChain: 4, TokenAddress: "0000000000000000000000005512014efa6cd57764fa743756f7a6ce3358cc83", Symbol: "EZ", CoingeckoID: "easyfi", Decimals: 18}, // Addr: 0x5512014efa6cd57764fa743756f7a6ce3358cc83, Notional: 0.33066322255087 - {TokenChain: 4, TokenAddress: "000000000000000000000000961c8c0b1aad0c0b10a51fef6a867e3091bcef17", Symbol: "DYP", CoingeckoID: "defi-yield-protocol", Decimals: 18}, // Addr: 0x961c8c0b1aad0c0b10a51fef6a867e3091bcef17, Notional: 1602.0137280635875 - {TokenChain: 4, TokenAddress: "000000000000000000000000b6c53431608e626ac81a9776ac3e999c5556717c", Symbol: "TLOS", CoingeckoID: "wrapped-telos", Decimals: 18}, // Addr: 0xb6c53431608e626ac81a9776ac3e999c5556717c, Notional: 1.02429534450301 - {TokenChain: 4, TokenAddress: "00000000000000000000000047bead2563dcbf3bf2c9407fea4dc236faba485a", Symbol: "SXP", CoingeckoID: "swipe", Decimals: 18}, // Addr: 0x47bead2563dcbf3bf2c9407fea4dc236faba485a, Notional: 289.33593525 - {TokenChain: 4, TokenAddress: "000000000000000000000000c0366a104b429f0806bfa98d0008daa9555b2bed", Symbol: "SMARS", CoingeckoID: "safemars-protocol", Decimals: 9}, // Addr: 0xc0366a104b429f0806bfa98d0008daa9555b2bed, Notional: 0.0011020601574729476 - {TokenChain: 4, TokenAddress: "0000000000000000000000002ab0e9e4ee70fff1fb9d67031e44f6410170d00e", Symbol: "bXEN", CoingeckoID: "xen-crypto-bsc", Decimals: 18}, // Addr: 0x2ab0e9e4ee70fff1fb9d67031e44f6410170d00e, Notional: 9.260383779863938 - {TokenChain: 4, TokenAddress: "0000000000000000000000009678e42cebeb63f23197d726b29b1cb20d0064e5", Symbol: "IOTX", CoingeckoID: "binance-peg-iotex", Decimals: 18}, // Addr: 0x9678e42cebeb63f23197d726b29b1cb20d0064e5, Notional: 101.1460801812936 - {TokenChain: 4, TokenAddress: "0000000000000000000000000b33542240d6fa323c796749f6d6869fdb7f13ca", Symbol: "ETHM", CoingeckoID: "ethereum-meta", Decimals: 18}, // Addr: 0x0b33542240d6fa323c796749f6d6869fdb7f13ca, Notional: 0.36197574340232014 - {TokenChain: 4, TokenAddress: "000000000000000000000000ac51066d7bec65dc4589368da368b212745d63e8", Symbol: "ALICE", CoingeckoID: "my-neighbor-alice", Decimals: 6}, // Addr: 0xac51066d7bec65dc4589368da368b212745d63e8, Notional: 0.5600688 - {TokenChain: 4, TokenAddress: "00000000000000000000000031d0a7ada4d4c131eb612db48861211f63e57610", Symbol: "START", CoingeckoID: "bscstarter", Decimals: 18}, // Addr: 0x31d0a7ada4d4c131eb612db48861211f63e57610, Notional: 0.014539700000000001 - {TokenChain: 4, TokenAddress: "000000000000000000000000aa2ded323944b25c0b6f1f891bc96f010b65622c", Symbol: "TheRadio", CoingeckoID: "radioreum", Decimals: 18}, // Addr: 0xaa2ded323944b25c0b6f1f891bc96f010b65622c, Notional: 0.0020236765394184 - {TokenChain: 4, TokenAddress: "000000000000000000000000eca41281c24451168a37211f0bc2b8645af45092", Symbol: "TPT", CoingeckoID: "token-pocket", Decimals: 4}, // Addr: 0xeca41281c24451168a37211f0bc2b8645af45092, Notional: 1.883158 - {TokenChain: 4, TokenAddress: "000000000000000000000000fb288d60d3b66f9c3e231a9a39ed3f158a4269aa", Symbol: "PPAY", CoingeckoID: "plasma-finance", Decimals: 18}, // Addr: 0xfb288d60d3b66f9c3e231a9a39ed3f158a4269aa, Notional: 0.056421058759650006 - {TokenChain: 4, TokenAddress: "00000000000000000000000072eb7ca07399ec402c5b7aa6a65752b6a1dc0c27", Symbol: "ASTRO", CoingeckoID: "astroswap", Decimals: 18}, // Addr: 0x72eb7ca07399ec402c5b7aa6a65752b6a1dc0c27, Notional: 0.0222265 - {TokenChain: 4, TokenAddress: "000000000000000000000000ad29abb318791d579433d831ed122afeaf29dcfe", Symbol: "FTM", CoingeckoID: "wrapped-fantom", Decimals: 18}, // Addr: 0xad29abb318791d579433d831ed122afeaf29dcfe, Notional: 750.2519003764128 - {TokenChain: 4, TokenAddress: "000000000000000000000000a7bd657c5838472ddf85ff0797a2e6fce8fd4833", Symbol: "ARBI", CoingeckoID: "arbipad", Decimals: 18}, // Addr: 0xa7bd657c5838472ddf85ff0797a2e6fce8fd4833, Notional: 1301.5352814393434 - {TokenChain: 4, TokenAddress: "000000000000000000000000fafd4cb703b25cb22f43d017e7e0d75febc26743", Symbol: "WEYU", CoingeckoID: "weyu", Decimals: 18}, // Addr: 0xfafd4cb703b25cb22f43d017e7e0d75febc26743, Notional: 250519.86519568667 - {TokenChain: 4, TokenAddress: "00000000000000000000000012e34cdf6a031a10fe241864c32fb03a4fdad739", Symbol: "FREE", CoingeckoID: "freedom-coin", Decimals: 18}, // Addr: 0x12e34cdf6a031a10fe241864c32fb03a4fdad739, Notional: 0.00002731434 - {TokenChain: 4, TokenAddress: "00000000000000000000000031471e0791fcdbe82fbf4c44943255e923f1b794", Symbol: "PVU", CoingeckoID: "plant-vs-undead-token", Decimals: 18}, // Addr: 0x31471e0791fcdbe82fbf4c44943255e923f1b794, Notional: 0.000023148000000000003 - {TokenChain: 4, TokenAddress: "000000000000000000000000250632378e573c6be1ac2f97fcdf00515d0aa91b", Symbol: "BETH", CoingeckoID: "binance-eth", Decimals: 18}, // Addr: 0x250632378e573c6be1ac2f97fcdf00515d0aa91b, Notional: 363.041729756 - {TokenChain: 4, TokenAddress: "0000000000000000000000000b15ddf19d47e6a86a56148fb4afffc6929bcb89", Symbol: "IDIA", CoingeckoID: "idia", Decimals: 18}, // Addr: 0x0b15ddf19d47e6a86a56148fb4afffc6929bcb89, Notional: 2624745.719728558 - {TokenChain: 4, TokenAddress: "0000000000000000000000007b610012bdc4d6deba2c2d91684e408f40863429", Symbol: "OSEA", CoingeckoID: "omnisea", Decimals: 18}, // Addr: 0x7b610012bdc4d6deba2c2d91684e408f40863429, Notional: 0.048204905 - {TokenChain: 4, TokenAddress: "00000000000000000000000012bb890508c125661e03b09ec06e404bc9289040", Symbol: "RACA", CoingeckoID: "radio-caca", Decimals: 18}, // Addr: 0x12bb890508c125661e03b09ec06e404bc9289040, Notional: 8.7577821 + {TokenChain: 3, TokenAddress: "010000000000000000000000000000000000000000000000000000756c756e61", Symbol: "LUNA", CoingeckoID: "terra-luna", Decimals: 6}, // Addr: uluna, Notional: 5312779.015341671 + {TokenChain: 3, TokenAddress: "0000000000000000000000002c71557d2edfedd8330e52be500058a014d329e7", Symbol: "BTL", CoingeckoID: "bitlocus", Decimals: 6}, // Addr: terra193c42lfwmlkasvcw22l9qqzc5q2dx208tkd7wl, Notional: 192850.68407013576 + {TokenChain: 3, TokenAddress: "000000000000000000000000a21d626429c68c8c768ba0b2913895571703fd5b", Symbol: "MIR", CoingeckoID: "mirror-protocol", Decimals: 6}, // Addr: terra15gwkyepfc6xgca5t5zefzwy42uts8l2m4g40k6, Notional: 243.930905257454 + {TokenChain: 3, TokenAddress: "0100000000000000000000000000000000000000000000000000000075757364", Symbol: "UST", CoingeckoID: "terrausd", Decimals: 6}, // Addr: uusd, Notional: 1736188.035782161 + {TokenChain: 3, TokenAddress: "0000000000000000000000008f5cd460d57ac54e111646fc569179144c7f0c28", Symbol: "PLY", CoingeckoID: "playnity", Decimals: 6}, // Addr: terra13awdgcx40tz5uygkgm79dytez3x87rpg4uhnvu, Notional: 137800.91630336022 + {TokenChain: 3, TokenAddress: "000000000000000000000000a8a9afbd2157e093e8448dd6450abec8ad79aeeb", Symbol: "ANC", CoingeckoID: "anchor-protocol", Decimals: 6}, // Addr: terra14z56l0fp2lsf86zy3hty2z47ezkhnthtr9yq76, Notional: 545.3273289137836 + {TokenChain: 3, TokenAddress: "00000000000000000000000034aa51100370594b15479392149157eeb479b9a8", Symbol: "ASTRO", CoingeckoID: "astroport", Decimals: 6}, // Addr: terra1xj49zyqrwpv5k928jwfpfy2ha668nwdgkwlrg3, Notional: 0.06677332837324 + {TokenChain: 3, TokenAddress: "0000000000000000000000005b7d58fe96a636927960029ea47996db5808d015", Symbol: "XRUNE", CoingeckoID: "thorstarter", Decimals: 6}, // Addr: terra1td743l5k5cmfy7tqq202g7vkmdvq35q48u2jfm, Notional: 75.91122998585045 + {TokenChain: 4, TokenAddress: "00000000000000000000000072b7d61e8fc8cf971960dd9cfa59b8c829d91991", Symbol: "AQUA", CoingeckoID: "planet-finance", Decimals: 18}, // Addr: 0x72b7d61e8fc8cf971960dd9cfa59b8c829d91991, Notional: 1.7090117921 + {TokenChain: 4, TokenAddress: "000000000000000000000000885c5fb8f0e67b2b0cf3a437e6cc6ebc0f9f9014", Symbol: "GEMG", CoingeckoID: "gemguardian", Decimals: 18}, // Addr: 0x885c5fb8f0e67b2b0cf3a437e6cc6ebc0f9f9014, Notional: 0.19300169002685402 + {TokenChain: 4, TokenAddress: "00000000000000000000000022168882276e5d5e1da694343b41dd7726eeb288", Symbol: "WSB", CoingeckoID: "wall-street-bets-dapp", Decimals: 18}, // Addr: 0x22168882276e5d5e1da694343b41dd7726eeb288, Notional: 6.071095629951835 + {TokenChain: 4, TokenAddress: "000000000000000000000000c9ad37e9baf41377540df5a77831db98c1915128", Symbol: "GINUX", CoingeckoID: "green-shiba-inu", Decimals: 18}, // Addr: 0xc9ad37e9baf41377540df5a77831db98c1915128, Notional: 106.62253379407734 + {TokenChain: 4, TokenAddress: "0000000000000000000000000231f91e02debd20345ae8ab7d71a41f8e140ce7", Symbol: "bwJUP", CoingeckoID: "jupiter", Decimals: 18}, // Addr: 0x0231f91e02debd20345ae8ab7d71a41f8e140ce7, Notional: 0.147442 + {TokenChain: 4, TokenAddress: "0000000000000000000000008519ea49c997f50ceffa444d240fb655e89248aa", Symbol: "RAMP", CoingeckoID: "ramp", Decimals: 18}, // Addr: 0x8519ea49c997f50ceffa444d240fb655e89248aa, Notional: 96.2107007955266 + {TokenChain: 4, TokenAddress: "000000000000000000000000c0ecb8499d8da2771abcbf4091db7f65158f1468", Symbol: "SWTH", CoingeckoID: "switcheo", Decimals: 8}, // Addr: 0xc0ecb8499d8da2771abcbf4091db7f65158f1468, Notional: 0.00320378 + {TokenChain: 4, TokenAddress: "000000000000000000000000b0d502e938ed5f4df2e681fe6e419ff29631d62b", Symbol: "STG", CoingeckoID: "stargate-finance", Decimals: 18}, // Addr: 0xb0d502e938ed5f4df2e681fe6e419ff29631d62b, Notional: 0.956555606136 + {TokenChain: 4, TokenAddress: "0000000000000000000000005b6dcf557e2abe2323c48445e8cc948910d8c2c9", Symbol: "MIR", CoingeckoID: "mirror-protocol", Decimals: 18}, // Addr: 0x5b6dcf557e2abe2323c48445e8cc948910d8c2c9, Notional: 84.37683528605233 + {TokenChain: 4, TokenAddress: "0000000000000000000000009d7107c8e30617cadc11f9692a19c82ae8bba938", Symbol: "ROO", CoingeckoID: "lucky-roo", Decimals: 18}, // Addr: 0x9d7107c8e30617cadc11f9692a19c82ae8bba938, Notional: 0.6438476432716216 + {TokenChain: 4, TokenAddress: "0000000000000000000000001a131f7b106d58f33eaf0fe5b47db2f2045e5732", Symbol: "DEGEN", CoingeckoID: "degenreborn", Decimals: 18}, // Addr: 0x1a131f7b106d58f33eaf0fe5b47db2f2045e5732, Notional: 13940.562320058778 + {TokenChain: 4, TokenAddress: "0000000000000000000000005512014efa6cd57764fa743756f7a6ce3358cc83", Symbol: "EZ", CoingeckoID: "easyfi", Decimals: 18}, // Addr: 0x5512014efa6cd57764fa743756f7a6ce3358cc83, Notional: 0.22973787956393177 + {TokenChain: 4, TokenAddress: "000000000000000000000000961c8c0b1aad0c0b10a51fef6a867e3091bcef17", Symbol: "DYP", CoingeckoID: "defi-yield-protocol", Decimals: 18}, // Addr: 0x961c8c0b1aad0c0b10a51fef6a867e3091bcef17, Notional: 1761.5906062726222 + {TokenChain: 4, TokenAddress: "000000000000000000000000b6c53431608e626ac81a9776ac3e999c5556717c", Symbol: "TLOS", CoingeckoID: "wrapped-telos", Decimals: 18}, // Addr: 0xb6c53431608e626ac81a9776ac3e999c5556717c, Notional: 0.6468716277324801 + {TokenChain: 4, TokenAddress: "00000000000000000000000047bead2563dcbf3bf2c9407fea4dc236faba485a", Symbol: "SXP", CoingeckoID: "swipe", Decimals: 18}, // Addr: 0x47bead2563dcbf3bf2c9407fea4dc236faba485a, Notional: 245.27282262 + {TokenChain: 4, TokenAddress: "000000000000000000000000e29142e14e52bdfbb8108076f66f49661f10ec10", Symbol: "SEILOR", CoingeckoID: "kryptonite", Decimals: 18}, // Addr: 0xe29142e14e52bdfbb8108076f66f49661f10ec10, Notional: 3068.1444181215998 + {TokenChain: 4, TokenAddress: "000000000000000000000000c0366a104b429f0806bfa98d0008daa9555b2bed", Symbol: "SMARS", CoingeckoID: "safemars-protocol", Decimals: 9}, // Addr: 0xc0366a104b429f0806bfa98d0008daa9555b2bed, Notional: 0.000960780291401109 + {TokenChain: 4, TokenAddress: "0000000000000000000000002ab0e9e4ee70fff1fb9d67031e44f6410170d00e", Symbol: "bXEN", CoingeckoID: "xen-crypto-bsc", Decimals: 18}, // Addr: 0x2ab0e9e4ee70fff1fb9d67031e44f6410170d00e, Notional: 7.305953091688748 + {TokenChain: 4, TokenAddress: "0000000000000000000000009678e42cebeb63f23197d726b29b1cb20d0064e5", Symbol: "IOTX", CoingeckoID: "binance-peg-iotex", Decimals: 18}, // Addr: 0x9678e42cebeb63f23197d726b29b1cb20d0064e5, Notional: 106.87608257963684 + {TokenChain: 4, TokenAddress: "0000000000000000000000000b33542240d6fa323c796749f6d6869fdb7f13ca", Symbol: "ETHM", CoingeckoID: "ethereum-meta", Decimals: 18}, // Addr: 0x0b33542240d6fa323c796749f6d6869fdb7f13ca, Notional: 0.18530617881543332 + {TokenChain: 4, TokenAddress: "000000000000000000000000ac51066d7bec65dc4589368da368b212745d63e8", Symbol: "ALICE", CoingeckoID: "my-neighbor-alice", Decimals: 6}, // Addr: 0xac51066d7bec65dc4589368da368b212745d63e8, Notional: 0.45817199999999997 + {TokenChain: 4, TokenAddress: "00000000000000000000000031d0a7ada4d4c131eb612db48861211f63e57610", Symbol: "START", CoingeckoID: "bscstarter", Decimals: 18}, // Addr: 0x31d0a7ada4d4c131eb612db48861211f63e57610, Notional: 0.00104925 + {TokenChain: 4, TokenAddress: "000000000000000000000000aa2ded323944b25c0b6f1f891bc96f010b65622c", Symbol: "TheRadio", CoingeckoID: "radioreum", Decimals: 18}, // Addr: 0xaa2ded323944b25c0b6f1f891bc96f010b65622c, Notional: 0.0015690120689324 + {TokenChain: 4, TokenAddress: "000000000000000000000000eca41281c24451168a37211f0bc2b8645af45092", Symbol: "TPT", CoingeckoID: "token-pocket", Decimals: 4}, // Addr: 0xeca41281c24451168a37211f0bc2b8645af45092, Notional: 1.4577039999999999 + {TokenChain: 4, TokenAddress: "000000000000000000000000fb288d60d3b66f9c3e231a9a39ed3f158a4269aa", Symbol: "PPAY", CoingeckoID: "plasma-finance", Decimals: 18}, // Addr: 0xfb288d60d3b66f9c3e231a9a39ed3f158a4269aa, Notional: 0.0726963641710875 + {TokenChain: 4, TokenAddress: "00000000000000000000000072eb7ca07399ec402c5b7aa6a65752b6a1dc0c27", Symbol: "ASTRO", CoingeckoID: "astroswap", Decimals: 18}, // Addr: 0x72eb7ca07399ec402c5b7aa6a65752b6a1dc0c27, Notional: 0.018390999999999998 + {TokenChain: 4, TokenAddress: "000000000000000000000000ad29abb318791d579433d831ed122afeaf29dcfe", Symbol: "FTM", CoingeckoID: "wrapped-fantom", Decimals: 18}, // Addr: 0xad29abb318791d579433d831ed122afeaf29dcfe, Notional: 709.4786696247475 + {TokenChain: 4, TokenAddress: "000000000000000000000000a7bd657c5838472ddf85ff0797a2e6fce8fd4833", Symbol: "ARBI", CoingeckoID: "arbipad", Decimals: 18}, // Addr: 0xa7bd657c5838472ddf85ff0797a2e6fce8fd4833, Notional: 479.73136090571035 + {TokenChain: 4, TokenAddress: "000000000000000000000000fafd4cb703b25cb22f43d017e7e0d75febc26743", Symbol: "WEYU", CoingeckoID: "weyu", Decimals: 18}, // Addr: 0xfafd4cb703b25cb22f43d017e7e0d75febc26743, Notional: 192418.6056625168 + {TokenChain: 4, TokenAddress: "00000000000000000000000012e34cdf6a031a10fe241864c32fb03a4fdad739", Symbol: "FREE", CoingeckoID: "freedom-coin", Decimals: 18}, // Addr: 0x12e34cdf6a031a10fe241864c32fb03a4fdad739, Notional: 0.00002680995 + {TokenChain: 4, TokenAddress: "00000000000000000000000031471e0791fcdbe82fbf4c44943255e923f1b794", Symbol: "PVU", CoingeckoID: "plant-vs-undead-token", Decimals: 18}, // Addr: 0x31471e0791fcdbe82fbf4c44943255e923f1b794, Notional: 0.0000139824 + {TokenChain: 4, TokenAddress: "000000000000000000000000250632378e573c6be1ac2f97fcdf00515d0aa91b", Symbol: "BETH", CoingeckoID: "binance-eth", Decimals: 18}, // Addr: 0x250632378e573c6be1ac2f97fcdf00515d0aa91b, Notional: 332.4305398664 + {TokenChain: 4, TokenAddress: "0000000000000000000000000b15ddf19d47e6a86a56148fb4afffc6929bcb89", Symbol: "IDIA", CoingeckoID: "idia", Decimals: 18}, // Addr: 0x0b15ddf19d47e6a86a56148fb4afffc6929bcb89, Notional: 1635081.9486543736 + {TokenChain: 4, TokenAddress: "0000000000000000000000007b610012bdc4d6deba2c2d91684e408f40863429", Symbol: "OSEA", CoingeckoID: "omnisea", Decimals: 18}, // Addr: 0x7b610012bdc4d6deba2c2d91684e408f40863429, Notional: 0.01577268 + {TokenChain: 4, TokenAddress: "00000000000000000000000012bb890508c125661e03b09ec06e404bc9289040", Symbol: "RACA", CoingeckoID: "radio-caca", Decimals: 18}, // Addr: 0x12bb890508c125661e03b09ec06e404bc9289040, Notional: 220.90965949568664 {TokenChain: 4, TokenAddress: "000000000000000000000000368eb5efdca39126e8e76aae5187166de7c2766c", Symbol: "CST", CoingeckoID: "cryptoskates", Decimals: 18}, // Addr: 0x368eb5efdca39126e8e76aae5187166de7c2766c, Notional: 0.22814737530270637 - {TokenChain: 4, TokenAddress: "00000000000000000000000055d398326f99059ff775485246999027b3197955", Symbol: "USDT", CoingeckoID: "tether", Decimals: 18}, // Addr: 0x55d398326f99059ff775485246999027b3197955, Notional: 144385.60259796344 - {TokenChain: 4, TokenAddress: "00000000000000000000000063eaeb6e33e11252b10553900a9f38a9ed172871", Symbol: "TUP", CoingeckoID: "tenup", Decimals: 18}, // Addr: 0x63eaeb6e33e11252b10553900a9f38a9ed172871, Notional: 1.497275122 - {TokenChain: 4, TokenAddress: "0000000000000000000000008bd778b12b15416359a227f0533ce2d91844e1ed", Symbol: "SAKE", CoingeckoID: "sake-token", Decimals: 18}, // Addr: 0x8bd778b12b15416359a227f0533ce2d91844e1ed, Notional: 2.047574799747184 - {TokenChain: 4, TokenAddress: "000000000000000000000000482e6bd0a178f985818c5dfb9ac77918e8412fba", Symbol: "ZEUM", CoingeckoID: "colizeum", Decimals: 18}, // Addr: 0x482e6bd0a178f985818c5dfb9ac77918e8412fba, Notional: 0.200911892110169 - {TokenChain: 4, TokenAddress: "000000000000000000000000678e840c640f619e17848045d23072844224dd37", Symbol: "CRTS", CoingeckoID: "cratos", Decimals: 18}, // Addr: 0x678e840c640f619e17848045d23072844224dd37, Notional: 4054.1786065417996 - {TokenChain: 4, TokenAddress: "000000000000000000000000fbc4f3f645c4003a2e4f4e9b51077d2daa9a9341", Symbol: "ZEDXION", CoingeckoID: "zedxion", Decimals: 18}, // Addr: 0xfbc4f3f645c4003a2e4f4e9b51077d2daa9a9341, Notional: 35530.61972267758 + {TokenChain: 4, TokenAddress: "00000000000000000000000055d398326f99059ff775485246999027b3197955", Symbol: "USDT", CoingeckoID: "tether", Decimals: 18}, // Addr: 0x55d398326f99059ff775485246999027b3197955, Notional: 405565.68603576 + {TokenChain: 4, TokenAddress: "00000000000000000000000063eaeb6e33e11252b10553900a9f38a9ed172871", Symbol: "TUP", CoingeckoID: "tenup", Decimals: 18}, // Addr: 0x63eaeb6e33e11252b10553900a9f38a9ed172871, Notional: 1.210857998 + {TokenChain: 4, TokenAddress: "0000000000000000000000008bd778b12b15416359a227f0533ce2d91844e1ed", Symbol: "SAKE", CoingeckoID: "sake-token", Decimals: 18}, // Addr: 0x8bd778b12b15416359a227f0533ce2d91844e1ed, Notional: 2.0567933789447688 + {TokenChain: 4, TokenAddress: "000000000000000000000000482e6bd0a178f985818c5dfb9ac77918e8412fba", Symbol: "ZEUM", CoingeckoID: "colizeum", Decimals: 18}, // Addr: 0x482e6bd0a178f985818c5dfb9ac77918e8412fba, Notional: 0.120229806109726 + {TokenChain: 4, TokenAddress: "000000000000000000000000678e840c640f619e17848045d23072844224dd37", Symbol: "CRTS", CoingeckoID: "cratos", Decimals: 18}, // Addr: 0x678e840c640f619e17848045d23072844224dd37, Notional: 3083.3561775908997 + {TokenChain: 4, TokenAddress: "000000000000000000000000fbc4f3f645c4003a2e4f4e9b51077d2daa9a9341", Symbol: "ZEDXION", CoingeckoID: "zedxion", Decimals: 18}, // Addr: 0xfbc4f3f645c4003a2e4f4e9b51077d2daa9a9341, Notional: 39686.564040584504 {TokenChain: 4, TokenAddress: "000000000000000000000000bf0cf158e84ebacca1b7746e794d507073e5adfe", Symbol: "BEPR", CoingeckoID: "blockchain-euro-project", Decimals: 9}, // Addr: 0xbf0cf158e84ebacca1b7746e794d507073e5adfe, Notional: 512.964521528051 - {TokenChain: 4, TokenAddress: "000000000000000000000000cafe001067cdef266afb7eb5a286dcfd277f3de5", Symbol: "PSP", CoingeckoID: "paraswap", Decimals: 18}, // Addr: 0xcafe001067cdef266afb7eb5a286dcfd277f3de5, Notional: 2.752889 - {TokenChain: 4, TokenAddress: "000000000000000000000000f8a0bf9cf54bb92f17374d9e9a321e6a111a51bd", Symbol: "LINK", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0xf8a0bf9cf54bb92f17374d9e9a321e6a111a51bd, Notional: 214.78875842969998 - {TokenChain: 4, TokenAddress: "000000000000000000000000f64ed9ad397a1ae657f31131d4b189220a7f1cc7", Symbol: "DFIAT", CoingeckoID: "defiato", Decimals: 18}, // Addr: 0xf64ed9ad397a1ae657f31131d4b189220a7f1cc7, Notional: 0.9672745039999999 - {TokenChain: 4, TokenAddress: "0000000000000000000000009b17baadf0f21f03e35249e0e59723f34994f806", Symbol: "SURE", CoingeckoID: "insure", Decimals: 18}, // Addr: 0x9b17baadf0f21f03e35249e0e59723f34994f806, Notional: 0.708952 - {TokenChain: 4, TokenAddress: "000000000000000000000000c748673057861a797275cd8a068abb95a902e8de", Symbol: "BabyDoge", CoingeckoID: "baby-doge-coin", Decimals: 9}, // Addr: 0xc748673057861a797275cd8a068abb95a902e8de, Notional: 14.060476084287018 - {TokenChain: 4, TokenAddress: "0000000000000000000000003c1748d647e6a56b37b66fcd2b5626d0461d3aa0", Symbol: "DNXC", CoingeckoID: "dinox", Decimals: 18}, // Addr: 0x3c1748d647e6a56b37b66fcd2b5626d0461d3aa0, Notional: 125.00186944286459 - {TokenChain: 4, TokenAddress: "000000000000000000000000bf7c81fff98bbe61b40ed186e4afd6ddd01337fe", Symbol: "EGLD", CoingeckoID: "wrapped-elrond", Decimals: 18}, // Addr: 0xbf7c81fff98bbe61b40ed186e4afd6ddd01337fe, Notional: 282.1214581708 - {TokenChain: 4, TokenAddress: "0000000000000000000000002a48ece377b87ce941406657b9278b4459595e06", Symbol: "LunaT", CoingeckoID: "lunatics", Decimals: 9}, // Addr: 0x2a48ece377b87ce941406657b9278b4459595e06, Notional: 10.124514938594281 - {TokenChain: 4, TokenAddress: "00000000000000000000000082443a77684a7da92fdcb639c8d2bd068a596245", Symbol: "SWAP", CoingeckoID: "trustswap", Decimals: 18}, // Addr: 0x82443a77684a7da92fdcb639c8d2bd068a596245, Notional: 0.37511700000000003 - {TokenChain: 4, TokenAddress: "0000000000000000000000009029fdfae9a03135846381c7ce16595c3554e10a", Symbol: "OOE", CoingeckoID: "openocean", Decimals: 18}, // Addr: 0x9029fdfae9a03135846381c7ce16595c3554e10a, Notional: 0.01090186 - {TokenChain: 4, TokenAddress: "0000000000000000000000004841181ae4079072ebe83a29b718388a387169e3", Symbol: "SUI", CoingeckoID: "salmonation", Decimals: 9}, // Addr: 0x4841181ae4079072ebe83a29b718388a387169e3, Notional: 47.607563874510674 - {TokenChain: 4, TokenAddress: "00000000000000000000000077edfae59a7948d66e9911a30cc787d2172343d4", Symbol: "LBL", CoingeckoID: "label-foundation", Decimals: 18}, // Addr: 0x77edfae59a7948d66e9911a30cc787d2172343d4, Notional: 13.44209622500478 - {TokenChain: 4, TokenAddress: "000000000000000000000000ca3f508b8e4dd382ee878a314789373d80a5190a", Symbol: "BIFI", CoingeckoID: "beefy-finance", Decimals: 18}, // Addr: 0xca3f508b8e4dd382ee878a314789373d80a5190a, Notional: 3.9650810009999997 - {TokenChain: 4, TokenAddress: "0000000000000000000000005b65cd9feb54f1df3d0c60576003344079f8dc06", Symbol: "UNW", CoingeckoID: "uniwhale", Decimals: 18}, // Addr: 0x5b65cd9feb54f1df3d0c60576003344079f8dc06, Notional: 60471.101131458985 - {TokenChain: 4, TokenAddress: "000000000000000000000000f952fc3ca7325cc27d15885d37117676d25bfda6", Symbol: "EGG", CoingeckoID: "goose-finance", Decimals: 18}, // Addr: 0xf952fc3ca7325cc27d15885d37117676d25bfda6, Notional: 0.22685380000000002 - {TokenChain: 4, TokenAddress: "00000000000000000000000088d7e9b65dc24cf54f5edef929225fc3e1580c25", Symbol: "JMPT", CoingeckoID: "jumptoken", Decimals: 18}, // Addr: 0x88d7e9b65dc24cf54f5edef929225fc3e1580c25, Notional: 498059.9947490123 - {TokenChain: 4, TokenAddress: "00000000000000000000000065c8743a5a266c3512eabd34e65ade42d4355ef1", Symbol: "BPLC", CoingeckoID: "blackpearl-chain", Decimals: 18}, // Addr: 0x65c8743a5a266c3512eabd34e65ade42d4355ef1, Notional: 5.010292563804825 - {TokenChain: 4, TokenAddress: "0000000000000000000000004691937a7508860f876c9c0a2a617e7d9e945d4b", Symbol: "WOO", CoingeckoID: "woo-network", Decimals: 18}, // Addr: 0x4691937a7508860f876c9c0a2a617e7d9e945d4b, Notional: 2.0765802429930997 - {TokenChain: 4, TokenAddress: "000000000000000000000000715d400f88c167884bbcc41c5fea407ed4d2f8a0", Symbol: "AXS", CoingeckoID: "axie-infinity", Decimals: 18}, // Addr: 0x715d400f88c167884bbcc41c5fea407ed4d2f8a0, Notional: 465.2816839821 - {TokenChain: 4, TokenAddress: "000000000000000000000000f7844cb890f4c339c497aeab599abdc3c874b67a", Symbol: "NFTART", CoingeckoID: "nft-art-finance", Decimals: 9}, // Addr: 0xf7844cb890f4c339c497aeab599abdc3c874b67a, Notional: 2.0222267495400003e-11 - {TokenChain: 4, TokenAddress: "0000000000000000000000006e2a5ea25b161befa6a8444c71ae3a89c39933c6", Symbol: "B2M", CoingeckoID: "bit2me", Decimals: 18}, // Addr: 0x6e2a5ea25b161befa6a8444c71ae3a89c39933c6, Notional: 65.37618 - {TokenChain: 4, TokenAddress: "00000000000000000000000046d502fac9aea7c5bc7b13c8ec9d02378c33d36f", Symbol: "WSPP", CoingeckoID: "wolfsafepoorpeople", Decimals: 0}, // Addr: 0x46d502fac9aea7c5bc7b13c8ec9d02378c33d36f, Notional: 9.67450219501189 - {TokenChain: 4, TokenAddress: "000000000000000000000000154a9f9cbd3449ad22fdae23044319d6ef2a1fab", Symbol: "SKILL", CoingeckoID: "cryptoblades", Decimals: 18}, // Addr: 0x154a9f9cbd3449ad22fdae23044319d6ef2a1fab, Notional: 0.000501035 - {TokenChain: 4, TokenAddress: "000000000000000000000000d9907fcda91ac644f70477b8fc1607ad15b2d7a8", Symbol: "multiBTC", CoingeckoID: "multibtc", Decimals: 8}, // Addr: 0xd9907fcda91ac644f70477b8fc1607ad15b2d7a8, Notional: 0.0421436 - {TokenChain: 4, TokenAddress: "0000000000000000000000002541be91fe0d220ffcbe65f11d88217a87a43bda", Symbol: "$Lordz", CoingeckoID: "meme-lordz", Decimals: 9}, // Addr: 0x2541be91fe0d220ffcbe65f11d88217a87a43bda, Notional: 0.00427873 - {TokenChain: 4, TokenAddress: "000000000000000000000000fa40d8fc324bcdd6bbae0e086de886c571c225d4", Symbol: "WZRD", CoingeckoID: "wizardia", Decimals: 18}, // Addr: 0xfa40d8fc324bcdd6bbae0e086de886c571c225d4, Notional: 6447.083005729431 - {TokenChain: 4, TokenAddress: "000000000000000000000000947950bcc74888a40ffa2593c5798f11fc9124c4", Symbol: "SUSHI", CoingeckoID: "sushi", Decimals: 18}, // Addr: 0x947950bcc74888a40ffa2593c5798f11fc9124c4, Notional: 3.2760491916845 - {TokenChain: 4, TokenAddress: "0000000000000000000000002ff0b946a6782190c4fe5d4971cfe79f0b6e4df2", Symbol: "MYST", CoingeckoID: "mysterium", Decimals: 18}, // Addr: 0x2ff0b946a6782190c4fe5d4971cfe79f0b6e4df2, Notional: 0.21089688163067 - {TokenChain: 4, TokenAddress: "0000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc3", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3, Notional: 1555.82200459 - {TokenChain: 4, TokenAddress: "00000000000000000000000098f8669f6481ebb341b522fcd3663f79a3d1a6a7", Symbol: "NEST", CoingeckoID: "nest", Decimals: 18}, // Addr: 0x98f8669f6481ebb341b522fcd3663f79a3d1a6a7, Notional: 0.7447431448250963 - {TokenChain: 4, TokenAddress: "000000000000000000000000d32d01a43c869edcd1117c640fbdcfcfd97d9d65", Symbol: "NMX", CoingeckoID: "nominex", Decimals: 18}, // Addr: 0xd32d01a43c869edcd1117c640fbdcfcfd97d9d65, Notional: 0.0475794212720175 - {TokenChain: 4, TokenAddress: "000000000000000000000000bf05279f9bf1ce69bbfed670813b7e431142afa4", Symbol: "MM", CoingeckoID: "million", Decimals: 18}, // Addr: 0xbf05279f9bf1ce69bbfed670813b7e431142afa4, Notional: 1.79 - {TokenChain: 4, TokenAddress: "00000000000000000000000052f24a5e03aee338da5fd9df68d2b6fae1178827", Symbol: "ankrBNB", CoingeckoID: "ankr-staked-bnb", Decimals: 18}, // Addr: 0x52f24a5e03aee338da5fd9df68d2b6fae1178827, Notional: 0.25408000000000003 - {TokenChain: 4, TokenAddress: "000000000000000000000000bfbee3dac982148ac793161f7362344925506903", Symbol: "CATZ", CoingeckoID: "catzcoin", Decimals: 18}, // Addr: 0xbfbee3dac982148ac793161f7362344925506903, Notional: 0.0015012 - {TokenChain: 4, TokenAddress: "000000000000000000000000b955b4cab9aa3b49e23aeb5204ebc5ff6678e86d", Symbol: "Afin", CoingeckoID: "afin-coin", Decimals: 18}, // Addr: 0xb955b4cab9aa3b49e23aeb5204ebc5ff6678e86d, Notional: 18.3139185307097 - {TokenChain: 4, TokenAddress: "000000000000000000000000854a63b35b70a7becbed508ff0b6ff5038d0c917", Symbol: "MNTO", CoingeckoID: "minato", Decimals: 18}, // Addr: 0x854a63b35b70a7becbed508ff0b6ff5038d0c917, Notional: 19.1514636144 - {TokenChain: 4, TokenAddress: "000000000000000000000000570a5d26f7765ecb712c0924e4de545b89fd43df", Symbol: "SOL", CoingeckoID: "wrapped-solana", Decimals: 18}, // Addr: 0x570a5d26f7765ecb712c0924e4de545b89fd43df, Notional: 4752.424861056 - {TokenChain: 4, TokenAddress: "0000000000000000000000007559c49c3aec50e763a486bb232fa8d0d76078e4", Symbol: "ATR", CoingeckoID: "artrade", Decimals: 9}, // Addr: 0x7559c49c3aec50e763a486bb232fa8d0d76078e4, Notional: 0.157626 - {TokenChain: 4, TokenAddress: "00000000000000000000000045f7967926e95fd161e56ed66b663c9114c5226f", Symbol: "TOKO", CoingeckoID: "toko", Decimals: 18}, // Addr: 0x45f7967926e95fd161e56ed66b663c9114c5226f, Notional: 0.3343995766910634 - {TokenChain: 4, TokenAddress: "0000000000000000000000001cb9ca00538265a22e56b758026948608ba5d86f", Symbol: "LSR", CoingeckoID: "lasereyes", Decimals: 8}, // Addr: 0x1cb9ca00538265a22e56b758026948608ba5d86f, Notional: 0.1234194 - {TokenChain: 4, TokenAddress: "0000000000000000000000009767c8e438aa18f550208e6d1fdf5f43541cc2c8", Symbol: "MMIT", CoingeckoID: "mangoman-intelligent", Decimals: 18}, // Addr: 0x9767c8e438aa18f550208e6d1fdf5f43541cc2c8, Notional: 9.864e-7 - {TokenChain: 4, TokenAddress: "000000000000000000000000a719b8ab7ea7af0ddb4358719a34631bb79d15dc", Symbol: "FRM", CoingeckoID: "ferrum-network", Decimals: 18}, // Addr: 0xa719b8ab7ea7af0ddb4358719a34631bb79d15dc, Notional: 3.625098114596062 - {TokenChain: 4, TokenAddress: "0000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f8", Symbol: "ETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x2170ed0880ac9a755fd29b2688956bd959f933f8, Notional: 105942.995707728 - {TokenChain: 4, TokenAddress: "0000000000000000000000003ee2200efb3400fabb9aacf31297cbdd1d435d47", Symbol: "ADA", CoingeckoID: "binance-peg-cardano", Decimals: 18}, // Addr: 0x3ee2200efb3400fabb9aacf31297cbdd1d435d47, Notional: 4.64985935102005 - {TokenChain: 4, TokenAddress: "000000000000000000000000fd7b3a77848f1c2d67e05e54d78d174a0c850335", Symbol: "ONT", CoingeckoID: "binance-peg-ontology", Decimals: 18}, // Addr: 0xfd7b3a77848f1c2d67e05e54d78d174a0c850335, Notional: 0.0186161 - {TokenChain: 4, TokenAddress: "000000000000000000000000317eb4ad9cfac6232f0046831322e895507bcbeb", Symbol: "TDX", CoingeckoID: "tidex-token", Decimals: 18}, // Addr: 0x317eb4ad9cfac6232f0046831322e895507bcbeb, Notional: 20.949892616712397 - {TokenChain: 4, TokenAddress: "0000000000000000000000004f39c3319188a723003670c3f9b9e7ef991e52f3", Symbol: "FIGHT", CoingeckoID: "crypto-fight-club", Decimals: 18}, // Addr: 0x4f39c3319188a723003670c3f9b9e7ef991e52f3, Notional: 0.00165606 - {TokenChain: 4, TokenAddress: "000000000000000000000000f7de7e8a6bd59ed41a4b5fe50278b3b7f31384df", Symbol: "RDNT", CoingeckoID: "radiant-capital", Decimals: 18}, // Addr: 0xf7de7e8a6bd59ed41a4b5fe50278b3b7f31384df, Notional: 2.3698286968302003 - {TokenChain: 4, TokenAddress: "000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056", Symbol: "iDYP", CoingeckoID: "idefiyieldprotocol", Decimals: 18}, // Addr: 0xbd100d061e120b2c67a24453cf6368e63f1be056, Notional: 0.042519 - {TokenChain: 4, TokenAddress: "0000000000000000000000008076c74c5e3f5852037f31ff0093eeb8c8add8d3", Symbol: "SAFEMOON", CoingeckoID: "safemoon", Decimals: 9}, // Addr: 0x8076c74c5e3f5852037f31ff0093eeb8c8add8d3, Notional: 2.3085e-7 - {TokenChain: 4, TokenAddress: "000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", Symbol: "WBNB", CoingeckoID: "wbnb", Decimals: 18}, // Addr: 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c, Notional: 3597805.1434384943 - {TokenChain: 4, TokenAddress: "0000000000000000000000007269d98af4aa705e0b1a5d8512fadb4d45817d5a", Symbol: "SHI", CoingeckoID: "shirtum", Decimals: 18}, // Addr: 0x7269d98af4aa705e0b1a5d8512fadb4d45817d5a, Notional: 0.14944100000000002 - {TokenChain: 4, TokenAddress: "000000000000000000000000734c5f3f8f6ad9697b26ecc6388678aafd3db3b2", Symbol: "METAMUSK", CoingeckoID: "musk-metaverse", Decimals: 18}, // Addr: 0x734c5f3f8f6ad9697b26ecc6388678aafd3db3b2, Notional: 0.00003271979602670728 - {TokenChain: 4, TokenAddress: "0000000000000000000000000eb3a705fc54725037cc9e008bdede697f62f335", Symbol: "ATOM", CoingeckoID: "cosmos", Decimals: 18}, // Addr: 0x0eb3a705fc54725037cc9e008bdede697f62f335, Notional: 216.4077254727 - {TokenChain: 4, TokenAddress: "000000000000000000000000d06716e1ff2e492cc5034c2e81805562dd3b45fa", Symbol: "MGP", CoingeckoID: "magpie", Decimals: 18}, // Addr: 0xd06716e1ff2e492cc5034c2e81805562dd3b45fa, Notional: 1074227.15761341 - {TokenChain: 4, TokenAddress: "000000000000000000000000fb5b838b6cfeedc2873ab27866079ac55363d37e", Symbol: "FLOKI", CoingeckoID: "floki", Decimals: 9}, // Addr: 0xfb5b838b6cfeedc2873ab27866079ac55363d37e, Notional: 327.1619358929704 - {TokenChain: 4, TokenAddress: "000000000000000000000000965f527d9159dce6288a2219db51fc6eef120dd1", Symbol: "BSW", CoingeckoID: "biswap", Decimals: 18}, // Addr: 0x965f527d9159dce6288a2219db51fc6eef120dd1, Notional: 0.083844 - {TokenChain: 4, TokenAddress: "000000000000000000000000027a9d301fb747cd972cfb29a63f3bda551dfc5c", Symbol: "mWOM", CoingeckoID: "magpie-wom", Decimals: 18}, // Addr: 0x027a9d301fb747cd972cfb29a63f3bda551dfc5c, Notional: 3.572367770365949 - {TokenChain: 4, TokenAddress: "0000000000000000000000004a2c860cec6471b9f5f5a336eb4f38bb21683c98", Symbol: "GST", CoingeckoID: "green-satoshi-token-bsc", Decimals: 8}, // Addr: 0x4a2c860cec6471b9f5f5a336eb4f38bb21683c98, Notional: 236.68504681168943 - {TokenChain: 4, TokenAddress: "000000000000000000000000d17479997f34dd9156deef8f95a52d81d265be9c", Symbol: "USDD", CoingeckoID: "usdd", Decimals: 18}, // Addr: 0xd17479997f34dd9156deef8f95a52d81d265be9c, Notional: 0.0040328555558199995 - {TokenChain: 4, TokenAddress: "000000000000000000000000111111111117dc0aa78b770fa6a738034120c302", Symbol: "1INCH", CoingeckoID: "1inch", Decimals: 18}, // Addr: 0x111111111117dc0aa78b770fa6a738034120c302, Notional: 15.971231 - {TokenChain: 4, TokenAddress: "000000000000000000000000cc42724c6683b7e57334c4e856f4c9965ed682bd", Symbol: "MATIC", CoingeckoID: "matic-network", Decimals: 18}, // Addr: 0xcc42724c6683b7e57334c4e856f4c9965ed682bd, Notional: 4336.879926812804 - {TokenChain: 4, TokenAddress: "000000000000000000000000fb9c339b4bace4fe63ccc1dd9a3c3c531441d5fe", Symbol: "SHILL", CoingeckoID: "shill-token", Decimals: 18}, // Addr: 0xfb9c339b4bace4fe63ccc1dd9a3c3c531441d5fe, Notional: 16.7917213324777 - {TokenChain: 4, TokenAddress: "000000000000000000000000928e55dab735aa8260af3cedada18b5f70c72f1b", Symbol: "FRONT", CoingeckoID: "frontier-token", Decimals: 18}, // Addr: 0x928e55dab735aa8260af3cedada18b5f70c72f1b, Notional: 1.02158063254336 - {TokenChain: 4, TokenAddress: "000000000000000000000000c342774492b54ce5f8ac662113ed702fc1b34972", Symbol: "BGEO", CoingeckoID: "geodb", Decimals: 18}, // Addr: 0xc342774492b54ce5f8ac662113ed702fc1b34972, Notional: 874.28 - {TokenChain: 4, TokenAddress: "000000000000000000000000524df384bffb18c0c8f3f43d012011f8f9795579", Symbol: "YAY", CoingeckoID: "yay-games", Decimals: 18}, // Addr: 0x524df384bffb18c0c8f3f43d012011f8f9795579, Notional: 0.006594599999999999 - {TokenChain: 4, TokenAddress: "000000000000000000000000a2120b9e674d3fc3875f415a7df52e382f141225", Symbol: "ATA", CoingeckoID: "automata", Decimals: 18}, // Addr: 0xa2120b9e674d3fc3875f415a7df52e382f141225, Notional: 1.7266632 - {TokenChain: 4, TokenAddress: "000000000000000000000000fb6115445bff7b52feb98650c87f44907e58f802", Symbol: "AAVE", CoingeckoID: "aave", Decimals: 18}, // Addr: 0xfb6115445bff7b52feb98650c87f44907e58f802, Notional: 20.182302 - {TokenChain: 4, TokenAddress: "0000000000000000000000009ed7e4b1bff939ad473da5e7a218c771d1569456", Symbol: "REUNI", CoingeckoID: "reunit-wallet", Decimals: 6}, // Addr: 0x9ed7e4b1bff939ad473da5e7a218c771d1569456, Notional: 17.88984375 - {TokenChain: 4, TokenAddress: "000000000000000000000000ffba7529ac181c2ee1844548e6d7061c9a597df4", Symbol: "CAPS", CoingeckoID: "coin-capsule", Decimals: 18}, // Addr: 0xffba7529ac181c2ee1844548e6d7061c9a597df4, Notional: 0.1561754 - {TokenChain: 4, TokenAddress: "000000000000000000000000d3b71117e6c1558c1553305b44988cd944e97300", Symbol: "YEL", CoingeckoID: "yel-finance", Decimals: 18}, // Addr: 0xd3b71117e6c1558c1553305b44988cd944e97300, Notional: 0.07641230193684499 - {TokenChain: 4, TokenAddress: "0000000000000000000000002d6f3dc5b202ccd91db114b592872bca32a7e292", Symbol: "SAUDISHIB", CoingeckoID: "saudi-shiba-inu", Decimals: 8}, // Addr: 0x2d6f3dc5b202ccd91db114b592872bca32a7e292, Notional: 72.45981021905578 - {TokenChain: 4, TokenAddress: "000000000000000000000000ba2ae424d960c26247dd6c32edc70b295c744c43", Symbol: "DOGE", CoingeckoID: "binance-peg-dogecoin", Decimals: 8}, // Addr: 0xba2ae424d960c26247dd6c32edc70b295c744c43, Notional: 239.27361838300442 - {TokenChain: 4, TokenAddress: "0000000000000000000000002cd96e8c3ff6b5e01169f6e3b61d28204e7810bb", Symbol: "LBlock", CoingeckoID: "lucky-block", Decimals: 9}, // Addr: 0x2cd96e8c3ff6b5e01169f6e3b61d28204e7810bb, Notional: 34.920558173460925 - {TokenChain: 4, TokenAddress: "000000000000000000000000e2e7329499e8ddb1f2b04ee4b35a8d7f6881e4ea", Symbol: "$ANRX", CoingeckoID: "anrkey-x", Decimals: 18}, // Addr: 0xe2e7329499e8ddb1f2b04ee4b35a8d7f6881e4ea, Notional: 74.8622208615 - {TokenChain: 4, TokenAddress: "000000000000000000000000b46584e0efde3092e04010a13f2eae62adb3b9f0", Symbol: "PEPE", CoingeckoID: "pepe-coin-bsc-c45e8b31-8ae1-43f4-bd34-e75551d97285", Decimals: 18}, // Addr: 0xb46584e0efde3092e04010a13f2eae62adb3b9f0, Notional: 0.006410126181800922 - {TokenChain: 4, TokenAddress: "000000000000000000000000fe56d5892bdffc7bf58f2e84be1b2c32d21c308b", Symbol: "KNC", CoingeckoID: "kyber-network-crystal", Decimals: 18}, // Addr: 0xfe56d5892bdffc7bf58f2e84be1b2c32d21c308b, Notional: 3.08389662880138 - {TokenChain: 4, TokenAddress: "0000000000000000000000002f25d402829ca4085b8ea4d3bc68bf203f5a9fab", Symbol: "Eagon", CoingeckoID: "eagonswap-token", Decimals: 18}, // Addr: 0x2f25d402829ca4085b8ea4d3bc68bf203f5a9fab, Notional: 1.7130095391750306 - {TokenChain: 4, TokenAddress: "00000000000000000000000025b24b3c47918b7962b3e49c4f468367f73cc0e0", Symbol: "AXL", CoingeckoID: "axl-inu", Decimals: 18}, // Addr: 0x25b24b3c47918b7962b3e49c4f468367f73cc0e0, Notional: 0.1079 - {TokenChain: 4, TokenAddress: "000000000000000000000000c19fe21b4ef356f2f65894392dde4252aa083605", Symbol: "WSO", CoingeckoID: "widi-soul", Decimals: 18}, // Addr: 0xc19fe21b4ef356f2f65894392dde4252aa083605, Notional: 0.0055006273059495 - {TokenChain: 4, TokenAddress: "000000000000000000000000e9c803f48dffe50180bd5b01dc04da939e3445fc", Symbol: "VLX", CoingeckoID: "velas", Decimals: 18}, // Addr: 0xe9c803f48dffe50180bd5b01dc04da939e3445fc, Notional: 0.0707662066346203 + {TokenChain: 4, TokenAddress: "000000000000000000000000cafe001067cdef266afb7eb5a286dcfd277f3de5", Symbol: "PSP", CoingeckoID: "paraswap", Decimals: 18}, // Addr: 0xcafe001067cdef266afb7eb5a286dcfd277f3de5, Notional: 2.374643 + {TokenChain: 4, TokenAddress: "000000000000000000000000f8a0bf9cf54bb92f17374d9e9a321e6a111a51bd", Symbol: "LINK", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0xf8a0bf9cf54bb92f17374d9e9a321e6a111a51bd, Notional: 2271.5308988372 + {TokenChain: 4, TokenAddress: "0000000000000000000000004ba0057f784858a48fe351445c672ff2a3d43515", Symbol: "KALM", CoingeckoID: "kalmar", Decimals: 18}, // Addr: 0x4ba0057f784858a48fe351445c672ff2a3d43515, Notional: 375.03799828 + {TokenChain: 4, TokenAddress: "000000000000000000000000f64ed9ad397a1ae657f31131d4b189220a7f1cc7", Symbol: "DFIAT", CoingeckoID: "defiato", Decimals: 18}, // Addr: 0xf64ed9ad397a1ae657f31131d4b189220a7f1cc7, Notional: 0.825560827 + {TokenChain: 4, TokenAddress: "0000000000000000000000009b17baadf0f21f03e35249e0e59723f34994f806", Symbol: "SURE", CoingeckoID: "insure", Decimals: 18}, // Addr: 0x9b17baadf0f21f03e35249e0e59723f34994f806, Notional: 0.618186 + {TokenChain: 4, TokenAddress: "000000000000000000000000c748673057861a797275cd8a068abb95a902e8de", Symbol: "BabyDoge", CoingeckoID: "baby-doge-coin", Decimals: 9}, // Addr: 0xc748673057861a797275cd8a068abb95a902e8de, Notional: 13.419803455548145 + {TokenChain: 4, TokenAddress: "0000000000000000000000003c1748d647e6a56b37b66fcd2b5626d0461d3aa0", Symbol: "DNXC", CoingeckoID: "dinox", Decimals: 18}, // Addr: 0x3c1748d647e6a56b37b66fcd2b5626d0461d3aa0, Notional: 159.21628971416968 + {TokenChain: 4, TokenAddress: "000000000000000000000000bf7c81fff98bbe61b40ed186e4afd6ddd01337fe", Symbol: "EGLD", CoingeckoID: "wrapped-elrond", Decimals: 18}, // Addr: 0xbf7c81fff98bbe61b40ed186e4afd6ddd01337fe, Notional: 247.44981501040002 + {TokenChain: 4, TokenAddress: "0000000000000000000000002a48ece377b87ce941406657b9278b4459595e06", Symbol: "LunaT", CoingeckoID: "lunatics", Decimals: 9}, // Addr: 0x2a48ece377b87ce941406657b9278b4459595e06, Notional: 10.12451493859477 + {TokenChain: 4, TokenAddress: "00000000000000000000000082443a77684a7da92fdcb639c8d2bd068a596245", Symbol: "SWAP", CoingeckoID: "trustswap", Decimals: 18}, // Addr: 0x82443a77684a7da92fdcb639c8d2bd068a596245, Notional: 0.270924 + {TokenChain: 4, TokenAddress: "0000000000000000000000009029fdfae9a03135846381c7ce16595c3554e10a", Symbol: "OOE", CoingeckoID: "openocean", Decimals: 18}, // Addr: 0x9029fdfae9a03135846381c7ce16595c3554e10a, Notional: 0.00998781 + {TokenChain: 4, TokenAddress: "0000000000000000000000004841181ae4079072ebe83a29b718388a387169e3", Symbol: "SUI", CoingeckoID: "salmonation", Decimals: 9}, // Addr: 0x4841181ae4079072ebe83a29b718388a387169e3, Notional: 43.56148632109256 + {TokenChain: 4, TokenAddress: "00000000000000000000000077edfae59a7948d66e9911a30cc787d2172343d4", Symbol: "LBL", CoingeckoID: "label-foundation", Decimals: 18}, // Addr: 0x77edfae59a7948d66e9911a30cc787d2172343d4, Notional: 16.734159134711895 + {TokenChain: 4, TokenAddress: "000000000000000000000000ca3f508b8e4dd382ee878a314789373d80a5190a", Symbol: "BIFI", CoingeckoID: "beefy-finance", Decimals: 18}, // Addr: 0xca3f508b8e4dd382ee878a314789373d80a5190a, Notional: 4.2069304973 + {TokenChain: 4, TokenAddress: "0000000000000000000000005b65cd9feb54f1df3d0c60576003344079f8dc06", Symbol: "UNW", CoingeckoID: "uniwhale", Decimals: 18}, // Addr: 0x5b65cd9feb54f1df3d0c60576003344079f8dc06, Notional: 13020.451531480767 + {TokenChain: 4, TokenAddress: "000000000000000000000000f952fc3ca7325cc27d15885d37117676d25bfda6", Symbol: "EGG", CoingeckoID: "goose-finance", Decimals: 18}, // Addr: 0xf952fc3ca7325cc27d15885d37117676d25bfda6, Notional: 0.23924620000000002 + {TokenChain: 4, TokenAddress: "0000000000000000000000001d1cb8997570e73949930c01fe5796c88d7336c6", Symbol: "PBR", CoingeckoID: "polkabridge", Decimals: 18}, // Addr: 0x1d1cb8997570e73949930c01fe5796c88d7336c6, Notional: 0.02552089 + {TokenChain: 4, TokenAddress: "00000000000000000000000088d7e9b65dc24cf54f5edef929225fc3e1580c25", Symbol: "JMPT", CoingeckoID: "jumptoken", Decimals: 18}, // Addr: 0x88d7e9b65dc24cf54f5edef929225fc3e1580c25, Notional: 543163.9160568777 + {TokenChain: 4, TokenAddress: "00000000000000000000000065c8743a5a266c3512eabd34e65ade42d4355ef1", Symbol: "BPLC", CoingeckoID: "blackpearl-chain", Decimals: 18}, // Addr: 0x65c8743a5a266c3512eabd34e65ade42d4355ef1, Notional: 4.414162273072584 + {TokenChain: 4, TokenAddress: "0000000000000000000000004691937a7508860f876c9c0a2a617e7d9e945d4b", Symbol: "WOO", CoingeckoID: "woo-network", Decimals: 18}, // Addr: 0x4691937a7508860f876c9c0a2a617e7d9e945d4b, Notional: 1.9364785474410997 + {TokenChain: 4, TokenAddress: "000000000000000000000000715d400f88c167884bbcc41c5fea407ed4d2f8a0", Symbol: "AXS", CoingeckoID: "axie-infinity", Decimals: 18}, // Addr: 0x715d400f88c167884bbcc41c5fea407ed4d2f8a0, Notional: 448.7300583965 + {TokenChain: 4, TokenAddress: "000000000000000000000000f7844cb890f4c339c497aeab599abdc3c874b67a", Symbol: "NFTART", CoingeckoID: "nft-art-finance", Decimals: 9}, // Addr: 0xf7844cb890f4c339c497aeab599abdc3c874b67a, Notional: 1.54191274848e-11 + {TokenChain: 4, TokenAddress: "00000000000000000000000041065e3428188ba6eb27fbdde8526ae3af8e3830", Symbol: "SWASH", CoingeckoID: "swash", Decimals: 18}, // Addr: 0x41065e3428188ba6eb27fbdde8526ae3af8e3830, Notional: 124.77134288634552 + {TokenChain: 4, TokenAddress: "0000000000000000000000006e2a5ea25b161befa6a8444c71ae3a89c39933c6", Symbol: "B2M", CoingeckoID: "bit2me", Decimals: 18}, // Addr: 0x6e2a5ea25b161befa6a8444c71ae3a89c39933c6, Notional: 57.12345 + {TokenChain: 4, TokenAddress: "00000000000000000000000046d502fac9aea7c5bc7b13c8ec9d02378c33d36f", Symbol: "WSPP", CoingeckoID: "wolfsafepoorpeople", Decimals: 0}, // Addr: 0x46d502fac9aea7c5bc7b13c8ec9d02378c33d36f, Notional: 10.043722850059837 + {TokenChain: 4, TokenAddress: "00000000000000000000000068784ffaa6ff05e3e04575df77960dc1d9f42b4a", Symbol: "ABR", CoingeckoID: "allbridge", Decimals: 18}, // Addr: 0x68784ffaa6ff05e3e04575df77960dc1d9f42b4a, Notional: 0.82194 + {TokenChain: 4, TokenAddress: "000000000000000000000000154a9f9cbd3449ad22fdae23044319d6ef2a1fab", Symbol: "SKILL", CoingeckoID: "cryptoblades", Decimals: 18}, // Addr: 0x154a9f9cbd3449ad22fdae23044319d6ef2a1fab, Notional: 0.000502935 + {TokenChain: 4, TokenAddress: "000000000000000000000000d9907fcda91ac644f70477b8fc1607ad15b2d7a8", Symbol: "multiBTC", CoingeckoID: "multibtc", Decimals: 8}, // Addr: 0xd9907fcda91ac644f70477b8fc1607ad15b2d7a8, Notional: 0.069348 + {TokenChain: 4, TokenAddress: "0000000000000000000000002541be91fe0d220ffcbe65f11d88217a87a43bda", Symbol: "$Lordz", CoingeckoID: "meme-lordz", Decimals: 9}, // Addr: 0x2541be91fe0d220ffcbe65f11d88217a87a43bda, Notional: 0.00606174 + {TokenChain: 4, TokenAddress: "000000000000000000000000fa40d8fc324bcdd6bbae0e086de886c571c225d4", Symbol: "WZRD", CoingeckoID: "wizardia", Decimals: 18}, // Addr: 0xfa40d8fc324bcdd6bbae0e086de886c571c225d4, Notional: 4201.136046644532 + {TokenChain: 4, TokenAddress: "000000000000000000000000947950bcc74888a40ffa2593c5798f11fc9124c4", Symbol: "SUSHI", CoingeckoID: "sushi", Decimals: 18}, // Addr: 0x947950bcc74888a40ffa2593c5798f11fc9124c4, Notional: 2.660178221302 + {TokenChain: 4, TokenAddress: "0000000000000000000000002ff0b946a6782190c4fe5d4971cfe79f0b6e4df2", Symbol: "MYST", CoingeckoID: "mysterium", Decimals: 18}, // Addr: 0x2ff0b946a6782190c4fe5d4971cfe79f0b6e4df2, Notional: 0.2061065669065 + {TokenChain: 4, TokenAddress: "000000000000000000000000ac472d0eed2b8a2f57a6e304ea7ebd8e88d1d36f", Symbol: "ANI", CoingeckoID: "anime-token", Decimals: 18}, // Addr: 0xac472d0eed2b8a2f57a6e304ea7ebd8e88d1d36f, Notional: 112.852 + {TokenChain: 4, TokenAddress: "0000000000000000000000001af3f329e8be154074d8769d1ffa4ee058b1dbc3", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3, Notional: 1585.4511413218647 + {TokenChain: 4, TokenAddress: "00000000000000000000000098f8669f6481ebb341b522fcd3663f79a3d1a6a7", Symbol: "NEST", CoingeckoID: "nest", Decimals: 18}, // Addr: 0x98f8669f6481ebb341b522fcd3663f79a3d1a6a7, Notional: 0.27943257181040815 + {TokenChain: 4, TokenAddress: "000000000000000000000000d32d01a43c869edcd1117c640fbdcfcfd97d9d65", Symbol: "NMX", CoingeckoID: "nominex", Decimals: 18}, // Addr: 0xd32d01a43c869edcd1117c640fbdcfcfd97d9d65, Notional: 0.0352141689173175 + {TokenChain: 4, TokenAddress: "000000000000000000000000bf05279f9bf1ce69bbfed670813b7e431142afa4", Symbol: "MM", CoingeckoID: "million", Decimals: 18}, // Addr: 0xbf05279f9bf1ce69bbfed670813b7e431142afa4, Notional: 2.04 + {TokenChain: 4, TokenAddress: "00000000000000000000000052f24a5e03aee338da5fd9df68d2b6fae1178827", Symbol: "ankrBNB", CoingeckoID: "ankr-staked-bnb", Decimals: 18}, // Addr: 0x52f24a5e03aee338da5fd9df68d2b6fae1178827, Notional: 0.23321 + {TokenChain: 4, TokenAddress: "000000000000000000000000bfbee3dac982148ac793161f7362344925506903", Symbol: "CATZ", CoingeckoID: "catzcoin", Decimals: 18}, // Addr: 0xbfbee3dac982148ac793161f7362344925506903, Notional: 0.00124544 + {TokenChain: 4, TokenAddress: "000000000000000000000000b955b4cab9aa3b49e23aeb5204ebc5ff6678e86d", Symbol: "Afin", CoingeckoID: "afin-coin", Decimals: 18}, // Addr: 0xb955b4cab9aa3b49e23aeb5204ebc5ff6678e86d, Notional: 5.112416071363197 + {TokenChain: 4, TokenAddress: "000000000000000000000000e4e11e02aa14c7f24db749421986eaec1369e8c9", Symbol: "MNTC", CoingeckoID: "minativerse", Decimals: 18}, // Addr: 0xe4e11e02aa14c7f24db749421986eaec1369e8c9, Notional: 3.4571999999999994 + {TokenChain: 4, TokenAddress: "000000000000000000000000854a63b35b70a7becbed508ff0b6ff5038d0c917", Symbol: "MNTO", CoingeckoID: "minato", Decimals: 18}, // Addr: 0x854a63b35b70a7becbed508ff0b6ff5038d0c917, Notional: 21.4533222219 + {TokenChain: 4, TokenAddress: "000000000000000000000000570a5d26f7765ecb712c0924e4de545b89fd43df", Symbol: "SOL", CoingeckoID: "wrapped-solana", Decimals: 18}, // Addr: 0x570a5d26f7765ecb712c0924e4de545b89fd43df, Notional: 6195.9551646695 + {TokenChain: 4, TokenAddress: "0000000000000000000000007559c49c3aec50e763a486bb232fa8d0d76078e4", Symbol: "ATR", CoingeckoID: "artrade", Decimals: 9}, // Addr: 0x7559c49c3aec50e763a486bb232fa8d0d76078e4, Notional: 0.117526 + {TokenChain: 4, TokenAddress: "00000000000000000000000010c9524dbf934b3b625dce3bdc0efdc367f4e84b", Symbol: "MVX", CoingeckoID: "mavaverse-token", Decimals: 8}, // Addr: 0x10c9524dbf934b3b625dce3bdc0efdc367f4e84b, Notional: 0.030077068593542526 + {TokenChain: 4, TokenAddress: "00000000000000000000000045f7967926e95fd161e56ed66b663c9114c5226f", Symbol: "TOKO", CoingeckoID: "toko", Decimals: 18}, // Addr: 0x45f7967926e95fd161e56ed66b663c9114c5226f, Notional: 0.30156899314961105 + {TokenChain: 4, TokenAddress: "0000000000000000000000002235e79086dd23135119366da45851c741874e5b", Symbol: "CREDI", CoingeckoID: "credefi", Decimals: 18}, // Addr: 0x2235e79086dd23135119366da45851c741874e5b, Notional: 4.706496743667016 + {TokenChain: 4, TokenAddress: "0000000000000000000000001cb9ca00538265a22e56b758026948608ba5d86f", Symbol: "LSR", CoingeckoID: "lasereyes", Decimals: 8}, // Addr: 0x1cb9ca00538265a22e56b758026948608ba5d86f, Notional: 0.12299976000000001 + {TokenChain: 4, TokenAddress: "0000000000000000000000009767c8e438aa18f550208e6d1fdf5f43541cc2c8", Symbol: "MMIT", CoingeckoID: "mangoman-intelligent", Decimals: 18}, // Addr: 0x9767c8e438aa18f550208e6d1fdf5f43541cc2c8, Notional: 0.0000013847 + {TokenChain: 4, TokenAddress: "000000000000000000000000a719b8ab7ea7af0ddb4358719a34631bb79d15dc", Symbol: "FRM", CoingeckoID: "ferrum-network", Decimals: 18}, // Addr: 0xa719b8ab7ea7af0ddb4358719a34631bb79d15dc, Notional: 2.60063819435475 + {TokenChain: 4, TokenAddress: "0000000000000000000000002170ed0880ac9a755fd29b2688956bd959f933f8", Symbol: "ETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x2170ed0880ac9a755fd29b2688956bd959f933f8, Notional: 96890.6282056362 + {TokenChain: 4, TokenAddress: "000000000000000000000000245d9f531757f83064ad808b4c9b220c703a4934", Symbol: "GODE", CoingeckoID: "gode-chain", Decimals: 6}, // Addr: 0x245d9f531757f83064ad808b4c9b220c703a4934, Notional: 0.0009121805 + {TokenChain: 4, TokenAddress: "0000000000000000000000003ee2200efb3400fabb9aacf31297cbdd1d435d47", Symbol: "ADA", CoingeckoID: "binance-peg-cardano", Decimals: 18}, // Addr: 0x3ee2200efb3400fabb9aacf31297cbdd1d435d47, Notional: 4.06825564825672 + {TokenChain: 4, TokenAddress: "000000000000000000000000fd7b3a77848f1c2d67e05e54d78d174a0c850335", Symbol: "ONT", CoingeckoID: "binance-peg-ontology", Decimals: 18}, // Addr: 0xfd7b3a77848f1c2d67e05e54d78d174a0c850335, Notional: 0.0177856 + {TokenChain: 4, TokenAddress: "000000000000000000000000317eb4ad9cfac6232f0046831322e895507bcbeb", Symbol: "TDX", CoingeckoID: "tidex-token", Decimals: 18}, // Addr: 0x317eb4ad9cfac6232f0046831322e895507bcbeb, Notional: 27.2059108861995 + {TokenChain: 4, TokenAddress: "0000000000000000000000004f39c3319188a723003670c3f9b9e7ef991e52f3", Symbol: "FIGHT", CoingeckoID: "crypto-fight-club", Decimals: 18}, // Addr: 0x4f39c3319188a723003670c3f9b9e7ef991e52f3, Notional: 0.0007502400000000001 + {TokenChain: 4, TokenAddress: "000000000000000000000000f7de7e8a6bd59ed41a4b5fe50278b3b7f31384df", Symbol: "RDNT", CoingeckoID: "radiant-capital", Decimals: 18}, // Addr: 0xf7de7e8a6bd59ed41a4b5fe50278b3b7f31384df, Notional: 1.8111447502077 + {TokenChain: 4, TokenAddress: "000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056", Symbol: "iDYP", CoingeckoID: "idefiyieldprotocol", Decimals: 18}, // Addr: 0xbd100d061e120b2c67a24453cf6368e63f1be056, Notional: 0.0216065 + {TokenChain: 4, TokenAddress: "0000000000000000000000008076c74c5e3f5852037f31ff0093eeb8c8add8d3", Symbol: "SAFEMOON", CoingeckoID: "safemoon", Decimals: 9}, // Addr: 0x8076c74c5e3f5852037f31ff0093eeb8c8add8d3, Notional: 1.9822500000000002e-7 + {TokenChain: 4, TokenAddress: "000000000000000000000000bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", Symbol: "WBNB", CoingeckoID: "wbnb", Decimals: 18}, // Addr: 0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c, Notional: 3327078.7546703233 + {TokenChain: 4, TokenAddress: "0000000000000000000000007269d98af4aa705e0b1a5d8512fadb4d45817d5a", Symbol: "SHI", CoingeckoID: "shirtum", Decimals: 18}, // Addr: 0x7269d98af4aa705e0b1a5d8512fadb4d45817d5a, Notional: 0.0000667674 + {TokenChain: 4, TokenAddress: "000000000000000000000000734c5f3f8f6ad9697b26ecc6388678aafd3db3b2", Symbol: "METAMUSK", CoingeckoID: "musk-metaverse", Decimals: 18}, // Addr: 0x734c5f3f8f6ad9697b26ecc6388678aafd3db3b2, Notional: 0.000032517752912474765 + {TokenChain: 4, TokenAddress: "0000000000000000000000000eb3a705fc54725037cc9e008bdede697f62f335", Symbol: "ATOM", CoingeckoID: "cosmos", Decimals: 18}, // Addr: 0x0eb3a705fc54725037cc9e008bdede697f62f335, Notional: 1741.4121190542 + {TokenChain: 4, TokenAddress: "000000000000000000000000d06716e1ff2e492cc5034c2e81805562dd3b45fa", Symbol: "MGP", CoingeckoID: "magpie", Decimals: 18}, // Addr: 0xd06716e1ff2e492cc5034c2e81805562dd3b45fa, Notional: 1587973.8130151804 + {TokenChain: 4, TokenAddress: "000000000000000000000000fb5b838b6cfeedc2873ab27866079ac55363d37e", Symbol: "FLOKI", CoingeckoID: "floki", Decimals: 9}, // Addr: 0xfb5b838b6cfeedc2873ab27866079ac55363d37e, Notional: 389.1210789478245 + {TokenChain: 4, TokenAddress: "000000000000000000000000965f527d9159dce6288a2219db51fc6eef120dd1", Symbol: "BSW", CoingeckoID: "biswap", Decimals: 18}, // Addr: 0x965f527d9159dce6288a2219db51fc6eef120dd1, Notional: 0.06164 + {TokenChain: 4, TokenAddress: "000000000000000000000000027a9d301fb747cd972cfb29a63f3bda551dfc5c", Symbol: "mWOM", CoingeckoID: "magpie-wom", Decimals: 18}, // Addr: 0x027a9d301fb747cd972cfb29a63f3bda551dfc5c, Notional: 3.7655607905177315 + {TokenChain: 4, TokenAddress: "0000000000000000000000004a2c860cec6471b9f5f5a336eb4f38bb21683c98", Symbol: "GST", CoingeckoID: "green-satoshi-token-bsc", Decimals: 8}, // Addr: 0x4a2c860cec6471b9f5f5a336eb4f38bb21683c98, Notional: 164.36817101843457 + {TokenChain: 4, TokenAddress: "000000000000000000000000d17479997f34dd9156deef8f95a52d81d265be9c", Symbol: "USDD", CoingeckoID: "usdd", Decimals: 18}, // Addr: 0xd17479997f34dd9156deef8f95a52d81d265be9c, Notional: 0.00403874 + {TokenChain: 4, TokenAddress: "000000000000000000000000111111111117dc0aa78b770fa6a738034120c302", Symbol: "1INCH", CoingeckoID: "1inch", Decimals: 18}, // Addr: 0x111111111117dc0aa78b770fa6a738034120c302, Notional: 13.638135619999998 + {TokenChain: 4, TokenAddress: "000000000000000000000000cc42724c6683b7e57334c4e856f4c9965ed682bd", Symbol: "MATIC", CoingeckoID: "matic-network", Decimals: 18}, // Addr: 0xcc42724c6683b7e57334c4e856f4c9965ed682bd, Notional: 4165.5362754972975 + {TokenChain: 4, TokenAddress: "000000000000000000000000fb9c339b4bace4fe63ccc1dd9a3c3c531441d5fe", Symbol: "SHILL", CoingeckoID: "shill-token", Decimals: 18}, // Addr: 0xfb9c339b4bace4fe63ccc1dd9a3c3c531441d5fe, Notional: 18.517310235580158 + {TokenChain: 4, TokenAddress: "000000000000000000000000928e55dab735aa8260af3cedada18b5f70c72f1b", Symbol: "FRONT", CoingeckoID: "frontier-token", Decimals: 18}, // Addr: 0x928e55dab735aa8260af3cedada18b5f70c72f1b, Notional: 1.9653935901740802 + {TokenChain: 4, TokenAddress: "000000000000000000000000c342774492b54ce5f8ac662113ed702fc1b34972", Symbol: "BGEO", CoingeckoID: "geodb", Decimals: 18}, // Addr: 0xc342774492b54ce5f8ac662113ed702fc1b34972, Notional: 820.8 + {TokenChain: 4, TokenAddress: "00000000000000000000000023e8a70534308a4aaf76fb8c32ec13d17a3bd89e", Symbol: "lUSD", CoingeckoID: "lusd", Decimals: 18}, // Addr: 0x23e8a70534308a4aaf76fb8c32ec13d17a3bd89e, Notional: 17.055199656441207 + {TokenChain: 4, TokenAddress: "000000000000000000000000524df384bffb18c0c8f3f43d012011f8f9795579", Symbol: "YAY", CoingeckoID: "yay-games", Decimals: 18}, // Addr: 0x524df384bffb18c0c8f3f43d012011f8f9795579, Notional: 0.0071402 + {TokenChain: 4, TokenAddress: "000000000000000000000000a2120b9e674d3fc3875f415a7df52e382f141225", Symbol: "ATA", CoingeckoID: "automata", Decimals: 18}, // Addr: 0xa2120b9e674d3fc3875f415a7df52e382f141225, Notional: 1.6508991000000002 + {TokenChain: 4, TokenAddress: "0000000000000000000000008263cd1601fe73c066bf49cc09841f35348e3be0", Symbol: "ALU", CoingeckoID: "altura", Decimals: 18}, // Addr: 0x8263cd1601fe73c066bf49cc09841f35348e3be0, Notional: 508.778065132414 + {TokenChain: 4, TokenAddress: "000000000000000000000000fb6115445bff7b52feb98650c87f44907e58f802", Symbol: "AAVE", CoingeckoID: "aave", Decimals: 18}, // Addr: 0xfb6115445bff7b52feb98650c87f44907e58f802, Notional: 39.2688108 + {TokenChain: 4, TokenAddress: "0000000000000000000000009ed7e4b1bff939ad473da5e7a218c771d1569456", Symbol: "REUNI", CoingeckoID: "reunit-wallet", Decimals: 6}, // Addr: 0x9ed7e4b1bff939ad473da5e7a218c771d1569456, Notional: 17.30975625 + {TokenChain: 4, TokenAddress: "000000000000000000000000ffba7529ac181c2ee1844548e6d7061c9a597df4", Symbol: "CAPS", CoingeckoID: "coin-capsule", Decimals: 18}, // Addr: 0xffba7529ac181c2ee1844548e6d7061c9a597df4, Notional: 0.14892640000000001 + {TokenChain: 4, TokenAddress: "000000000000000000000000d3b71117e6c1558c1553305b44988cd944e97300", Symbol: "YEL", CoingeckoID: "yel-finance", Decimals: 18}, // Addr: 0xd3b71117e6c1558c1553305b44988cd944e97300, Notional: 0.051831514222557995 + {TokenChain: 4, TokenAddress: "0000000000000000000000002d6f3dc5b202ccd91db114b592872bca32a7e292", Symbol: "SAUDISHIB", CoingeckoID: "saudi-shiba-inu", Decimals: 8}, // Addr: 0x2d6f3dc5b202ccd91db114b592872bca32a7e292, Notional: 28.508639017345168 + {TokenChain: 4, TokenAddress: "000000000000000000000000ba2ae424d960c26247dd6c32edc70b295c744c43", Symbol: "DOGE", CoingeckoID: "binance-peg-dogecoin", Decimals: 8}, // Addr: 0xba2ae424d960c26247dd6c32edc70b295c744c43, Notional: 206.0270508923928 + {TokenChain: 4, TokenAddress: "0000000000000000000000002cd96e8c3ff6b5e01169f6e3b61d28204e7810bb", Symbol: "LBlock", CoingeckoID: "lucky-block", Decimals: 9}, // Addr: 0x2cd96e8c3ff6b5e01169f6e3b61d28204e7810bb, Notional: 9.53494654284397 + {TokenChain: 4, TokenAddress: "000000000000000000000000e2e7329499e8ddb1f2b04ee4b35a8d7f6881e4ea", Symbol: "$ANRX", CoingeckoID: "anrkey-x", Decimals: 18}, // Addr: 0xe2e7329499e8ddb1f2b04ee4b35a8d7f6881e4ea, Notional: 45.3557092494 + {TokenChain: 4, TokenAddress: "000000000000000000000000b46584e0efde3092e04010a13f2eae62adb3b9f0", Symbol: "PEPE", CoingeckoID: "pepe-coin-bsc-c45e8b31-8ae1-43f4-bd34-e75551d97285", Decimals: 18}, // Addr: 0xb46584e0efde3092e04010a13f2eae62adb3b9f0, Notional: 0.0000057832230043418955 + {TokenChain: 4, TokenAddress: "000000000000000000000000fe56d5892bdffc7bf58f2e84be1b2c32d21c308b", Symbol: "KNC", CoingeckoID: "kyber-network-crystal", Decimals: 18}, // Addr: 0xfe56d5892bdffc7bf58f2e84be1b2c32d21c308b, Notional: 2.69990082560673 + {TokenChain: 4, TokenAddress: "0000000000000000000000002f25d402829ca4085b8ea4d3bc68bf203f5a9fab", Symbol: "Eagon", CoingeckoID: "eagonswap-token", Decimals: 18}, // Addr: 0x2f25d402829ca4085b8ea4d3bc68bf203f5a9fab, Notional: 1.6908640083189141 + {TokenChain: 4, TokenAddress: "00000000000000000000000025b24b3c47918b7962b3e49c4f468367f73cc0e0", Symbol: "AXL", CoingeckoID: "axl-inu", Decimals: 18}, // Addr: 0x25b24b3c47918b7962b3e49c4f468367f73cc0e0, Notional: 0.0758 + {TokenChain: 4, TokenAddress: "000000000000000000000000c19fe21b4ef356f2f65894392dde4252aa083605", Symbol: "WSO", CoingeckoID: "widi-soul", Decimals: 18}, // Addr: 0xc19fe21b4ef356f2f65894392dde4252aa083605, Notional: 0.005467401565892999 + {TokenChain: 4, TokenAddress: "000000000000000000000000e9c803f48dffe50180bd5b01dc04da939e3445fc", Symbol: "VLX", CoingeckoID: "velas", Decimals: 18}, // Addr: 0xe9c803f48dffe50180bd5b01dc04da939e3445fc, Notional: 0.0497417062983315 + {TokenChain: 4, TokenAddress: "0000000000000000000000001dacbcd9b3fc2d6a341dca3634439d12bc71ca4d", Symbol: "BVT", CoingeckoID: "bovineverse-bvt", Decimals: 18}, // Addr: 0x1dacbcd9b3fc2d6a341dca3634439d12bc71ca4d, Notional: 0.211503009741624 {TokenChain: 4, TokenAddress: "000000000000000000000000114597f4260caf4cde1eeb0b9d9865b0b7b9a46a", Symbol: "AGF", CoingeckoID: "augmented-finance", Decimals: 18}, // Addr: 0x114597f4260caf4cde1eeb0b9d9865b0b7b9a46a, Notional: 0.0038066000000000003 - {TokenChain: 4, TokenAddress: "000000000000000000000000e4fae3faa8300810c835970b9187c268f55d998f", Symbol: "CATE", CoingeckoID: "catecoin", Decimals: 9}, // Addr: 0xe4fae3faa8300810c835970b9187c268f55d998f, Notional: 0.001693386793658762 - {TokenChain: 4, TokenAddress: "0000000000000000000000004afc8c2be6a0783ea16e16066fde140d15979296", Symbol: "HARE", CoingeckoID: "hare-token", Decimals: 9}, // Addr: 0x4afc8c2be6a0783ea16e16066fde140d15979296, Notional: 9.9e-14 - {TokenChain: 4, TokenAddress: "000000000000000000000000a75d9ca2a0a1d547409d82e1b06618ec284a2ced", Symbol: "WMX", CoingeckoID: "wombex", Decimals: 18}, // Addr: 0xa75d9ca2a0a1d547409d82e1b06618ec284a2ced, Notional: 292738.4519135661 - {TokenChain: 4, TokenAddress: "000000000000000000000000c5326b32e8baef125acd68f8bc646fd646104f1c", Symbol: "ZAP", CoingeckoID: "zap", Decimals: 18}, // Addr: 0xc5326b32e8baef125acd68f8bc646fd646104f1c, Notional: 4026.974583676728 - {TokenChain: 4, TokenAddress: "0000000000000000000000004b8285ab433d8f69cb48d5ad62b415ed1a221e4f", Symbol: "MCRT", CoingeckoID: "magiccraft", Decimals: 9}, // Addr: 0x4b8285ab433d8f69cb48d5ad62b415ed1a221e4f, Notional: 21448.50656227874 + {TokenChain: 4, TokenAddress: "000000000000000000000000e4fae3faa8300810c835970b9187c268f55d998f", Symbol: "CATE", CoingeckoID: "catecoin", Decimals: 9}, // Addr: 0xe4fae3faa8300810c835970b9187c268f55d998f, Notional: 0.0015997281396916867 + {TokenChain: 4, TokenAddress: "0000000000000000000000004afc8c2be6a0783ea16e16066fde140d15979296", Symbol: "HARE", CoingeckoID: "hare-token", Decimals: 9}, // Addr: 0x4afc8c2be6a0783ea16e16066fde140d15979296, Notional: 9.000000000000001e-14 + {TokenChain: 4, TokenAddress: "000000000000000000000000a75d9ca2a0a1d547409d82e1b06618ec284a2ced", Symbol: "WMX", CoingeckoID: "wombex", Decimals: 18}, // Addr: 0xa75d9ca2a0a1d547409d82e1b06618ec284a2ced, Notional: 133830.12673596182 + {TokenChain: 4, TokenAddress: "000000000000000000000000c5326b32e8baef125acd68f8bc646fd646104f1c", Symbol: "ZAP", CoingeckoID: "zap", Decimals: 18}, // Addr: 0xc5326b32e8baef125acd68f8bc646fd646104f1c, Notional: 3047.2665463459257 + {TokenChain: 4, TokenAddress: "0000000000000000000000004b8285ab433d8f69cb48d5ad62b415ed1a221e4f", Symbol: "MCRT", CoingeckoID: "magiccraft", Decimals: 9}, // Addr: 0x4b8285ab433d8f69cb48d5ad62b415ed1a221e4f, Notional: 16816.133256780082 {TokenChain: 4, TokenAddress: "000000000000000000000000ce355300b9d7909f577640a3fb179cf911a23fbb", Symbol: "PPP", CoingeckoID: "playposeidon-nft", Decimals: 18}, // Addr: 0xce355300b9d7909f577640a3fb179cf911a23fbb, Notional: 2.1648 - {TokenChain: 4, TokenAddress: "000000000000000000000000f218184af829cf2b0019f8e6f0b2423498a36983", Symbol: "MATH", CoingeckoID: "math", Decimals: 18}, // Addr: 0xf218184af829cf2b0019f8e6f0b2423498a36983, Notional: 0.150084 - {TokenChain: 4, TokenAddress: "0000000000000000000000006f769e65c14ebd1f68817f5f1dcdb61cfa2d6f7e", Symbol: "ARPA", CoingeckoID: "arpa", Decimals: 18}, // Addr: 0x6f769e65c14ebd1f68817f5f1dcdb61cfa2d6f7e, Notional: 21.500130600000002 - {TokenChain: 4, TokenAddress: "0000000000000000000000007eefb6aeb8bc2c1ba6be1d4273ec0758a1321272", Symbol: "ENG", CoingeckoID: "endless-battlefield", Decimals: 18}, // Addr: 0x7eefb6aeb8bc2c1ba6be1d4273ec0758a1321272, Notional: 1.2462499999999999 - {TokenChain: 4, TokenAddress: "000000000000000000000000fdfd27ae39cebefdbaac8615f18aa68ddd0f15f5", Symbol: "GHD", CoingeckoID: "giftedhands", Decimals: 18}, // Addr: 0xfdfd27ae39cebefdbaac8615f18aa68ddd0f15f5, Notional: 0.0007029 - {TokenChain: 4, TokenAddress: "0000000000000000000000007dc6dc21ce07e6499fdcc30dcdb943a8ee4db802", Symbol: "GPTG", CoingeckoID: "gpt-guru", Decimals: 18}, // Addr: 0x7dc6dc21ce07e6499fdcc30dcdb943a8ee4db802, Notional: 28654.062053222002 + {TokenChain: 4, TokenAddress: "000000000000000000000000f218184af829cf2b0019f8e6f0b2423498a36983", Symbol: "MATH", CoingeckoID: "math", Decimals: 18}, // Addr: 0xf218184af829cf2b0019f8e6f0b2423498a36983, Notional: 0.135484 + {TokenChain: 4, TokenAddress: "0000000000000000000000006f769e65c14ebd1f68817f5f1dcdb61cfa2d6f7e", Symbol: "ARPA", CoingeckoID: "arpa", Decimals: 18}, // Addr: 0x6f769e65c14ebd1f68817f5f1dcdb61cfa2d6f7e, Notional: 18.300966467000002 + {TokenChain: 4, TokenAddress: "00000000000000000000000025a528af62e56512a19ce8c3cab427807c28cc19", Symbol: "FORM", CoingeckoID: "formation-fi", Decimals: 18}, // Addr: 0x25a528af62e56512a19ce8c3cab427807c28cc19, Notional: 1.3709039353499952 + {TokenChain: 4, TokenAddress: "0000000000000000000000007eefb6aeb8bc2c1ba6be1d4273ec0758a1321272", Symbol: "ENG", CoingeckoID: "endless-battlefield", Decimals: 18}, // Addr: 0x7eefb6aeb8bc2c1ba6be1d4273ec0758a1321272, Notional: 1.20524 + {TokenChain: 4, TokenAddress: "000000000000000000000000fdfd27ae39cebefdbaac8615f18aa68ddd0f15f5", Symbol: "GHD", CoingeckoID: "giftedhands", Decimals: 18}, // Addr: 0xfdfd27ae39cebefdbaac8615f18aa68ddd0f15f5, Notional: 0.000059418216 + {TokenChain: 4, TokenAddress: "0000000000000000000000007dc6dc21ce07e6499fdcc30dcdb943a8ee4db802", Symbol: "GPTG", CoingeckoID: "gpt-guru", Decimals: 18}, // Addr: 0x7dc6dc21ce07e6499fdcc30dcdb943a8ee4db802, Notional: 6544.8213365266 {TokenChain: 4, TokenAddress: "00000000000000000000000044c99ca267c2b2646ceec72e898273085ab87ca5", Symbol: "RPTR", CoingeckoID: "raptor-finance-2", Decimals: 18}, // Addr: 0x44c99ca267c2b2646ceec72e898273085ab87ca5, Notional: 101.91777043 - {TokenChain: 4, TokenAddress: "000000000000000000000000af7bfa6240745fd41d1ed4b5fade9dcaf369ba6c", Symbol: "Mverse", CoingeckoID: "maticverse", Decimals: 18}, // Addr: 0xaf7bfa6240745fd41d1ed4b5fade9dcaf369ba6c, Notional: 6.978531308799677 - {TokenChain: 4, TokenAddress: "00000000000000000000000071be881e9c5d4465b3fff61e89c6f3651e69b5bb", Symbol: "BRZ", CoingeckoID: "brz", Decimals: 4}, // Addr: 0x71be881e9c5d4465b3fff61e89c6f3651e69b5bb, Notional: 68.4705836 - {TokenChain: 4, TokenAddress: "000000000000000000000000de7d1ce109236b12809c45b23d22f30dba0ef424", Symbol: "USDS", CoingeckoID: "spiceusd", Decimals: 18}, // Addr: 0xde7d1ce109236b12809c45b23d22f30dba0ef424, Notional: 0.286064 - {TokenChain: 4, TokenAddress: "0000000000000000000000007b65b489fe53fce1f6548db886c08ad73111ddd8", Symbol: "IRON", CoingeckoID: "iron-bsc", Decimals: 18}, // Addr: 0x7b65b489fe53fce1f6548db886c08ad73111ddd8, Notional: 1.25928 - {TokenChain: 4, TokenAddress: "000000000000000000000000f16e81dce15b08f326220742020379b855b87df9", Symbol: "ICE", CoingeckoID: "ice-token", Decimals: 18}, // Addr: 0xf16e81dce15b08f326220742020379b855b87df9, Notional: 4.7139532 - {TokenChain: 4, TokenAddress: "000000000000000000000000833f307ac507d47309fd8cdd1f835bef8d702a93", Symbol: "REVV", CoingeckoID: "revv", Decimals: 18}, // Addr: 0x833f307ac507d47309fd8cdd1f835bef8d702a93, Notional: 0.00853835 - {TokenChain: 4, TokenAddress: "00000000000000000000000035bedbf9291b22218a0da863170dcc9329ef2563", Symbol: "TAP", CoingeckoID: "tap-fantasy", Decimals: 18}, // Addr: 0x35bedbf9291b22218a0da863170dcc9329ef2563, Notional: 3.63292029 - {TokenChain: 4, TokenAddress: "00000000000000000000000042981d0bfbaf196529376ee702f2a9eb9092fcb5", Symbol: "SFM", CoingeckoID: "safemoon-2", Decimals: 9}, // Addr: 0x42981d0bfbaf196529376ee702f2a9eb9092fcb5, Notional: 1.0892478767224825 + {TokenChain: 4, TokenAddress: "000000000000000000000000af7bfa6240745fd41d1ed4b5fade9dcaf369ba6c", Symbol: "Mverse", CoingeckoID: "maticverse", Decimals: 18}, // Addr: 0xaf7bfa6240745fd41d1ed4b5fade9dcaf369ba6c, Notional: 6.980310128314426 + {TokenChain: 4, TokenAddress: "00000000000000000000000071be881e9c5d4465b3fff61e89c6f3651e69b5bb", Symbol: "BRZ", CoingeckoID: "brz", Decimals: 4}, // Addr: 0x71be881e9c5d4465b3fff61e89c6f3651e69b5bb, Notional: 65.9646907 + {TokenChain: 4, TokenAddress: "000000000000000000000000de7d1ce109236b12809c45b23d22f30dba0ef424", Symbol: "USDS", CoingeckoID: "spiceusd", Decimals: 18}, // Addr: 0xde7d1ce109236b12809c45b23d22f30dba0ef424, Notional: 0.08064 + {TokenChain: 4, TokenAddress: "0000000000000000000000007b65b489fe53fce1f6548db886c08ad73111ddd8", Symbol: "IRON", CoingeckoID: "iron-bsc", Decimals: 18}, // Addr: 0x7b65b489fe53fce1f6548db886c08ad73111ddd8, Notional: 1.1995452 + {TokenChain: 4, TokenAddress: "000000000000000000000000f16e81dce15b08f326220742020379b855b87df9", Symbol: "ICE", CoingeckoID: "ice-token", Decimals: 18}, // Addr: 0xf16e81dce15b08f326220742020379b855b87df9, Notional: 4.99499 + {TokenChain: 4, TokenAddress: "000000000000000000000000833f307ac507d47309fd8cdd1f835bef8d702a93", Symbol: "REVV", CoingeckoID: "revv", Decimals: 18}, // Addr: 0x833f307ac507d47309fd8cdd1f835bef8d702a93, Notional: 0.00710968 + {TokenChain: 4, TokenAddress: "00000000000000000000000035bedbf9291b22218a0da863170dcc9329ef2563", Symbol: "TAP", CoingeckoID: "tap-fantasy", Decimals: 18}, // Addr: 0x35bedbf9291b22218a0da863170dcc9329ef2563, Notional: 2.6836222199999997 + {TokenChain: 4, TokenAddress: "00000000000000000000000042981d0bfbaf196529376ee702f2a9eb9092fcb5", Symbol: "SFM", CoingeckoID: "safemoon-2", Decimals: 9}, // Addr: 0x42981d0bfbaf196529376ee702f2a9eb9092fcb5, Notional: 1.1013609273690683 {TokenChain: 4, TokenAddress: "000000000000000000000000a6168c7e5eb7c5c379f3a1d7cf1073e09b2f031e", Symbol: "GRAV", CoingeckoID: "graviton-zero", Decimals: 18}, // Addr: 0xa6168c7e5eb7c5c379f3a1d7cf1073e09b2f031e, Notional: 0.000027992831999999998 - {TokenChain: 4, TokenAddress: "000000000000000000000000c864019047b864b6ab609a968ae2725dfaee808a", Symbol: "BIT", CoingeckoID: "biconomy-exchange-token", Decimals: 9}, // Addr: 0xc864019047b864b6ab609a968ae2725dfaee808a, Notional: 8368.407759591642 - {TokenChain: 4, TokenAddress: "000000000000000000000000a260e12d2b924cb899ae80bb58123ac3fee1e2f0", Symbol: "HOOK", CoingeckoID: "hooked-protocol", Decimals: 18}, // Addr: 0xa260e12d2b924cb899ae80bb58123ac3fee1e2f0, Notional: 1.843306 - {TokenChain: 4, TokenAddress: "000000000000000000000000fce146bf3146100cfe5db4129cf6c82b0ef4ad8c", Symbol: "renBTC", CoingeckoID: "renbtc", Decimals: 8}, // Addr: 0xfce146bf3146100cfe5db4129cf6c82b0ef4ad8c, Notional: 23.07713268 - {TokenChain: 4, TokenAddress: "00000000000000000000000083adb07bb91ddde95a24982f1b2d343963ba3995", Symbol: "Fwcl", CoingeckoID: "legends", Decimals: 9}, // Addr: 0x83adb07bb91ddde95a24982f1b2d343963ba3995, Notional: 6.65 - {TokenChain: 4, TokenAddress: "0000000000000000000000001613957159e9b0ac6c80e824f7eea748a32a0ae2", Symbol: "CGG", CoingeckoID: "chain-guardians", Decimals: 18}, // Addr: 0x1613957159e9b0ac6c80e824f7eea748a32a0ae2, Notional: 48.75674867643914 - {TokenChain: 4, TokenAddress: "0000000000000000000000005fb4968fc85868df3ad2d6e59883a10570f01d18", Symbol: "SHR", CoingeckoID: "sharering", Decimals: 18}, // Addr: 0x5fb4968fc85868df3ad2d6e59883a10570f01d18, Notional: 64.98336832 - {TokenChain: 4, TokenAddress: "0000000000000000000000007083609fce4d1d8dc0c979aab8c869ea2c873402", Symbol: "DOT", CoingeckoID: "binance-peg-polkadot", Decimals: 18}, // Addr: 0x7083609fce4d1d8dc0c979aab8c869ea2c873402, Notional: 4105.4580616705 - {TokenChain: 4, TokenAddress: "0000000000000000000000002326c7395d02a8c89a9d7a0b0c1cf159d49ce51c", Symbol: "TBAC", CoingeckoID: "blockaura", Decimals: 8}, // Addr: 0x2326c7395d02a8c89a9d7a0b0c1cf159d49ce51c, Notional: 0.7313999999999999 - {TokenChain: 4, TokenAddress: "0000000000000000000000005e95a952a7f79f978585afd54a053af0f51372fa", Symbol: "SBG", CoingeckoID: "sb-group", Decimals: 9}, // Addr: 0x5e95a952a7f79f978585afd54a053af0f51372fa, Notional: 0.0085 - {TokenChain: 4, TokenAddress: "000000000000000000000000c146b7cdbaff065090077151d391f4c96aa09e0c", Symbol: "MCC", CoingeckoID: "multi-chain-capital-2", Decimals: 9}, // Addr: 0xc146b7cdbaff065090077151d391f4c96aa09e0c, Notional: 0.000003962985000000001 - {TokenChain: 4, TokenAddress: "0000000000000000000000007af173f350d916358af3e218bdf2178494beb748", Symbol: "TRADE", CoingeckoID: "unitrade", Decimals: 18}, // Addr: 0x7af173f350d916358af3e218bdf2178494beb748, Notional: 12.199923093425886 - {TokenChain: 4, TokenAddress: "000000000000000000000000c94595b56e301f3ffedb8ccc2d672882d623e53a", Symbol: "ACY", CoingeckoID: "acy-finance", Decimals: 18}, // Addr: 0xc94595b56e301f3ffedb8ccc2d672882d623e53a, Notional: 0.057584300000000005 - {TokenChain: 4, TokenAddress: "000000000000000000000000ca830317146bfdde71e7c0b880e2ec1f66e273ee", Symbol: "GULL", CoingeckoID: "polygod", Decimals: 18}, // Addr: 0xca830317146bfdde71e7c0b880e2ec1f66e273ee, Notional: 3.1116300000000003 - {TokenChain: 4, TokenAddress: "00000000000000000000000021f9b5b2626603e3f40bfc13d01afb8c431d382f", Symbol: "ZINU", CoingeckoID: "zombie-inu", Decimals: 9}, // Addr: 0x21f9b5b2626603e3f40bfc13d01afb8c431d382f, Notional: 1.6620254615205763 - {TokenChain: 4, TokenAddress: "0000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", Symbol: "BTCB", CoingeckoID: "binance-bitcoin", Decimals: 18}, // Addr: 0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c, Notional: 4415.3707622599995 - {TokenChain: 4, TokenAddress: "0000000000000000000000009df465460938f9ebdf51c38cc87d72184471f8f0", Symbol: "GENE", CoingeckoID: "genopets", Decimals: 18}, // Addr: 0x9df465460938f9ebdf51c38cc87d72184471f8f0, Notional: 23.45735953642185 - {TokenChain: 4, TokenAddress: "0000000000000000000000001446f3cedf4d86a9399e49f7937766e6de2a3aab", Symbol: "KRW", CoingeckoID: "krown", Decimals: 18}, // Addr: 0x1446f3cedf4d86a9399e49f7937766e6de2a3aab, Notional: 0.0745514622411933 - {TokenChain: 4, TokenAddress: "00000000000000000000000082d2f8e02afb160dd5a480a617692e62de9038c4", Symbol: "ALEPH", CoingeckoID: "aleph", Decimals: 18}, // Addr: 0x82d2f8e02afb160dd5a480a617692e62de9038c4, Notional: 26.734710103095683 - {TokenChain: 4, TokenAddress: "0000000000000000000000001796ae0b0fa4862485106a0de9b654efe301d0b2", Symbol: "PMON", CoingeckoID: "polychain-monsters", Decimals: 18}, // Addr: 0x1796ae0b0fa4862485106a0de9b654efe301d0b2, Notional: 0.16757526682424 - {TokenChain: 4, TokenAddress: "0000000000000000000000007e8db69dcff9209e486a100e611b0af300c3374e", Symbol: "TRDC", CoingeckoID: "traders-coin", Decimals: 18}, // Addr: 0x7e8db69dcff9209e486a100e611b0af300c3374e, Notional: 0.41081632081491803 - {TokenChain: 4, TokenAddress: "000000000000000000000000bf37f781473f3b50e82c668352984865eac9853f", Symbol: "MILK", CoingeckoID: "the-crypto-you", Decimals: 18}, // Addr: 0xbf37f781473f3b50e82c668352984865eac9853f, Notional: 9.88891e-7 - {TokenChain: 4, TokenAddress: "000000000000000000000000bd83010eb60f12112908774998f65761cf9f6f9a", Symbol: "STARS", CoingeckoID: "mogul-productions", Decimals: 18}, // Addr: 0xbd83010eb60f12112908774998f65761cf9f6f9a, Notional: 0.7034332608 - {TokenChain: 4, TokenAddress: "000000000000000000000000c74cd0042c837ce59210857504ebb0859e06aa22", Symbol: "SAFUYIELD", CoingeckoID: "safu-protocol", Decimals: 9}, // Addr: 0xc74cd0042c837ce59210857504ebb0859e06aa22, Notional: 0.00046984687360100816 - {TokenChain: 4, TokenAddress: "00000000000000000000000008b450e4a48c04cdf6db2bd4cf24057f7b9563ff", Symbol: "QUO", CoingeckoID: "quo", Decimals: 18}, // Addr: 0x08b450e4a48c04cdf6db2bd4cf24057f7b9563ff, Notional: 25033.9238520035 - {TokenChain: 4, TokenAddress: "0000000000000000000000008578eb576e126f67913a8bc0622e0a22eba0989a", Symbol: "PANDA", CoingeckoID: "hashpanda", Decimals: 9}, // Addr: 0x8578eb576e126f67913a8bc0622e0a22eba0989a, Notional: 0.02592372799630816 - {TokenChain: 4, TokenAddress: "000000000000000000000000d069599e718f963bd84502b49ba8f8657faf5b3a", Symbol: "PLAY", CoingeckoID: "xcad-network-play", Decimals: 18}, // Addr: 0xd069599e718f963bd84502b49ba8f8657faf5b3a, Notional: 34088.20106320247 - {TokenChain: 4, TokenAddress: "000000000000000000000000e60eaf5a997dfae83739e035b005a33afdcc6df5", Symbol: "DERI", CoingeckoID: "deri-protocol", Decimals: 18}, // Addr: 0xe60eaf5a997dfae83739e035b005a33afdcc6df5, Notional: 0.006183735 - {TokenChain: 4, TokenAddress: "0000000000000000000000009eb6935aea6afb5bc6d1a74be0c2f78280ab6448", Symbol: "ACA", CoingeckoID: "aca-token", Decimals: 9}, // Addr: 0x9eb6935aea6afb5bc6d1a74be0c2f78280ab6448, Notional: 0.09950490000000001 - {TokenChain: 4, TokenAddress: "0000000000000000000000006d86f0a41c3966cef8ea139648db707e912563c9", Symbol: "MCOIN", CoingeckoID: "mcoin1", Decimals: 18}, // Addr: 0x6d86f0a41c3966cef8ea139648db707e912563c9, Notional: 0.17300000000000001 - {TokenChain: 4, TokenAddress: "0000000000000000000000004da996c5fe84755c80e108cf96fe705174c5e36a", Symbol: "WOW", CoingeckoID: "wowswap", Decimals: 18}, // Addr: 0x4da996c5fe84755c80e108cf96fe705174c5e36a, Notional: 0.6907618503071999 - {TokenChain: 4, TokenAddress: "0000000000000000000000008da443f84fea710266c8eb6bc34b71702d033ef2", Symbol: "CTSI", CoingeckoID: "cartesi", Decimals: 18}, // Addr: 0x8da443f84fea710266c8eb6bc34b71702d033ef2, Notional: 3.1093482600000004 - {TokenChain: 4, TokenAddress: "0000000000000000000000009e6b3e35c8f563b45d864f9ff697a144ad28a371", Symbol: "DOGO", CoingeckoID: "dogemon-go", Decimals: 18}, // Addr: 0x9e6b3e35c8f563b45d864f9ff697a144ad28a371, Notional: 0.06998553829183561 - {TokenChain: 4, TokenAddress: "00000000000000000000000062823659d09f9f9d2222058878f89437425eb261", Symbol: "ERTHA", CoingeckoID: "ertha", Decimals: 18}, // Addr: 0x62823659d09f9f9d2222058878f89437425eb261, Notional: 0.03067974 - {TokenChain: 4, TokenAddress: "000000000000000000000000a2b726b1145a4773f68593cf171187d8ebe4d495", Symbol: "INJ", CoingeckoID: "injective-protocol", Decimals: 18}, // Addr: 0xa2b726b1145a4773f68593cf171187d8ebe4d495, Notional: 205.7704586336 - {TokenChain: 4, TokenAddress: "000000000000000000000000c6f509274fcc1f485644167cb911fd0c61545e6c", Symbol: "OBS", CoingeckoID: "obsidium", Decimals: 18}, // Addr: 0xc6f509274fcc1f485644167cb911fd0c61545e6c, Notional: 5.714027 - {TokenChain: 4, TokenAddress: "000000000000000000000000e4cc45bb5dbda06db6183e8bf016569f40497aa5", Symbol: "GAL", CoingeckoID: "project-galaxy", Decimals: 18}, // Addr: 0xe4cc45bb5dbda06db6183e8bf016569f40497aa5, Notional: 12.01893 - {TokenChain: 4, TokenAddress: "000000000000000000000000935a544bf5816e3a7c13db2efe3009ffda0acda2", Symbol: "BLZ", CoingeckoID: "bluzelle", Decimals: 18}, // Addr: 0x935a544bf5816e3a7c13db2efe3009ffda0acda2, Notional: 23.58023937797528 - {TokenChain: 4, TokenAddress: "0000000000000000000000000cf8e180350253271f4b917ccfb0accc4862f262", Symbol: "BTCBR", CoingeckoID: "bitcoin-br", Decimals: 18}, // Addr: 0x0cf8e180350253271f4b917ccfb0accc4862f262, Notional: 2.2300000000000004e-12 - {TokenChain: 4, TokenAddress: "00000000000000000000000019b99162adaab85134e781ac0048c275c31b205a", Symbol: "TAUR", CoingeckoID: "marnotaur", Decimals: 18}, // Addr: 0x19b99162adaab85134e781ac0048c275c31b205a, Notional: 4.280023423357171 - {TokenChain: 4, TokenAddress: "0000000000000000000000004b5decb9327b4d511a58137a1ade61434aacdd43", Symbol: "PKN", CoingeckoID: "poken", Decimals: 18}, // Addr: 0x4b5decb9327b4d511a58137a1ade61434aacdd43, Notional: 56.01853839058109 - {TokenChain: 4, TokenAddress: "000000000000000000000000bf5140a22578168fd562dccf235e5d43a02ce9b1", Symbol: "UNI", CoingeckoID: "uniswap", Decimals: 18}, // Addr: 0xbf5140a22578168fd562dccf235e5d43a02ce9b1, Notional: 17.91495 - {TokenChain: 4, TokenAddress: "000000000000000000000000fe19f0b51438fd612f6fd59c1dbb3ea319f433ba", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0xfe19f0b51438fd612f6fd59c1dbb3ea319f433ba, Notional: 988.1665601419326 - {TokenChain: 4, TokenAddress: "0000000000000000000000006ff1bfa14a57594a5874b37ff6ac5efbd9f9599a", Symbol: "TOTM", CoingeckoID: "totemfi", Decimals: 18}, // Addr: 0x6ff1bfa14a57594a5874b37ff6ac5efbd9f9599a, Notional: 0.7811302605981699 - {TokenChain: 4, TokenAddress: "0000000000000000000000001d2f0da169ceb9fc7b3144628db156f3f6c60dbe", Symbol: "XRP", CoingeckoID: "binance-peg-xrp", Decimals: 18}, // Addr: 0x1d2f0da169ceb9fc7b3144628db156f3f6c60dbe, Notional: 77.24585783 - {TokenChain: 4, TokenAddress: "0000000000000000000000001ce0c2827e2ef14d5c4f29a091d735a204794041", Symbol: "AVAX", CoingeckoID: "binance-peg-avalanche", Decimals: 18}, // Addr: 0x1ce0c2827e2ef14d5c4f29a091d735a204794041, Notional: 1367.9823056724 - {TokenChain: 4, TokenAddress: "000000000000000000000000959229d94c9060552daea25ac17193bca65d7884", Symbol: "IOI", CoingeckoID: "ioi-token", Decimals: 6}, // Addr: 0x959229d94c9060552daea25ac17193bca65d7884, Notional: 0.6228155272309499 - {TokenChain: 4, TokenAddress: "0000000000000000000000001fa4a73a3f0133f0025378af00236f3abdee5d63", Symbol: "NEAR", CoingeckoID: "wrapped-near", Decimals: 18}, // Addr: 0x1fa4a73a3f0133f0025378af00236f3abdee5d63, Notional: 34.784679999999994 - {TokenChain: 4, TokenAddress: "000000000000000000000000f915fdda4c882731c0456a4214548cd13a822886", Symbol: "UNV", CoingeckoID: "unvest", Decimals: 18}, // Addr: 0xf915fdda4c882731c0456a4214548cd13a822886, Notional: 31.06663504 - {TokenChain: 4, TokenAddress: "000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56", Symbol: "BUSD", CoingeckoID: "binance-usd", Decimals: 18}, // Addr: 0xe9e7cea3dedca5984780bafc599bd69add087d56, Notional: 458133.2295885545 - {TokenChain: 4, TokenAddress: "0000000000000000000000004b5c23cac08a567ecf0c1ffca8372a45a5d33743", Symbol: "FARM", CoingeckoID: "harvest-finance", Decimals: 18}, // Addr: 0x4b5c23cac08a567ecf0c1ffca8372a45a5d33743, Notional: 0.4040375523 - {TokenChain: 4, TokenAddress: "0000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 18}, // Addr: 0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d, Notional: 4885553.656497984 - {TokenChain: 4, TokenAddress: "000000000000000000000000686318000d982bc8dcc1cdcf8ffd22322f0960ed", Symbol: "OPUL", CoingeckoID: "opulous", Decimals: 18}, // Addr: 0x686318000d982bc8dcc1cdcf8ffd22322f0960ed, Notional: 108.40682889739884 - {TokenChain: 4, TokenAddress: "00000000000000000000000059c49b54d4425c7ff1e49f40958a14d48cc87c26", Symbol: "MC", CoingeckoID: "tap-fantasy-mc", Decimals: 18}, // Addr: 0x59c49b54d4425c7ff1e49f40958a14d48cc87c26, Notional: 0.614471 - {TokenChain: 4, TokenAddress: "0000000000000000000000008ebc361536094fd5b4ffb8521e31900614c9f55d", Symbol: "DARC", CoingeckoID: "darcmatter-coin", Decimals: 18}, // Addr: 0x8ebc361536094fd5b4ffb8521e31900614c9f55d, Notional: 3817.6524757540888 - {TokenChain: 4, TokenAddress: "000000000000000000000000e552fb52a4f19e44ef5a967632dbc320b0820639", Symbol: "Metis", CoingeckoID: "metis-token", Decimals: 18}, // Addr: 0xe552fb52a4f19e44ef5a967632dbc320b0820639, Notional: 95145.000085142 - {TokenChain: 4, TokenAddress: "00000000000000000000000040c8225329bd3e28a043b029e0d07a5344d2c27c", Symbol: "AOG", CoingeckoID: "ageofgods", Decimals: 18}, // Addr: 0x40c8225329bd3e28a043b029e0d07a5344d2c27c, Notional: 2.3202344715390106 - {TokenChain: 4, TokenAddress: "00000000000000000000000039ae8eefb05138f418bb27659c21632dc1ddab10", Symbol: "KAI", CoingeckoID: "kardiachain", Decimals: 18}, // Addr: 0x39ae8eefb05138f418bb27659c21632dc1ddab10, Notional: 44.1161844255645 - {TokenChain: 4, TokenAddress: "000000000000000000000000aec945e04baf28b135fa7c640f624f8d90f1c3a6", Symbol: "C98", CoingeckoID: "coin98", Decimals: 18}, // Addr: 0xaec945e04baf28b135fa7c640f624f8d90f1c3a6, Notional: 56.432463499242246 - {TokenChain: 4, TokenAddress: "0000000000000000000000004aac18de824ec1b553dbf342829834e4ff3f7a9f", Symbol: "ANCHOR", CoingeckoID: "anchorswap", Decimals: 18}, // Addr: 0x4aac18de824ec1b553dbf342829834e4ff3f7a9f, Notional: 0.1083427338752926 - {TokenChain: 4, TokenAddress: "0000000000000000000000007e35d0e9180bf3a1fc47b0d110be7a21a10b41fe", Symbol: "OVR", CoingeckoID: "ovr", Decimals: 18}, // Addr: 0x7e35d0e9180bf3a1fc47b0d110be7a21a10b41fe, Notional: 21.113850674104437 - {TokenChain: 4, TokenAddress: "0000000000000000000000000782b6d8c4551b9760e74c0545a9bcd90bdc41e5", Symbol: "HAY", CoingeckoID: "helio-protocol-hay", Decimals: 18}, // Addr: 0x0782b6d8c4551b9760e74c0545a9bcd90bdc41e5, Notional: 2.4947072952619997 - {TokenChain: 4, TokenAddress: "000000000000000000000000ad6742a35fb341a9cc6ad674738dd8da98b94fb1", Symbol: "WOM", CoingeckoID: "wombat-exchange", Decimals: 18}, // Addr: 0xad6742a35fb341a9cc6ad674738dd8da98b94fb1, Notional: 1671915.8468878875 - {TokenChain: 4, TokenAddress: "0000000000000000000000002c717059b366714d267039af8f59125cadce6d8c", Symbol: "MHUNT", CoingeckoID: "metashooter", Decimals: 18}, // Addr: 0x2c717059b366714d267039af8f59125cadce6d8c, Notional: 0.399567685093755 - {TokenChain: 4, TokenAddress: "0000000000000000000000000e09fabb73bd3ade0a17ecc321fd13a19e81ce82", Symbol: "Cake", CoingeckoID: "pancakeswap-token", Decimals: 18}, // Addr: 0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82, Notional: 205.41359125900001 - {TokenChain: 4, TokenAddress: "0000000000000000000000000ebd9537a25f56713e34c45b38f421a1e7191469", Symbol: "MOOV", CoingeckoID: "dotmoovs", Decimals: 18}, // Addr: 0x0ebd9537a25f56713e34c45b38f421a1e7191469, Notional: 588.52296244 - {TokenChain: 4, TokenAddress: "0000000000000000000000004338665cbb7b2485a8855a139b75d5e34ab0db94", Symbol: "LTC", CoingeckoID: "binance-peg-litecoin", Decimals: 18}, // Addr: 0x4338665cbb7b2485a8855a139b75d5e34ab0db94, Notional: 12.8194448793 - {TokenChain: 4, TokenAddress: "000000000000000000000000e2604c9561d490624aa35e156e65e590eb749519", Symbol: "GM", CoingeckoID: "goldminer", Decimals: 18}, // Addr: 0xe2604c9561d490624aa35e156e65e590eb749519, Notional: 74.73868778818331 - {TokenChain: 4, TokenAddress: "000000000000000000000000c8a11f433512c16ed895245f34bcc2ca44eb06bd", Symbol: "KSN", CoingeckoID: "kissan", Decimals: 18}, // Addr: 0xc8a11f433512c16ed895245f34bcc2ca44eb06bd, Notional: 0.159609 + {TokenChain: 4, TokenAddress: "000000000000000000000000c864019047b864b6ab609a968ae2725dfaee808a", Symbol: "BIT", CoingeckoID: "biconomy-exchange-token", Decimals: 9}, // Addr: 0xc864019047b864b6ab609a968ae2725dfaee808a, Notional: 7371.136368552223 + {TokenChain: 4, TokenAddress: "000000000000000000000000a260e12d2b924cb899ae80bb58123ac3fee1e2f0", Symbol: "HOOK", CoingeckoID: "hooked-protocol", Decimals: 18}, // Addr: 0xa260e12d2b924cb899ae80bb58123ac3fee1e2f0, Notional: 1.582626 + {TokenChain: 4, TokenAddress: "000000000000000000000000fce146bf3146100cfe5db4129cf6c82b0ef4ad8c", Symbol: "renBTC", CoingeckoID: "renbtc", Decimals: 8}, // Addr: 0xfce146bf3146100cfe5db4129cf6c82b0ef4ad8c, Notional: 25.1356791 + {TokenChain: 4, TokenAddress: "00000000000000000000000083adb07bb91ddde95a24982f1b2d343963ba3995", Symbol: "Fwcl", CoingeckoID: "legends", Decimals: 9}, // Addr: 0x83adb07bb91ddde95a24982f1b2d343963ba3995, Notional: 0.40585000000000004 + {TokenChain: 4, TokenAddress: "0000000000000000000000004268b8f0b87b6eae5d897996e6b845ddbd99adf3", Symbol: "axlUSDC", CoingeckoID: "axlusdc", Decimals: 6}, // Addr: 0x4268b8f0b87b6eae5d897996e6b845ddbd99adf3, Notional: 12.081283443999999 + {TokenChain: 4, TokenAddress: "0000000000000000000000001613957159e9b0ac6c80e824f7eea748a32a0ae2", Symbol: "CGG", CoingeckoID: "chain-guardians", Decimals: 18}, // Addr: 0x1613957159e9b0ac6c80e824f7eea748a32a0ae2, Notional: 14.551759830868754 + {TokenChain: 4, TokenAddress: "0000000000000000000000005fb4968fc85868df3ad2d6e59883a10570f01d18", Symbol: "SHR", CoingeckoID: "sharering", Decimals: 18}, // Addr: 0x5fb4968fc85868df3ad2d6e59883a10570f01d18, Notional: 56.87694656 + {TokenChain: 4, TokenAddress: "0000000000000000000000007083609fce4d1d8dc0c979aab8c869ea2c873402", Symbol: "DOT", CoingeckoID: "binance-peg-polkadot", Decimals: 18}, // Addr: 0x7083609fce4d1d8dc0c979aab8c869ea2c873402, Notional: 3259.9775895640996 + {TokenChain: 4, TokenAddress: "0000000000000000000000002326c7395d02a8c89a9d7a0b0c1cf159d49ce51c", Symbol: "TBAC", CoingeckoID: "blockaura", Decimals: 8}, // Addr: 0x2326c7395d02a8c89a9d7a0b0c1cf159d49ce51c, Notional: 0.6943 + {TokenChain: 4, TokenAddress: "0000000000000000000000005e95a952a7f79f978585afd54a053af0f51372fa", Symbol: "SBG", CoingeckoID: "sb-group", Decimals: 9}, // Addr: 0x5e95a952a7f79f978585afd54a053af0f51372fa, Notional: 0.00583 + {TokenChain: 4, TokenAddress: "000000000000000000000000c146b7cdbaff065090077151d391f4c96aa09e0c", Symbol: "MCC", CoingeckoID: "multi-chain-capital-2", Decimals: 9}, // Addr: 0xc146b7cdbaff065090077151d391f4c96aa09e0c, Notional: 0.00000370812 + {TokenChain: 4, TokenAddress: "0000000000000000000000007af173f350d916358af3e218bdf2178494beb748", Symbol: "TRADE", CoingeckoID: "unitrade", Decimals: 18}, // Addr: 0x7af173f350d916358af3e218bdf2178494beb748, Notional: 1.165028820416628 + {TokenChain: 4, TokenAddress: "000000000000000000000000c94595b56e301f3ffedb8ccc2d672882d623e53a", Symbol: "ACY", CoingeckoID: "acy-finance", Decimals: 18}, // Addr: 0xc94595b56e301f3ffedb8ccc2d672882d623e53a, Notional: 0.0575699 + {TokenChain: 4, TokenAddress: "000000000000000000000000ca830317146bfdde71e7c0b880e2ec1f66e273ee", Symbol: "GULL", CoingeckoID: "polygod", Decimals: 18}, // Addr: 0xca830317146bfdde71e7c0b880e2ec1f66e273ee, Notional: 3.10722 + {TokenChain: 4, TokenAddress: "00000000000000000000000021f9b5b2626603e3f40bfc13d01afb8c431d382f", Symbol: "ZINU", CoingeckoID: "zombie-inu", Decimals: 9}, // Addr: 0x21f9b5b2626603e3f40bfc13d01afb8c431d382f, Notional: 1.3695910836476435 + {TokenChain: 4, TokenAddress: "0000000000000000000000007130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", Symbol: "BTCB", CoingeckoID: "binance-bitcoin", Decimals: 18}, // Addr: 0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c, Notional: 1557.0860722099999 + {TokenChain: 4, TokenAddress: "0000000000000000000000009df465460938f9ebdf51c38cc87d72184471f8f0", Symbol: "GENE", CoingeckoID: "genopets", Decimals: 18}, // Addr: 0x9df465460938f9ebdf51c38cc87d72184471f8f0, Notional: 12.2219194144327 + {TokenChain: 4, TokenAddress: "0000000000000000000000001446f3cedf4d86a9399e49f7937766e6de2a3aab", Symbol: "KRW", CoingeckoID: "krown", Decimals: 18}, // Addr: 0x1446f3cedf4d86a9399e49f7937766e6de2a3aab, Notional: 0.07654481684657279 + {TokenChain: 4, TokenAddress: "00000000000000000000000082d2f8e02afb160dd5a480a617692e62de9038c4", Symbol: "ALEPH", CoingeckoID: "aleph", Decimals: 18}, // Addr: 0x82d2f8e02afb160dd5a480a617692e62de9038c4, Notional: 23.19590494511306 + {TokenChain: 4, TokenAddress: "0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e", Symbol: "KEX", CoingeckoID: "kira-network", Decimals: 6}, // Addr: 0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e, Notional: 0.0000602223 + {TokenChain: 4, TokenAddress: "00000000000000000000000014778860e937f509e651192a90589de711fb88a9", Symbol: "CYBER", CoingeckoID: "cyberconnect", Decimals: 18}, // Addr: 0x14778860e937f509e651192a90589de711fb88a9, Notional: 57.0860973495 + {TokenChain: 4, TokenAddress: "0000000000000000000000001796ae0b0fa4862485106a0de9b654efe301d0b2", Symbol: "PMON", CoingeckoID: "polychain-monsters", Decimals: 18}, // Addr: 0x1796ae0b0fa4862485106a0de9b654efe301d0b2, Notional: 0.10612970160120001 + {TokenChain: 4, TokenAddress: "0000000000000000000000007e8db69dcff9209e486a100e611b0af300c3374e", Symbol: "TRDC", CoingeckoID: "traders-coin", Decimals: 18}, // Addr: 0x7e8db69dcff9209e486a100e611b0af300c3374e, Notional: 0.42117288777495 + {TokenChain: 4, TokenAddress: "000000000000000000000000bf37f781473f3b50e82c668352984865eac9853f", Symbol: "MILK", CoingeckoID: "the-crypto-you", Decimals: 18}, // Addr: 0xbf37f781473f3b50e82c668352984865eac9853f, Notional: 8.47882e-7 + {TokenChain: 4, TokenAddress: "000000000000000000000000bd83010eb60f12112908774998f65761cf9f6f9a", Symbol: "STARS", CoingeckoID: "mogul-productions", Decimals: 18}, // Addr: 0xbd83010eb60f12112908774998f65761cf9f6f9a, Notional: 0.8464005468 + {TokenChain: 4, TokenAddress: "000000000000000000000000c74cd0042c837ce59210857504ebb0859e06aa22", Symbol: "SAFUYIELD", CoingeckoID: "safu-protocol", Decimals: 9}, // Addr: 0xc74cd0042c837ce59210857504ebb0859e06aa22, Notional: 0.0036352000000078 + {TokenChain: 4, TokenAddress: "00000000000000000000000008b450e4a48c04cdf6db2bd4cf24057f7b9563ff", Symbol: "QUO", CoingeckoID: "quo", Decimals: 18}, // Addr: 0x08b450e4a48c04cdf6db2bd4cf24057f7b9563ff, Notional: 17272.603887079655 + {TokenChain: 4, TokenAddress: "0000000000000000000000008578eb576e126f67913a8bc0622e0a22eba0989a", Symbol: "PANDA", CoingeckoID: "hashpanda", Decimals: 9}, // Addr: 0x8578eb576e126f67913a8bc0622e0a22eba0989a, Notional: 0.024601468569463582 + {TokenChain: 4, TokenAddress: "000000000000000000000000d069599e718f963bd84502b49ba8f8657faf5b3a", Symbol: "PLAY", CoingeckoID: "xcad-network-play", Decimals: 18}, // Addr: 0xd069599e718f963bd84502b49ba8f8657faf5b3a, Notional: 7331.941099550909 + {TokenChain: 4, TokenAddress: "000000000000000000000000e60eaf5a997dfae83739e035b005a33afdcc6df5", Symbol: "DERI", CoingeckoID: "deri-protocol", Decimals: 18}, // Addr: 0xe60eaf5a997dfae83739e035b005a33afdcc6df5, Notional: 0.00426657 + {TokenChain: 4, TokenAddress: "0000000000000000000000009eb6935aea6afb5bc6d1a74be0c2f78280ab6448", Symbol: "ACA", CoingeckoID: "aca-token", Decimals: 9}, // Addr: 0x9eb6935aea6afb5bc6d1a74be0c2f78280ab6448, Notional: 0.09989495999999999 + {TokenChain: 4, TokenAddress: "0000000000000000000000006d86f0a41c3966cef8ea139648db707e912563c9", Symbol: "MCOIN", CoingeckoID: "mcoin1", Decimals: 18}, // Addr: 0x6d86f0a41c3966cef8ea139648db707e912563c9, Notional: 0.213 + {TokenChain: 4, TokenAddress: "0000000000000000000000004da996c5fe84755c80e108cf96fe705174c5e36a", Symbol: "WOW", CoingeckoID: "wowswap", Decimals: 18}, // Addr: 0x4da996c5fe84755c80e108cf96fe705174c5e36a, Notional: 0.30702398309782075 + {TokenChain: 4, TokenAddress: "0000000000000000000000008da443f84fea710266c8eb6bc34b71702d033ef2", Symbol: "CTSI", CoingeckoID: "cartesi", Decimals: 18}, // Addr: 0x8da443f84fea710266c8eb6bc34b71702d033ef2, Notional: 2.85099867 + {TokenChain: 4, TokenAddress: "0000000000000000000000009e6b3e35c8f563b45d864f9ff697a144ad28a371", Symbol: "DOGO", CoingeckoID: "dogemon-go", Decimals: 18}, // Addr: 0x9e6b3e35c8f563b45d864f9ff697a144ad28a371, Notional: 0.11014673096778001 + {TokenChain: 4, TokenAddress: "00000000000000000000000062823659d09f9f9d2222058878f89437425eb261", Symbol: "ERTHA", CoingeckoID: "ertha", Decimals: 18}, // Addr: 0x62823659d09f9f9d2222058878f89437425eb261, Notional: 0.01685586 + {TokenChain: 4, TokenAddress: "000000000000000000000000a2b726b1145a4773f68593cf171187d8ebe4d495", Symbol: "INJ", CoingeckoID: "injective-protocol", Decimals: 18}, // Addr: 0xa2b726b1145a4773f68593cf171187d8ebe4d495, Notional: 253.9494615936 + {TokenChain: 4, TokenAddress: "000000000000000000000000c6f509274fcc1f485644167cb911fd0c61545e6c", Symbol: "OBS", CoingeckoID: "obsidium", Decimals: 18}, // Addr: 0xc6f509274fcc1f485644167cb911fd0c61545e6c, Notional: 1.8704839999999998 + {TokenChain: 4, TokenAddress: "000000000000000000000000e4cc45bb5dbda06db6183e8bf016569f40497aa5", Symbol: "GAL", CoingeckoID: "project-galaxy", Decimals: 18}, // Addr: 0xe4cc45bb5dbda06db6183e8bf016569f40497aa5, Notional: 11.720939999999999 + {TokenChain: 4, TokenAddress: "000000000000000000000000935a544bf5816e3a7c13db2efe3009ffda0acda2", Symbol: "BLZ", CoingeckoID: "bluzelle", Decimals: 18}, // Addr: 0x935a544bf5816e3a7c13db2efe3009ffda0acda2, Notional: 88.86265417442776 + {TokenChain: 4, TokenAddress: "0000000000000000000000000cf8e180350253271f4b917ccfb0accc4862f262", Symbol: "BTCBR", CoingeckoID: "bitcoin-br", Decimals: 18}, // Addr: 0x0cf8e180350253271f4b917ccfb0accc4862f262, Notional: 1.036e-11 + {TokenChain: 4, TokenAddress: "00000000000000000000000019b99162adaab85134e781ac0048c275c31b205a", Symbol: "TAUR", CoingeckoID: "marnotaur", Decimals: 18}, // Addr: 0x19b99162adaab85134e781ac0048c275c31b205a, Notional: 3.5871321362443016 + {TokenChain: 4, TokenAddress: "0000000000000000000000004b5decb9327b4d511a58137a1ade61434aacdd43", Symbol: "PKN", CoingeckoID: "poken", Decimals: 18}, // Addr: 0x4b5decb9327b4d511a58137a1ade61434aacdd43, Notional: 36.77732037415088 + {TokenChain: 4, TokenAddress: "000000000000000000000000bf5140a22578168fd562dccf235e5d43a02ce9b1", Symbol: "UNI", CoingeckoID: "uniswap", Decimals: 18}, // Addr: 0xbf5140a22578168fd562dccf235e5d43a02ce9b1, Notional: 16.035156117499998 + {TokenChain: 4, TokenAddress: "000000000000000000000000fe19f0b51438fd612f6fd59c1dbb3ea319f433ba", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0xfe19f0b51438fd612f6fd59c1dbb3ea319f433ba, Notional: 1007.4652507842 + {TokenChain: 4, TokenAddress: "0000000000000000000000006ff1bfa14a57594a5874b37ff6ac5efbd9f9599a", Symbol: "TOTM", CoingeckoID: "totemfi", Decimals: 18}, // Addr: 0x6ff1bfa14a57594a5874b37ff6ac5efbd9f9599a, Notional: 0.694860941720637 + {TokenChain: 4, TokenAddress: "0000000000000000000000001d2f0da169ceb9fc7b3144628db156f3f6c60dbe", Symbol: "XRP", CoingeckoID: "binance-peg-xrp", Decimals: 18}, // Addr: 0x1d2f0da169ceb9fc7b3144628db156f3f6c60dbe, Notional: 62.39850206854572 + {TokenChain: 4, TokenAddress: "0000000000000000000000001ce0c2827e2ef14d5c4f29a091d735a204794041", Symbol: "AVAX", CoingeckoID: "binance-peg-avalanche", Decimals: 18}, // Addr: 0x1ce0c2827e2ef14d5c4f29a091d735a204794041, Notional: 1112.0619329325002 + {TokenChain: 4, TokenAddress: "0000000000000000000000007881cd2b5724431372f57c50e91611352557a606", Symbol: "HyPC", CoingeckoID: "hypercycle", Decimals: 6}, // Addr: 0x7881cd2b5724431372f57c50e91611352557a606, Notional: 11.58871355 + {TokenChain: 4, TokenAddress: "000000000000000000000000959229d94c9060552daea25ac17193bca65d7884", Symbol: "IOI", CoingeckoID: "ioi-token", Decimals: 6}, // Addr: 0x959229d94c9060552daea25ac17193bca65d7884, Notional: 0.19782725543895 + {TokenChain: 4, TokenAddress: "0000000000000000000000001fa4a73a3f0133f0025378af00236f3abdee5d63", Symbol: "NEAR", CoingeckoID: "wrapped-near", Decimals: 18}, // Addr: 0x1fa4a73a3f0133f0025378af00236f3abdee5d63, Notional: 26.3618182 + {TokenChain: 4, TokenAddress: "000000000000000000000000f915fdda4c882731c0456a4214548cd13a822886", Symbol: "UNV", CoingeckoID: "unvest", Decimals: 18}, // Addr: 0xf915fdda4c882731c0456a4214548cd13a822886, Notional: 9.33099944 + {TokenChain: 4, TokenAddress: "000000000000000000000000e9e7cea3dedca5984780bafc599bd69add087d56", Symbol: "BUSD", CoingeckoID: "binance-usd", Decimals: 18}, // Addr: 0xe9e7cea3dedca5984780bafc599bd69add087d56, Notional: 136516.01945595612 + {TokenChain: 4, TokenAddress: "0000000000000000000000004b5c23cac08a567ecf0c1ffca8372a45a5d33743", Symbol: "FARM", CoingeckoID: "harvest-finance", Decimals: 18}, // Addr: 0x4b5c23cac08a567ecf0c1ffca8372a45a5d33743, Notional: 0.3933574218 + {TokenChain: 4, TokenAddress: "0000000000000000000000008ac76a51cc950d9822d68b83fe1ad97b32cd580d", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 18}, // Addr: 0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d, Notional: 5323805.969834672 + {TokenChain: 4, TokenAddress: "00000000000000000000000059c49b54d4425c7ff1e49f40958a14d48cc87c26", Symbol: "MC", CoingeckoID: "tap-fantasy-mc", Decimals: 18}, // Addr: 0x59c49b54d4425c7ff1e49f40958a14d48cc87c26, Notional: 4.33128 + {TokenChain: 4, TokenAddress: "0000000000000000000000008ebc361536094fd5b4ffb8521e31900614c9f55d", Symbol: "DARC", CoingeckoID: "darcmatter-coin", Decimals: 18}, // Addr: 0x8ebc361536094fd5b4ffb8521e31900614c9f55d, Notional: 2981.712593546912 + {TokenChain: 4, TokenAddress: "000000000000000000000000e552fb52a4f19e44ef5a967632dbc320b0820639", Symbol: "Metis", CoingeckoID: "metis-token", Decimals: 18}, // Addr: 0xe552fb52a4f19e44ef5a967632dbc320b0820639, Notional: 89041.5107921196 + {TokenChain: 4, TokenAddress: "00000000000000000000000040c8225329bd3e28a043b029e0d07a5344d2c27c", Symbol: "AOG", CoingeckoID: "ageofgods", Decimals: 18}, // Addr: 0x40c8225329bd3e28a043b029e0d07a5344d2c27c, Notional: 2.108921458779452 + {TokenChain: 4, TokenAddress: "00000000000000000000000039ae8eefb05138f418bb27659c21632dc1ddab10", Symbol: "KAI", CoingeckoID: "kardiachain", Decimals: 18}, // Addr: 0x39ae8eefb05138f418bb27659c21632dc1ddab10, Notional: 50.420895376829286 + {TokenChain: 4, TokenAddress: "000000000000000000000000aec945e04baf28b135fa7c640f624f8d90f1c3a6", Symbol: "C98", CoingeckoID: "coin98", Decimals: 18}, // Addr: 0xaec945e04baf28b135fa7c640f624f8d90f1c3a6, Notional: 63.01554548677032 + {TokenChain: 4, TokenAddress: "000000000000000000000000f486ad071f3bee968384d2e39e2d8af0fcf6fd46", Symbol: "VELO", CoingeckoID: "velo", Decimals: 18}, // Addr: 0xf486ad071f3bee968384d2e39e2d8af0fcf6fd46, Notional: 11.4455363822696 + {TokenChain: 4, TokenAddress: "0000000000000000000000004aac18de824ec1b553dbf342829834e4ff3f7a9f", Symbol: "ANCHOR", CoingeckoID: "anchorswap", Decimals: 18}, // Addr: 0x4aac18de824ec1b553dbf342829834e4ff3f7a9f, Notional: 0.1815799320458428 + {TokenChain: 4, TokenAddress: "0000000000000000000000007e35d0e9180bf3a1fc47b0d110be7a21a10b41fe", Symbol: "OVR", CoingeckoID: "ovr", Decimals: 18}, // Addr: 0x7e35d0e9180bf3a1fc47b0d110be7a21a10b41fe, Notional: 39.6383965176749 + {TokenChain: 4, TokenAddress: "0000000000000000000000000782b6d8c4551b9760e74c0545a9bcd90bdc41e5", Symbol: "HAY", CoingeckoID: "helio-protocol-hay", Decimals: 18}, // Addr: 0x0782b6d8c4551b9760e74c0545a9bcd90bdc41e5, Notional: 2.496575426758 + {TokenChain: 4, TokenAddress: "000000000000000000000000ad6742a35fb341a9cc6ad674738dd8da98b94fb1", Symbol: "WOM", CoingeckoID: "wombat-exchange", Decimals: 18}, // Addr: 0xad6742a35fb341a9cc6ad674738dd8da98b94fb1, Notional: 1514438.0683924924 + {TokenChain: 4, TokenAddress: "0000000000000000000000002c717059b366714d267039af8f59125cadce6d8c", Symbol: "MHUNT", CoingeckoID: "metashooter", Decimals: 18}, // Addr: 0x2c717059b366714d267039af8f59125cadce6d8c, Notional: 0.2714162328420164 + {TokenChain: 4, TokenAddress: "00000000000000000000000011a38e06699b238d6d9a0c7a01f3ac63a07ad318", Symbol: "USDFI", CoingeckoID: "usdfi", Decimals: 18}, // Addr: 0x11a38e06699b238d6d9a0c7a01f3ac63a07ad318, Notional: 0.694215 + {TokenChain: 4, TokenAddress: "0000000000000000000000000e09fabb73bd3ade0a17ecc321fd13a19e81ce82", Symbol: "Cake", CoingeckoID: "pancakeswap-token", Decimals: 18}, // Addr: 0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82, Notional: 166.13360423199998 + {TokenChain: 4, TokenAddress: "0000000000000000000000000ebd9537a25f56713e34c45b38f421a1e7191469", Symbol: "MOOV", CoingeckoID: "dotmoovs", Decimals: 18}, // Addr: 0x0ebd9537a25f56713e34c45b38f421a1e7191469, Notional: 502.77126372 + {TokenChain: 4, TokenAddress: "0000000000000000000000004338665cbb7b2485a8855a139b75d5e34ab0db94", Symbol: "LTC", CoingeckoID: "binance-peg-litecoin", Decimals: 18}, // Addr: 0x4338665cbb7b2485a8855a139b75d5e34ab0db94, Notional: 9.7212047427 + {TokenChain: 4, TokenAddress: "000000000000000000000000e2604c9561d490624aa35e156e65e590eb749519", Symbol: "GM", CoingeckoID: "goldminer", Decimals: 18}, // Addr: 0xe2604c9561d490624aa35e156e65e590eb749519, Notional: 65.06029656381426 + {TokenChain: 4, TokenAddress: "000000000000000000000000c8a11f433512c16ed895245f34bcc2ca44eb06bd", Symbol: "KSN", CoingeckoID: "kissan", Decimals: 18}, // Addr: 0xc8a11f433512c16ed895245f34bcc2ca44eb06bd, Notional: 0.159585 {TokenChain: 4, TokenAddress: "000000000000000000000000a5496935a247fa81b1462e553ad139d2fd0af795", Symbol: "FLAG", CoingeckoID: "flag-network", Decimals: 18}, // Addr: 0xa5496935a247fa81b1462e553ad139d2fd0af795, Notional: 1.2682991236047 - {TokenChain: 4, TokenAddress: "0000000000000000000000004b0f1812e5df2a09796481ff14017e6005508003", Symbol: "TWT", CoingeckoID: "trust-wallet-token", Decimals: 18}, // Addr: 0x4b0f1812e5df2a09796481ff14017e6005508003, Notional: 6697.346543595812 - {TokenChain: 4, TokenAddress: "000000000000000000000000872d068c25511be88c1f5990c53eeffcdf46c9b4", Symbol: "VENT", CoingeckoID: "vent-finance", Decimals: 18}, // Addr: 0x872d068c25511be88c1f5990c53eeffcdf46c9b4, Notional: 0.01556888 - {TokenChain: 4, TokenAddress: "000000000000000000000000c3d912863152e1afc935ad0d42d469e7c6b05b77", Symbol: "LUCKY", CoingeckoID: "lucky-lion", Decimals: 18}, // Addr: 0xc3d912863152e1afc935ad0d42d469e7c6b05b77, Notional: 0.004070029522522 - {TokenChain: 4, TokenAddress: "00000000000000000000000092868a5255c628da08f550a858a802f5351c5223", Symbol: "BRIDGE", CoingeckoID: "cross-chain-bridge", Decimals: 18}, // Addr: 0x92868a5255c628da08f550a858a802f5351c5223, Notional: 0.06338898 - {TokenChain: 4, TokenAddress: "000000000000000000000000ace8c5e6e492aa7aebf31a8053f8a487f62ceb84", Symbol: "NADA", CoingeckoID: "nothing", Decimals: 18}, // Addr: 0xace8c5e6e492aa7aebf31a8053f8a487f62ceb84, Notional: 0.1074696 - {TokenChain: 4, TokenAddress: "0000000000000000000000002d94172436d869c1e3c094bead272508fab0d9e3", Symbol: "RCG", CoingeckoID: "recharge", Decimals: 18}, // Addr: 0x2d94172436d869c1e3c094bead272508fab0d9e3, Notional: 0.06995828 - {TokenChain: 4, TokenAddress: "00000000000000000000000010f6f2b97f3ab29583d9d38babf2994df7220c21", Symbol: "TEDDY", CoingeckoID: "teddy-doge", Decimals: 18}, // Addr: 0x10f6f2b97f3ab29583d9d38babf2994df7220c21, Notional: 0.44797684658382425 - {TokenChain: 4, TokenAddress: "0000000000000000000000003019bf2a2ef8040c242c9a4c5c4bd4c81678b2a1", Symbol: "GMT", CoingeckoID: "stepn", Decimals: 8}, // Addr: 0x3019bf2a2ef8040c242c9a4c5c4bd4c81678b2a1, Notional: 344.60921043530686 - {TokenChain: 4, TokenAddress: "000000000000000000000000c598275452fa319d75ee5f176fd3b8384925b425", Symbol: "STRM", CoingeckoID: "streamcoin", Decimals: 18}, // Addr: 0xc598275452fa319d75ee5f176fd3b8384925b425, Notional: 0.0300885 - {TokenChain: 4, TokenAddress: "00000000000000000000000023396cf899ca06c4472205fc903bdb4de249d6fc", Symbol: "UST", CoingeckoID: "wrapped-ust", Decimals: 18}, // Addr: 0x23396cf899ca06c4472205fc903bdb4de249d6fc, Notional: 0.8611165312671102 - {TokenChain: 4, TokenAddress: "000000000000000000000000129385c4acd0075e45a0c9a5177bdfec9678a138", Symbol: "MTK", CoingeckoID: "metakings", Decimals: 18}, // Addr: 0x129385c4acd0075e45a0c9a5177bdfec9678a138, Notional: 0.0042712 - {TokenChain: 4, TokenAddress: "0000000000000000000000002f29bc0ffaf9bff337b31cbe6cb5fb3bf12e5840", Symbol: "DOLA", CoingeckoID: "dola-usd", Decimals: 18}, // Addr: 0x2f29bc0ffaf9bff337b31cbe6cb5fb3bf12e5840, Notional: 146.50276621982204 - {TokenChain: 5, TokenAddress: "000000000000000000000000aaa5b9e6c589642f98a1cda99b9d024b8407285a", Symbol: "TITAN", CoingeckoID: "iron-titanium-token", Decimals: 18}, // Addr: 0xaaa5b9e6c589642f98a1cda99b9d024b8407285a, Notional: 15.114405730247004 - {TokenChain: 5, TokenAddress: "000000000000000000000000723b17718289a91af252d616de2c77944962d122", Symbol: "GAIA", CoingeckoID: "gaia-everworld", Decimals: 18}, // Addr: 0x723b17718289a91af252d616de2c77944962d122, Notional: 0.0323872465907376 - {TokenChain: 5, TokenAddress: "00000000000000000000000030ea765d4dda26e0f89e1b23a7c7b2526b7d29ec", Symbol: "POLYPAD", CoingeckoID: "polypad", Decimals: 18}, // Addr: 0x30ea765d4dda26e0f89e1b23a7c7b2526b7d29ec, Notional: 290.7196773461167 - {TokenChain: 5, TokenAddress: "0000000000000000000000008f006d1e1d9dc6c98996f50a4c810f17a47fbf19", Symbol: "NSFW", CoingeckoID: "pleasure-coin", Decimals: 18}, // Addr: 0x8f006d1e1d9dc6c98996f50a4c810f17a47fbf19, Notional: 1750.20805092 - {TokenChain: 5, TokenAddress: "0000000000000000000000009cb74c8032b007466865f060ad2c46145d45553d", Symbol: "IDEX", CoingeckoID: "aurora-dao", Decimals: 18}, // Addr: 0x9cb74c8032b007466865f060ad2c46145d45553d, Notional: 0.3053776244792 - {TokenChain: 5, TokenAddress: "0000000000000000000000001a13f4ca1d028320a707d99520abfefca3998b7f", Symbol: "amUSDC", CoingeckoID: "aave-polygon-usdc", Decimals: 6}, // Addr: 0x1a13f4ca1d028320a707d99520abfefca3998b7f, Notional: 19.123801714944 - {TokenChain: 5, TokenAddress: "00000000000000000000000034c1b299a74588d6abdc1b85a53345a48428a521", Symbol: "EZ", CoingeckoID: "easyfi", Decimals: 18}, // Addr: 0x34c1b299a74588d6abdc1b85a53345a48428a521, Notional: 0.207196 - {TokenChain: 5, TokenAddress: "00000000000000000000000050b728d8d964fd00c2d0aad81718b71311fef68a", Symbol: "SNX", CoingeckoID: "havven", Decimals: 18}, // Addr: 0x50b728d8d964fd00c2d0aad81718b71311fef68a, Notional: 2.52 - {TokenChain: 5, TokenAddress: "0000000000000000000000002ab0e9e4ee70fff1fb9d67031e44f6410170d00e", Symbol: "mXEN", CoingeckoID: "xen-crypto-matic", Decimals: 18}, // Addr: 0x2ab0e9e4ee70fff1fb9d67031e44f6410170d00e, Notional: 355.58613904744885 - {TokenChain: 5, TokenAddress: "0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270", Symbol: "WMATIC", CoingeckoID: "wmatic", Decimals: 18}, // Addr: 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270, Notional: 539913.9267726103 - {TokenChain: 5, TokenAddress: "000000000000000000000000d8ca34fd379d9ca3c6ee3b3905678320f5b45195", Symbol: "gOHM", CoingeckoID: "governance-ohm", Decimals: 18}, // Addr: 0xd8ca34fd379d9ca3c6ee3b3905678320f5b45195, Notional: 9.239383395 - {TokenChain: 5, TokenAddress: "000000000000000000000000444444444444c1a66f394025ac839a535246fcc8", Symbol: "GENI", CoingeckoID: "genius", Decimals: 9}, // Addr: 0x444444444444c1a66f394025ac839a535246fcc8, Notional: 22.83046786941621 - {TokenChain: 5, TokenAddress: "000000000000000000000000a649325aa7c5093d12d6f98eb4378deae68ce23f", Symbol: "BNB", CoingeckoID: "wbnb", Decimals: 18}, // Addr: 0xa649325aa7c5093d12d6f98eb4378deae68ce23f, Notional: 856.2831504047999 - {TokenChain: 5, TokenAddress: "000000000000000000000000596ebe76e2db4470966ea395b0d063ac6197a8c5", Symbol: "JRT", CoingeckoID: "jarvis-reward-token", Decimals: 18}, // Addr: 0x596ebe76e2db4470966ea395b0d063ac6197a8c5, Notional: 977.566 - {TokenChain: 5, TokenAddress: "000000000000000000000000f28164a485b0b2c90639e47b0f377b4a438a16b1", Symbol: "dQUICK", CoingeckoID: "dragons-quick", Decimals: 18}, // Addr: 0xf28164a485b0b2c90639e47b0f377b4a438a16b1, Notional: 0.20965052800000003 - {TokenChain: 5, TokenAddress: "000000000000000000000000d838290e877e0188a4a44700463419ed96c16107", Symbol: "NCT", CoingeckoID: "toucan-protocol-nature-carbon-tonne", Decimals: 18}, // Addr: 0xd838290e877e0188a4a44700463419ed96c16107, Notional: 72 - {TokenChain: 5, TokenAddress: "000000000000000000000000229b1b6c23ff8953d663c4cbb519717e323a0a84", Symbol: "BLOK", CoingeckoID: "bloktopia", Decimals: 18}, // Addr: 0x229b1b6c23ff8953d663c4cbb519717e323a0a84, Notional: 0.1193405454392832 - {TokenChain: 5, TokenAddress: "0000000000000000000000008eef5a82e6aa222a60f009ac18c24ee12dbf4b41", Symbol: "TXL", CoingeckoID: "autobahn-network", Decimals: 18}, // Addr: 0x8eef5a82e6aa222a60f009ac18c24ee12dbf4b41, Notional: 0.0000247703 - {TokenChain: 5, TokenAddress: "000000000000000000000000a7051c5a22d963b81d71c2ba64d46a877fbc1821", Symbol: "EROWAN", CoingeckoID: "sifchain", Decimals: 18}, // Addr: 0xa7051c5a22d963b81d71c2ba64d46a877fbc1821, Notional: 0.0007673369986161999 - {TokenChain: 5, TokenAddress: "000000000000000000000000edcfb6984a3c70501baa8b7f5421ae795ecc1496", Symbol: "META", CoingeckoID: "abcmeta", Decimals: 8}, // Addr: 0xedcfb6984a3c70501baa8b7f5421ae795ecc1496, Notional: 0.46403742000000003 - {TokenChain: 5, TokenAddress: "00000000000000000000000018ec0a6e18e5bc3784fdd3a3634b31245ab704f6", Symbol: "EURe", CoingeckoID: "monerium-eur-money", Decimals: 18}, // Addr: 0x18ec0a6e18e5bc3784fdd3a3634b31245ab704f6, Notional: 0.32880000000000004 - {TokenChain: 5, TokenAddress: "0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f619", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x7ceb23fd6bc0add59e62ac25578270cff1b9f619, Notional: 114880.5739065552 - {TokenChain: 5, TokenAddress: "00000000000000000000000008e175a1eac9744a0f1ccaeb8f669af6a2bda3ce", Symbol: "E8", CoingeckoID: "energy8", Decimals: 9}, // Addr: 0x08e175a1eac9744a0f1ccaeb8f669af6a2bda3ce, Notional: 27.49236663610974 - {TokenChain: 5, TokenAddress: "000000000000000000000000f21441f9ec4c1fe69cb7cf186eceab31af2b658d", Symbol: "VENT", CoingeckoID: "vent-finance", Decimals: 18}, // Addr: 0xf21441f9ec4c1fe69cb7cf186eceab31af2b658d, Notional: 47.485084 - {TokenChain: 5, TokenAddress: "000000000000000000000000692597b009d13c4049a947cab2239b7d6517875f", Symbol: "UST", CoingeckoID: "wrapped-ust", Decimals: 18}, // Addr: 0x692597b009d13c4049a947cab2239b7d6517875f, Notional: 246.8082794958351 - {TokenChain: 5, TokenAddress: "000000000000000000000000e9993763e0b7f7d915a62a5f22a6e151f91d98a8", Symbol: "TORG", CoingeckoID: "torg", Decimals: 18}, // Addr: 0xe9993763e0b7f7d915a62a5f22a6e151f91d98a8, Notional: 0.031026212968987225 - {TokenChain: 5, TokenAddress: "0000000000000000000000004e1581f01046efdd7a1a2cdb0f82cdd7f71f2e59", Symbol: "ICE", CoingeckoID: "ice-token", Decimals: 18}, // Addr: 0x4e1581f01046efdd7a1a2cdb0f82cdd7f71f2e59, Notional: 97.8187006163268 - {TokenChain: 5, TokenAddress: "000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0xc2132d05d31c914a87c6611c10748aeb04b58e8f, Notional: 94147.43780652447 - {TokenChain: 5, TokenAddress: "0000000000000000000000004a81f8796e0c6ad4877a51c86693b0de8093f2ef", Symbol: "ICE", CoingeckoID: "iron-finance", Decimals: 18}, // Addr: 0x4a81f8796e0c6ad4877a51c86693b0de8093f2ef, Notional: 2.7425047499999997 - {TokenChain: 5, TokenAddress: "0000000000000000000000009085b4d52c3e0b8b6f9af6213e85a433c7d76f19", Symbol: "OWL", CoingeckoID: "owldao", Decimals: 18}, // Addr: 0x9085b4d52c3e0b8b6f9af6213e85a433c7d76f19, Notional: 1.0600566086450616 - {TokenChain: 5, TokenAddress: "00000000000000000000000091c5a5488c0decde1eacd8a4f10e0942fb925067", Symbol: "AUDT", CoingeckoID: "auditchain", Decimals: 18}, // Addr: 0x91c5a5488c0decde1eacd8a4f10e0942fb925067, Notional: 87.2497 - {TokenChain: 5, TokenAddress: "0000000000000000000000004c9f66b2806538cf00ef596e09fb05bcb0d17dc8", Symbol: "MNTO", CoingeckoID: "minato", Decimals: 18}, // Addr: 0x4c9f66b2806538cf00ef596e09fb05bcb0d17dc8, Notional: 4.16 - {TokenChain: 5, TokenAddress: "00000000000000000000000004429fbb948bbd09327763214b45e505a5293346", Symbol: "ABR", CoingeckoID: "allbridge", Decimals: 18}, // Addr: 0x04429fbb948bbd09327763214b45e505a5293346, Notional: 32.535918 - {TokenChain: 5, TokenAddress: "000000000000000000000000aa404804ba583c025fa64c9a276a6127ceb355c6", Symbol: "CPR", CoingeckoID: "cipher-2", Decimals: 2}, // Addr: 0xaa404804ba583c025fa64c9a276a6127ceb355c6, Notional: 11333.6729525448 - {TokenChain: 5, TokenAddress: "000000000000000000000000d86b5923f3ad7b585ed81b448170ae026c65ae9a", Symbol: "IRON", CoingeckoID: "iron-stablecoin", Decimals: 18}, // Addr: 0xd86b5923f3ad7b585ed81b448170ae026c65ae9a, Notional: 18.93586316836303 - {TokenChain: 5, TokenAddress: "000000000000000000000000430ef9263e76dae63c84292c3409d61c598e9682", Symbol: "PYR", CoingeckoID: "vulcan-forged", Decimals: 18}, // Addr: 0x430ef9263e76dae63c84292c3409d61c598e9682, Notional: 30.6 - {TokenChain: 5, TokenAddress: "0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x2791bca1f2de4661ed88a30c99a7a9449aa84174, Notional: 3939487.7895833454 - {TokenChain: 5, TokenAddress: "000000000000000000000000a5eb60ca85898f8b26e18ff7c7e43623ccba772c", Symbol: "COSMIC", CoingeckoID: "cosmicswap", Decimals: 18}, // Addr: 0xa5eb60ca85898f8b26e18ff7c7e43623ccba772c, Notional: 55.707364207532805 - {TokenChain: 5, TokenAddress: "0000000000000000000000000d6ae2a429df13e44a07cd2969e085e4833f64a0", Symbol: "PBR", CoingeckoID: "polkabridge", Decimals: 18}, // Addr: 0x0d6ae2a429df13e44a07cd2969e085e4833f64a0, Notional: 421.29295425429524 - {TokenChain: 5, TokenAddress: "0000000000000000000000004fb71290ac171e1d144f7221d882becac7196eb5", Symbol: "TRYB", CoingeckoID: "bilira", Decimals: 6}, // Addr: 0x4fb71290ac171e1d144f7221d882becac7196eb5, Notional: 11.35231095147084 - {TokenChain: 5, TokenAddress: "0000000000000000000000006ccf12b480a99c54b23647c995f4525d544a7e72", Symbol: "START", CoingeckoID: "bscstarter", Decimals: 18}, // Addr: 0x6ccf12b480a99c54b23647c995f4525d544a7e72, Notional: 53.506096 - {TokenChain: 5, TokenAddress: "0000000000000000000000008d1566569d5b695d44a9a234540f68d393cdc40d", Symbol: "GAME", CoingeckoID: "gamecredits", Decimals: 18}, // Addr: 0x8d1566569d5b695d44a9a234540f68d393cdc40d, Notional: 0.07827624 - {TokenChain: 5, TokenAddress: "0000000000000000000000009c891326fd8b1a713974f73bb604677e1e63396d", Symbol: "ISLAMI", CoingeckoID: "islamicoin", Decimals: 7}, // Addr: 0x9c891326fd8b1a713974f73bb604677e1e63396d, Notional: 229280 - {TokenChain: 5, TokenAddress: "00000000000000000000000045c32fa6df82ead1e2ef74d17b76547eddfaff89", Symbol: "FRAX", CoingeckoID: "frax", Decimals: 18}, // Addr: 0x45c32fa6df82ead1e2ef74d17b76547eddfaff89, Notional: 9.99520197598062 - {TokenChain: 5, TokenAddress: "000000000000000000000000e0bceef36f3a6efdd5eebfacd591423f8549b9d5", Symbol: "FACTR", CoingeckoID: "defactor", Decimals: 18}, // Addr: 0xe0bceef36f3a6efdd5eebfacd591423f8549b9d5, Notional: 2.24755572696804 - {TokenChain: 5, TokenAddress: "00000000000000000000000022e3f02f86bc8ea0d73718a2ae8851854e62adc5", Symbol: "FLAME", CoingeckoID: "firestarter", Decimals: 18}, // Addr: 0x22e3f02f86bc8ea0d73718a2ae8851854e62adc5, Notional: 10487.68237294471 - {TokenChain: 5, TokenAddress: "000000000000000000000000613a489785c95afeb3b404cc41565ccff107b6e0", Symbol: "RADIO", CoingeckoID: "radioshack", Decimals: 18}, // Addr: 0x613a489785c95afeb3b404cc41565ccff107b6e0, Notional: 0.0169818189090932 - {TokenChain: 5, TokenAddress: "000000000000000000000000a1c57f48f0deb89f569dfbe6e2b7f46d33606fd4", Symbol: "MANA", CoingeckoID: "decentraland", Decimals: 18}, // Addr: 0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4, Notional: 624.0090803187055 - {TokenChain: 5, TokenAddress: "000000000000000000000000e20b9e246db5a0d21bf9209e4858bc9a3ff7a034", Symbol: "wBAN", CoingeckoID: "banano", Decimals: 18}, // Addr: 0xe20b9e246db5a0d21bf9209e4858bc9a3ff7a034, Notional: 55.62303595325316 - {TokenChain: 5, TokenAddress: "000000000000000000000000831753dd7087cac61ab5644b308642cc1c33dc13", Symbol: "QUICK", CoingeckoID: "quick", Decimals: 18}, // Addr: 0x831753dd7087cac61ab5644b308642cc1c33dc13, Notional: 7.7823987072 - {TokenChain: 5, TokenAddress: "0000000000000000000000009ff62d1fc52a907b6dcba8077c2ddca6e6a9d3e1", Symbol: "FORT", CoingeckoID: "forta", Decimals: 18}, // Addr: 0x9ff62d1fc52a907b6dcba8077c2ddca6e6a9d3e1, Notional: 396.6905150623354 - {TokenChain: 5, TokenAddress: "0000000000000000000000001d734a02ef1e1f5886e66b0673b71af5b53ffa94", Symbol: "SD", CoingeckoID: "stader", Decimals: 18}, // Addr: 0x1d734a02ef1e1f5886e66b0673b71af5b53ffa94, Notional: 118.07255381681459 - {TokenChain: 5, TokenAddress: "0000000000000000000000002ab4f9ac80f33071211729e45cfc346c1f8446d5", Symbol: "CGG", CoingeckoID: "chain-guardians", Decimals: 18}, // Addr: 0x2ab4f9ac80f33071211729e45cfc346c1f8446d5, Notional: 0.058678 - {TokenChain: 5, TokenAddress: "00000000000000000000000025788a1a171ec66da6502f9975a15b609ff54cf6", Symbol: "POOL", CoingeckoID: "pooltogether", Decimals: 18}, // Addr: 0x25788a1a171ec66da6502f9975a15b609ff54cf6, Notional: 4.086537 + {TokenChain: 4, TokenAddress: "0000000000000000000000004b0f1812e5df2a09796481ff14017e6005508003", Symbol: "TWT", CoingeckoID: "trust-wallet-token", Decimals: 18}, // Addr: 0x4b0f1812e5df2a09796481ff14017e6005508003, Notional: 7254.364860036309 + {TokenChain: 4, TokenAddress: "000000000000000000000000872d068c25511be88c1f5990c53eeffcdf46c9b4", Symbol: "VENT", CoingeckoID: "vent-finance", Decimals: 18}, // Addr: 0x872d068c25511be88c1f5990c53eeffcdf46c9b4, Notional: 0.01187678 + {TokenChain: 4, TokenAddress: "000000000000000000000000c3d912863152e1afc935ad0d42d469e7c6b05b77", Symbol: "LUCKY", CoingeckoID: "lucky-lion", Decimals: 18}, // Addr: 0xc3d912863152e1afc935ad0d42d469e7c6b05b77, Notional: 0.0040680482842287 + {TokenChain: 4, TokenAddress: "000000000000000000000000f21768ccbc73ea5b6fd3c687208a7c2def2d966e", Symbol: "REEF", CoingeckoID: "reef", Decimals: 18}, // Addr: 0xf21768ccbc73ea5b6fd3c687208a7c2def2d966e, Notional: 20.175308360000002 + {TokenChain: 4, TokenAddress: "00000000000000000000000092868a5255c628da08f550a858a802f5351c5223", Symbol: "BRIDGE", CoingeckoID: "cross-chain-bridge", Decimals: 18}, // Addr: 0x92868a5255c628da08f550a858a802f5351c5223, Notional: 0.04864212 + {TokenChain: 4, TokenAddress: "000000000000000000000000ace8c5e6e492aa7aebf31a8053f8a487f62ceb84", Symbol: "NADA", CoingeckoID: "nothing", Decimals: 18}, // Addr: 0xace8c5e6e492aa7aebf31a8053f8a487f62ceb84, Notional: 0.0919484 + {TokenChain: 4, TokenAddress: "0000000000000000000000002d94172436d869c1e3c094bead272508fab0d9e3", Symbol: "RCG", CoingeckoID: "recharge", Decimals: 18}, // Addr: 0x2d94172436d869c1e3c094bead272508fab0d9e3, Notional: 0.0301834708 + {TokenChain: 4, TokenAddress: "00000000000000000000000010f6f2b97f3ab29583d9d38babf2994df7220c21", Symbol: "TEDDY", CoingeckoID: "teddy-doge", Decimals: 18}, // Addr: 0x10f6f2b97f3ab29583d9d38babf2994df7220c21, Notional: 0.30783698513606866 + {TokenChain: 4, TokenAddress: "0000000000000000000000003019bf2a2ef8040c242c9a4c5c4bd4c81678b2a1", Symbol: "GMT", CoingeckoID: "stepn", Decimals: 8}, // Addr: 0x3019bf2a2ef8040c242c9a4c5c4bd4c81678b2a1, Notional: 256.65614732050875 + {TokenChain: 4, TokenAddress: "000000000000000000000000aa076b62efc6f357882e07665157a271ab46a063", Symbol: "NSFW", CoingeckoID: "pleasure-coin", Decimals: 18}, // Addr: 0xaa076b62efc6f357882e07665157a271ab46a063, Notional: 1416.3553192955185 + {TokenChain: 4, TokenAddress: "000000000000000000000000c598275452fa319d75ee5f176fd3b8384925b425", Symbol: "STRM", CoingeckoID: "streamcoin", Decimals: 18}, // Addr: 0xc598275452fa319d75ee5f176fd3b8384925b425, Notional: 0.00464558 + {TokenChain: 4, TokenAddress: "00000000000000000000000023396cf899ca06c4472205fc903bdb4de249d6fc", Symbol: "UST", CoingeckoID: "wrapped-ust", Decimals: 18}, // Addr: 0x23396cf899ca06c4472205fc903bdb4de249d6fc, Notional: 0.6606459500117537 + {TokenChain: 4, TokenAddress: "000000000000000000000000129385c4acd0075e45a0c9a5177bdfec9678a138", Symbol: "MTK", CoingeckoID: "metakings", Decimals: 18}, // Addr: 0x129385c4acd0075e45a0c9a5177bdfec9678a138, Notional: 0.0042363999999999995 + {TokenChain: 4, TokenAddress: "0000000000000000000000002f29bc0ffaf9bff337b31cbe6cb5fb3bf12e5840", Symbol: "DOLA", CoingeckoID: "dola-usd", Decimals: 18}, // Addr: 0x2f29bc0ffaf9bff337b31cbe6cb5fb3bf12e5840, Notional: 690.856298161922 + {TokenChain: 5, TokenAddress: "000000000000000000000000aaa5b9e6c589642f98a1cda99b9d024b8407285a", Symbol: "TITAN", CoingeckoID: "iron-titanium-token", Decimals: 18}, // Addr: 0xaaa5b9e6c589642f98a1cda99b9d024b8407285a, Notional: 17.453943388524348 + {TokenChain: 5, TokenAddress: "0000000000000000000000000308a3a9c433256ad7ef24dbef9c49c8cb01300a", Symbol: "GPO", CoingeckoID: "goldpesa-option", Decimals: 18}, // Addr: 0x0308a3a9c433256ad7ef24dbef9c49c8cb01300a, Notional: 21.220008 + {TokenChain: 5, TokenAddress: "000000000000000000000000723b17718289a91af252d616de2c77944962d122", Symbol: "GAIA", CoingeckoID: "gaia-everworld", Decimals: 18}, // Addr: 0x723b17718289a91af252d616de2c77944962d122, Notional: 0.0289677168748512 + {TokenChain: 5, TokenAddress: "00000000000000000000000030ea765d4dda26e0f89e1b23a7c7b2526b7d29ec", Symbol: "POLYPAD", CoingeckoID: "polypad", Decimals: 18}, // Addr: 0x30ea765d4dda26e0f89e1b23a7c7b2526b7d29ec, Notional: 295.81599092943173 + {TokenChain: 5, TokenAddress: "0000000000000000000000008f006d1e1d9dc6c98996f50a4c810f17a47fbf19", Symbol: "NSFW", CoingeckoID: "pleasure-coin", Decimals: 18}, // Addr: 0x8f006d1e1d9dc6c98996f50a4c810f17a47fbf19, Notional: 18559.532718794762 + {TokenChain: 5, TokenAddress: "0000000000000000000000009cb74c8032b007466865f060ad2c46145d45553d", Symbol: "IDEX", CoingeckoID: "aurora-dao", Decimals: 18}, // Addr: 0x9cb74c8032b007466865f060ad2c46145d45553d, Notional: 0.28055196366470003 + {TokenChain: 5, TokenAddress: "0000000000000000000000001a13f4ca1d028320a707d99520abfefca3998b7f", Symbol: "amUSDC", CoingeckoID: "aave-polygon-usdc", Decimals: 6}, // Addr: 0x1a13f4ca1d028320a707d99520abfefca3998b7f, Notional: 19.196107719167998 + {TokenChain: 5, TokenAddress: "00000000000000000000000034c1b299a74588d6abdc1b85a53345a48428a521", Symbol: "EZ", CoingeckoID: "easyfi", Decimals: 18}, // Addr: 0x34c1b299a74588d6abdc1b85a53345a48428a521, Notional: 0.14395544 + {TokenChain: 5, TokenAddress: "00000000000000000000000050b728d8d964fd00c2d0aad81718b71311fef68a", Symbol: "SNX", CoingeckoID: "havven", Decimals: 18}, // Addr: 0x50b728d8d964fd00c2d0aad81718b71311fef68a, Notional: 2.18 + {TokenChain: 5, TokenAddress: "0000000000000000000000002ab0e9e4ee70fff1fb9d67031e44f6410170d00e", Symbol: "mXEN", CoingeckoID: "xen-crypto-matic", Decimals: 18}, // Addr: 0x2ab0e9e4ee70fff1fb9d67031e44f6410170d00e, Notional: 193.93083233292884 + {TokenChain: 5, TokenAddress: "0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270", Symbol: "WMATIC", CoingeckoID: "wmatic", Decimals: 18}, // Addr: 0x0d500b1d8e8ef31e21c99d1db9a6444d3adf1270, Notional: 506077.6607025054 + {TokenChain: 5, TokenAddress: "000000000000000000000000d8ca34fd379d9ca3c6ee3b3905678320f5b45195", Symbol: "gOHM", CoingeckoID: "governance-ohm", Decimals: 18}, // Addr: 0xd8ca34fd379d9ca3c6ee3b3905678320f5b45195, Notional: 23.2099283973 + {TokenChain: 5, TokenAddress: "000000000000000000000000444444444444c1a66f394025ac839a535246fcc8", Symbol: "GENI", CoingeckoID: "genius", Decimals: 9}, // Addr: 0x444444444444c1a66f394025ac839a535246fcc8, Notional: 9.664578310267578 + {TokenChain: 5, TokenAddress: "000000000000000000000000a649325aa7c5093d12d6f98eb4378deae68ce23f", Symbol: "BNB", CoingeckoID: "wbnb", Decimals: 18}, // Addr: 0xa649325aa7c5093d12d6f98eb4378deae68ce23f, Notional: 814.4283250656999 + {TokenChain: 5, TokenAddress: "000000000000000000000000596ebe76e2db4470966ea395b0d063ac6197a8c5", Symbol: "JRT", CoingeckoID: "jarvis-reward-token", Decimals: 18}, // Addr: 0x596ebe76e2db4470966ea395b0d063ac6197a8c5, Notional: 635.448 + {TokenChain: 5, TokenAddress: "000000000000000000000000f28164a485b0b2c90639e47b0f377b4a438a16b1", Symbol: "dQUICK", CoingeckoID: "dragons-quick", Decimals: 18}, // Addr: 0xf28164a485b0b2c90639e47b0f377b4a438a16b1, Notional: 0.00017094843680000004 + {TokenChain: 5, TokenAddress: "000000000000000000000000d838290e877e0188a4a44700463419ed96c16107", Symbol: "NCT", CoingeckoID: "toucan-protocol-base-carbon-tonne", Decimals: 18}, // Addr: 0xd838290e877e0188a4a44700463419ed96c16107, Notional: 10.911645 + {TokenChain: 5, TokenAddress: "000000000000000000000000229b1b6c23ff8953d663c4cbb519717e323a0a84", Symbol: "BLOK", CoingeckoID: "bloktopia", Decimals: 18}, // Addr: 0x229b1b6c23ff8953d663c4cbb519717e323a0a84, Notional: 0.1198436328956096 + {TokenChain: 5, TokenAddress: "0000000000000000000000008eef5a82e6aa222a60f009ac18c24ee12dbf4b41", Symbol: "TXL", CoingeckoID: "autobahn-network", Decimals: 18}, // Addr: 0x8eef5a82e6aa222a60f009ac18c24ee12dbf4b41, Notional: 0.0000090905 + {TokenChain: 5, TokenAddress: "000000000000000000000000a7051c5a22d963b81d71c2ba64d46a877fbc1821", Symbol: "EROWAN", CoingeckoID: "sifchain", Decimals: 18}, // Addr: 0xa7051c5a22d963b81d71c2ba64d46a877fbc1821, Notional: 0.0032797970192942998 + {TokenChain: 5, TokenAddress: "000000000000000000000000edcfb6984a3c70501baa8b7f5421ae795ecc1496", Symbol: "META", CoingeckoID: "abcmeta", Decimals: 8}, // Addr: 0xedcfb6984a3c70501baa8b7f5421ae795ecc1496, Notional: 0.20939765 + {TokenChain: 5, TokenAddress: "00000000000000000000000018ec0a6e18e5bc3784fdd3a3634b31245ab704f6", Symbol: "EURe", CoingeckoID: "monerium-eur-money", Decimals: 18}, // Addr: 0x18ec0a6e18e5bc3784fdd3a3634b31245ab704f6, Notional: 0.318 + {TokenChain: 5, TokenAddress: "0000000000000000000000007ceb23fd6bc0add59e62ac25578270cff1b9f619", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x7ceb23fd6bc0add59e62ac25578270cff1b9f619, Notional: 107905.31934931979 + {TokenChain: 5, TokenAddress: "000000000000000000000000411bc96881a62572ff33c9d8ce60df99e3d96cd8", Symbol: "MRST", CoingeckoID: "the-mars", Decimals: 18}, // Addr: 0x411bc96881a62572ff33c9d8ce60df99e3d96cd8, Notional: 0.59650244 + {TokenChain: 5, TokenAddress: "000000000000000000000000930a7dc10ae084fbbddc6537d7df7d4c65a40944", Symbol: "UNLOCK", CoingeckoID: "unlock", Decimals: 18}, // Addr: 0x930a7dc10ae084fbbddc6537d7df7d4c65a40944, Notional: 8.237735 + {TokenChain: 5, TokenAddress: "00000000000000000000000008e175a1eac9744a0f1ccaeb8f669af6a2bda3ce", Symbol: "E8", CoingeckoID: "energy8", Decimals: 9}, // Addr: 0x08e175a1eac9744a0f1ccaeb8f669af6a2bda3ce, Notional: 17.582327499837625 + {TokenChain: 5, TokenAddress: "000000000000000000000000f21441f9ec4c1fe69cb7cf186eceab31af2b658d", Symbol: "VENT", CoingeckoID: "vent-finance", Decimals: 18}, // Addr: 0xf21441f9ec4c1fe69cb7cf186eceab31af2b658d, Notional: 36.224179 + {TokenChain: 5, TokenAddress: "000000000000000000000000692597b009d13c4049a947cab2239b7d6517875f", Symbol: "UST", CoingeckoID: "wrapped-ust", Decimals: 18}, // Addr: 0x692597b009d13c4049a947cab2239b7d6517875f, Notional: 189.35057948956998 + {TokenChain: 5, TokenAddress: "000000000000000000000000e261d618a959afffd53168cd07d12e37b26761db", Symbol: "DIMO", CoingeckoID: "dimo", Decimals: 18}, // Addr: 0xe261d618a959afffd53168cd07d12e37b26761db, Notional: 2085.5082821425885 + {TokenChain: 5, TokenAddress: "000000000000000000000000e9993763e0b7f7d915a62a5f22a6e151f91d98a8", Symbol: "TORG", CoingeckoID: "torg", Decimals: 18}, // Addr: 0xe9993763e0b7f7d915a62a5f22a6e151f91d98a8, Notional: 0.021413474747088306 + {TokenChain: 5, TokenAddress: "0000000000000000000000004e1581f01046efdd7a1a2cdb0f82cdd7f71f2e59", Symbol: "ICE", CoingeckoID: "ice-token", Decimals: 18}, // Addr: 0x4e1581f01046efdd7a1a2cdb0f82cdd7f71f2e59, Notional: 103.65046292601 + {TokenChain: 5, TokenAddress: "000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0xc2132d05d31c914a87c6611c10748aeb04b58e8f, Notional: 92683.715996 + {TokenChain: 5, TokenAddress: "0000000000000000000000004a81f8796e0c6ad4877a51c86693b0de8093f2ef", Symbol: "ICE", CoingeckoID: "iron-finance", Decimals: 18}, // Addr: 0x4a81f8796e0c6ad4877a51c86693b0de8093f2ef, Notional: 1.5573744 + {TokenChain: 5, TokenAddress: "0000000000000000000000009085b4d52c3e0b8b6f9af6213e85a433c7d76f19", Symbol: "OWL", CoingeckoID: "owldao", Decimals: 18}, // Addr: 0x9085b4d52c3e0b8b6f9af6213e85a433c7d76f19, Notional: 0.9214323616430156 + {TokenChain: 5, TokenAddress: "00000000000000000000000091c5a5488c0decde1eacd8a4f10e0942fb925067", Symbol: "AUDT", CoingeckoID: "auditchain", Decimals: 18}, // Addr: 0x91c5a5488c0decde1eacd8a4f10e0942fb925067, Notional: 75.38000000000001 + {TokenChain: 5, TokenAddress: "0000000000000000000000004c9f66b2806538cf00ef596e09fb05bcb0d17dc8", Symbol: "MNTO", CoingeckoID: "minato", Decimals: 18}, // Addr: 0x4c9f66b2806538cf00ef596e09fb05bcb0d17dc8, Notional: 4.66 + {TokenChain: 5, TokenAddress: "000000000000000000000000ee9801669c6138e84bd50deb500827b776777d28", Symbol: "O3", CoingeckoID: "o3-swap", Decimals: 18}, // Addr: 0xee9801669c6138e84bd50deb500827b776777d28, Notional: 10.917165621459748 + {TokenChain: 5, TokenAddress: "00000000000000000000000004429fbb948bbd09327763214b45e505a5293346", Symbol: "ABR", CoingeckoID: "allbridge", Decimals: 18}, // Addr: 0x04429fbb948bbd09327763214b45e505a5293346, Notional: 30.041576326140543 + {TokenChain: 5, TokenAddress: "000000000000000000000000dc3326e71d45186f113a2f448984ca0e8d201995", Symbol: "XSGD", CoingeckoID: "xsgd", Decimals: 6}, // Addr: 0xdc3326e71d45186f113a2f448984ca0e8d201995, Notional: 1.4578 + {TokenChain: 5, TokenAddress: "000000000000000000000000aa404804ba583c025fa64c9a276a6127ceb355c6", Symbol: "CPR", CoingeckoID: "cipher-2", Decimals: 2}, // Addr: 0xaa404804ba583c025fa64c9a276a6127ceb355c6, Notional: 22307.4674988594 + {TokenChain: 5, TokenAddress: "000000000000000000000000d86b5923f3ad7b585ed81b448170ae026c65ae9a", Symbol: "IRON", CoingeckoID: "iron-stablecoin", Decimals: 18}, // Addr: 0xd86b5923f3ad7b585ed81b448170ae026c65ae9a, Notional: 20.26398959674981 + {TokenChain: 5, TokenAddress: "000000000000000000000000430ef9263e76dae63c84292c3409d61c598e9682", Symbol: "PYR", CoingeckoID: "vulcan-forged", Decimals: 18}, // Addr: 0x430ef9263e76dae63c84292c3409d61c598e9682, Notional: 31.200000000000003 + {TokenChain: 5, TokenAddress: "0000000000000000000000002791bca1f2de4661ed88a30c99a7a9449aa84174", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x2791bca1f2de4661ed88a30c99a7a9449aa84174, Notional: 4194293.3714942257 + {TokenChain: 5, TokenAddress: "000000000000000000000000a5eb60ca85898f8b26e18ff7c7e43623ccba772c", Symbol: "COSMIC", CoingeckoID: "cosmicswap", Decimals: 18}, // Addr: 0xa5eb60ca85898f8b26e18ff7c7e43623ccba772c, Notional: 43.867262991106564 + {TokenChain: 5, TokenAddress: "0000000000000000000000000d6ae2a429df13e44a07cd2969e085e4833f64a0", Symbol: "PBR", CoingeckoID: "polkabridge", Decimals: 18}, // Addr: 0x0d6ae2a429df13e44a07cd2969e085e4833f64a0, Notional: 268.0404149155226 + {TokenChain: 5, TokenAddress: "0000000000000000000000004fb71290ac171e1d144f7221d882becac7196eb5", Symbol: "TRYB", CoingeckoID: "bilira", Decimals: 6}, // Addr: 0x4fb71290ac171e1d144f7221d882becac7196eb5, Notional: 11.13123131435952 + {TokenChain: 5, TokenAddress: "0000000000000000000000006ccf12b480a99c54b23647c995f4525d544a7e72", Symbol: "START", CoingeckoID: "bscstarter", Decimals: 18}, // Addr: 0x6ccf12b480a99c54b23647c995f4525d544a7e72, Notional: 3.86124 + {TokenChain: 5, TokenAddress: "0000000000000000000000008d1566569d5b695d44a9a234540f68d393cdc40d", Symbol: "GAME", CoingeckoID: "gamecredits", Decimals: 18}, // Addr: 0x8d1566569d5b695d44a9a234540f68d393cdc40d, Notional: 0.08181968 + {TokenChain: 5, TokenAddress: "0000000000000000000000009c891326fd8b1a713974f73bb604677e1e63396d", Symbol: "ISLAMI", CoingeckoID: "islamicoin", Decimals: 7}, // Addr: 0x9c891326fd8b1a713974f73bb604677e1e63396d, Notional: 0.48952999999999997 + {TokenChain: 5, TokenAddress: "000000000000000000000000d60deba014459f07bbcc077a5b817f31dafd5229", Symbol: "VATRENI", CoingeckoID: "croatian-ff-fan-token", Decimals: 18}, // Addr: 0xd60deba014459f07bbcc077a5b817f31dafd5229, Notional: 0.248076 + {TokenChain: 5, TokenAddress: "00000000000000000000000045c32fa6df82ead1e2ef74d17b76547eddfaff89", Symbol: "FRAX", CoingeckoID: "frax", Decimals: 18}, // Addr: 0x45c32fa6df82ead1e2ef74d17b76547eddfaff89, Notional: 9.996903353392021 + {TokenChain: 5, TokenAddress: "000000000000000000000000e0bceef36f3a6efdd5eebfacd591423f8549b9d5", Symbol: "FACTR", CoingeckoID: "defactor", Decimals: 18}, // Addr: 0xe0bceef36f3a6efdd5eebfacd591423f8549b9d5, Notional: 1.227239914085698 + {TokenChain: 5, TokenAddress: "00000000000000000000000022e3f02f86bc8ea0d73718a2ae8851854e62adc5", Symbol: "FLAME", CoingeckoID: "firestarter", Decimals: 18}, // Addr: 0x22e3f02f86bc8ea0d73718a2ae8851854e62adc5, Notional: 5583.753868097466 + {TokenChain: 5, TokenAddress: "000000000000000000000000613a489785c95afeb3b404cc41565ccff107b6e0", Symbol: "RADIO", CoingeckoID: "radioshack", Decimals: 18}, // Addr: 0x613a489785c95afeb3b404cc41565ccff107b6e0, Notional: 0.0142380332826764 + {TokenChain: 5, TokenAddress: "000000000000000000000000a1c57f48f0deb89f569dfbe6e2b7f46d33606fd4", Symbol: "MANA", CoingeckoID: "decentraland", Decimals: 18}, // Addr: 0xa1c57f48f0deb89f569dfbe6e2b7f46d33606fd4, Notional: 513.472968690531 + {TokenChain: 5, TokenAddress: "000000000000000000000000e20b9e246db5a0d21bf9209e4858bc9a3ff7a034", Symbol: "wBAN", CoingeckoID: "banano", Decimals: 18}, // Addr: 0xe20b9e246db5a0d21bf9209e4858bc9a3ff7a034, Notional: 40.13650679788967 + {TokenChain: 5, TokenAddress: "000000000000000000000000831753dd7087cac61ab5644b308642cc1c33dc13", Symbol: "QUICK", CoingeckoID: "quick", Decimals: 18}, // Addr: 0x831753dd7087cac61ab5644b308642cc1c33dc13, Notional: 6.882870651499999 + {TokenChain: 5, TokenAddress: "0000000000000000000000009ff62d1fc52a907b6dcba8077c2ddca6e6a9d3e1", Symbol: "FORT", CoingeckoID: "forta", Decimals: 18}, // Addr: 0x9ff62d1fc52a907b6dcba8077c2ddca6e6a9d3e1, Notional: 273.6379589080431 + {TokenChain: 5, TokenAddress: "0000000000000000000000001d734a02ef1e1f5886e66b0673b71af5b53ffa94", Symbol: "SD", CoingeckoID: "stader", Decimals: 18}, // Addr: 0x1d734a02ef1e1f5886e66b0673b71af5b53ffa94, Notional: 86.86088703149932 + {TokenChain: 5, TokenAddress: "0000000000000000000000002ab4f9ac80f33071211729e45cfc346c1f8446d5", Symbol: "CGG", CoingeckoID: "chain-guardians", Decimals: 18}, // Addr: 0x2ab4f9ac80f33071211729e45cfc346c1f8446d5, Notional: 0.01751282 + {TokenChain: 5, TokenAddress: "00000000000000000000000025788a1a171ec66da6502f9975a15b609ff54cf6", Symbol: "POOL", CoingeckoID: "pooltogether", Decimals: 18}, // Addr: 0x25788a1a171ec66da6502f9975a15b609ff54cf6, Notional: 9.378713 {TokenChain: 5, TokenAddress: "000000000000000000000000dab529f40e671a1d4bf91361c21bf9f0c9712ab7", Symbol: "BUSD", CoingeckoID: "binance-usd", Decimals: 18}, // Addr: 0xdab529f40e671a1d4bf91361c21bf9f0c9712ab7, Notional: 345.92296061323 - {TokenChain: 5, TokenAddress: "000000000000000000000000efee2de82343be622dcb4e545f75a3b9f50c272d", Symbol: "TRY", CoingeckoID: "tryhards", Decimals: 18}, // Addr: 0xefee2de82343be622dcb4e545f75a3b9f50c272d, Notional: 3.043720487120465 - {TokenChain: 5, TokenAddress: "00000000000000000000000024834bbec7e39ef42f4a75eaf8e5b6486d3f0e57", Symbol: "LUNA", CoingeckoID: "wrapped-terra", Decimals: 18}, // Addr: 0x24834bbec7e39ef42f4a75eaf8e5b6486d3f0e57, Notional: 27.628794393888327 - {TokenChain: 5, TokenAddress: "000000000000000000000000e0b52e49357fd4daf2c15e02058dce6bc0057db4", Symbol: "agEUR", CoingeckoID: "ageur", Decimals: 18}, // Addr: 0xe0b52e49357fd4daf2c15e02058dce6bc0057db4, Notional: 27.43310181671 - {TokenChain: 5, TokenAddress: "000000000000000000000000a3fa99a148fa48d14ed51d610c367c61876997f1", Symbol: "miMATIC", CoingeckoID: "mimatic", Decimals: 18}, // Addr: 0xa3fa99a148fa48d14ed51d610c367c61876997f1, Notional: 21.594419913303902 - {TokenChain: 5, TokenAddress: "0000000000000000000000000df0f72ee0e5c9b7ca761ecec42754992b2da5bf", Symbol: "ATA", CoingeckoID: "automata", Decimals: 18}, // Addr: 0x0df0f72ee0e5c9b7ca761ecec42754992b2da5bf, Notional: 4050.662152338508 - {TokenChain: 5, TokenAddress: "000000000000000000000000d6df932a45c0f255f85145f286ea0b292b21c90b", Symbol: "AAVE", CoingeckoID: "aave", Decimals: 18}, // Addr: 0xd6df932a45c0f255f85145f286ea0b292b21c90b, Notional: 1.11321 - {TokenChain: 5, TokenAddress: "00000000000000000000000065a05db8322701724c197af82c9cae41195b0aa8", Symbol: "FOX", CoingeckoID: "shapeshift-fox-token", Decimals: 18}, // Addr: 0x65a05db8322701724c197af82c9cae41195b0aa8, Notional: 0.00950911 - {TokenChain: 5, TokenAddress: "000000000000000000000000e0339c80ffde91f3e20494df88d4206d86024cdf", Symbol: "ELON", CoingeckoID: "dogelon-mars", Decimals: 18}, // Addr: 0xe0339c80ffde91f3e20494df88d4206d86024cdf, Notional: 148.2082969294776 - {TokenChain: 5, TokenAddress: "0000000000000000000000003a9a81d576d83ff21f26f325066054540720fc34", Symbol: "DATA", CoingeckoID: "streamr", Decimals: 18}, // Addr: 0x3a9a81d576d83ff21f26f325066054540720fc34, Notional: 0.10185252 - {TokenChain: 5, TokenAddress: "000000000000000000000000bbba073c31bf03b8acf7c28ef0738decf3695683", Symbol: "SAND", CoingeckoID: "the-sandbox", Decimals: 18}, // Addr: 0xbbba073c31bf03b8acf7c28ef0738decf3695683, Notional: 92.4706185598377 - {TokenChain: 5, TokenAddress: "000000000000000000000000fe712251173a2cd5f5be2b46bb528328ea3565e1", Symbol: "MVI", CoingeckoID: "metaverse-index", Decimals: 18}, // Addr: 0xfe712251173a2cd5f5be2b46bb528328ea3565e1, Notional: 249.40724185079998 - {TokenChain: 5, TokenAddress: "00000000000000000000000023d29d30e35c5e8d321e1dc9a8a61bfd846d4c5c", Symbol: "HEX", CoingeckoID: "hex", Decimals: 8}, // Addr: 0x23d29d30e35c5e8d321e1dc9a8a61bfd846d4c5c, Notional: 0.08830546379642698 - {TokenChain: 5, TokenAddress: "0000000000000000000000000b3f868e0be5597d5db7feb59e1cadbb0fdda50a", Symbol: "SUSHI", CoingeckoID: "sushi", Decimals: 18}, // Addr: 0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a, Notional: 267.9663580994114 - {TokenChain: 5, TokenAddress: "000000000000000000000000ee7666aacaefaa6efeef62ea40176d3eb21953b9", Symbol: "MCHC", CoingeckoID: "mch-coin", Decimals: 18}, // Addr: 0xee7666aacaefaa6efeef62ea40176d3eb21953b9, Notional: 34.120528636161 - {TokenChain: 5, TokenAddress: "0000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd6", Symbol: "WBTC", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6, Notional: 10423.366152300001 - {TokenChain: 5, TokenAddress: "00000000000000000000000053e0bca35ec356bd5dddfebbd1fc0fd03fabad39", Symbol: "LINK", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39, Notional: 316.5380768979 - {TokenChain: 5, TokenAddress: "0000000000000000000000009ca6a77c8b38159fd2da9bd25bc3e259c33f5e39", Symbol: "SPORK", CoingeckoID: "sporkdao", Decimals: 18}, // Addr: 0x9ca6a77c8b38159fd2da9bd25bc3e259c33f5e39, Notional: 0.0689752 - {TokenChain: 5, TokenAddress: "000000000000000000000000709a4b6217584188ddb93c82f5d716d969acce1c", Symbol: "HANU", CoingeckoID: "hanu-yokia", Decimals: 12}, // Addr: 0x709a4b6217584188ddb93c82f5d716d969acce1c, Notional: 0.23038304749909436 - {TokenChain: 5, TokenAddress: "0000000000000000000000002c89bbc92bd86f8075d1decc58c7f4e0107f286b", Symbol: "AVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, // Addr: 0x2c89bbc92bd86f8075d1decc58c7f4e0107f286b, Notional: 1142.2511426875 - {TokenChain: 5, TokenAddress: "000000000000000000000000b33eaad8d922b1083446dc23f610c2567fb5180f", Symbol: "UNI", CoingeckoID: "uniswap", Decimals: 18}, // Addr: 0xb33eaad8d922b1083446dc23f610c2567fb5180f, Notional: 0.621372015 - {TokenChain: 5, TokenAddress: "00000000000000000000000042d61d766b85431666b39b89c43011f24451bff6", Symbol: "PSP", CoingeckoID: "paraswap", Decimals: 18}, // Addr: 0x42d61d766b85431666b39b89c43011f24451bff6, Notional: 0.05505778 - {TokenChain: 5, TokenAddress: "0000000000000000000000008f3cf7ad23cd3cadbd9735aff958023239c6a063", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x8f3cf7ad23cd3cadbd9735aff958023239c6a063, Notional: 2034.18859257 - {TokenChain: 5, TokenAddress: "000000000000000000000000431d5dff03120afa4bdf332c61a6e1766ef37bdb", Symbol: "JPYC", CoingeckoID: "jpy-coin", Decimals: 18}, // Addr: 0x431d5dff03120afa4bdf332c61a6e1766ef37bdb, Notional: 0.7029869999999999 - {TokenChain: 5, TokenAddress: "000000000000000000000000750e4c4984a9e0f12978ea6742bc1c5d248f40ed", Symbol: "axlUSDC", CoingeckoID: "axlusdc", Decimals: 6}, // Addr: 0x750e4c4984a9e0f12978ea6742bc1c5d248f40ed, Notional: 76.636260701 - {TokenChain: 5, TokenAddress: "0000000000000000000000006ae7dfc73e0dde2aa99ac063dcf7e8a63265108c", Symbol: "JPYC", CoingeckoID: "jpyc", Decimals: 18}, // Addr: 0x6ae7dfc73e0dde2aa99ac063dcf7e8a63265108c, Notional: 6.469968 - {TokenChain: 5, TokenAddress: "00000000000000000000000052ede6bba83b7b4ba1d738df0df713d6a2036b71", Symbol: "0xMR", CoingeckoID: "0xmonero", Decimals: 18}, // Addr: 0x52ede6bba83b7b4ba1d738df0df713d6a2036b71, Notional: 4.07294959962156 - {TokenChain: 5, TokenAddress: "0000000000000000000000002e1ad108ff1d8c782fcbbb89aad783ac49586756", Symbol: "TUSD", CoingeckoID: "true-usd", Decimals: 18}, // Addr: 0x2e1ad108ff1d8c782fcbbb89aad783ac49586756, Notional: 4.73393678825068 - {TokenChain: 5, TokenAddress: "0000000000000000000000002f25d402829ca4085b8ea4d3bc68bf203f5a9fab", Symbol: "Eagon", CoingeckoID: "eagonswap-token", Decimals: 18}, // Addr: 0x2f25d402829ca4085b8ea4d3bc68bf203f5a9fab, Notional: 0.2322750354001254 - {TokenChain: 5, TokenAddress: "00000000000000000000000049a0400587a7f65072c87c4910449fdcc5c47242", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0x49a0400587a7f65072c87c4910449fdcc5c47242, Notional: 49.4351418 - {TokenChain: 5, TokenAddress: "000000000000000000000000011734f6ed20e8d011d85cf7894814b897420acf", Symbol: "ACRE", CoingeckoID: "arable-protocol", Decimals: 18}, // Addr: 0x011734f6ed20e8d011d85cf7894814b897420acf, Notional: 0.0034849267520771997 - {TokenChain: 5, TokenAddress: "000000000000000000000000c3c7d422809852031b44ab29eec9f1eff2a58756", Symbol: "LDO", CoingeckoID: "lido-dao", Decimals: 18}, // Addr: 0xc3c7d422809852031b44ab29eec9f1eff2a58756, Notional: 18.418400000000002 - {TokenChain: 5, TokenAddress: "0000000000000000000000009c2c5fd7b07e95ee044ddeba0e97a665f142394f", Symbol: "1INCH", CoingeckoID: "1inch", Decimals: 18}, // Addr: 0x9c2c5fd7b07e95ee044ddeba0e97a665f142394f, Notional: 0.3131 - {TokenChain: 5, TokenAddress: "000000000000000000000000adbe0eac80f955363f4ff47b0f70189093908c04", Symbol: "XMT", CoingeckoID: "metalswap", Decimals: 18}, // Addr: 0xadbe0eac80f955363f4ff47b0f70189093908c04, Notional: 12.5098766 - {TokenChain: 5, TokenAddress: "000000000000000000000000ee327f889d5947c1dc1934bb208a1e792f953e96", Symbol: "frxETH", CoingeckoID: "frax-ether", Decimals: 18}, // Addr: 0xee327f889d5947c1dc1934bb208a1e792f953e96, Notional: 116.23461626839999 - {TokenChain: 5, TokenAddress: "0000000000000000000000008f36cc333f55b09bb71091409a3d7ade399e3b1c", Symbol: "CHER", CoingeckoID: "cherry-network", Decimals: 18}, // Addr: 0x8f36cc333f55b09bb71091409a3d7ade399e3b1c, Notional: 0.08056479999999999 - {TokenChain: 6, TokenAddress: "0000000000000000000000005085434227ab73151fad2de546210cbc8663df96", Symbol: "DBY", CoingeckoID: "metaderby", Decimals: 18}, // Addr: 0x5085434227ab73151fad2de546210cbc8663df96, Notional: 15228.59483964 - {TokenChain: 6, TokenAddress: "00000000000000000000000068ee0d0aad9e1984af85ca224117e4d20eaf68be", Symbol: "ROY", CoingeckoID: "crypto-royale", Decimals: 18}, // Addr: 0x68ee0d0aad9e1984af85ca224117e4d20eaf68be, Notional: 0.13895841 - {TokenChain: 6, TokenAddress: "0000000000000000000000003eefb18003d033661f84e48360ebecd181a84709", Symbol: "ISA", CoingeckoID: "islander", Decimals: 18}, // Addr: 0x3eefb18003d033661f84e48360ebecd181a84709, Notional: 0.23145456 - {TokenChain: 6, TokenAddress: "000000000000000000000000c0c5aa69dbe4d6dddfbc89c0957686ec60f24389", Symbol: "aXEN", CoingeckoID: "xen-crypto", Decimals: 18}, // Addr: 0xc0c5aa69dbe4d6dddfbc89c0957686ec60f24389, Notional: 33.92955882373625 - {TokenChain: 6, TokenAddress: "000000000000000000000000564a341df6c126f90cf3ecb92120fd7190acb401", Symbol: "TRYB", CoingeckoID: "bilira", Decimals: 6}, // Addr: 0x564a341df6c126f90cf3ecb92120fd7190acb401, Notional: 0.03615718 - {TokenChain: 6, TokenAddress: "000000000000000000000000264c1383ea520f73dd837f915ef3a732e204a493", Symbol: "BNB", CoingeckoID: "wbnb", Decimals: 18}, // Addr: 0x264c1383ea520f73dd837f915ef3a732e204a493, Notional: 1220.5541887056 - {TokenChain: 6, TokenAddress: "000000000000000000000000961c8c0b1aad0c0b10a51fef6a867e3091bcef17", Symbol: "DYP", CoingeckoID: "defi-yield-protocol", Decimals: 18}, // Addr: 0x961c8c0b1aad0c0b10a51fef6a867e3091bcef17, Notional: 882.7145973831499 - {TokenChain: 6, TokenAddress: "000000000000000000000000bbaaa0420d474b34be197f95a323c2ff3829e811", Symbol: "LODE", CoingeckoID: "lode-token", Decimals: 18}, // Addr: 0xbbaaa0420d474b34be197f95a323c2ff3829e811, Notional: 0.1274 - {TokenChain: 6, TokenAddress: "000000000000000000000000ce1bffbd5374dac86a2893119683f4911a2f7814", Symbol: "SPELL", CoingeckoID: "spell-token", Decimals: 18}, // Addr: 0xce1bffbd5374dac86a2893119683f4911a2f7814, Notional: 0.46726999999999996 - {TokenChain: 6, TokenAddress: "0000000000000000000000000da67235dd5787d67955420c84ca1cecd4e5bb3b", Symbol: "wMEMO", CoingeckoID: "wrapped-memory", Decimals: 18}, // Addr: 0x0da67235dd5787d67955420c84ca1cecd4e5bb3b, Notional: 99.93997249 - {TokenChain: 6, TokenAddress: "000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70", Symbol: "DAI.e", CoingeckoID: "dai", Decimals: 18}, // Addr: 0xd586e7f844cea2f87f50152665bcbc2c279d8d70, Notional: 773.17756534 - {TokenChain: 6, TokenAddress: "000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0x130966628846bfd36ff31a822705796e8cb8c18d, Notional: 111.93730789895609 - {TokenChain: 6, TokenAddress: "000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664", Symbol: "USDC.e", CoingeckoID: "usd-coin-avalanche-bridged-usdc-e", Decimals: 6}, // Addr: 0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664, Notional: 27999.48889750485 - {TokenChain: 6, TokenAddress: "000000000000000000000000491a4eb4f1fc3bff8e1d2fc856a6a46663ad556f", Symbol: "BRZ", CoingeckoID: "brz", Decimals: 4}, // Addr: 0x491a4eb4f1fc3bff8e1d2fc856a6a46663ad556f, Notional: 0.210776 - {TokenChain: 6, TokenAddress: "00000000000000000000000063682bdc5f875e9bf69e201550658492c9763f89", Symbol: "BSGG", CoingeckoID: "betswap-gg", Decimals: 18}, // Addr: 0x63682bdc5f875e9bf69e201550658492c9763f89, Notional: 1.2765992664144408 - {TokenChain: 6, TokenAddress: "000000000000000000000000431d5dff03120afa4bdf332c61a6e1766ef37bdb", Symbol: "JPYC", CoingeckoID: "jpy-coin", Decimals: 18}, // Addr: 0x431d5dff03120afa4bdf332c61a6e1766ef37bdb, Notional: 2.421150510467948 - {TokenChain: 6, TokenAddress: "00000000000000000000000049d5c2bdffac6ce2bfdb6640f4f80f226bc10bab", Symbol: "WETH.e", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab, Notional: 5294.1842915711995 - {TokenChain: 6, TokenAddress: "000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e, Notional: 72355.529287041 - {TokenChain: 6, TokenAddress: "0000000000000000000000005947bb275c521040051d82396192181b413227a3", Symbol: "LINK.e", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0x5947bb275c521040051d82396192181b413227a3, Notional: 0.7410000000000001 - {TokenChain: 6, TokenAddress: "000000000000000000000000321e7092a180bb43555132ec53aaa65a5bf84251", Symbol: "gOHM", CoingeckoID: "governance-ohm", Decimals: 18}, // Addr: 0x321e7092a180bb43555132ec53aaa65a5bf84251, Notional: 12.633162948 - {TokenChain: 6, TokenAddress: "000000000000000000000000027dbca046ca156de9622cd1e2d907d375e53aa7", Symbol: "AMPL", CoingeckoID: "ampleforth", Decimals: 9}, // Addr: 0x027dbca046ca156de9622cd1e2d907d375e53aa7, Notional: 0.6839999999999999 - {TokenChain: 6, TokenAddress: "000000000000000000000000152b9d0fdc40c096757f570a51e494bd4b943e50", Symbol: "BTC.b", CoingeckoID: "bitcoin-avalanche-bridged-btc-b", Decimals: 8}, // Addr: 0x152b9d0fdc40c096757f570a51e494bd4b943e50, Notional: 213.32127864 - {TokenChain: 6, TokenAddress: "0000000000000000000000004bfc90322dd638f81f034517359bd447f8e0235a", Symbol: "NEWO", CoingeckoID: "new-order", Decimals: 18}, // Addr: 0x4bfc90322dd638f81f034517359bd447f8e0235a, Notional: 6390.603518264519 - {TokenChain: 6, TokenAddress: "000000000000000000000000ed2b42d3c9c6e97e11755bb37df29b6375ede3eb", Symbol: "HON", CoingeckoID: "heroes-of-nft", Decimals: 18}, // Addr: 0xed2b42d3c9c6e97e11755bb37df29b6375ede3eb, Notional: 9.994817961053627 - {TokenChain: 6, TokenAddress: "00000000000000000000000098443b96ea4b0858fdf3219cd13e98c7a4690588", Symbol: "BAT.e", CoingeckoID: "basic-attention-token", Decimals: 18}, // Addr: 0x98443b96ea4b0858fdf3219cd13e98c7a4690588, Notional: 9.9140196443607 - {TokenChain: 6, TokenAddress: "000000000000000000000000444444444444c1a66f394025ac839a535246fcc8", Symbol: "GENI", CoingeckoID: "genius", Decimals: 9}, // Addr: 0x444444444444c1a66f394025ac839a535246fcc8, Notional: 5.46054380330596 - {TokenChain: 6, TokenAddress: "0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7", Symbol: "USDt", CoingeckoID: "tether", Decimals: 6}, // Addr: 0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7, Notional: 25432.942391880366 - {TokenChain: 6, TokenAddress: "000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7", Symbol: "WAVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, // Addr: 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7, Notional: 720715.9339860076 - {TokenChain: 6, TokenAddress: "00000000000000000000000063a72806098bd3d9520cc43356dd78afe5d386d9", Symbol: "AAVE.e", CoingeckoID: "aave", Decimals: 18}, // Addr: 0x63a72806098bd3d9520cc43356dd78afe5d386d9, Notional: 0.612535014 - {TokenChain: 6, TokenAddress: "000000000000000000000000820802fa8a99901f52e39acd21177b0be6ee2974", Symbol: "EUROe", CoingeckoID: "euroe-stablecoin", Decimals: 6}, // Addr: 0x820802fa8a99901f52e39acd21177b0be6ee2974, Notional: 1.422053402 - {TokenChain: 6, TokenAddress: "0000000000000000000000002b2c81e08f1af8835a78bb2a90ae924ace0ea4be", Symbol: "sAVAX", CoingeckoID: "benqi-liquid-staked-avax", Decimals: 18}, // Addr: 0x2b2c81e08f1af8835a78bb2a90ae924ace0ea4be, Notional: 361000.0317547152 - {TokenChain: 6, TokenAddress: "000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118", Symbol: "USDT.e", CoingeckoID: "tether-avalanche-bridged-usdt-e", Decimals: 6}, // Addr: 0xc7198437980c041c805a1edcba50c1ce5db95118, Notional: 6031.169467513684 - {TokenChain: 6, TokenAddress: "000000000000000000000000fab550568c688d5d8a52c7d794cb93edc26ec0ec", Symbol: "axlUSDC", CoingeckoID: "axlusdc", Decimals: 6}, // Addr: 0xfab550568c688d5d8a52c7d794cb93edc26ec0ec, Notional: 0.6005999999999999 - {TokenChain: 6, TokenAddress: "00000000000000000000000050b7545627a5162f82a992c33b87adc75187b218", Symbol: "WBTC.e", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x50b7545627a5162f82a992c33b87adc75187b218, Notional: 768.08862715 - {TokenChain: 7, TokenAddress: "00000000000000000000000021c718c22d52d0f3a789b752d4c2fd5908a8a733", Symbol: "wROSE", CoingeckoID: "oasis-network", Decimals: 18}, // Addr: 0x21c718c22d52d0f3a789b752d4c2fd5908a8a733, Notional: 30541.06845305769 - {TokenChain: 9, TokenAddress: "0000000000000000000000005ce9f0b6afb36135b5ddbf11705ceb65e634a9dc", Symbol: "atUST", CoingeckoID: "wrapped-ust", Decimals: 18}, // Addr: 0x5ce9f0b6afb36135b5ddbf11705ceb65e634a9dc, Notional: 0.015414282746742601 - {TokenChain: 9, TokenAddress: "0000000000000000000000004988a896b1227218e4a686fde5eabdcabd91571f", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0x4988a896b1227218e4a686fde5eabdcabd91571f, Notional: 507.15323001240597 + {TokenChain: 5, TokenAddress: "000000000000000000000000efee2de82343be622dcb4e545f75a3b9f50c272d", Symbol: "TRY", CoingeckoID: "tryhards", Decimals: 18}, // Addr: 0xefee2de82343be622dcb4e545f75a3b9f50c272d, Notional: 2.5724705489475035 + {TokenChain: 5, TokenAddress: "00000000000000000000000024834bbec7e39ef42f4a75eaf8e5b6486d3f0e57", Symbol: "LUNA", CoingeckoID: "wrapped-terra", Decimals: 18}, // Addr: 0x24834bbec7e39ef42f4a75eaf8e5b6486d3f0e57, Notional: 20.020713137022327 + {TokenChain: 5, TokenAddress: "000000000000000000000000e0b52e49357fd4daf2c15e02058dce6bc0057db4", Symbol: "agEUR", CoingeckoID: "ageur", Decimals: 18}, // Addr: 0xe0b52e49357fd4daf2c15e02058dce6bc0057db4, Notional: 26.532835941229997 + {TokenChain: 5, TokenAddress: "000000000000000000000000a3fa99a148fa48d14ed51d610c367c61876997f1", Symbol: "miMATIC", CoingeckoID: "mimatic", Decimals: 18}, // Addr: 0xa3fa99a148fa48d14ed51d610c367c61876997f1, Notional: 17.0107673148972 + {TokenChain: 5, TokenAddress: "0000000000000000000000005d47baba0d66083c52009271faf3f50dcc01023c", Symbol: "BANANA", CoingeckoID: "apeswap-finance", Decimals: 18}, // Addr: 0x5d47baba0d66083c52009271faf3f50dcc01023c, Notional: 0.20057952 + {TokenChain: 5, TokenAddress: "0000000000000000000000000df0f72ee0e5c9b7ca761ecec42754992b2da5bf", Symbol: "ATA", CoingeckoID: "automata", Decimals: 18}, // Addr: 0x0df0f72ee0e5c9b7ca761ecec42754992b2da5bf, Notional: 3872.923510328885 + {TokenChain: 5, TokenAddress: "000000000000000000000000d6df932a45c0f255f85145f286ea0b292b21c90b", Symbol: "AAVE", CoingeckoID: "aave", Decimals: 18}, // Addr: 0xd6df932a45c0f255f85145f286ea0b292b21c90b, Notional: 439.555750983 + {TokenChain: 5, TokenAddress: "00000000000000000000000065a05db8322701724c197af82c9cae41195b0aa8", Symbol: "FOX", CoingeckoID: "shapeshift-fox-token", Decimals: 18}, // Addr: 0x65a05db8322701724c197af82c9cae41195b0aa8, Notional: 0.010359155 + {TokenChain: 5, TokenAddress: "000000000000000000000000e0339c80ffde91f3e20494df88d4206d86024cdf", Symbol: "ELON", CoingeckoID: "dogelon-mars", Decimals: 18}, // Addr: 0xe0339c80ffde91f3e20494df88d4206d86024cdf, Notional: 211.7004808498271 + {TokenChain: 5, TokenAddress: "0000000000000000000000003a9a81d576d83ff21f26f325066054540720fc34", Symbol: "DATA", CoingeckoID: "streamr", Decimals: 18}, // Addr: 0x3a9a81d576d83ff21f26f325066054540720fc34, Notional: 0.09995324 + {TokenChain: 5, TokenAddress: "000000000000000000000000bbba073c31bf03b8acf7c28ef0738decf3695683", Symbol: "SAND", CoingeckoID: "the-sandbox", Decimals: 18}, // Addr: 0xbbba073c31bf03b8acf7c28ef0738decf3695683, Notional: 69.21857102206431 + {TokenChain: 5, TokenAddress: "000000000000000000000000fe712251173a2cd5f5be2b46bb528328ea3565e1", Symbol: "MVI", CoingeckoID: "metaverse-index", Decimals: 18}, // Addr: 0xfe712251173a2cd5f5be2b46bb528328ea3565e1, Notional: 200.1098049285 + {TokenChain: 5, TokenAddress: "00000000000000000000000023d29d30e35c5e8d321e1dc9a8a61bfd846d4c5c", Symbol: "HEX", CoingeckoID: "hex", Decimals: 8}, // Addr: 0x23d29d30e35c5e8d321e1dc9a8a61bfd846d4c5c, Notional: 0.48206363193444807 + {TokenChain: 5, TokenAddress: "0000000000000000000000000b3f868e0be5597d5db7feb59e1cadbb0fdda50a", Symbol: "SUSHI", CoingeckoID: "sushi", Decimals: 18}, // Addr: 0x0b3f868e0be5597d5db7feb59e1cadbb0fdda50a, Notional: 217.5908321728024 + {TokenChain: 5, TokenAddress: "000000000000000000000000ee7666aacaefaa6efeef62ea40176d3eb21953b9", Symbol: "MCHC", CoingeckoID: "mch-coin", Decimals: 18}, // Addr: 0xee7666aacaefaa6efeef62ea40176d3eb21953b9, Notional: 31.177097036578353 + {TokenChain: 5, TokenAddress: "0000000000000000000000001bfd67037b42cf73acf2047067bd4f2c47d9bfd6", Symbol: "WBTC", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x1bfd67037b42cf73acf2047067bd4f2c47d9bfd6, Notional: 11304.3572487 + {TokenChain: 5, TokenAddress: "0000000000000000000000009c9e5fd8bbc25984b178fdce6117defa39d2db39", Symbol: "BUSD", CoingeckoID: "binance-peg-busd", Decimals: 18}, // Addr: 0x9c9e5fd8bbc25984b178fdce6117defa39d2db39, Notional: 0.998694 + {TokenChain: 5, TokenAddress: "00000000000000000000000053e0bca35ec356bd5dddfebbd1fc0fd03fabad39", Symbol: "LINK", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0x53e0bca35ec356bd5dddfebbd1fc0fd03fabad39, Notional: 437.6140687919 + {TokenChain: 5, TokenAddress: "0000000000000000000000009ca6a77c8b38159fd2da9bd25bc3e259c33f5e39", Symbol: "SPORK", CoingeckoID: "sporkdao", Decimals: 18}, // Addr: 0x9ca6a77c8b38159fd2da9bd25bc3e259c33f5e39, Notional: 0.07899400000000001 + {TokenChain: 5, TokenAddress: "000000000000000000000000709a4b6217584188ddb93c82f5d716d969acce1c", Symbol: "HANU", CoingeckoID: "hanu-yokia", Decimals: 12}, // Addr: 0x709a4b6217584188ddb93c82f5d716d969acce1c, Notional: 0.48772275655570063 + {TokenChain: 5, TokenAddress: "0000000000000000000000002c89bbc92bd86f8075d1decc58c7f4e0107f286b", Symbol: "AVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, // Addr: 0x2c89bbc92bd86f8075d1decc58c7f4e0107f286b, Notional: 916.8036547145999 + {TokenChain: 5, TokenAddress: "000000000000000000000000b33eaad8d922b1083446dc23f610c2567fb5180f", Symbol: "UNI", CoingeckoID: "uniswap", Decimals: 18}, // Addr: 0xb33eaad8d922b1083446dc23f610c2567fb5180f, Notional: 0.429403425 + {TokenChain: 5, TokenAddress: "000000000000000000000000c3ec80343d2bae2f8e680fdadde7c17e71e114ea", Symbol: "OM", CoingeckoID: "mantra-dao", Decimals: 18}, // Addr: 0xc3ec80343d2bae2f8e680fdadde7c17e71e114ea, Notional: 1.29325758121998 + {TokenChain: 5, TokenAddress: "00000000000000000000000042d61d766b85431666b39b89c43011f24451bff6", Symbol: "PSP", CoingeckoID: "paraswap", Decimals: 18}, // Addr: 0x42d61d766b85431666b39b89c43011f24451bff6, Notional: 0.04749286 + {TokenChain: 5, TokenAddress: "000000000000000000000000d3b71117e6c1558c1553305b44988cd944e97300", Symbol: "YEL", CoingeckoID: "yel-finance", Decimals: 18}, // Addr: 0xd3b71117e6c1558c1553305b44988cd944e97300, Notional: 1.09334 + {TokenChain: 5, TokenAddress: "0000000000000000000000008f3cf7ad23cd3cadbd9735aff958023239c6a063", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x8f3cf7ad23cd3cadbd9735aff958023239c6a063, Notional: 2160.5296167961615 + {TokenChain: 5, TokenAddress: "000000000000000000000000431d5dff03120afa4bdf332c61a6e1766ef37bdb", Symbol: "JPYC", CoingeckoID: "jpy-coin", Decimals: 18}, // Addr: 0x431d5dff03120afa4bdf332c61a6e1766ef37bdb, Notional: 0.659831 + {TokenChain: 5, TokenAddress: "000000000000000000000000750e4c4984a9e0f12978ea6742bc1c5d248f40ed", Symbol: "axlUSDC", CoingeckoID: "axlusdc", Decimals: 6}, // Addr: 0x750e4c4984a9e0f12978ea6742bc1c5d248f40ed, Notional: 76.789380103 + {TokenChain: 5, TokenAddress: "0000000000000000000000006ae7dfc73e0dde2aa99ac063dcf7e8a63265108c", Symbol: "JPYC", CoingeckoID: "jpyc", Decimals: 18}, // Addr: 0x6ae7dfc73e0dde2aa99ac063dcf7e8a63265108c, Notional: 7.358903999999999 + {TokenChain: 5, TokenAddress: "00000000000000000000000052ede6bba83b7b4ba1d738df0df713d6a2036b71", Symbol: "0xMR", CoingeckoID: "0xmonero", Decimals: 18}, // Addr: 0x52ede6bba83b7b4ba1d738df0df713d6a2036b71, Notional: 6.32873104331662 + {TokenChain: 5, TokenAddress: "0000000000000000000000002e1ad108ff1d8c782fcbbb89aad783ac49586756", Symbol: "TUSD", CoingeckoID: "true-usd", Decimals: 18}, // Addr: 0x2e1ad108ff1d8c782fcbbb89aad783ac49586756, Notional: 4.73394152364597 + {TokenChain: 5, TokenAddress: "0000000000000000000000002f25d402829ca4085b8ea4d3bc68bf203f5a9fab", Symbol: "Eagon", CoingeckoID: "eagonswap-token", Decimals: 18}, // Addr: 0x2f25d402829ca4085b8ea4d3bc68bf203f5a9fab, Notional: 0.2292722185179519 + {TokenChain: 5, TokenAddress: "00000000000000000000000049a0400587a7f65072c87c4910449fdcc5c47242", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0x49a0400587a7f65072c87c4910449fdcc5c47242, Notional: 50.4006 + {TokenChain: 5, TokenAddress: "000000000000000000000000011734f6ed20e8d011d85cf7894814b897420acf", Symbol: "ACRE", CoingeckoID: "arable-protocol", Decimals: 18}, // Addr: 0x011734f6ed20e8d011d85cf7894814b897420acf, Notional: 0.0021143006111508 + {TokenChain: 5, TokenAddress: "000000000000000000000000c3c7d422809852031b44ab29eec9f1eff2a58756", Symbol: "LDO", CoingeckoID: "lido-dao", Decimals: 18}, // Addr: 0xc3c7d422809852031b44ab29eec9f1eff2a58756, Notional: 17.9179 + {TokenChain: 5, TokenAddress: "000000000000000000000000590eb2920486486c2d9bb3eb651f73b81df87bcf", Symbol: "BOBC", CoingeckoID: "bobcoin", Decimals: 18}, // Addr: 0x590eb2920486486c2d9bb3eb651f73b81df87bcf, Notional: 0.319808 + {TokenChain: 5, TokenAddress: "0000000000000000000000009c2c5fd7b07e95ee044ddeba0e97a665f142394f", Symbol: "1INCH", CoingeckoID: "1inch", Decimals: 18}, // Addr: 0x9c2c5fd7b07e95ee044ddeba0e97a665f142394f, Notional: 0.267362 + {TokenChain: 5, TokenAddress: "000000000000000000000000adbe0eac80f955363f4ff47b0f70189093908c04", Symbol: "XMT", CoingeckoID: "metalswap", Decimals: 18}, // Addr: 0xadbe0eac80f955363f4ff47b0f70189093908c04, Notional: 11.053673799999999 + {TokenChain: 5, TokenAddress: "000000000000000000000000ee327f889d5947c1dc1934bb208a1e792f953e96", Symbol: "frxETH", CoingeckoID: "frax-ether", Decimals: 18}, // Addr: 0xee327f889d5947c1dc1934bb208a1e792f953e96, Notional: 106.4488628756 + {TokenChain: 5, TokenAddress: "0000000000000000000000008f36cc333f55b09bb71091409a3d7ade399e3b1c", Symbol: "CHER", CoingeckoID: "cherry-network", Decimals: 18}, // Addr: 0x8f36cc333f55b09bb71091409a3d7ade399e3b1c, Notional: 0.0516491 + {TokenChain: 6, TokenAddress: "0000000000000000000000005085434227ab73151fad2de546210cbc8663df96", Symbol: "DBY", CoingeckoID: "metaderby", Decimals: 18}, // Addr: 0x5085434227ab73151fad2de546210cbc8663df96, Notional: 10109.52777366 + {TokenChain: 6, TokenAddress: "00000000000000000000000068ee0d0aad9e1984af85ca224117e4d20eaf68be", Symbol: "ROY", CoingeckoID: "crypto-royale", Decimals: 18}, // Addr: 0x68ee0d0aad9e1984af85ca224117e4d20eaf68be, Notional: 0.15411288 + {TokenChain: 6, TokenAddress: "00000000000000000000000031c994ac062c1970c086260bc61babb708643fac", Symbol: "XETA", CoingeckoID: "xana", Decimals: 18}, // Addr: 0x31c994ac062c1970c086260bc61babb708643fac, Notional: 0.0656372 + {TokenChain: 6, TokenAddress: "000000000000000000000000c0c5aa69dbe4d6dddfbc89c0957686ec60f24389", Symbol: "aXEN", CoingeckoID: "xen-crypto", Decimals: 18}, // Addr: 0xc0c5aa69dbe4d6dddfbc89c0957686ec60f24389, Notional: 27.02859556051747 + {TokenChain: 6, TokenAddress: "000000000000000000000000564a341df6c126f90cf3ecb92120fd7190acb401", Symbol: "TRYB", CoingeckoID: "bilira", Decimals: 6}, // Addr: 0x564a341df6c126f90cf3ecb92120fd7190acb401, Notional: 0.03545304 + {TokenChain: 6, TokenAddress: "000000000000000000000000264c1383ea520f73dd837f915ef3a732e204a493", Symbol: "BNB", CoingeckoID: "wbnb", Decimals: 18}, // Addr: 0x264c1383ea520f73dd837f915ef3a732e204a493, Notional: 1116.7603881441 + {TokenChain: 6, TokenAddress: "000000000000000000000000961c8c0b1aad0c0b10a51fef6a867e3091bcef17", Symbol: "DYP", CoingeckoID: "defi-yield-protocol", Decimals: 18}, // Addr: 0x961c8c0b1aad0c0b10a51fef6a867e3091bcef17, Notional: 699.7034401844844 + {TokenChain: 6, TokenAddress: "000000000000000000000000130966628846bfd36ff31a822705796e8cb8c18d", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0x130966628846bfd36ff31a822705796e8cb8c18d, Notional: 114.12342060869999 + {TokenChain: 6, TokenAddress: "0000000000000000000000006e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd", Symbol: "JOE", CoingeckoID: "joe", Decimals: 18}, // Addr: 0x6e84a6216ea6dacc71ee8e6b0a5b7322eebc0fdd, Notional: 1.5150156966350998 + {TokenChain: 6, TokenAddress: "000000000000000000000000321e7092a180bb43555132ec53aaa65a5bf84251", Symbol: "gOHM", CoingeckoID: "governance-ohm", Decimals: 18}, // Addr: 0x321e7092a180bb43555132ec53aaa65a5bf84251, Notional: 14.0655083688 + {TokenChain: 6, TokenAddress: "000000000000000000000000152b9d0fdc40c096757f570a51e494bd4b943e50", Symbol: "BTC.b", CoingeckoID: "bitcoin-avalanche-bridged-btc-b", Decimals: 8}, // Addr: 0x152b9d0fdc40c096757f570a51e494bd4b943e50, Notional: 225.24193732 + {TokenChain: 6, TokenAddress: "0000000000000000000000004bfc90322dd638f81f034517359bd447f8e0235a", Symbol: "NEWO", CoingeckoID: "new-order", Decimals: 18}, // Addr: 0x4bfc90322dd638f81f034517359bd447f8e0235a, Notional: 2161.874173389822 + {TokenChain: 6, TokenAddress: "000000000000000000000000444444444444c1a66f394025ac839a535246fcc8", Symbol: "GENI", CoingeckoID: "genius", Decimals: 9}, // Addr: 0x444444444444c1a66f394025ac839a535246fcc8, Notional: 2.311553731861662 + {TokenChain: 6, TokenAddress: "00000000000000000000000063a72806098bd3d9520cc43356dd78afe5d386d9", Symbol: "AAVE.e", CoingeckoID: "aave", Decimals: 18}, // Addr: 0x63a72806098bd3d9520cc43356dd78afe5d386d9, Notional: 0.7898032116 + {TokenChain: 6, TokenAddress: "000000000000000000000000714f020c54cc9d104b6f4f6998c63ce2a31d1888", Symbol: "FITFI", CoingeckoID: "step-app-fitfi", Decimals: 18}, // Addr: 0x714f020c54cc9d104b6f4f6998c63ce2a31d1888, Notional: 4.3949300000000004e-11 + {TokenChain: 6, TokenAddress: "0000000000000000000000002f6f07cdcf3588944bf4c42ac74ff24bf56e7590", Symbol: "STG", CoingeckoID: "stargate-finance", Decimals: 18}, // Addr: 0x2f6f07cdcf3588944bf4c42ac74ff24bf56e7590, Notional: 0.04629416 + {TokenChain: 6, TokenAddress: "000000000000000000000000fab550568c688d5d8a52c7d794cb93edc26ec0ec", Symbol: "axlUSDC", CoingeckoID: "axlusdc", Decimals: 6}, // Addr: 0xfab550568c688d5d8a52c7d794cb93edc26ec0ec, Notional: 0.6017999999999999 + {TokenChain: 6, TokenAddress: "0000000000000000000000003eefb18003d033661f84e48360ebecd181a84709", Symbol: "ISA", CoingeckoID: "islander", Decimals: 18}, // Addr: 0x3eefb18003d033661f84e48360ebecd181a84709, Notional: 0.18341112 + {TokenChain: 6, TokenAddress: "000000000000000000000000bbaaa0420d474b34be197f95a323c2ff3829e811", Symbol: "LODE", CoingeckoID: "lode-token", Decimals: 18}, // Addr: 0xbbaaa0420d474b34be197f95a323c2ff3829e811, Notional: 0.12950000000000003 + {TokenChain: 6, TokenAddress: "000000000000000000000000ce1bffbd5374dac86a2893119683f4911a2f7814", Symbol: "SPELL", CoingeckoID: "spell-token", Decimals: 18}, // Addr: 0xce1bffbd5374dac86a2893119683f4911a2f7814, Notional: 0.45225000000000004 + {TokenChain: 6, TokenAddress: "000000000000000000000000ec3492a2508ddf4fdc0cd76f31f340b30d1793e6", Symbol: "CLY", CoingeckoID: "colony", Decimals: 18}, // Addr: 0xec3492a2508ddf4fdc0cd76f31f340b30d1793e6, Notional: 0.04605118 + {TokenChain: 6, TokenAddress: "0000000000000000000000000da67235dd5787d67955420c84ca1cecd4e5bb3b", Symbol: "wMEMO", CoingeckoID: "wrapped-memory", Decimals: 18}, // Addr: 0x0da67235dd5787d67955420c84ca1cecd4e5bb3b, Notional: 101.98881963000001 + {TokenChain: 6, TokenAddress: "000000000000000000000000d586e7f844cea2f87f50152665bcbc2c279d8d70", Symbol: "DAI.e", CoingeckoID: "dai", Decimals: 18}, // Addr: 0xd586e7f844cea2f87f50152665bcbc2c279d8d70, Notional: 772.7237101091454 + {TokenChain: 6, TokenAddress: "000000000000000000000000a7d7079b0fead91f3e65f86e8915cb59c1a4c664", Symbol: "USDC.e", CoingeckoID: "usd-coin-avalanche-bridged-usdc-e", Decimals: 6}, // Addr: 0xa7d7079b0fead91f3e65f86e8915cb59c1a4c664, Notional: 27088.848858 + {TokenChain: 6, TokenAddress: "00000000000000000000000020cf1b6e9d856321ed4686877cf4538f2c84b4de", Symbol: "ANKR", CoingeckoID: "ankr", Decimals: 18}, // Addr: 0x20cf1b6e9d856321ed4686877cf4538f2c84b4de, Notional: 2.117014 + {TokenChain: 6, TokenAddress: "000000000000000000000000491a4eb4f1fc3bff8e1d2fc856a6a46663ad556f", Symbol: "BRZ", CoingeckoID: "brz", Decimals: 4}, // Addr: 0x491a4eb4f1fc3bff8e1d2fc856a6a46663ad556f, Notional: 0.203062 + {TokenChain: 6, TokenAddress: "00000000000000000000000063682bdc5f875e9bf69e201550658492c9763f89", Symbol: "BSGG", CoingeckoID: "betswap-gg", Decimals: 18}, // Addr: 0x63682bdc5f875e9bf69e201550658492c9763f89, Notional: 1.4226351923032188 + {TokenChain: 6, TokenAddress: "000000000000000000000000431d5dff03120afa4bdf332c61a6e1766ef37bdb", Symbol: "JPYC", CoingeckoID: "jpy-coin", Decimals: 18}, // Addr: 0x431d5dff03120afa4bdf332c61a6e1766ef37bdb, Notional: 2.272517361590721 + {TokenChain: 6, TokenAddress: "00000000000000000000000049d5c2bdffac6ce2bfdb6640f4f80f226bc10bab", Symbol: "WETH.e", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x49d5c2bdffac6ce2bfdb6640f4f80f226bc10bab, Notional: 4901.2184627145 + {TokenChain: 6, TokenAddress: "000000000000000000000000b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e, Notional: 73511.88089745499 + {TokenChain: 6, TokenAddress: "0000000000000000000000005947bb275c521040051d82396192181b413227a3", Symbol: "LINK.e", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0x5947bb275c521040051d82396192181b413227a3, Notional: 1.0010000000000001 + {TokenChain: 6, TokenAddress: "000000000000000000000000027dbca046ca156de9622cd1e2d907d375e53aa7", Symbol: "AMPL", CoingeckoID: "ampleforth", Decimals: 9}, // Addr: 0x027dbca046ca156de9622cd1e2d907d375e53aa7, Notional: 0.75 + {TokenChain: 6, TokenAddress: "000000000000000000000000ed2b42d3c9c6e97e11755bb37df29b6375ede3eb", Symbol: "HON", CoingeckoID: "heroes-of-nft", Decimals: 18}, // Addr: 0xed2b42d3c9c6e97e11755bb37df29b6375ede3eb, Notional: 6.5002351261544815 + {TokenChain: 6, TokenAddress: "00000000000000000000000098443b96ea4b0858fdf3219cd13e98c7a4690588", Symbol: "BAT.e", CoingeckoID: "basic-attention-token", Decimals: 18}, // Addr: 0x98443b96ea4b0858fdf3219cd13e98c7a4690588, Notional: 9.73197374983522 + {TokenChain: 6, TokenAddress: "0000000000000000000000009702230a8ea53601f5cd2dc00fdbc13d4df4a8c7", Symbol: "USDt", CoingeckoID: "tether", Decimals: 6}, // Addr: 0x9702230a8ea53601f5cd2dc00fdbc13d4df4a8c7, Notional: 25735.463411 + {TokenChain: 6, TokenAddress: "000000000000000000000000b31f66aa3c1e785363f0875a1b74e27b85fd66c7", Symbol: "WAVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, // Addr: 0xb31f66aa3c1e785363f0875a1b74e27b85fd66c7, Notional: 592962.8348224398 + {TokenChain: 6, TokenAddress: "000000000000000000000000820802fa8a99901f52e39acd21177b0be6ee2974", Symbol: "EUROe", CoingeckoID: "euroe-stablecoin", Decimals: 6}, // Addr: 0x820802fa8a99901f52e39acd21177b0be6ee2974, Notional: 1.390393586 + {TokenChain: 6, TokenAddress: "0000000000000000000000002b2c81e08f1af8835a78bb2a90ae924ace0ea4be", Symbol: "sAVAX", CoingeckoID: "benqi-liquid-staked-avax", Decimals: 18}, // Addr: 0x2b2c81e08f1af8835a78bb2a90ae924ace0ea4be, Notional: 292916.692432554 + {TokenChain: 6, TokenAddress: "000000000000000000000000c7198437980c041c805a1edcba50c1ce5db95118", Symbol: "USDT.e", CoingeckoID: "tether-avalanche-bridged-usdt-e", Decimals: 6}, // Addr: 0xc7198437980c041c805a1edcba50c1ce5db95118, Notional: 6092.516973364 + {TokenChain: 6, TokenAddress: "00000000000000000000000050b7545627a5162f82a992c33b87adc75187b218", Symbol: "WBTC.e", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x50b7545627a5162f82a992c33b87adc75187b218, Notional: 808.52960721 + {TokenChain: 7, TokenAddress: "00000000000000000000000021c718c22d52d0f3a789b752d4c2fd5908a8a733", Symbol: "wROSE", CoingeckoID: "oasis-network", Decimals: 18}, // Addr: 0x21c718c22d52d0f3a789b752d4c2fd5908a8a733, Notional: 29806.160228354573 + {TokenChain: 8, TokenAddress: "0000000000000000000000000000000000000000000000000000000000000000", Symbol: "ALGO", CoingeckoID: "algorand", Decimals: 6}, // Addr: 0, Notional: 84.960293418 + {TokenChain: 8, TokenAddress: "000000000000000000000000000000000000000000000000000000000029fcf5", Symbol: "RIO", CoingeckoID: "realio-network", Decimals: 7}, // Addr: 2751733, Notional: 507.375551015223 + {TokenChain: 8, TokenAddress: "0000000000000000000000000000000000000000000000000000000008338636", Symbol: "HDL", CoingeckoID: "headline", Decimals: 6}, // Addr: 137594422, Notional: 166.85386074077795 + {TokenChain: 8, TokenAddress: "00000000000000000000000000000000000000000000000000000000112883e4", Symbol: "OPUL", CoingeckoID: "opulous", Decimals: 8}, // Addr: 287867876, Notional: 0.50438388 + {TokenChain: 8, TokenAddress: "000000000000000000000000000000000000000000000000000000001704d555", Symbol: "goBTC", CoingeckoID: "gobtc", Decimals: 8}, // Addr: 386192725, Notional: 62.303292139999996 + {TokenChain: 8, TokenAddress: "000000000000000000000000000000000000000000000000000000001704e1e4", Symbol: "goETH", CoingeckoID: "goeth", Decimals: 8}, // Addr: 386195940, Notional: 15.129411264 + {TokenChain: 8, TokenAddress: "000000000000000000000000000000000000000000000000000000001a777316", Symbol: "ZONE", CoingeckoID: "zone", Decimals: 6}, // Addr: 444035862, Notional: 0.0009633 + {TokenChain: 8, TokenAddress: "000000000000000000000000000000000000000000000000000000002f461f17", Symbol: "gALGO", CoingeckoID: "governance-algo", Decimals: 6}, // Addr: 793124631, Notional: 0.0181504 + {TokenChain: 9, TokenAddress: "0000000000000000000000005ce9f0b6afb36135b5ddbf11705ceb65e634a9dc", Symbol: "atUST", CoingeckoID: "wrapped-ust", Decimals: 18}, // Addr: 0x5ce9f0b6afb36135b5ddbf11705ceb65e634a9dc, Notional: 0.0118257902376894 + {TokenChain: 9, TokenAddress: "0000000000000000000000004988a896b1227218e4a686fde5eabdcabd91571f", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0x4988a896b1227218e4a686fde5eabdcabd91571f, Notional: 507.188226 {TokenChain: 9, TokenAddress: "000000000000000000000000b12bfca5a55806aaf64e99521918a4bf0fc40802", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xb12bfca5a55806aaf64e99521918a4bf0fc40802, Notional: 329.863747213 - {TokenChain: 9, TokenAddress: "000000000000000000000000dcd6d4e2b3e1d1e1e6fa8c21c8a323dcbecff970", Symbol: "ROSE", CoingeckoID: "rose", Decimals: 18}, // Addr: 0xdcd6d4e2b3e1d1e1e6fa8c21c8a323dcbecff970, Notional: 0.08813563 - {TokenChain: 9, TokenAddress: "0000000000000000000000008bec47865ade3b172a928df8f990bc7f2a3b9f79", Symbol: "AURORA", CoingeckoID: "aurora-near", Decimals: 18}, // Addr: 0x8bec47865ade3b172a928df8f990bc7f2a3b9f79, Notional: 0.0000035529 - {TokenChain: 9, TokenAddress: "000000000000000000000000c9bdeed33cd01541e1eed10f90519d2c06fe3feb", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0xc9bdeed33cd01541e1eed10f90519d2c06fe3feb, Notional: 4847.5101804 - {TokenChain: 9, TokenAddress: "0000000000000000000000007ca1c28663b76cfde424a9494555b94846205585", Symbol: "XNL", CoingeckoID: "chronicle", Decimals: 18}, // Addr: 0x7ca1c28663b76cfde424a9494555b94846205585, Notional: 1.27550097 - {TokenChain: 9, TokenAddress: "000000000000000000000000c4bdd27c33ec7daa6fcfd8532ddb524bf4038096", Symbol: "atLUNA", CoingeckoID: "wrapped-terra", Decimals: 18}, // Addr: 0xc4bdd27c33ec7daa6fcfd8532ddb524bf4038096, Notional: 0.06619153072021561 - {TokenChain: 10, TokenAddress: "000000000000000000000000de5ed76e7c05ec5e4572cfc88d1acea165109e44", Symbol: "DEUS", CoingeckoID: "deus-finance-2", Decimals: 18}, // Addr: 0xde5ed76e7c05ec5e4572cfc88d1acea165109e44, Notional: 2.6233237681 - {TokenChain: 10, TokenAddress: "00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b75", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x04068da6c83afcfa0e13ba15a6696662335d5b75, Notional: 166057.66670493 - {TokenChain: 10, TokenAddress: "0000000000000000000000005d5530eb3147152fe78d5c4bfeede054c8d1442a", Symbol: "FEED", CoingeckoID: "feeder-finance", Decimals: 18}, // Addr: 0x5d5530eb3147152fe78d5c4bfeede054c8d1442a, Notional: 0.9622844689913326 - {TokenChain: 10, TokenAddress: "000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be355", Symbol: "FRAX", CoingeckoID: "frax", Decimals: 18}, // Addr: 0xdc301622e621166bd8e82f2ca0a26c13ad0be355, Notional: 3093.10040776007 - {TokenChain: 10, TokenAddress: "000000000000000000000000468003b688943977e6130f4f68f23aad939a1040", Symbol: "SPELL", CoingeckoID: "spell-token", Decimals: 18}, // Addr: 0x468003b688943977e6130f4f68f23aad939a1040, Notional: 0.0928965010321222 - {TokenChain: 10, TokenAddress: "000000000000000000000000174c7106aeecdc11389f7dd21342f05f46ccb40f", Symbol: "DEVIL", CoingeckoID: "devil-finance", Decimals: 18}, // Addr: 0x174c7106aeecdc11389f7dd21342f05f46ccb40f, Notional: 4.328962000039354 - {TokenChain: 10, TokenAddress: "000000000000000000000000d67de0e0a0fd7b15dc8348bb9be742f3c5850454", Symbol: "BNB", CoingeckoID: "wbnb", Decimals: 18}, // Addr: 0xd67de0e0a0fd7b15dc8348bb9be742f3c5850454, Notional: 672.42320208 - {TokenChain: 10, TokenAddress: "00000000000000000000000021ada0d2ac28c3a5fa3cd2ee30882da8812279b6", Symbol: "OATH", CoingeckoID: "oath", Decimals: 18}, // Addr: 0x21ada0d2ac28c3a5fa3cd2ee30882da8812279b6, Notional: 5.0644 - {TokenChain: 10, TokenAddress: "0000000000000000000000002130d2a1e51112d349ccf78d2a1ee65843ba36e0", Symbol: "UNIDX", CoingeckoID: "unidex", Decimals: 18}, // Addr: 0x2130d2a1e51112d349ccf78d2a1ee65843ba36e0, Notional: 4.3635311564000006 - {TokenChain: 10, TokenAddress: "00000000000000000000000044f7237df00e386af8e79b817d05ed9f6fe0f296", Symbol: "SOL", CoingeckoID: "wrapped-solana", Decimals: 18}, // Addr: 0x44f7237df00e386af8e79b817d05ed9f6fe0f296, Notional: 292.8556917504 - {TokenChain: 10, TokenAddress: "000000000000000000000000b3654dc3d10ea7645f8319668e8f54d2574fbdc8", Symbol: "LINK", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0xb3654dc3d10ea7645f8319668e8f54d2574fbdc8, Notional: 524.4961436442001 - {TokenChain: 10, TokenAddress: "000000000000000000000000be41772587872a92184873d55b09c6bb6f59f895", Symbol: "MARS", CoingeckoID: "projectmars", Decimals: 9}, // Addr: 0xbe41772587872a92184873d55b09c6bb6f59f895, Notional: 0.01133134163527527 - {TokenChain: 10, TokenAddress: "0000000000000000000000006626c47c00f1d87902fc13eecfac3ed06d5e8d8a", Symbol: "WOO", CoingeckoID: "woo-network", Decimals: 18}, // Addr: 0x6626c47c00f1d87902fc13eecfac3ed06d5e8d8a, Notional: 18.26284756014828 - {TokenChain: 10, TokenAddress: "000000000000000000000000511d35c52a3c244e7b8bd92c0c297755fbd89212", Symbol: "AVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, // Addr: 0x511d35c52a3c244e7b8bd92c0c297755fbd89212, Notional: 517.7258309806 - {TokenChain: 10, TokenAddress: "0000000000000000000000001e4f97b9f9f913c46f1632781732927b9019c68b", Symbol: "CRV", CoingeckoID: "curve-dao-token", Decimals: 18}, // Addr: 0x1e4f97b9f9f913c46f1632781732927b9019c68b, Notional: 143.72307174753544 - {TokenChain: 10, TokenAddress: "00000000000000000000000082f0b8b456c1a451378467398982d4834b6829c1", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0x82f0b8b456c1a451378467398982d4834b6829c1, Notional: 18.73993776025998 - {TokenChain: 10, TokenAddress: "0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e, Notional: 21595.45323873 - {TokenChain: 10, TokenAddress: "0000000000000000000000009879abdea01a879644185341f7af7d8343556b7a", Symbol: "TUSD", CoingeckoID: "true-usd", Decimals: 18}, // Addr: 0x9879abdea01a879644185341f7af7d8343556b7a, Notional: 10.996612 - {TokenChain: 10, TokenAddress: "000000000000000000000000049d68029688eabf473097a2fc38ef61633a3c7a", Symbol: "fUSDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0x049d68029688eabf473097a2fc38ef61633a3c7a, Notional: 1738.201197841202 - {TokenChain: 10, TokenAddress: "00000000000000000000000040df1ae6074c35047bff66675488aa2f9f6384f3", Symbol: "MATIC", CoingeckoID: "wmatic", Decimals: 18}, // Addr: 0x40df1ae6074c35047bff66675488aa2f9f6384f3, Notional: 772.1785895306693 - {TokenChain: 10, TokenAddress: "00000000000000000000000074b23882a30290451a17c44f4f05243b6b58c76d", Symbol: "ETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x74b23882a30290451a17c44f4f05243b6b58c76d, Notional: 7107.070892193599 - {TokenChain: 10, TokenAddress: "00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83", Symbol: "WFTM", CoingeckoID: "wrapped-fantom", Decimals: 18}, // Addr: 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83, Notional: 284466.7200887292 - {TokenChain: 10, TokenAddress: "0000000000000000000000006a07a792ab2965c72a5b8088d3a069a7ac3a993b", Symbol: "AAVE", CoingeckoID: "aave", Decimals: 18}, // Addr: 0x6a07a792ab2965c72a5b8088d3a069a7ac3a993b, Notional: 6.51 - {TokenChain: 10, TokenAddress: "000000000000000000000000fb98b335551a418cd0737375a2ea0ded62ea213b", Symbol: "miMATIC", CoingeckoID: "mimatic", Decimals: 18}, // Addr: 0xfb98b335551a418cd0737375a2ea0ded62ea213b, Notional: 9.62730662960848 - {TokenChain: 10, TokenAddress: "000000000000000000000000e705af5f63fcabdcdf5016aa838eaaac35d12890", Symbol: "MCRT", CoingeckoID: "magiccraft", Decimals: 9}, // Addr: 0xe705af5f63fcabdcdf5016aa838eaaac35d12890, Notional: 0.7703348813147965 - {TokenChain: 10, TokenAddress: "000000000000000000000000e64b9fd040d1f9d4715c645e0d567ef69958d3d9", Symbol: "MOD", CoingeckoID: "modefi", Decimals: 18}, // Addr: 0xe64b9fd040d1f9d4715c645e0d567ef69958d3d9, Notional: 2.3278366083827 - {TokenChain: 10, TokenAddress: "000000000000000000000000e2d27f06f63d98b8e11b38b5b08a75d0c8dd62b9", Symbol: "UST", CoingeckoID: "wrapped-ust", Decimals: 6}, // Addr: 0xe2d27f06f63d98b8e11b38b5b08a75d0c8dd62b9, Notional: 111.76718000575958 - {TokenChain: 10, TokenAddress: "000000000000000000000000904f51a2e7eeaf76aaf0418cbaf0b71149686f4a", Symbol: "FAME", CoingeckoID: "fantom-maker", Decimals: 18}, // Addr: 0x904f51a2e7eeaf76aaf0418cbaf0b71149686f4a, Notional: 120245.37822998452 - {TokenChain: 10, TokenAddress: "000000000000000000000000ae75a438b2e0cb8bb01ec1e1e376de11d44477cc", Symbol: "SUSHI", CoingeckoID: "sushi", Decimals: 18}, // Addr: 0xae75a438b2e0cb8bb01ec1e1e376de11d44477cc, Notional: 0.709126 - {TokenChain: 10, TokenAddress: "000000000000000000000000260b3e40c714ce8196465ec824cd8bb915081812", Symbol: "IronICE", CoingeckoID: "iron-bsc", Decimals: 18}, // Addr: 0x260b3e40c714ce8196465ec824cd8bb915081812, Notional: 23.95066608 - {TokenChain: 10, TokenAddress: "0000000000000000000000002f6f07cdcf3588944bf4c42ac74ff24bf56e7590", Symbol: "STG", CoingeckoID: "stargate-finance", Decimals: 18}, // Addr: 0x2f6f07cdcf3588944bf4c42ac74ff24bf56e7590, Notional: 8.200038000000001 - {TokenChain: 10, TokenAddress: "0000000000000000000000000615dbba33fe61a31c7ed131bda6655ed76748b1", Symbol: "ANKR", CoingeckoID: "ankr", Decimals: 18}, // Addr: 0x0615dbba33fe61a31c7ed131bda6655ed76748b1, Notional: 1.250025373642453 - {TokenChain: 10, TokenAddress: "000000000000000000000000321162cd933e2be498cd2267a90534a804051b11", Symbol: "BTC", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x321162cd933e2be498cd2267a90534a804051b11, Notional: 4597.4400684 + {TokenChain: 9, TokenAddress: "000000000000000000000000dcd6d4e2b3e1d1e1e6fa8c21c8a323dcbecff970", Symbol: "ROSE", CoingeckoID: "rose", Decimals: 18}, // Addr: 0xdcd6d4e2b3e1d1e1e6fa8c21c8a323dcbecff970, Notional: 0.07088786 + {TokenChain: 9, TokenAddress: "0000000000000000000000008bec47865ade3b172a928df8f990bc7f2a3b9f79", Symbol: "AURORA", CoingeckoID: "aurora-near", Decimals: 18}, // Addr: 0x8bec47865ade3b172a928df8f990bc7f2a3b9f79, Notional: 0.0000024845605 + {TokenChain: 9, TokenAddress: "000000000000000000000000c9bdeed33cd01541e1eed10f90519d2c06fe3feb", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0xc9bdeed33cd01541e1eed10f90519d2c06fe3feb, Notional: 4436.3558643 + {TokenChain: 9, TokenAddress: "0000000000000000000000007ca1c28663b76cfde424a9494555b94846205585", Symbol: "XNL", CoingeckoID: "chronicle", Decimals: 18}, // Addr: 0x7ca1c28663b76cfde424a9494555b94846205585, Notional: 1.0684258199999999 + {TokenChain: 9, TokenAddress: "000000000000000000000000c4bdd27c33ec7daa6fcfd8532ddb524bf4038096", Symbol: "atLUNA", CoingeckoID: "wrapped-terra", Decimals: 18}, // Addr: 0xc4bdd27c33ec7daa6fcfd8532ddb524bf4038096, Notional: 0.0479645123039817 + {TokenChain: 10, TokenAddress: "000000000000000000000000de5ed76e7c05ec5e4572cfc88d1acea165109e44", Symbol: "DEUS", CoingeckoID: "deus-finance-2", Decimals: 18}, // Addr: 0xde5ed76e7c05ec5e4572cfc88d1acea165109e44, Notional: 2.2755382814 + {TokenChain: 10, TokenAddress: "00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b75", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x04068da6c83afcfa0e13ba15a6696662335d5b75, Notional: 168777.99000162096 + {TokenChain: 10, TokenAddress: "0000000000000000000000005d5530eb3147152fe78d5c4bfeede054c8d1442a", Symbol: "FEED", CoingeckoID: "feeder-finance", Decimals: 18}, // Addr: 0x5d5530eb3147152fe78d5c4bfeede054c8d1442a, Notional: 1.0922604994275975 + {TokenChain: 10, TokenAddress: "0000000000000000000000007d016eec9c25232b01f23ef992d98ca97fc2af5a", Symbol: "FXS", CoingeckoID: "frax-share", Decimals: 18}, // Addr: 0x7d016eec9c25232b01f23ef992d98ca97fc2af5a, Notional: 1.9177924922 + {TokenChain: 10, TokenAddress: "000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be355", Symbol: "FRAX", CoingeckoID: "frax", Decimals: 18}, // Addr: 0xdc301622e621166bd8e82f2ca0a26c13ad0be355, Notional: 144.48936742122416 + {TokenChain: 10, TokenAddress: "000000000000000000000000174c7106aeecdc11389f7dd21342f05f46ccb40f", Symbol: "DEVIL", CoingeckoID: "devil-finance", Decimals: 18}, // Addr: 0x174c7106aeecdc11389f7dd21342f05f46ccb40f, Notional: 5.633452000051213 + {TokenChain: 10, TokenAddress: "000000000000000000000000695921034f0387eac4e11620ee91b1b15a6a09fe", Symbol: "WETH", CoingeckoID: "bridged-wrapped-ether-stargate", Decimals: 18}, // Addr: 0x695921034f0387eac4e11620ee91b1b15a6a09fe, Notional: 0.19517 + {TokenChain: 10, TokenAddress: "000000000000000000000000d67de0e0a0fd7b15dc8348bb9be742f3c5850454", Symbol: "BNB", CoingeckoID: "wbnb", Decimals: 18}, // Addr: 0xd67de0e0a0fd7b15dc8348bb9be742f3c5850454, Notional: 844.8618823304 + {TokenChain: 10, TokenAddress: "00000000000000000000000021ada0d2ac28c3a5fa3cd2ee30882da8812279b6", Symbol: "OATH", CoingeckoID: "oath", Decimals: 18}, // Addr: 0x21ada0d2ac28c3a5fa3cd2ee30882da8812279b6, Notional: 3.407703 + {TokenChain: 10, TokenAddress: "000000000000000000000000657a1861c15a3ded9af0b6799a195a249ebdcbc6", Symbol: "CREAM", CoingeckoID: "cream-2", Decimals: 18}, // Addr: 0x657a1861c15a3ded9af0b6799a195a249ebdcbc6, Notional: 0.11137 + {TokenChain: 10, TokenAddress: "00000000000000000000000044f7237df00e386af8e79b817d05ed9f6fe0f296", Symbol: "SOL", CoingeckoID: "wrapped-solana", Decimals: 18}, // Addr: 0x44f7237df00e386af8e79b817d05ed9f6fe0f296, Notional: 376.6701846779 + {TokenChain: 10, TokenAddress: "000000000000000000000000b3654dc3d10ea7645f8319668e8f54d2574fbdc8", Symbol: "LINK", CoingeckoID: "chainlink", Decimals: 18}, // Addr: 0xb3654dc3d10ea7645f8319668e8f54d2574fbdc8, Notional: 746.8074451838 + {TokenChain: 10, TokenAddress: "000000000000000000000000be41772587872a92184873d55b09c6bb6f59f895", Symbol: "MARS", CoingeckoID: "projectmars", Decimals: 9}, // Addr: 0xbe41772587872a92184873d55b09c6bb6f59f895, Notional: 0.008567167805352062 + {TokenChain: 10, TokenAddress: "000000000000000000000000511d35c52a3c244e7b8bd92c0c297755fbd89212", Symbol: "AVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, // Addr: 0x511d35c52a3c244e7b8bd92c0c297755fbd89212, Notional: 426.0274439796 + {TokenChain: 10, TokenAddress: "00000000000000000000000082f0b8b456c1a451378467398982d4834b6829c1", Symbol: "MIM", CoingeckoID: "magic-internet-money", Decimals: 18}, // Addr: 0x82f0b8b456c1a451378467398982d4834b6829c1, Notional: 19.10592490866 + {TokenChain: 10, TokenAddress: "00000000000000000000000040df1ae6074c35047bff66675488aa2f9f6384f3", Symbol: "MATIC", CoingeckoID: "wmatic", Decimals: 18}, // Addr: 0x40df1ae6074c35047bff66675488aa2f9f6384f3, Notional: 735.421643977292 + {TokenChain: 10, TokenAddress: "0000000000000000000000006a07a792ab2965c72a5b8088d3a069a7ac3a993b", Symbol: "AAVE", CoingeckoID: "aave", Decimals: 18}, // Addr: 0x6a07a792ab2965c72a5b8088d3a069a7ac3a993b, Notional: 279.6016117272 + {TokenChain: 10, TokenAddress: "000000000000000000000000fb98b335551a418cd0737375a2ea0ded62ea213b", Symbol: "miMATIC", CoingeckoID: "mimatic", Decimals: 18}, // Addr: 0xfb98b335551a418cd0737375a2ea0ded62ea213b, Notional: 19.479591330279682 + {TokenChain: 10, TokenAddress: "000000000000000000000000e64b9fd040d1f9d4715c645e0d567ef69958d3d9", Symbol: "MOD", CoingeckoID: "modefi", Decimals: 18}, // Addr: 0xe64b9fd040d1f9d4715c645e0d567ef69958d3d9, Notional: 2.12283696659687 + {TokenChain: 10, TokenAddress: "000000000000000000000000904f51a2e7eeaf76aaf0418cbaf0b71149686f4a", Symbol: "FAME", CoingeckoID: "fantom-maker", Decimals: 18}, // Addr: 0x904f51a2e7eeaf76aaf0418cbaf0b71149686f4a, Notional: 40725.04333382503 + {TokenChain: 10, TokenAddress: "0000000000000000000000002f6f07cdcf3588944bf4c42ac74ff24bf56e7590", Symbol: "STG", CoingeckoID: "stargate-finance", Decimals: 18}, // Addr: 0x2f6f07cdcf3588944bf4c42ac74ff24bf56e7590, Notional: 5.891984 + {TokenChain: 10, TokenAddress: "0000000000000000000000000615dbba33fe61a31c7ed131bda6655ed76748b1", Symbol: "ANKR", CoingeckoID: "ankr", Decimals: 18}, // Addr: 0x0615dbba33fe61a31c7ed131bda6655ed76748b1, Notional: 12.29687535053332 + {TokenChain: 10, TokenAddress: "000000000000000000000000321162cd933e2be498cd2267a90534a804051b11", Symbol: "BTC", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x321162cd933e2be498cd2267a90534a804051b11, Notional: 10837.30119453 + {TokenChain: 10, TokenAddress: "0000000000000000000000003dc57b391262e3aae37a08d91241f9ba9d58b570", Symbol: "YOSHI", CoingeckoID: "yoshi-exchange", Decimals: 18}, // Addr: 0x3dc57b391262e3aae37a08d91241f9ba9d58b570, Notional: 0.034847559 + {TokenChain: 10, TokenAddress: "0000000000000000000000009fb9a33956351cf4fa040f65a13b835a3c8764e3", Symbol: "MULTI", CoingeckoID: "multichain", Decimals: 18}, // Addr: 0x9fb9a33956351cf4fa040f65a13b835a3c8764e3, Notional: 1343.671283639 + {TokenChain: 10, TokenAddress: "00000000000000000000000056ee926bd8c72b2d5fa1af4d9e4cbb515a1e3adc", Symbol: "SNX", CoingeckoID: "havven", Decimals: 18}, // Addr: 0x56ee926bd8c72b2d5fa1af4d9e4cbb515a1e3adc, Notional: 0.37350430500000004 + {TokenChain: 10, TokenAddress: "000000000000000000000000468003b688943977e6130f4f68f23aad939a1040", Symbol: "SPELL", CoingeckoID: "spell-token", Decimals: 18}, // Addr: 0x468003b688943977e6130f4f68f23aad939a1040, Notional: 0.089910421366185 + {TokenChain: 10, TokenAddress: "0000000000000000000000002130d2a1e51112d349ccf78d2a1ee65843ba36e0", Symbol: "UNIDX", CoingeckoID: "unidex", Decimals: 18}, // Addr: 0x2130d2a1e51112d349ccf78d2a1ee65843ba36e0, Notional: 1.794024746 + {TokenChain: 10, TokenAddress: "0000000000000000000000006626c47c00f1d87902fc13eecfac3ed06d5e8d8a", Symbol: "WOO", CoingeckoID: "woo-network", Decimals: 18}, // Addr: 0x6626c47c00f1d87902fc13eecfac3ed06d5e8d8a, Notional: 17.03069873401068 + {TokenChain: 10, TokenAddress: "00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf", Symbol: "USDC", CoingeckoID: "layerzero-usdc", Decimals: 6}, // Addr: 0x28a92dde19d9989f39a49905d7c9c2fac7799bdf, Notional: 247.233519533 + {TokenChain: 10, TokenAddress: "0000000000000000000000001e4f97b9f9f913c46f1632781732927b9019c68b", Symbol: "CRV", CoingeckoID: "curve-dao-token", Decimals: 18}, // Addr: 0x1e4f97b9f9f913c46f1632781732927b9019c68b, Notional: 213.23030832699905 + {TokenChain: 10, TokenAddress: "0000000000000000000000008d11ec38a3eb5e956b052f67da8bdc9bef8abf3e", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x8d11ec38a3eb5e956b052f67da8bdc9bef8abf3e, Notional: 12839.528168603174 + {TokenChain: 10, TokenAddress: "0000000000000000000000009879abdea01a879644185341f7af7d8343556b7a", Symbol: "TUSD", CoingeckoID: "true-usd", Decimals: 18}, // Addr: 0x9879abdea01a879644185341f7af7d8343556b7a, Notional: 11.988030534419071 + {TokenChain: 10, TokenAddress: "000000000000000000000000049d68029688eabf473097a2fc38ef61633a3c7a", Symbol: "fUSDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0x049d68029688eabf473097a2fc38ef61633a3c7a, Notional: 2082.801669 + {TokenChain: 10, TokenAddress: "00000000000000000000000074b23882a30290451a17c44f4f05243b6b58c76d", Symbol: "ETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x74b23882a30290451a17c44f4f05243b6b58c76d, Notional: 8716.4196026295 + {TokenChain: 10, TokenAddress: "00000000000000000000000021be370d5312f44cb42ce377bc9b8a0cef1a4c83", Symbol: "WFTM", CoingeckoID: "wrapped-fantom", Decimals: 18}, // Addr: 0x21be370d5312f44cb42ce377bc9b8a0cef1a4c83, Notional: 268062.24583218986 + {TokenChain: 10, TokenAddress: "0000000000000000000000005c4fdfc5233f935f20d2adba572f770c2e377ab0", Symbol: "HEC", CoingeckoID: "hector-dao", Decimals: 9}, // Addr: 0x5c4fdfc5233f935f20d2adba572f770c2e377ab0, Notional: 8.642953639937389 + {TokenChain: 10, TokenAddress: "000000000000000000000000e705af5f63fcabdcdf5016aa838eaaac35d12890", Symbol: "MCRT", CoingeckoID: "magiccraft", Decimals: 9}, // Addr: 0xe705af5f63fcabdcdf5016aa838eaaac35d12890, Notional: 0.47613303830962894 + {TokenChain: 10, TokenAddress: "000000000000000000000000e2d27f06f63d98b8e11b38b5b08a75d0c8dd62b9", Symbol: "UST", CoingeckoID: "wrapped-ust", Decimals: 6}, // Addr: 0xe2d27f06f63d98b8e11b38b5b08a75d0c8dd62b9, Notional: 85.74743618774602 + {TokenChain: 10, TokenAddress: "000000000000000000000000ee9801669c6138e84bd50deb500827b776777d28", Symbol: "O3", CoingeckoID: "o3-swap", Decimals: 18}, // Addr: 0xee9801669c6138e84bd50deb500827b776777d28, Notional: 17.177542493707282 + {TokenChain: 10, TokenAddress: "000000000000000000000000ae75a438b2e0cb8bb01ec1e1e376de11d44477cc", Symbol: "SUSHI", CoingeckoID: "sushi", Decimals: 18}, // Addr: 0xae75a438b2e0cb8bb01ec1e1e376de11d44477cc, Notional: 0.575816 + {TokenChain: 10, TokenAddress: "000000000000000000000000260b3e40c714ce8196465ec824cd8bb915081812", Symbol: "IronICE", CoingeckoID: "iron-bsc", Decimals: 18}, // Addr: 0x260b3e40c714ce8196465ec824cd8bb915081812, Notional: 22.8145500072 {TokenChain: 11, TokenAddress: "0000000000000000000000000000000000000000000100000000000000000081", Symbol: "aUSD", CoingeckoID: "acala-dollar", Decimals: 12}, // Addr: 0x0000000000000000000100000000000000000081, Notional: 5.1058603195018 - {TokenChain: 12, TokenAddress: "0000000000000000000000000000000000000000000100000000000000000001", Symbol: "aUSD", CoingeckoID: "acala-dollar-acala", Decimals: 12}, // Addr: 0x0000000000000000000100000000000000000001, Notional: 632.404999556 - {TokenChain: 13, TokenAddress: "000000000000000000000000cd670d77f3dcab82d43dff9bd2c4b87339fb3560", Symbol: "KOKOS", CoingeckoID: "kokonut-swap", Decimals: 18}, // Addr: 0xcd670d77f3dcab82d43dff9bd2c4b87339fb3560, Notional: 1003881.6324684316 - {TokenChain: 13, TokenAddress: "000000000000000000000000e4f05a66ec68b54a58b17c22107b02e0232cc817", Symbol: "WKLAY", CoingeckoID: "wrapped-klay", Decimals: 18}, // Addr: 0xe4f05a66ec68b54a58b17c22107b02e0232cc817, Notional: 152.78073512579476 - {TokenChain: 13, TokenAddress: "0000000000000000000000005c74070fdea071359b86082bd9f9b3deaafbe32b", Symbol: "KDAI", CoingeckoID: "klaytn-dai", Decimals: 18}, // Addr: 0x5c74070fdea071359b86082bd9f9b3deaafbe32b, Notional: 0.019991000000000002 - {TokenChain: 13, TokenAddress: "0000000000000000000000009eaefb09fe4aabfbe6b1ca316a3c36afc83a393f", Symbol: "oXRP", CoingeckoID: "orbit-bridge-klaytn-ripple", Decimals: 6}, // Addr: 0x9eaefb09fe4aabfbe6b1ca316a3c36afc83a393f, Notional: 0.0341813 - {TokenChain: 13, TokenAddress: "000000000000000000000000754288077d0ff82af7a5317c7cb8c444d421d103", Symbol: "oUSDC", CoingeckoID: "orbit-bridge-klaytn-usdc", Decimals: 6}, // Addr: 0x754288077d0ff82af7a5317c7cb8c444d421d103, Notional: 0.04004 + {TokenChain: 12, TokenAddress: "0000000000000000000000000000000000000000000100000000000000000001", Symbol: "aUSD", CoingeckoID: "acala-dollar-acala", Decimals: 12}, // Addr: 0x0000000000000000000100000000000000000001, Notional: 245.05448930859689 + {TokenChain: 13, TokenAddress: "000000000000000000000000cd670d77f3dcab82d43dff9bd2c4b87339fb3560", Symbol: "KOKOS", CoingeckoID: "kokonut-swap", Decimals: 18}, // Addr: 0xcd670d77f3dcab82d43dff9bd2c4b87339fb3560, Notional: 653759.1030321693 + {TokenChain: 13, TokenAddress: "000000000000000000000000e4f05a66ec68b54a58b17c22107b02e0232cc817", Symbol: "WKLAY", CoingeckoID: "wrapped-klay", Decimals: 18}, // Addr: 0xe4f05a66ec68b54a58b17c22107b02e0232cc817, Notional: 120.840639585906 + {TokenChain: 13, TokenAddress: "0000000000000000000000005c74070fdea071359b86082bd9f9b3deaafbe32b", Symbol: "KDAI", CoingeckoID: "klaytn-dai", Decimals: 18}, // Addr: 0x5c74070fdea071359b86082bd9f9b3deaafbe32b, Notional: 0.0199288 + {TokenChain: 13, TokenAddress: "0000000000000000000000009eaefb09fe4aabfbe6b1ca316a3c36afc83a393f", Symbol: "oXRP", CoingeckoID: "orbit-bridge-klaytn-ripple", Decimals: 6}, // Addr: 0x9eaefb09fe4aabfbe6b1ca316a3c36afc83a393f, Notional: 0.026442300000000002 + {TokenChain: 13, TokenAddress: "000000000000000000000000754288077d0ff82af7a5317c7cb8c444d421d103", Symbol: "oUSDC", CoingeckoID: "orbit-bridge-klaytn-usdc", Decimals: 6}, // Addr: 0x754288077d0ff82af7a5317c7cb8c444d421d103, Notional: 0.04008 + {TokenChain: 13, TokenAddress: "000000000000000000000000ce899f5fcf55b0c1d7478910f812cfe68c5bcf0f", Symbol: "ABC", CoingeckoID: "angry-bulls-club", Decimals: 18}, // Addr: 0xce899f5fcf55b0c1d7478910f812cfe68c5bcf0f, Notional: 68.25265042998359 {TokenChain: 13, TokenAddress: "0000000000000000000000006270b58be569a7c0b8f47594f191631ae5b2c86c", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x6270b58be569a7c0b8f47594f191631ae5b2c86c, Notional: 45617.13061405499 - {TokenChain: 14, TokenAddress: "000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a", Symbol: "cUSD", CoingeckoID: "celo-dollar", Decimals: 18}, // Addr: 0x765de816845861e75a25fca122bb6898b8b1282a, Notional: 189.22328107339393 - {TokenChain: 14, TokenAddress: "00000000000000000000000074c0c58b99b68cf16a717279ac2d056a34ba2bfe", Symbol: "SOURCE", CoingeckoID: "resource-protocol", Decimals: 18}, // Addr: 0x74c0c58b99b68cf16a717279ac2d056a34ba2bfe, Notional: 0.0015451080000000001 - {TokenChain: 14, TokenAddress: "000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca73", Symbol: "cEUR", CoingeckoID: "celo-euro", Decimals: 18}, // Addr: 0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73, Notional: 163774.57594632157 - {TokenChain: 14, TokenAddress: "000000000000000000000000d629eb00deced2a080b7ec630ef6ac117e614f1b", Symbol: "BTC", CoingeckoID: "wrapped-bitcoin", Decimals: 18}, // Addr: 0xd629eb00deced2a080b7ec630ef6ac117e614f1b, Notional: 0.844915 - {TokenChain: 14, TokenAddress: "000000000000000000000000471ece3750da237f93b8e339c536989b8978a438", Symbol: "CELO", CoingeckoID: "celo", Decimals: 18}, // Addr: 0x471ece3750da237f93b8e339c536989b8978a438, Notional: 119751.24479288624 - {TokenChain: 14, TokenAddress: "00000000000000000000000000be915b9dcf56a3cbe739d9b9c202ca692409ec", Symbol: "UBE", CoingeckoID: "ubeswap", Decimals: 18}, // Addr: 0x00be915b9dcf56a3cbe739d9b9c202ca692409ec, Notional: 13.779843151775228 - {TokenChain: 14, TokenAddress: "00000000000000000000000046c9757c5497c5b1f2eb73ae79b6b67d119b0b58", Symbol: "PACT", CoingeckoID: "impactmarket", Decimals: 18}, // Addr: 0x46c9757c5497c5b1f2eb73ae79b6b67d119b0b58, Notional: 1581.4875031516535 - {TokenChain: 15, TokenAddress: "67499b7b8f58eaeb3cd81aea1d1ce9f7f722fd7750ceb2bed13e255073c25e2a", Symbol: "SWEAT", CoingeckoID: "sweatcoin", Decimals: 18}, // Addr: token.sweat, Notional: 6498537.393380653 - {TokenChain: 16, TokenAddress: "000000000000000000000000efaeee334f0fd1712f9a8cc375f427d9cdd40d73", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0xefaeee334f0fd1712f9a8cc375f427d9cdd40d73, Notional: 9.99931 - {TokenChain: 16, TokenAddress: "0000000000000000000000008f552a71efe5eefc207bf75485b356a0b3f01ec9", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x8f552a71efe5eefc207bf75485b356a0b3f01ec9, Notional: 1163.036742868 - {TokenChain: 16, TokenAddress: "000000000000000000000000ffffffff52c56a9257bb97f4b2b6f7b2d624ecda", Symbol: "xcaUSD", CoingeckoID: "acala-dollar-acala", Decimals: 12}, // Addr: 0xffffffff52c56a9257bb97f4b2b6f7b2d624ecda, Notional: 53.6558451495 - {TokenChain: 16, TokenAddress: "0000000000000000000000004792c1ecb969b036eb51330c63bd27899a13d84e", Symbol: "AVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, // Addr: 0x4792c1ecb969b036eb51330c63bd27899a13d84e, Notional: 12.47 - {TokenChain: 16, TokenAddress: "000000000000000000000000ca01a1d0993565291051daff390892518acfad3a", Symbol: "axlUSDC", CoingeckoID: "axlusdc", Decimals: 6}, // Addr: 0xca01a1d0993565291051daff390892518acfad3a, Notional: 5.004999999999999 - {TokenChain: 16, TokenAddress: "000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e62", Symbol: "EFT", CoingeckoID: "energyfi", Decimals: 18}, // Addr: 0xa423e7eeb60547d9c7b65005477b63ae7ce67e62, Notional: 24.31975 - {TokenChain: 16, TokenAddress: "00000000000000000000000030d2a9f5fdf90ace8c17952cbb4ee48a55d916a7", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x30d2a9f5fdf90ace8c17952cbb4ee48a55d916a7, Notional: 543.8843860176 - {TokenChain: 16, TokenAddress: "000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080", Symbol: "xcDOT", CoingeckoID: "xcdot", Decimals: 10}, // Addr: 0xffffffff1fcacbd218edc0eba20fc2308c778080, Notional: 209.57656662199997 - {TokenChain: 16, TokenAddress: "0000000000000000000000003405a1bd46b85c5c029483fbecf2f3e611026e45", Symbol: "MATIC", CoingeckoID: "matic-network", Decimals: 18}, // Addr: 0x3405a1bd46b85c5c029483fbecf2f3e611026e45, Notional: 28.488409526713596 + {TokenChain: 14, TokenAddress: "000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a", Symbol: "cUSD", CoingeckoID: "celo-dollar", Decimals: 18}, // Addr: 0x765de816845861e75a25fca122bb6898b8b1282a, Notional: 264.3432801390504 + {TokenChain: 14, TokenAddress: "00000000000000000000000074c0c58b99b68cf16a717279ac2d056a34ba2bfe", Symbol: "SOURCE", CoingeckoID: "resource-protocol", Decimals: 18}, // Addr: 0x74c0c58b99b68cf16a717279ac2d056a34ba2bfe, Notional: 0.0007097820000000001 + {TokenChain: 14, TokenAddress: "000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca73", Symbol: "cEUR", CoingeckoID: "celo-euro", Decimals: 18}, // Addr: 0xd8763cba276a3738e6de85b4b3bf5fded6d6ca73, Notional: 244189.42827801753 + {TokenChain: 14, TokenAddress: "000000000000000000000000d629eb00deced2a080b7ec630ef6ac117e614f1b", Symbol: "BTC", CoingeckoID: "wrapped-bitcoin", Decimals: 18}, // Addr: 0xd629eb00deced2a080b7ec630ef6ac117e614f1b, Notional: 3.956301 + {TokenChain: 14, TokenAddress: "000000000000000000000000471ece3750da237f93b8e339c536989b8978a438", Symbol: "CELO", CoingeckoID: "celo", Decimals: 18}, // Addr: 0x471ece3750da237f93b8e339c536989b8978a438, Notional: 194324.61897439012 + {TokenChain: 14, TokenAddress: "00000000000000000000000000be915b9dcf56a3cbe739d9b9c202ca692409ec", Symbol: "UBE", CoingeckoID: "ubeswap", Decimals: 18}, // Addr: 0x00be915b9dcf56a3cbe739d9b9c202ca692409ec, Notional: 8.293230645555992 + {TokenChain: 14, TokenAddress: "00000000000000000000000046c9757c5497c5b1f2eb73ae79b6b67d119b0b58", Symbol: "PACT", CoingeckoID: "impactmarket", Decimals: 18}, // Addr: 0x46c9757c5497c5b1f2eb73ae79b6b67d119b0b58, Notional: 5674.240256653032 + {TokenChain: 14, TokenAddress: "000000000000000000000000639a647fbe20b6c8ac19e48e2de44ea792c62c5c", Symbol: "BIFI", CoingeckoID: "beefy-finance", Decimals: 18}, // Addr: 0x639a647fbe20b6c8ac19e48e2de44ea792c62c5c, Notional: 213.27125129400002 + {TokenChain: 15, TokenAddress: "67499b7b8f58eaeb3cd81aea1d1ce9f7f722fd7750ceb2bed13e255073c25e2a", Symbol: "SWEAT", CoingeckoID: "sweatcoin", Decimals: 18}, // Addr: token.sweat, Notional: 10172033.161737675 + {TokenChain: 16, TokenAddress: "000000000000000000000000efaeee334f0fd1712f9a8cc375f427d9cdd40d73", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0xefaeee334f0fd1712f9a8cc375f427d9cdd40d73, Notional: 112.241215 + {TokenChain: 16, TokenAddress: "0000000000000000000000008f552a71efe5eefc207bf75485b356a0b3f01ec9", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x8f552a71efe5eefc207bf75485b356a0b3f01ec9, Notional: 1181.7950674529998 + {TokenChain: 16, TokenAddress: "000000000000000000000000ffffffff52c56a9257bb97f4b2b6f7b2d624ecda", Symbol: "xcaUSD", CoingeckoID: "acala-dollar-acala", Decimals: 12}, // Addr: 0xffffffff52c56a9257bb97f4b2b6f7b2d624ecda, Notional: 20.79143229538551 + {TokenChain: 16, TokenAddress: "0000000000000000000000004792c1ecb969b036eb51330c63bd27899a13d84e", Symbol: "AVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, // Addr: 0x4792c1ecb969b036eb51330c63bd27899a13d84e, Notional: 10.1202 + {TokenChain: 16, TokenAddress: "000000000000000000000000511ab53f793683763e5a8829738301368a2411e3", Symbol: "WELL", CoingeckoID: "moonwell-artemis", Decimals: 18}, // Addr: 0x511ab53f793683763e5a8829738301368a2411e3, Notional: 1555487.823383341 + {TokenChain: 16, TokenAddress: "000000000000000000000000ca01a1d0993565291051daff390892518acfad3a", Symbol: "axlUSDC", CoingeckoID: "axlusdc", Decimals: 6}, // Addr: 0xca01a1d0993565291051daff390892518acfad3a, Notional: 15.044999999999998 + {TokenChain: 16, TokenAddress: "000000000000000000000000765277eebeca2e31912c9946eae1021199b39c61", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0x765277eebeca2e31912c9946eae1021199b39c61, Notional: 23.985912 + {TokenChain: 16, TokenAddress: "000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e62", Symbol: "EFT", CoingeckoID: "energyfi", Decimals: 18}, // Addr: 0xa423e7eeb60547d9c7b65005477b63ae7ce67e62, Notional: 24.247 + {TokenChain: 16, TokenAddress: "00000000000000000000000030d2a9f5fdf90ace8c17952cbb4ee48a55d916a7", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x30d2a9f5fdf90ace8c17952cbb4ee48a55d916a7, Notional: 980.9192579367001 + {TokenChain: 16, TokenAddress: "000000000000000000000000ffffffff1fcacbd218edc0eba20fc2308c778080", Symbol: "xcDOT", CoingeckoID: "xcdot", Decimals: 10}, // Addr: 0xffffffff1fcacbd218edc0eba20fc2308c778080, Notional: 173.45347089649997 + {TokenChain: 16, TokenAddress: "0000000000000000000000003405a1bd46b85c5c029483fbecf2f3e611026e45", Symbol: "MATIC", CoingeckoID: "matic-network", Decimals: 18}, // Addr: 0x3405a1bd46b85c5c029483fbecf2f3e611026e45, Notional: 41.815778810501975 {TokenChain: 16, TokenAddress: "000000000000000000000000a649325aa7c5093d12d6f98eb4378deae68ce23f", Symbol: "BUSD", CoingeckoID: "binance-usd", Decimals: 18}, // Addr: 0xa649325aa7c5093d12d6f98eb4378deae68ce23f, Notional: 346.95023651288 - {TokenChain: 16, TokenAddress: "000000000000000000000000322e86852e492a7ee17f28a78c663da38fb33bfb", Symbol: "FRAX", CoingeckoID: "frax", Decimals: 18}, // Addr: 0x322e86852e492a7ee17f28a78c663da38fb33bfb, Notional: 5.00354211 - {TokenChain: 16, TokenAddress: "000000000000000000000000acc15dc74880c9944775448304b263d191c6077f", Symbol: "WGLMR", CoingeckoID: "wrapped-moonbeam", Decimals: 18}, // Addr: 0xacc15dc74880c9944775448304b263d191c6077f, Notional: 1885.5061566552638 - {TokenChain: 16, TokenAddress: "000000000000000000000000ffffffffea09fb06d082fd1275cd48b191cbcd1d", Symbol: "xcUSDT", CoingeckoID: "xcusdt", Decimals: 6}, // Addr: 0xffffffffea09fb06d082fd1275cd48b191cbcd1d, Notional: 6.050202771032 - {TokenChain: 18, TokenAddress: "00e079a77f9591f05ef4c2208aff66d85b83afe8db60b398acc7b1277c58887e", Symbol: "LunaX", CoingeckoID: "lunax", Decimals: 6}, // Addr: terra14xsm2wzvu7xaf567r693vgfkhmvfs08l68h4tjj5wjgyn5ky8e2qvzyanh, Notional: 0.659216918736 - {TokenChain: 18, TokenAddress: "01fa6c6fbc36d8c245b0a852a43eb5d644e8b4c477b27bfab9537c10945939da", Symbol: "LUNA", CoingeckoID: "terra-luna-2", Decimals: 6}, // Addr: uluna, Notional: 2022.271447713852 - {TokenChain: 21, TokenAddress: "3e50a0a576877092bfaa4f8e4ec8cd7dd0a4a281bec3f806583949cf7873d07b", Symbol: "SUIP", CoingeckoID: "suipad", Decimals: 9}, // Addr: 0xe4239cd951f6c53d9c41e25270d80d31f925ad1655e5ba5b543843d4a66975ee::SUIP::SUIP, Notional: 51394.40295859124 - {TokenChain: 21, TokenAddress: "95a4518ae9e019c757df6703dce9ea5ecac8b319b9afed3a44c4d50363a66b42", Symbol: "TURBOS", CoingeckoID: "turbos-finance", Decimals: 9}, // Addr: 0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c355171f84bb1ba4a::turbos::TURBOS, Notional: 108083.37857619755 - {TokenChain: 21, TokenAddress: "9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3", Symbol: "SUI", CoingeckoID: "sui", Decimals: 9}, // Addr: 0x2::sui::SUI, Notional: 2455.53352701273 - {TokenChain: 22, TokenAddress: "0d080af8d4c0959b482427505b893d59abca4d1c9670de1a1fe02dc9d7c66728", Symbol: "tAPT", CoingeckoID: "tortuga-staked-aptos", Decimals: 8}, // Addr: 0x84d7aeef42d38a5ffc3ccef853e1b82e4958659d16a7de736a29c55fbbeb0114::staked_aptos_coin::StakedAptosCoin, Notional: 15.763180470000002 - {TokenChain: 22, TokenAddress: "74daea1908495c26f56b389614a4d4c799f072524064711c3a84e893ddb60865", Symbol: "MOVER", CoingeckoID: "mover-xyz", Decimals: 8}, // Addr: 0x14b0ef0ec69f346bea3dfa0c5a8c3942fb05c08760059948f9f24c02cd0d4fd8::mover_token::Mover, Notional: 0.08641442 - {TokenChain: 22, TokenAddress: "0cb75f840d0b043dda136e86fb2b01415a873169531ad5be0df923c12864d9bd", Symbol: "Cake", CoingeckoID: "pancakeswap-token", Decimals: 8}, // Addr: 0x159df6b7689437016108a019fd5bef736bac692b6d4a1f10c941f6fbb9a74ca6::oft::CakeOFT, Notional: 61.1064462218 - {TokenChain: 22, TokenAddress: "ec43792d3639b37cfcf7a3381d4fd71e2a7c75e708a518970eb0d475a03097cf", Symbol: "BNB", CoingeckoID: "wrapped-bnb-celer", Decimals: 8}, // Addr: 0x8d87a65ba30e09357fa2edea2c80dbac296e5dec2b18287113500b902942929d::celer_coin_manager::BnbCoin, Notional: 5.0018822532 - {TokenChain: 22, TokenAddress: "6155e0a106aeb3b0944388613027aee11c84921969ff775727e8046b17b17154", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xf22bede237a07e121b56d91a491eb7bcdfd1f5907926a9e58338f964a01b17fa::asset::USDC, Notional: 10403.467554479997 - {TokenChain: 22, TokenAddress: "5a03e1706af81b4176d7a25ec23b7ce4098f79082daf20e312d4bf6e52d2e195", Symbol: "SLT", CoingeckoID: "sui-launch-token", Decimals: 8}, // Addr: 0x8b2df69c9766e18486c37e3cfc53c6ce6e9aa58bbc606a8a0a219f24cf9eafc1::sui_launch_token::SuiLaunchToken, Notional: 0.19924399999999998 - {TokenChain: 22, TokenAddress: "a867703f5395cb2965feb7ebff5cdf39b771fc6156085da3ae4147a00be91b38", Symbol: "APT", CoingeckoID: "aptos", Decimals: 8}, // Addr: 0x1::aptos_coin::AptosCoin, Notional: 48225.1177580896 - {TokenChain: 22, TokenAddress: "eb1cbad587018a828b7e2d49456ed3e96d01baa8f7590723c558fecdfdffe842", Symbol: "ALT", CoingeckoID: "aptos-launch-token", Decimals: 8}, // Addr: 0xd0b4efb4be7c3508d9a26a9b5405cf9f860d0b9e5fe2f498b90e68b8d2cedd3e::aptos_launch_token::AptosLaunchToken, Notional: 0.04893561 - {TokenChain: 22, TokenAddress: "2603e2b07403ec1ff0315cbbeffac190f08a85dd61157c503c8f88efb2a7e123", Symbol: "MOVE", CoingeckoID: "bluemove", Decimals: 8}, // Addr: 0x27fafcc4e39daac97556af8a803dbb52bcb03f0821898dc845ac54225b9793eb::move_coin::MoveCoin, Notional: 63.53185742111385 - {TokenChain: 23, TokenAddress: "0000000000000000000000002f2a2543b76a4166549f7aab2e75bef0aefc5b0f", Symbol: "WBTC", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f, Notional: 108.04190320000001 - {TokenChain: 23, TokenAddress: "000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548", Symbol: "ARB", CoingeckoID: "arbitrum", Decimals: 18}, // Addr: 0x912ce59144191c1204e64559fe8253a0e49e6548, Notional: 6354.702299228999 - {TokenChain: 23, TokenAddress: "000000000000000000000000b261104a83887ae92392fb5ce5899fcfe5481456", Symbol: "NFTE", CoingeckoID: "nftearth", Decimals: 18}, // Addr: 0xb261104a83887ae92392fb5ce5899fcfe5481456, Notional: 0.0022393 - {TokenChain: 23, TokenAddress: "00000000000000000000000010393c20975cf177a3513071bc110f7962cd67da", Symbol: "JONES", CoingeckoID: "jones-dao", Decimals: 18}, // Addr: 0x10393c20975cf177a3513071bc110f7962cd67da, Notional: 0.0090182169 - {TokenChain: 23, TokenAddress: "0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee55", Symbol: "DPX", CoingeckoID: "dopex", Decimals: 18}, // Addr: 0x6c2c06790b3e3e3c38e12ee22f8183b37a13ee55, Notional: 0.0102414055 - {TokenChain: 23, TokenAddress: "000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d24", Symbol: "VSTA", CoingeckoID: "vesta-finance", Decimals: 18}, // Addr: 0xa684cd057951541187f288294a1e1c2646aa2d24, Notional: 0.0068381013078 - {TokenChain: 23, TokenAddress: "00000000000000000000000018c11fd286c5ec11c3b683caa813b77f5163a122", Symbol: "GNS", CoingeckoID: "gains-network", Decimals: 18}, // Addr: 0x18c11fd286c5ec11c3b683caa813b77f5163a122, Notional: 1.0052429232 - {TokenChain: 23, TokenAddress: "000000000000000000000000921f99719eb6c01b4b8f0ba7973a7c24891e740a", Symbol: "XCAD", CoingeckoID: "xcad-network", Decimals: 18}, // Addr: 0x921f99719eb6c01b4b8f0ba7973a7c24891e740a, Notional: 91.70066502499999 - {TokenChain: 23, TokenAddress: "0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", Symbol: "GRT", CoingeckoID: "the-graph", Decimals: 18}, // Addr: 0x9623063377ad1b27544c965ccd7342f7ea7e88c7, Notional: 57.97245177755241 - {TokenChain: 23, TokenAddress: "000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9, Notional: 14962.665451841658 - {TokenChain: 23, TokenAddress: "000000000000000000000000539bde0d7dbd336b79148aa742883198bbf60342", Symbol: "MAGIC", CoingeckoID: "magic", Decimals: 18}, // Addr: 0x539bde0d7dbd336b79148aa742883198bbf60342, Notional: 7.720243966044481 - {TokenChain: 23, TokenAddress: "0000000000000000000000006fd58f5a2f3468e35feb098b5f59f04157002407", Symbol: "pogai", CoingeckoID: "pogai", Decimals: 18}, // Addr: 0x6fd58f5a2f3468e35feb098b5f59f04157002407, Notional: 0.7035 - {TokenChain: 23, TokenAddress: "00000000000000000000000024ef78c7092d255ed14a0281ac1800c359af3afe", Symbol: "RAB", CoingeckoID: "rabbit-wallet", Decimals: 18}, // Addr: 0x24ef78c7092d255ed14a0281ac1800c359af3afe, Notional: 0.0457568 - {TokenChain: 23, TokenAddress: "00000000000000000000000046f74778b265df3a15ec9695ccd2fd3869ca848c", Symbol: "ANKR", CoingeckoID: "ankr", Decimals: 18}, // Addr: 0x46f74778b265df3a15ec9695ccd2fd3869ca848c, Notional: 3818.974440840855 - {TokenChain: 23, TokenAddress: "00000000000000000000000051318b7d00db7acc4026c88c3952b66278b6a67f", Symbol: "PLS", CoingeckoID: "plutusdao", Decimals: 18}, // Addr: 0x51318b7d00db7acc4026c88c3952b66278b6a67f, Notional: 0.01792676815788 - {TokenChain: 23, TokenAddress: "000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0xda10009cbd5d07dd0cecc66161fc93d7c9000da1, Notional: 62.73837593 - {TokenChain: 23, TokenAddress: "000000000000000000000000de903e2712288a1da82942dddf2c20529565ac30", Symbol: "SWPR", CoingeckoID: "swapr", Decimals: 18}, // Addr: 0xde903e2712288a1da82942dddf2c20529565ac30, Notional: 0.54473892 - {TokenChain: 23, TokenAddress: "000000000000000000000000e6045890b20945d00e6f3c01878265c03c5435d3", Symbol: "IDIA", CoingeckoID: "idia", Decimals: 18}, // Addr: 0xe6045890b20945d00e6f3c01878265c03c5435d3, Notional: 170662.39818353957 - {TokenChain: 23, TokenAddress: "000000000000000000000000289ba1701c2f088cf0faf8b3705246331cb8a839", Symbol: "LPT", CoingeckoID: "livepeer", Decimals: 18}, // Addr: 0x289ba1701c2f088cf0faf8b3705246331cb8a839, Notional: 0.0105095592 - {TokenChain: 23, TokenAddress: "000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xff970a61a04b1ca14834a43f5de4533ebddb5cc8, Notional: 1047186.8390693709 - {TokenChain: 23, TokenAddress: "00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x82af49447d8a07e3bd95bd0d56f35241523fbab1, Notional: 24733.348368925203 - {TokenChain: 23, TokenAddress: "0000000000000000000000004d15a3a2286d883af0aa1b3f21367843fac63e07", Symbol: "TUSD", CoingeckoID: "true-usd", Decimals: 18}, // Addr: 0x4d15a3a2286d883af0aa1b3f21367843fac63e07, Notional: 0.999692 - {TokenChain: 23, TokenAddress: "00000000000000000000000009090e22118b375f2c7b95420c04414e4bf68e1a", Symbol: "BELA", CoingeckoID: "beluga-protocol", Decimals: 18}, // Addr: 0x09090e22118b375f2c7b95420c04414e4bf68e1a, Notional: 0.701556 - {TokenChain: 23, TokenAddress: "0000000000000000000000000c880f6761f1af8d9aa9c466984b80dab9a8c9e8", Symbol: "PENDLE", CoingeckoID: "pendle", Decimals: 18}, // Addr: 0x0c880f6761f1af8d9aa9c466984b80dab9a8c9e8, Notional: 2.828272 - {TokenChain: 23, TokenAddress: "000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xaf88d065e77c8cc2239327c5edb3a432268e5831, Notional: 9472.025647083998 - {TokenChain: 23, TokenAddress: "000000000000000000000000a1150db5105987cec5fd092273d1e3cbb22b378b", Symbol: "OATH", CoingeckoID: "oath", Decimals: 18}, // Addr: 0xa1150db5105987cec5fd092273d1e3cbb22b378b, Notional: 10.526075194344601 - {TokenChain: 23, TokenAddress: "000000000000000000000000371c7ec6d8039ff7933a2aa28eb827ffe1f52f07", Symbol: "JOE", CoingeckoID: "joe", Decimals: 18}, // Addr: 0x371c7ec6d8039ff7933a2aa28eb827ffe1f52f07, Notional: 0.31510859999999996 - {TokenChain: 23, TokenAddress: "000000000000000000000000c628534100180582e43271448098cb2c185795bd", Symbol: "FLASH", CoingeckoID: "flash-stake", Decimals: 18}, // Addr: 0xc628534100180582e43271448098cb2c185795bd, Notional: 21.534849880046913 - {TokenChain: 24, TokenAddress: "00000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0x94b008aa00579c1307b0ef2c499ad98a8ce58e58, Notional: 175.651026242857 - {TokenChain: 24, TokenAddress: "0000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x7f5c764cbc14f9669b88837ca1490cca17c31607, Notional: 5731.838639527 - {TokenChain: 24, TokenAddress: "0000000000000000000000004200000000000000000000000000000000000006", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x4200000000000000000000000000000000000006, Notional: 555.25356 - {TokenChain: 24, TokenAddress: "000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0xda10009cbd5d07dd0cecc66161fc93d7c9000da1, Notional: 11.94135969 - {TokenChain: 24, TokenAddress: "000000000000000000000000fdb794692724153d1488ccdbe0c56c252596735f", Symbol: "LDO", CoingeckoID: "lido-dao", Decimals: 18}, // Addr: 0xfdb794692724153d1488ccdbe0c56c252596735f, Notional: 2.9482431504 - {TokenChain: 24, TokenAddress: "0000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9", Symbol: "sUSD", CoingeckoID: "nusd", Decimals: 18}, // Addr: 0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9, Notional: 1.04740978872585 - {TokenChain: 24, TokenAddress: "000000000000000000000000fd389dc9533717239856190f42475d3f263a270d", Symbol: "GRAIN", CoingeckoID: "granary", Decimals: 18}, // Addr: 0xfd389dc9533717239856190f42475d3f263a270d, Notional: 0.37027867000000003 - {TokenChain: 24, TokenAddress: "0000000000000000000000004200000000000000000000000000000000000042", Symbol: "OP", CoingeckoID: "optimism", Decimals: 18}, // Addr: 0x4200000000000000000000000000000000000042, Notional: 271.14883334840005 - {TokenChain: 28, TokenAddress: "017ce8aec5af3bb3ac0158d49771d4c8feba2e54a614fa2a1c0c95e9c4c37185", Symbol: "XPLA", CoingeckoID: "xpla", Decimals: 18}, // Addr: axpla, Notional: 1.5771036 + {TokenChain: 16, TokenAddress: "000000000000000000000000322e86852e492a7ee17f28a78c663da38fb33bfb", Symbol: "FRAX", CoingeckoID: "frax", Decimals: 18}, // Addr: 0x322e86852e492a7ee17f28a78c663da38fb33bfb, Notional: 5.00439381 + {TokenChain: 16, TokenAddress: "000000000000000000000000acc15dc74880c9944775448304b263d191c6077f", Symbol: "WGLMR", CoingeckoID: "wrapped-moonbeam", Decimals: 18}, // Addr: 0xacc15dc74880c9944775448304b263d191c6077f, Notional: 1491.4392761796908 + {TokenChain: 16, TokenAddress: "000000000000000000000000ffffffffea09fb06d082fd1275cd48b191cbcd1d", Symbol: "xcUSDT", CoingeckoID: "xcusdt", Decimals: 6}, // Addr: 0xffffffffea09fb06d082fd1275cd48b191cbcd1d, Notional: 6.828549077074 + {TokenChain: 18, TokenAddress: "00e079a77f9591f05ef4c2208aff66d85b83afe8db60b398acc7b1277c58887e", Symbol: "LunaX", CoingeckoID: "lunax", Decimals: 6}, // Addr: terra14xsm2wzvu7xaf567r693vgfkhmvfs08l68h4tjj5wjgyn5ky8e2qvzyanh, Notional: 0.49914914004300004 + {TokenChain: 18, TokenAddress: "01fa6c6fbc36d8c245b0a852a43eb5d644e8b4c477b27bfab9537c10945939da", Symbol: "LUNA", CoingeckoID: "terra-luna-2", Decimals: 6}, // Addr: uluna, Notional: 539.4705610776571 + {TokenChain: 21, TokenAddress: "3e50a0a576877092bfaa4f8e4ec8cd7dd0a4a281bec3f806583949cf7873d07b", Symbol: "SUIP", CoingeckoID: "suipad", Decimals: 9}, // Addr: 0xe4239cd951f6c53d9c41e25270d80d31f925ad1655e5ba5b543843d4a66975ee::SUIP::SUIP, Notional: 20530.493732259227 + {TokenChain: 21, TokenAddress: "95a4518ae9e019c757df6703dce9ea5ecac8b319b9afed3a44c4d50363a66b42", Symbol: "TURBOS", CoingeckoID: "turbos-finance", Decimals: 9}, // Addr: 0x5d1f47ea69bb0de31c313d7acf89b890dbb8991ea8e03c6c355171f84bb1ba4a::turbos::TURBOS, Notional: 43307.604605558925 + {TokenChain: 21, TokenAddress: "9258181f5ceac8dbffb7030890243caed69a9599d2886d957a9cb7656af3bdb3", Symbol: "SUI", CoingeckoID: "sui", Decimals: 9}, // Addr: 0x2::sui::SUI, Notional: 3578.523260627659 + {TokenChain: 22, TokenAddress: "ec43792d3639b37cfcf7a3381d4fd71e2a7c75e708a518970eb0d475a03097cf", Symbol: "BNB", CoingeckoID: "wrapped-bnb-celer", Decimals: 8}, // Addr: 0x8d87a65ba30e09357fa2edea2c80dbac296e5dec2b18287113500b902942929d::celer_coin_manager::BnbCoin, Notional: 6.2237368851 + {TokenChain: 22, TokenAddress: "6155e0a106aeb3b0944388613027aee11c84921969ff775727e8046b17b17154", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xf22bede237a07e121b56d91a491eb7bcdfd1f5907926a9e58338f964a01b17fa::asset::USDC, Notional: 10730.230423912999 + {TokenChain: 22, TokenAddress: "5a03e1706af81b4176d7a25ec23b7ce4098f79082daf20e312d4bf6e52d2e195", Symbol: "SLT", CoingeckoID: "sui-launch-token", Decimals: 8}, // Addr: 0x8b2df69c9766e18486c37e3cfc53c6ce6e9aa58bbc606a8a0a219f24cf9eafc1::sui_launch_token::SuiLaunchToken, Notional: 0.0020304 + {TokenChain: 22, TokenAddress: "a867703f5395cb2965feb7ebff5cdf39b771fc6156085da3ae4147a00be91b38", Symbol: "APT", CoingeckoID: "aptos", Decimals: 8}, // Addr: 0x1::aptos_coin::AptosCoin, Notional: 44423.6169168198 + {TokenChain: 22, TokenAddress: "2603e2b07403ec1ff0315cbbeffac190f08a85dd61157c503c8f88efb2a7e123", Symbol: "MOVE", CoingeckoID: "bluemove", Decimals: 8}, // Addr: 0x27fafcc4e39daac97556af8a803dbb52bcb03f0821898dc845ac54225b9793eb::move_coin::MoveCoin, Notional: 49.801855549825866 + {TokenChain: 22, TokenAddress: "0d080af8d4c0959b482427505b893d59abca4d1c9670de1a1fe02dc9d7c66728", Symbol: "tAPT", CoingeckoID: "tortuga-staked-aptos", Decimals: 8}, // Addr: 0x84d7aeef42d38a5ffc3ccef853e1b82e4958659d16a7de736a29c55fbbeb0114::staked_aptos_coin::StakedAptosCoin, Notional: 13.78453857 + {TokenChain: 22, TokenAddress: "0cb75f840d0b043dda136e86fb2b01415a873169531ad5be0df923c12864d9bd", Symbol: "Cake", CoingeckoID: "pancakeswap-token", Decimals: 8}, // Addr: 0x159df6b7689437016108a019fd5bef736bac692b6d4a1f10c941f6fbb9a74ca6::oft::CakeOFT, Notional: 49.6643489715 + {TokenChain: 22, TokenAddress: "b029b48ea7d6c38a48a0400a156544700a9fc7ac9b82a18a3e644326177996be", Symbol: "MOD", CoingeckoID: "move-dollar", Decimals: 8}, // Addr: 0x6f986d146e4a90b828d8c12c14b6f4e003fdff11a8eecceceb63744363eaac01::mod_coin::MOD, Notional: 0.987047 + {TokenChain: 22, TokenAddress: "eb1cbad587018a828b7e2d49456ed3e96d01baa8f7590723c558fecdfdffe842", Symbol: "ALT", CoingeckoID: "aptos-launch-token", Decimals: 8}, // Addr: 0xd0b4efb4be7c3508d9a26a9b5405cf9f860d0b9e5fe2f498b90e68b8d2cedd3e::aptos_launch_token::AptosLaunchToken, Notional: 0.02359537220425 + {TokenChain: 23, TokenAddress: "0000000000000000000000002f2a2543b76a4166549f7aab2e75bef0aefc5b0f", Symbol: "WBTC", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, // Addr: 0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f, Notional: 113.73077277 + {TokenChain: 23, TokenAddress: "000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548", Symbol: "ARB", CoingeckoID: "arbitrum", Decimals: 18}, // Addr: 0x912ce59144191c1204e64559fe8253a0e49e6548, Notional: 6017.013205637328 + {TokenChain: 23, TokenAddress: "000000000000000000000000b261104a83887ae92392fb5ce5899fcfe5481456", Symbol: "NFTE", CoingeckoID: "nftearth", Decimals: 18}, // Addr: 0xb261104a83887ae92392fb5ce5899fcfe5481456, Notional: 0.0019374 + {TokenChain: 23, TokenAddress: "00000000000000000000000010393c20975cf177a3513071bc110f7962cd67da", Symbol: "JONES", CoingeckoID: "jones-dao", Decimals: 18}, // Addr: 0x10393c20975cf177a3513071bc110f7962cd67da, Notional: 0.011923527 + {TokenChain: 23, TokenAddress: "00000000000000000000000099c409e5f62e4bd2ac142f17cafb6810b8f0baae", Symbol: "BIFI", CoingeckoID: "beefy-finance", Decimals: 18}, // Addr: 0x99c409e5f62e4bd2ac142f17cafb6810b8f0baae, Notional: 884.2256475739 + {TokenChain: 23, TokenAddress: "0000000000000000000000006c2c06790b3e3e3c38e12ee22f8183b37a13ee55", Symbol: "DPX", CoingeckoID: "dopex", Decimals: 18}, // Addr: 0x6c2c06790b3e3e3c38e12ee22f8183b37a13ee55, Notional: 0.009156024 + {TokenChain: 23, TokenAddress: "000000000000000000000000a684cd057951541187f288294a1e1c2646aa2d24", Symbol: "VSTA", CoingeckoID: "vesta-finance", Decimals: 18}, // Addr: 0xa684cd057951541187f288294a1e1c2646aa2d24, Notional: 0.0256672114356 + {TokenChain: 23, TokenAddress: "00000000000000000000000018c11fd286c5ec11c3b683caa813b77f5163a122", Symbol: "GNS", CoingeckoID: "gains-network", Decimals: 18}, // Addr: 0x18c11fd286c5ec11c3b683caa813b77f5163a122, Notional: 0.7960984224000001 + {TokenChain: 23, TokenAddress: "000000000000000000000000921f99719eb6c01b4b8f0ba7973a7c24891e740a", Symbol: "XCAD", CoingeckoID: "xcad-network", Decimals: 18}, // Addr: 0x921f99719eb6c01b4b8f0ba7973a7c24891e740a, Notional: 57.80951630909416 + {TokenChain: 23, TokenAddress: "0000000000000000000000009623063377ad1b27544c965ccd7342f7ea7e88c7", Symbol: "GRT", CoingeckoID: "the-graph", Decimals: 18}, // Addr: 0x9623063377ad1b27544c965ccd7342f7ea7e88c7, Notional: 57.09544051368276 + {TokenChain: 23, TokenAddress: "000000000000000000000000fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9, Notional: 6807.617097 + {TokenChain: 23, TokenAddress: "000000000000000000000000539bde0d7dbd336b79148aa742883198bbf60342", Symbol: "MAGIC", CoingeckoID: "magic", Decimals: 18}, // Addr: 0x539bde0d7dbd336b79148aa742883198bbf60342, Notional: 5.2345470952881605 + {TokenChain: 23, TokenAddress: "0000000000000000000000006fd58f5a2f3468e35feb098b5f59f04157002407", Symbol: "pogai", CoingeckoID: "pogai", Decimals: 18}, // Addr: 0x6fd58f5a2f3468e35feb098b5f59f04157002407, Notional: 0.8917700000000001 + {TokenChain: 23, TokenAddress: "00000000000000000000000024ef78c7092d255ed14a0281ac1800c359af3afe", Symbol: "RAB", CoingeckoID: "rabbit-wallet", Decimals: 18}, // Addr: 0x24ef78c7092d255ed14a0281ac1800c359af3afe, Notional: 0.0218644 + {TokenChain: 23, TokenAddress: "00000000000000000000000046f74778b265df3a15ec9695ccd2fd3869ca848c", Symbol: "ANKR", CoingeckoID: "ankr", Decimals: 18}, // Addr: 0x46f74778b265df3a15ec9695ccd2fd3869ca848c, Notional: 3317.9854830037216 + {TokenChain: 23, TokenAddress: "00000000000000000000000051318b7d00db7acc4026c88c3952b66278b6a67f", Symbol: "PLS", CoingeckoID: "plutusdao", Decimals: 18}, // Addr: 0x51318b7d00db7acc4026c88c3952b66278b6a67f, Notional: 0.014842991251639999 + {TokenChain: 23, TokenAddress: "000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0xda10009cbd5d07dd0cecc66161fc93d7c9000da1, Notional: 62.701548503329086 + {TokenChain: 23, TokenAddress: "000000000000000000000000de903e2712288a1da82942dddf2c20529565ac30", Symbol: "SWPR", CoingeckoID: "swapr", Decimals: 18}, // Addr: 0xde903e2712288a1da82942dddf2c20529565ac30, Notional: 0.43184163 + {TokenChain: 23, TokenAddress: "0000000000000000000000006c84a8f1c29108f47a79964b5fe888d4f4d0de40", Symbol: "tBTC", CoingeckoID: "tbtc", Decimals: 18}, // Addr: 0x6c84a8f1c29108f47a79964b5fe888d4f4d0de40, Notional: 34.023720000000004 + {TokenChain: 23, TokenAddress: "000000000000000000000000d5a56b510247db33695b0bea29992ac6670081ea", Symbol: "GOB", CoingeckoID: "goons-of-balatroon", Decimals: 18}, // Addr: 0xd5a56b510247db33695b0bea29992ac6670081ea, Notional: 9.17532982 + {TokenChain: 23, TokenAddress: "000000000000000000000000e6045890b20945d00e6f3c01878265c03c5435d3", Symbol: "IDIA", CoingeckoID: "idia", Decimals: 18}, // Addr: 0xe6045890b20945d00e6f3c01878265c03c5435d3, Notional: 98872.40707141493 + {TokenChain: 23, TokenAddress: "000000000000000000000000289ba1701c2f088cf0faf8b3705246331cb8a839", Symbol: "LPT", CoingeckoID: "livepeer", Decimals: 18}, // Addr: 0x289ba1701c2f088cf0faf8b3705246331cb8a839, Notional: 11.262820815600001 + {TokenChain: 23, TokenAddress: "000000000000000000000000ff970a61a04b1ca14834a43f5de4533ebddb5cc8", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xff970a61a04b1ca14834a43f5de4533ebddb5cc8, Notional: 2026132.9362924648 + {TokenChain: 23, TokenAddress: "00000000000000000000000082af49447d8a07e3bd95bd0d56f35241523fbab1", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x82af49447d8a07e3bd95bd0d56f35241523fbab1, Notional: 52053.9149281347 + {TokenChain: 23, TokenAddress: "0000000000000000000000004d15a3a2286d883af0aa1b3f21367843fac63e07", Symbol: "TUSD", CoingeckoID: "true-usd", Decimals: 18}, // Addr: 0x4d15a3a2286d883af0aa1b3f21367843fac63e07, Notional: 0.999693 + {TokenChain: 23, TokenAddress: "00000000000000000000000009090e22118b375f2c7b95420c04414e4bf68e1a", Symbol: "BELA", CoingeckoID: "beluga-protocol", Decimals: 18}, // Addr: 0x09090e22118b375f2c7b95420c04414e4bf68e1a, Notional: 0.248335 + {TokenChain: 23, TokenAddress: "0000000000000000000000000c880f6761f1af8d9aa9c466984b80dab9a8c9e8", Symbol: "PENDLE", CoingeckoID: "pendle", Decimals: 18}, // Addr: 0x0c880f6761f1af8d9aa9c466984b80dab9a8c9e8, Notional: 3.89769 + {TokenChain: 23, TokenAddress: "000000000000000000000000b827710314a05bcbee9180e11c2abe5823289422", Symbol: "ABI", CoingeckoID: "abachi-2", Decimals: 18}, // Addr: 0xb827710314a05bcbee9180e11c2abe5823289422, Notional: 1.91 + {TokenChain: 23, TokenAddress: "000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0xaf88d065e77c8cc2239327c5edb3a432268e5831, Notional: 14552.299858096 + {TokenChain: 23, TokenAddress: "000000000000000000000000371c7ec6d8039ff7933a2aa28eb827ffe1f52f07", Symbol: "JOE", CoingeckoID: "joe", Decimals: 18}, // Addr: 0x371c7ec6d8039ff7933a2aa28eb827ffe1f52f07, Notional: 0.26167904000000003 + {TokenChain: 23, TokenAddress: "000000000000000000000000c628534100180582e43271448098cb2c185795bd", Symbol: "FLASH", CoingeckoID: "flash-stake", Decimals: 18}, // Addr: 0xc628534100180582e43271448098cb2c185795bd, Notional: 2.407121789579211 + {TokenChain: 24, TokenAddress: "00000000000000000000000094b008aa00579c1307b0ef2c499ad98a8ce58e58", Symbol: "USDT", CoingeckoID: "tether", Decimals: 6}, // Addr: 0x94b008aa00579c1307b0ef2c499ad98a8ce58e58, Notional: 447.082361 + {TokenChain: 24, TokenAddress: "000000000000000000000000fd389dc9533717239856190f42475d3f263a270d", Symbol: "GRAIN", CoingeckoID: "granary", Decimals: 18}, // Addr: 0xfd389dc9533717239856190f42475d3f263a270d, Notional: 0.19570505 + {TokenChain: 24, TokenAddress: "0000000000000000000000007f5c764cbc14f9669b88837ca1490cca17c31607", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x7f5c764cbc14f9669b88837ca1490cca17c31607, Notional: 291028.926744556 + {TokenChain: 24, TokenAddress: "0000000000000000000000004200000000000000000000000000000000000006", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x4200000000000000000000000000000000000006, Notional: 525.4710880917 + {TokenChain: 24, TokenAddress: "0000000000000000000000008b21e9b7daf2c4325bf3d18c1beb79a347fe902a", Symbol: "COLLAB", CoingeckoID: "collab-land", Decimals: 18}, // Addr: 0x8b21e9b7daf2c4325bf3d18c1beb79a347fe902a, Notional: 0.21484995600000004 + {TokenChain: 24, TokenAddress: "000000000000000000000000da10009cbd5d07dd0cecc66161fc93d7c9000da1", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, // Addr: 0xda10009cbd5d07dd0cecc66161fc93d7c9000da1, Notional: 11.93534952486197 + {TokenChain: 24, TokenAddress: "0000000000000000000000000b2c639c533813f4aa9d7837caf62653d097ff85", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, // Addr: 0x0b2c639c533813f4aa9d7837caf62653d097ff85, Notional: 0.010110099999999999 + {TokenChain: 24, TokenAddress: "0000000000000000000000009e1028f5f1d5ede59748ffcee5532509976840e0", Symbol: "PERP", CoingeckoID: "perpetual-protocol", Decimals: 18}, // Addr: 0x9e1028f5f1d5ede59748ffcee5532509976840e0, Notional: 0.13135598141253 + {TokenChain: 24, TokenAddress: "000000000000000000000000fdb794692724153d1488ccdbe0c56c252596735f", Symbol: "LDO", CoingeckoID: "lido-dao", Decimals: 18}, // Addr: 0xfdb794692724153d1488ccdbe0c56c252596735f, Notional: 2.8681278474000003 + {TokenChain: 24, TokenAddress: "0000000000000000000000008c6f28f2f1a3c87f0f938b96d27520d9751ec8d9", Symbol: "sUSD", CoingeckoID: "nusd", Decimals: 18}, // Addr: 0x8c6f28f2f1a3c87f0f938b96d27520d9751ec8d9, Notional: 1.95293546116461 + {TokenChain: 24, TokenAddress: "00000000000000000000000014778860e937f509e651192a90589de711fb88a9", Symbol: "CYBER", CoingeckoID: "cyberconnect", Decimals: 18}, // Addr: 0x14778860e937f509e651192a90589de711fb88a9, Notional: 24.442200906 + {TokenChain: 24, TokenAddress: "0000000000000000000000004200000000000000000000000000000000000042", Symbol: "OP", CoingeckoID: "optimism", Decimals: 18}, // Addr: 0x4200000000000000000000000000000000000042, Notional: 252.75674435460002 + {TokenChain: 24, TokenAddress: "0000000000000000000000006c84a8f1c29108f47a79964b5fe888d4f4d0de40", Symbol: "tBTC", CoingeckoID: "tbtc", Decimals: 18}, // Addr: 0x6c84a8f1c29108f47a79964b5fe888d4f4d0de40, Notional: 3.67824 + {TokenChain: 28, TokenAddress: "017ce8aec5af3bb3ac0158d49771d4c8feba2e54a614fa2a1c0c95e9c4c37185", Symbol: "XPLA", CoingeckoID: "xpla", Decimals: 18}, // Addr: axpla, Notional: 0.7660692000000001 + {TokenChain: 30, TokenAddress: "0000000000000000000000004200000000000000000000000000000000000006", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, // Addr: 0x4200000000000000000000000000000000000006, Notional: 10351.6388705625 + {TokenChain: 30, TokenAddress: "000000000000000000000000eb466342c4d449bc9f53a865d5cb90586f405215", Symbol: "axlUSDC", CoingeckoID: "axlusdc", Decimals: 6}, // Addr: 0xeb466342c4d449bc9f53a865d5cb90586f405215, Notional: 100.470875092 + {TokenChain: 30, TokenAddress: "000000000000000000000000d9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca", Symbol: "USDbC", CoingeckoID: "bridged-usd-coin-base", Decimals: 6}, // Addr: 0xd9aaec86b65d86f6a7b5b1b0c42ffa531710b6ca, Notional: 15.999438 } } diff --git a/common/domain/testnet_tokens.go b/common/domain/testnet_tokens.go new file mode 100644 index 00000000..752488db --- /dev/null +++ b/common/domain/testnet_tokens.go @@ -0,0 +1,16 @@ +package domain + +func manualTestnetTokenList() []TokenMetadata { + return []TokenMetadata{ + {TokenChain: 1, TokenAddress: "069b8857feab8184fb687f634618c035dac439dc1aeb3b5598a0f00000000001", Symbol: "SOL", CoingeckoID: "wrapped-solana", Decimals: 9}, + {TokenChain: 2, TokenAddress: "000000000000000000000000b4fbf271143f4fbf7b91a5ded31805e42b2208d6", Symbol: "WETH", CoingeckoID: "weth", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000011fe4b6ae13d2a6055c8d9cf65c55bac32b5d844", Symbol: "DAI", CoingeckoID: "dai", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000ae13d989dac2f0debff460ac112a837c89baa7cd", Symbol: "WBNB", CoingeckoID: "wbnb", Decimals: 18}, + {TokenChain: 5, TokenAddress: "0000000000000000000000009c3c9283d3e44854697cd22d3faa240cfb032889", Symbol: "WMATIC", CoingeckoID: "wmatic", Decimals: 18}, + {TokenChain: 6, TokenAddress: "0000000000000000000000005425890298aed601595a70ab815c96711a31bc65", Symbol: "USDC", CoingeckoID: "usd-coin", Decimals: 6}, + {TokenChain: 6, TokenAddress: "000000000000000000000000d00ae08403b9bbb9124bb305c09058e32c39a48c", Symbol: "WAVAX", CoingeckoID: "wrapped-avax", Decimals: 18}, + {TokenChain: 10, TokenAddress: "000000000000000000000000f1277d1ed8ad466beddf92ef448a132661956621", Symbol: "WFTM", CoingeckoID: "wrapped-fantom", Decimals: 18}, + {TokenChain: 14, TokenAddress: "000000000000000000000000f194afdf50b03e69bd7d057c1aa9e10c9954e4c9", Symbol: "CELO", CoingeckoID: "celo", Decimals: 18}, + {TokenChain: 16, TokenAddress: "000000000000000000000000d909178cc99d318e4d46e7e66a972955859670e1", Symbol: "GLMR", CoingeckoID: "wrapped-moonbeam", Decimals: 18}, + {TokenChain: 21, TokenAddress: "587c29de216efd4219573e08a1f6964d4fa7cb714518c2c8a0f29abfa264327d", Symbol: "SUI", CoingeckoID: "sui", Decimals: 9}} +} diff --git a/common/domain/tokens.go b/common/domain/tokens.go index 959a38c3..02f04b06 100644 --- a/common/domain/tokens.go +++ b/common/domain/tokens.go @@ -24,20 +24,37 @@ type TokenMetadata struct { Decimals int64 } -var ( - tokenMetadata = generatedMainnetTokenList() - tokenMetadataByContractID = make(map[string]*TokenMetadata) - tokenMetadataByCoingeckoID = make(map[string]*TokenMetadata) -) +type TokenProvider struct { + p2pNetwork string + tokenMetadata []TokenMetadata + tokenMetadataByContractID map[string]*TokenMetadata + tokenMetadataByCoingeckoID map[string]*TokenMetadata +} func (t *TokenMetadata) GetTokenID() string { return fmt.Sprintf("%d/%s", t.TokenChain, t.TokenAddress) } -func init() { +func makeContractID(tokenChain sdk.ChainID, tokenAddress string) string { + return fmt.Sprintf("%d-%s", tokenChain, tokenAddress) +} + +func NewTokenProvider(p2pNetwork string) *TokenProvider { + var tokenMetadata []TokenMetadata + + switch p2pNetwork { + case P2pMainNet: + tokenMetadata = generatedMainnetTokenList() + case P2pTestNet: + tokenMetadata = manualTestnetTokenList() + default: + panic(fmt.Sprintf("unknown p2p network: %s", p2pNetwork)) + } + + tokenMetadataByContractID := make(map[string]*TokenMetadata) + tokenMetadataByCoingeckoID := make(map[string]*TokenMetadata) for i := range tokenMetadata { - // populate the map `tokenMetadataByCoingeckoID` coingeckoID := tokenMetadata[i].CoingeckoID if coingeckoID != "" { @@ -50,26 +67,28 @@ func init() { tokenMetadataByContractID[contractID] = &tokenMetadata[i] } } -} - -func makeContractID(tokenChain sdk.ChainID, tokenAddress string) string { - return fmt.Sprintf("%d-%s", tokenChain, tokenAddress) + return &TokenProvider{ + p2pNetwork: p2pNetwork, + tokenMetadata: tokenMetadata, + tokenMetadataByContractID: tokenMetadataByContractID, + tokenMetadataByCoingeckoID: tokenMetadataByCoingeckoID, + } } // GetAllTokens returns a list of all tokens that exist in the database. // // The caller must not modify the `[]TokenMetadata` returned. -func GetAllTokens() []TokenMetadata { - return tokenMetadata +func (t *TokenProvider) GetAllTokens() []TokenMetadata { + return t.tokenMetadata } // GetAllCoingeckoIDs returns a list of all coingecko IDs that exist in the database. -func GetAllCoingeckoIDs() []string { +func (t *TokenProvider) GetAllCoingeckoIDs() []string { // use a map to remove duplicates - uniqueIDs := make(map[string]bool, len(tokenMetadata)) - for i := range tokenMetadata { - uniqueIDs[tokenMetadata[i].CoingeckoID] = true + uniqueIDs := make(map[string]bool, len(t.tokenMetadata)) + for i := range t.tokenMetadata { + uniqueIDs[t.tokenMetadata[i].CoingeckoID] = true } // collect keys into a slice @@ -84,9 +103,9 @@ func GetAllCoingeckoIDs() []string { // GetTokenByCoingeckoID returns information about a token identified by its coingecko ID. // // The caller must not modify the `*TokenMetadata` returned. -func GetTokenByCoingeckoID(coingeckoID string) (*TokenMetadata, bool) { +func (t *TokenProvider) GetTokenByCoingeckoID(coingeckoID string) (*TokenMetadata, bool) { - result, ok := tokenMetadataByCoingeckoID[coingeckoID] + result, ok := t.tokenMetadataByCoingeckoID[coingeckoID] if !ok { return nil, false } @@ -97,14 +116,18 @@ func GetTokenByCoingeckoID(coingeckoID string) (*TokenMetadata, bool) { // GetTokenByAddress returns information about a token identified by its original mint address. // // The caller must not modify the `*TokenMetadata` returned. -func GetTokenByAddress(tokenChain sdk.ChainID, tokenAddress string) (*TokenMetadata, bool) { +func (t *TokenProvider) GetTokenByAddress(tokenChain sdk.ChainID, tokenAddress string) (*TokenMetadata, bool) { key := makeContractID(tokenChain, tokenAddress) - result, ok := tokenMetadataByContractID[key] + result, ok := t.tokenMetadataByContractID[key] if !ok { return nil, false } return result, true } + +func (t *TokenProvider) GetP2pNewtork() string { + return t.p2pNetwork +} diff --git a/common/events/types.go b/common/events/types.go new file mode 100644 index 00000000..5442b51b --- /dev/null +++ b/common/events/types.go @@ -0,0 +1,74 @@ +package events + +import ( + "encoding/json" + "time" +) + +const ( + SignedVaaType = "signed-vaa" + LogMessagePublishedMesageType = "log-message-published" +) + +type NotificationEvent struct { + TrackID string `json:"trackId"` + Source string `json:"source"` + Event string `json:"event"` + Version string `json:"version"` + Timestamp time.Time `json:"timestamp"` + Data json.RawMessage `json:"data"` +} + +func NewNotificationEvent[T EventData](trackID, source, _type string, data T) (*NotificationEvent, error) { + p, err := json.Marshal(data) + if err != nil { + return nil, err + } + return &NotificationEvent{ + TrackID: trackID, + Source: source, + Event: _type, + Data: json.RawMessage(p), + Version: "1", + Timestamp: time.Now(), + }, nil +} + +type EventData interface { + SignedVaa | LogMessagePublished +} + +func GetEventData[T EventData](e *NotificationEvent) (T, error) { + var data T + err := json.Unmarshal(e.Data, &data) + return data, err +} + +type SignedVaa struct { + ID string `json:"id"` + EmitterChain uint16 `json:"emitterChain"` + EmitterAddress string `json:"emitterAddress"` + Sequence uint64 `json:"sequence"` + GuardianSetIndex uint32 `json:"guardianSetIndex"` + Timestamp time.Time `json:"timestamp"` + Vaa []byte `json:"vaa"` + TxHash string `json:"txHash"` + Version int `json:"version"` +} + +type LogMessagePublished struct { + ChainID uint16 `json:"chainId"` + Emitter string `json:"emitter"` + TxHash string `json:"txHash"` + BlockHeight string `json:"blockHeight"` + BlockTime time.Time `json:"blockTime"` + Attributes PublishedLogMessageAttributes `json:"attributes"` +} + +type PublishedLogMessageAttributes struct { + Sender string `json:"sender"` + Sequence uint64 `json:"sequence"` + Nonce uint32 `json:"nonce"` + Payload string `json:"payload"` + ConsistencyLevel uint8 `json:"consistencyLevel"` +} diff --git a/common/domain/events_test.go b/common/events/types_test.go similarity index 88% rename from common/domain/events_test.go rename to common/events/types_test.go index fd66277d..f9759643 100644 --- a/common/domain/events_test.go +++ b/common/events/types_test.go @@ -1,4 +1,4 @@ -package domain +package events import ( "encoding/json" @@ -13,8 +13,8 @@ func Test_GetEventPayload(t *testing.T) { body := `{ "trackId": "63e16082da939a263512a307", "source": "fly", - "type": "signed-vaa", - "payload": { + "event": "signed-vaa", + "data": { "id": "2/000000000000000000000000f890982f9310df57d00f659cf4fd87e65aded8d7/162727", "emitterChain": 2, "emitterAddr": "000000000000000000000000f890982f9310df57d00f659cf4fd87e65aded8d7", @@ -32,8 +32,8 @@ func Test_GetEventPayload(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "63e16082da939a263512a307", event.TrackID) assert.Equal(t, "fly", event.Source) - assert.Equal(t, SignedVaaType, event.Type) - signedVaa, err := GetEventPayload[SignedVaa](&event) + assert.Equal(t, SignedVaaType, event.Event) + signedVaa, err := GetEventData[SignedVaa](&event) assert.NoError(t, err) assert.Equal(t, "2/000000000000000000000000f890982f9310df57d00f659cf4fd87e65aded8d7/162727", signedVaa.ID) } @@ -43,7 +43,7 @@ func Test_GetEventPayload_Error(t *testing.T) { body := `{ "trackId": "63e16082da939a263512a307", "source": "fly", - "type": "signed-vaa" + "event": "signed-vaa" }` event := NotificationEvent{} @@ -51,7 +51,7 @@ func Test_GetEventPayload_Error(t *testing.T) { assert.NoError(t, err) assert.Equal(t, "63e16082da939a263512a307", event.TrackID) assert.Equal(t, "fly", event.Source) - assert.Equal(t, SignedVaaType, event.Type) - _, err = GetEventPayload[SignedVaa](&event) + assert.Equal(t, SignedVaaType, event.Event) + _, err = GetEventData[SignedVaa](&event) assert.Error(t, err) } diff --git a/common/events/vaa.go b/common/events/vaa.go new file mode 100644 index 00000000..0d5d0abd --- /dev/null +++ b/common/events/vaa.go @@ -0,0 +1,35 @@ +package events + +import ( + "encoding/hex" + "fmt" + "strings" + + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" +) + +func CreateUnsignedVAA(plm *LogMessagePublished) (*sdk.VAA, error) { + + address, err := sdk.StringToAddress(plm.Attributes.Sender) + if err != nil { + return nil, fmt.Errorf("error converting emitter address: %w", err) + } + payload, err := hex.DecodeString(strings.TrimPrefix(plm.Attributes.Payload, "0x")) + if err != nil { + return nil, fmt.Errorf("error converting payload: %w", err) + } + + vaa := sdk.VAA{ + Version: sdk.SupportedVAAVersion, + GuardianSetIndex: 1, + EmitterChain: sdk.ChainID(plm.ChainID), + EmitterAddress: address, + Sequence: plm.Attributes.Sequence, + Timestamp: plm.BlockTime, + Payload: payload, + Nonce: plm.Attributes.Nonce, + ConsistencyLevel: plm.Attributes.ConsistencyLevel, + } + + return &vaa, nil +} diff --git a/tx-tracker/http/infrastructure/controller.go b/common/health/controller.go similarity index 84% rename from tx-tracker/http/infrastructure/controller.go rename to common/health/controller.go index 7fe9e6f1..74c61129 100644 --- a/tx-tracker/http/infrastructure/controller.go +++ b/common/health/controller.go @@ -1,21 +1,20 @@ -package infrastructure +package health import ( "fmt" "github.com/gofiber/fiber/v2" - "github.com/wormhole-foundation/wormhole-explorer/common/health" "go.uber.org/zap" ) // Controller definition. type Controller struct { - checks []health.Check + checks []Check logger *zap.Logger } // NewController creates a Controller instance. -func NewController(checks []health.Check, logger *zap.Logger) *Controller { +func NewController(checks []Check, logger *zap.Logger) *Controller { return &Controller{checks: checks, logger: logger} } diff --git a/contract-watcher/go.mod b/contract-watcher/go.mod index 1fbac4cc..9b9f0528 100644 --- a/contract-watcher/go.mod +++ b/contract-watcher/go.mod @@ -45,10 +45,12 @@ require ( github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.12.4 // indirect github.com/dfuse-io/logging v0.0.0-20201110202154-26697de88c79 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/ethereum/go-ethereum v1.11.3 // indirect github.com/fatih/color v1.9.0 // indirect github.com/gagliardetto/binary v0.7.7 // indirect github.com/gagliardetto/treeout v0.1.4 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/gofiber/adaptor/v2 v2.1.31 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/protobuf v1.5.2 // indirect diff --git a/contract-watcher/go.sum b/contract-watcher/go.sum index 37529aac..0fe4595d 100644 --- a/contract-watcher/go.sum +++ b/contract-watcher/go.sum @@ -133,6 +133,8 @@ github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGn github.com/dfuse-io/logging v0.0.0-20201110202154-26697de88c79 h1:+HRtcJejUYA/2rnyTMbOaZ4g7f4aVuFduTV/03dbpLY= github.com/dfuse-io/logging v0.0.0-20201110202154-26697de88c79/go.mod h1:V+ED4kT/t/lKtH99JQmKIb0v9WL3VaYkJ36CfHlVECI= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -144,6 +146,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/gagliardetto/binary v0.7.7 h1:QZpT38+sgoPg+TIQjH94sLbl/vX+nlIRA37pEyOsjfY= github.com/gagliardetto/binary v0.7.7/go.mod h1:mUuay5LL8wFVnIlecHakSZMvcdqfs+CsotR5n77kyjM= github.com/gagliardetto/gofuzz v1.2.2/go.mod h1:bkH/3hYLZrMLbfYWA0pWzXmi5TTRZnu4pMGZBkqMKvY= @@ -163,6 +166,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -364,12 +369,14 @@ github.com/near/borsh-go v0.3.1 h1:ukNbhJlPKxfua0/nIuMZhggSU8zvtRP/VyC25LLqPUA= github.com/near/borsh-go v0.3.1/go.mod h1:NeMochZp7jN/pYFuxLkrZtmLqbADmnp/y1+/dL+AsyQ= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.19 h1:JernwK3Bgd5x+UJPV6S2LPYoBF+DFOYBoQ5JeJPVBNc= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.19/go.mod h1:4OjcxgwdXzezqytxN534MooNmrxRD50geWZxTD7845s= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -807,7 +814,6 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -899,6 +905,7 @@ gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/contract-watcher/watcher/watcher_test.go b/contract-watcher/watcher/watcher_test.go index 3409387f..084c214c 100644 --- a/contract-watcher/watcher/watcher_test.go +++ b/contract-watcher/watcher/watcher_test.go @@ -198,7 +198,7 @@ func TestCheckTxShouldBeUpdated(t *testing.T) { inputGetGlobalTransactionByIDFunc: func(ctx context.Context, id string) (storage.TransactionUpdate, error) { return storage.TransactionUpdate{}, storage.ErrDocNotFound }, - expectedUpdate: true, + expectedUpdate: false, expectedError: ErrInvalidTxStatus, }, } @@ -208,7 +208,7 @@ func TestCheckTxShouldBeUpdated(t *testing.T) { t.Run(tc.name, func(t *testing.T) { update, err := checkTxShouldBeUpdated(context.Background(), tc.inputTx, tc.inputGetGlobalTransactionByIDFunc) if update != tc.expectedUpdate { - t.Errorf("expected update %v, got %v", tc.expectedUpdate, update) + t.Errorf("%s - expected update %v, got %v", tc.name, tc.expectedUpdate, update) } if err != tc.expectedError { t.Errorf("expected error %v, got %v", tc.expectedError, err) diff --git a/deploy/analytics/analytics-service.yaml b/deploy/analytics/analytics-service.yaml index 1b106533..bcb01d73 100644 --- a/deploy/analytics/analytics-service.yaml +++ b/deploy/analytics/analytics-service.yaml @@ -46,10 +46,21 @@ spec: value: "8000" - name: LOG_LEVEL value: "INFO" - - name: SQS_URL - value: {{ .SQS_URL }} + - name: PIPELINE_SQS_URL + valueFrom: + configMapKeyRef: + name: analytics + key: pipeline-sqs-url + - name: NOTIFICATIONS_SQS_URL + valueFrom: + configMapKeyRef: + name: analytics + key: notifications-sqs-url - name: AWS_REGION - value: {{ .SQS_AWS_REGION }} + valueFrom: + configMapKeyRef: + name: analytics + key: aws-region - name: PPROF_ENABLED value: "{{ .PPROF_ENABLED }}" - name: P2P_NETWORK diff --git a/deploy/analytics/configmap.yaml b/deploy/analytics/configmap.yaml new file mode 100644 index 00000000..af922f19 --- /dev/null +++ b/deploy/analytics/configmap.yaml @@ -0,0 +1,10 @@ +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: analytics + namespace: {{ .NAMESPACE }} +data: + aws-region: {{ .SQS_AWS_REGION }} + pipeline-sqs-url: {{ .PIPELINE_SQS_URL }} + notifications-sqs-url: {{ .NOTIFICATIONS_SQS_URL }} \ No newline at end of file diff --git a/deploy/analytics/env/production-mainnet.env b/deploy/analytics/env/production-mainnet.env index 75f73fa3..29becc43 100644 --- a/deploy/analytics/env/production-mainnet.env +++ b/deploy/analytics/env/production-mainnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=64Mi RESOURCES_LIMITS_CPU=200m RESOURCES_REQUESTS_MEMORY=32Mi RESOURCES_REQUESTS_CPU=100m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= P2P_NETWORK=mainnet PPROF_ENABLED=false diff --git a/deploy/analytics/env/production-testnet.env b/deploy/analytics/env/production-testnet.env index d7bab346..de3913a5 100644 --- a/deploy/analytics/env/production-testnet.env +++ b/deploy/analytics/env/production-testnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=128Mi RESOURCES_LIMITS_CPU=200m RESOURCES_REQUESTS_MEMORY=64Mi RESOURCES_REQUESTS_CPU=100m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= P2P_NETWORK=testnet PPROF_ENABLED=false diff --git a/deploy/analytics/env/staging-mainnet.env b/deploy/analytics/env/staging-mainnet.env index 26cfc1a7..48c930aa 100644 --- a/deploy/analytics/env/staging-mainnet.env +++ b/deploy/analytics/env/staging-mainnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=64Mi RESOURCES_LIMITS_CPU=200m RESOURCES_REQUESTS_MEMORY=32Mi RESOURCES_REQUESTS_CPU=100m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= P2P_NETWORK=mainnet PPROF_ENABLED=true diff --git a/deploy/analytics/env/staging-testnet.env b/deploy/analytics/env/staging-testnet.env index 45773d9c..8c1ef36f 100644 --- a/deploy/analytics/env/staging-testnet.env +++ b/deploy/analytics/env/staging-testnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=128Mi RESOURCES_LIMITS_CPU=200m RESOURCES_REQUESTS_MEMORY=64Mi RESOURCES_REQUESTS_CPU=100m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= P2P_NETWORK=testnet PPROF_ENABLED=false diff --git a/deploy/blockchain-watcher/env/staging-testnet.env b/deploy/blockchain-watcher/env/staging-testnet.env index ad445672..efa4e7e4 100644 --- a/deploy/blockchain-watcher/env/staging-testnet.env +++ b/deploy/blockchain-watcher/env/staging-testnet.env @@ -18,4 +18,4 @@ SNS_TOPIC_ARN= SNS_REGION= SOLANA_RPCS='[""]' -AWS_IAM_ROLE= \ No newline at end of file +AWS_IAM_ROLE= diff --git a/deploy/blockchain-watcher/workers/solana.yaml b/deploy/blockchain-watcher/workers/solana.yaml index e812b32c..95c26e0d 100644 --- a/deploy/blockchain-watcher/workers/solana.yaml +++ b/deploy/blockchain-watcher/workers/solana.yaml @@ -46,8 +46,9 @@ data: "commitment": "confirmed", "interval": 5000, "signaturesLimit": 100, - "programId": "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5", - "chain": "solana" + "programId": "Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o", + "chain": "solana", + "network": "devnet" } }, "handlers": [ @@ -56,7 +57,7 @@ data: "target": "sns", "mapper": "solanaLogMessagePublishedMapper", "config": { - "programId": "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5" + "programId": "Bridge1p5gheXUvJ6jGWGeCsgPKgnE3YgdGKRVCMY9o" } } ] diff --git a/deploy/jobs/env/production-testnet.env b/deploy/jobs/env/production-testnet.env index 5934885f..35af4a70 100644 --- a/deploy/jobs/env/production-testnet.env +++ b/deploy/jobs/env/production-testnet.env @@ -6,7 +6,7 @@ RESOURCES_LIMITS_MEMORY=30Mi RESOURCES_LIMITS_CPU=20m RESOURCES_REQUESTS_MEMORY=15Mi RESOURCES_REQUESTS_CPU=10m -P2P_NETWORK=mainnet +P2P_NETWORK=testnet COINGECKO_URL=https://api.coingecko.com/api/v3 NOTIONAL_CHANNEL=WORMSCAN:NOTIONAL LOG_LEVEL=INFO diff --git a/deploy/jobs/env/staging-testnet.env b/deploy/jobs/env/staging-testnet.env index d2c58911..6d968bfe 100644 --- a/deploy/jobs/env/staging-testnet.env +++ b/deploy/jobs/env/staging-testnet.env @@ -6,7 +6,7 @@ RESOURCES_LIMITS_MEMORY=30Mi RESOURCES_LIMITS_CPU=20m RESOURCES_REQUESTS_MEMORY=15Mi RESOURCES_REQUESTS_CPU=10m -P2P_NETWORK=mainnet +P2P_NETWORK=testnet COINGECKO_URL=https://api.coingecko.com/api/v3 NOTIONAL_CHANNEL=WORMSCAN:NOTIONAL LOG_LEVEL=INFO diff --git a/deploy/parser/configmap.yaml b/deploy/parser/configmap.yaml new file mode 100644 index 00000000..0e812146 --- /dev/null +++ b/deploy/parser/configmap.yaml @@ -0,0 +1,10 @@ +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: parser + namespace: {{ .NAMESPACE }} +data: + aws-region: {{ .SQS_AWS_REGION }} + pipeline-sqs-url: {{ .PIPELINE_SQS_URL }} + notifications-sqs-url: {{ .NOTIFICATIONS_SQS_URL }} \ No newline at end of file diff --git a/deploy/parser/env/production-mainnet.env b/deploy/parser/env/production-mainnet.env index a36ef5ac..d02dd3a5 100644 --- a/deploy/parser/env/production-mainnet.env +++ b/deploy/parser/env/production-mainnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=256Mi RESOURCES_LIMITS_CPU=500m RESOURCES_REQUESTS_MEMORY=128Mi RESOURCES_REQUESTS_CPU=250m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= VAA_PAYLOAD_PARSER_URL=http://wormscan-vaa-payload-parser.wormscan VAA_PAYLOAD_PARSER_TIMEOUT=10 diff --git a/deploy/parser/env/production-testnet.env b/deploy/parser/env/production-testnet.env index 48dae70a..9db0f50f 100644 --- a/deploy/parser/env/production-testnet.env +++ b/deploy/parser/env/production-testnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=30Mi RESOURCES_LIMITS_CPU=20m RESOURCES_REQUESTS_MEMORY=15Mi RESOURCES_REQUESTS_CPU=10m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= VAA_PAYLOAD_PARSER_URL=http://wormscan-vaa-payload-parser.wormscan-testnet VAA_PAYLOAD_PARSER_TIMEOUT=10 diff --git a/deploy/parser/env/staging-mainnet.env b/deploy/parser/env/staging-mainnet.env index 061369fb..3f0e7cf2 100644 --- a/deploy/parser/env/staging-mainnet.env +++ b/deploy/parser/env/staging-mainnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=256Mi RESOURCES_LIMITS_CPU=500m RESOURCES_REQUESTS_MEMORY=128Mi RESOURCES_REQUESTS_CPU=250m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= VAA_PAYLOAD_PARSER_URL=http://wormscan-vaa-payload-parser.wormscan VAA_PAYLOAD_PARSER_TIMEOUT=10 diff --git a/deploy/parser/env/staging-testnet.env b/deploy/parser/env/staging-testnet.env index 74830971..926cf20d 100644 --- a/deploy/parser/env/staging-testnet.env +++ b/deploy/parser/env/staging-testnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=30Mi RESOURCES_LIMITS_CPU=20m RESOURCES_REQUESTS_MEMORY=15Mi RESOURCES_REQUESTS_CPU=10m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= VAA_PAYLOAD_PARSER_URL=http://wormscan-vaa-payload-parser.wormscan-testnet VAA_PAYLOAD_PARSER_TIMEOUT=10 diff --git a/deploy/parser/parser-service.yaml b/deploy/parser/parser-service.yaml index 254f94a2..8509d321 100644 --- a/deploy/parser/parser-service.yaml +++ b/deploy/parser/parser-service.yaml @@ -56,10 +56,21 @@ spec: configMapKeyRef: name: config key: mongo-database - - name: SQS_URL - value: {{ .SQS_URL }} + - name: PIPELINE_SQS_URL + valueFrom: + configMapKeyRef: + name: parser + key: pipeline-sqs-url + - name: NOTIFICATIONS_SQS_URL + valueFrom: + configMapKeyRef: + name: parser + key: notifications-sqs-url - name: AWS_REGION - value: {{ .SQS_AWS_REGION }} + valueFrom: + configMapKeyRef: + name: parser + key: aws-region - name: VAA_PAYLOAD_PARSER_URL value: {{ .VAA_PAYLOAD_PARSER_URL }} - name: VAA_PAYLOAD_PARSER_TIMEOUT diff --git a/deploy/tx-tracker/configmap.yaml b/deploy/tx-tracker/configmap.yaml new file mode 100644 index 00000000..77af563d --- /dev/null +++ b/deploy/tx-tracker/configmap.yaml @@ -0,0 +1,10 @@ +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: tx-tracker + namespace: {{ .NAMESPACE }} +data: + aws-region: {{ .SQS_AWS_REGION }} + pipeline-sqs-url: {{ .PIPELINE_SQS_URL }} + notifications-sqs-url: {{ .NOTIFICATIONS_SQS_URL }} diff --git a/deploy/tx-tracker/env/production-mainnet.env b/deploy/tx-tracker/env/production-mainnet.env index 5a3352c0..be3cc388 100644 --- a/deploy/tx-tracker/env/production-mainnet.env +++ b/deploy/tx-tracker/env/production-mainnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=256Mi RESOURCES_LIMITS_CPU=500m RESOURCES_REQUESTS_MEMORY=128Mi RESOURCES_REQUESTS_CPU=250m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= P2P_NETWORK=mainnet AWS_IAM_ROLE= @@ -40,6 +41,9 @@ CELO_REQUESTS_PER_MINUTE=12 ETHEREUM_BASE_URL=https://rpc.ankr.com/eth ETHEREUM_REQUESTS_PER_MINUTE=12 +EVMOS_BASE_URL=https://tm.evmos.lava.build +EVMOS_REQUESTS_PER_MINUTE=12 + FANTOM_BASE_URL=https://rpc.ankr.com/fantom FANTOM_REQUESTS_PER_MINUTE=12 @@ -54,6 +58,9 @@ KARURA_REQUESTS_PER_MINUTE=12 KLAYTN_BASE_URL=https://klaytn-mainnet-rpc.allthatnode.com:8551 KLAYTN_REQUESTS_PER_MINUTE=12 +KUJIRA_BASE_URL=https://kujira-rpc.ibs.team +KUJIRA_REQUESTS_PER_MINUTE=12 + MOONBEAM_BASE_URL=https://rpc.api.moonbeam.network MOONBEAM_REQUESTS_PER_MINUTE=12 @@ -69,6 +76,9 @@ OSMOSIS_REQUESTS_PER_MINUTE=12 POLYGON_BASE_URL=https://rpc.ankr.com/polygon POLYGON_REQUESTS_PER_MINUTE=12 +SEI_BASE_URL=https://rpc.ankr.com/sei +SEI_REQUESTS_PER_MINUTE=12 + SOLANA_BASE_URL=https://api.mainnet-beta.solana.com SOLANA_REQUESTS_PER_MINUTE=12 diff --git a/deploy/tx-tracker/env/production-testnet.env b/deploy/tx-tracker/env/production-testnet.env index 3060e4a6..3740cfa5 100644 --- a/deploy/tx-tracker/env/production-testnet.env +++ b/deploy/tx-tracker/env/production-testnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=30Mi RESOURCES_LIMITS_CPU=20m RESOURCES_REQUESTS_MEMORY=15Mi RESOURCES_REQUESTS_CPU=10m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= P2P_NETWORK=testnet AWS_IAM_ROLE= @@ -40,6 +41,9 @@ CELO_REQUESTS_PER_MINUTE=12 ETHEREUM_BASE_URL=https://rpc.ankr.com/eth_goerli ETHEREUM_REQUESTS_PER_MINUTE=12 +EVMOS_BASE_URL=https://evmos-testnet-rpc.polkachu.com +EVMOS_REQUESTS_PER_MINUTE=12 + FANTOM_BASE_URL=https://rpc.testnet.fantom.network FANTOM_REQUESTS_PER_MINUTE=12 @@ -52,6 +56,9 @@ KARURA_REQUESTS_PER_MINUTE=12 KLAYTN_BASE_URL=https://api.baobab.klaytn.net:8651 KLAYTN_REQUESTS_PER_MINUTE=12 +KUJIRA_BASE_URL=https://kujira-testnet-rpc.polkachu.com +KUJIRA_REQUESTS_PER_MINUTE=12 + MOONBEAM_BASE_URL=https://rpc.api.moonbase.moonbeam.network MOONBEAM_REQUESTS_PER_MINUTE=12 @@ -67,6 +74,9 @@ OSMOSIS_REQUESTS_PER_MINUTE=12 POLYGON_BASE_URL=https://rpc.ankr.com/polygon_mumbai POLYGON_REQUESTS_PER_MINUTE=12 +SEI_BASE_URL=https://sei-a2-rpc.brocha.in +SEI_REQUESTS_PER_MINUTE=12 + SOLANA_BASE_URL=https://api.devnet.solana.com SOLANA_REQUESTS_PER_MINUTE=12 diff --git a/deploy/tx-tracker/env/staging-mainnet.env b/deploy/tx-tracker/env/staging-mainnet.env index 23c5a161..915ec6bf 100644 --- a/deploy/tx-tracker/env/staging-mainnet.env +++ b/deploy/tx-tracker/env/staging-mainnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=30Mi RESOURCES_LIMITS_CPU=60m RESOURCES_REQUESTS_MEMORY=15Mi RESOURCES_REQUESTS_CPU=40m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= P2P_NETWORK=mainnet AWS_IAM_ROLE= @@ -40,6 +41,9 @@ CELO_REQUESTS_PER_MINUTE=12 ETHEREUM_BASE_URL=https://rpc.ankr.com/eth ETHEREUM_REQUESTS_PER_MINUTE=12 +EVMOS_BASE_URL=https://tm.evmos.lava.build +EVMOS_REQUESTS_PER_MINUTE=12 + FANTOM_BASE_URL=https://rpc.ankr.com/fantom FANTOM_REQUESTS_PER_MINUTE=12 @@ -54,6 +58,9 @@ KARURA_REQUESTS_PER_MINUTE=12 KLAYTN_BASE_URL=https://klaytn-mainnet-rpc.allthatnode.com:8551 KLAYTN_REQUESTS_PER_MINUTE=12 +KUJIRA_BASE_URL=https://kujira-rpc.ibs.team +KUJIRA_REQUESTS_PER_MINUTE=12 + MOONBEAM_BASE_URL=https://rpc.api.moonbeam.network MOONBEAM_REQUESTS_PER_MINUTE=12 @@ -69,6 +76,9 @@ OSMOSIS_REQUESTS_PER_MINUTE=12 POLYGON_BASE_URL=https://rpc.ankr.com/polygon POLYGON_REQUESTS_PER_MINUTE=12 +SEI_BASE_URL=https://rpc.ankr.com/sei +SEI_REQUESTS_PER_MINUTE=12 + SOLANA_BASE_URL=https://api.mainnet-beta.solana.com SOLANA_REQUESTS_PER_MINUTE=12 diff --git a/deploy/tx-tracker/env/staging-testnet.env b/deploy/tx-tracker/env/staging-testnet.env index 154aeaa0..b1132847 100644 --- a/deploy/tx-tracker/env/staging-testnet.env +++ b/deploy/tx-tracker/env/staging-testnet.env @@ -7,7 +7,8 @@ RESOURCES_LIMITS_MEMORY=30Mi RESOURCES_LIMITS_CPU=20m RESOURCES_REQUESTS_MEMORY=15Mi RESOURCES_REQUESTS_CPU=10m -SQS_URL= +PIPELINE_SQS_URL= +NOTIFICATIONS_SQS_URL= SQS_AWS_REGION= P2P_NETWORK=testnet AWS_IAM_ROLE= @@ -40,6 +41,9 @@ CELO_REQUESTS_PER_MINUTE=12 ETHEREUM_BASE_URL=https://rpc.ankr.com/eth_goerli ETHEREUM_REQUESTS_PER_MINUTE=12 +EVMOS_BASE_URL=https://evmos-testnet-rpc.polkachu.com +EVMOS_REQUESTS_PER_MINUTE=12 + FANTOM_BASE_URL=https://rpc.testnet.fantom.network FANTOM_REQUESTS_PER_MINUTE=12 @@ -52,6 +56,9 @@ KARURA_REQUESTS_PER_MINUTE=12 KLAYTN_BASE_URL=https://api.baobab.klaytn.net:8651 KLAYTN_REQUESTS_PER_MINUTE=12 +KUJIRA_BASE_URL=https://kujira-testnet-rpc.polkachu.com +KUJIRA_REQUESTS_PER_MINUTE=12 + MOONBEAM_BASE_URL=https://rpc.api.moonbase.moonbeam.network MOONBEAM_REQUESTS_PER_MINUTE=12 @@ -67,6 +74,9 @@ OSMOSIS_REQUESTS_PER_MINUTE=12 POLYGON_BASE_URL=https://rpc.ankr.com/polygon_mumbai POLYGON_REQUESTS_PER_MINUTE=12 +SEI_BASE_URL=https://sei-a2-rpc.brocha.in +SEI_REQUESTS_PER_MINUTE=12 + SOLANA_BASE_URL=https://api.devnet.solana.com SOLANA_REQUESTS_PER_MINUTE=12 diff --git a/deploy/tx-tracker/tx-tracker-service.yaml b/deploy/tx-tracker/tx-tracker-service.yaml index d5c09aa0..17f7907c 100644 --- a/deploy/tx-tracker/tx-tracker-service.yaml +++ b/deploy/tx-tracker/tx-tracker-service.yaml @@ -56,10 +56,21 @@ spec: configMapKeyRef: name: config key: mongo-database - - name: SQS_URL - value: {{ .SQS_URL }} + - name: PIPELINE_SQS_URL + valueFrom: + configMapKeyRef: + name: tx-tracker + key: pipeline-sqs-url + - name: NOTIFICATIONS_SQS_URL + valueFrom: + configMapKeyRef: + name: tx-tracker + key: notifications-sqs-url - name: AWS_REGION - value: {{ .SQS_AWS_REGION }} + valueFrom: + configMapKeyRef: + name: tx-tracker + key: aws-region - name: P2P_NETWORK value: {{ .P2P_NETWORK }} - name: METRICS_ENABLED @@ -100,6 +111,10 @@ spec: value: {{ .ETHEREUM_BASE_URL }} - name: ETHEREUM_REQUESTS_PER_MINUTE value: "{{ .ETHEREUM_REQUESTS_PER_MINUTE }}" + - name: EVMOS_BASE_URL + value: {{ .EVMOS_BASE_URL }} + - name: EVMOS_REQUESTS_PER_MINUTE + value: "{{ .EVMOS_REQUESTS_PER_MINUTE }}" - name: FANTOM_BASE_URL value: {{ .FANTOM_BASE_URL }} - name: FANTOM_REQUESTS_PER_MINUTE @@ -116,6 +131,10 @@ spec: value: {{ .KLAYTN_BASE_URL }} - name: KLAYTN_REQUESTS_PER_MINUTE value: "{{ .KLAYTN_REQUESTS_PER_MINUTE }}" + - name: KUJIRA_BASE_URL + value: {{ .KUJIRA_BASE_URL }} + - name: KUJIRA_REQUESTS_PER_MINUTE + value: "{{ .KUJIRA_REQUESTS_PER_MINUTE }}" - name: MOONBEAM_BASE_URL value: {{ .MOONBEAM_BASE_URL }} - name: MOONBEAM_REQUESTS_PER_MINUTE @@ -136,6 +155,10 @@ spec: value: {{ .POLYGON_BASE_URL }} - name: POLYGON_REQUESTS_PER_MINUTE value: "{{ .POLYGON_REQUESTS_PER_MINUTE }}" + - name: SEI_BASE_URL + value: {{ .SEI_BASE_URL }} + - name: SEI_REQUESTS_PER_MINUTE + value: "{{ .SEI_REQUESTS_PER_MINUTE }}" - name: SOLANA_BASE_URL value: {{ .SOLANA_BASE_URL }} - name: SOLANA_REQUESTS_PER_MINUTE diff --git a/fly/cmd/backfiller/notify.go b/fly/cmd/backfiller/notify.go index 8395c925..e6bb844a 100644 --- a/fly/cmd/backfiller/notify.go +++ b/fly/cmd/backfiller/notify.go @@ -69,7 +69,7 @@ func newSNSProducer(ctx context.Context, cfg WorkerConfiguration, alertClient al // newVAATopicProducerFunc creates a new VAA topic producer function from the given configuration. func newVAATopicProducerFunc(ctx context.Context, cfg WorkerConfiguration, alertClient alert.AlertClient, metricsClient metrics.Metrics, logger *zap.Logger) (producer.PushFunc, error) { if !cfg.NotifyEnabled { - return func(context.Context, *producer.NotificationEvent) error { + return func(context.Context, *producer.Notification) error { return nil }, nil } diff --git a/fly/main.go b/fly/main.go index 4167589d..e9616d91 100644 --- a/fly/main.go +++ b/fly/main.go @@ -216,7 +216,7 @@ func newMetrics(enviroment string) metrics.Metrics { // Creates a callback to publish VAA messages to a redis pubsub func newVAARedisProducerFunc(ctx context.Context, isLocal bool, logger *zap.Logger) (producer.PushFunc, error) { if isLocal { - return func(context.Context, *producer.NotificationEvent) error { + return func(context.Context, *producer.Notification) error { return nil }, nil } diff --git a/fly/producer/producer.go b/fly/producer/producer.go deleted file mode 100644 index 096c823a..00000000 --- a/fly/producer/producer.go +++ /dev/null @@ -1,40 +0,0 @@ -package producer - -import ( - "context" - "time" -) - -// PushFunc is a function to push VAAEvent. -type PushFunc func(context.Context, *NotificationEvent) error - -type NotificationEvent struct { - TrackID string `json:"trackId"` - Source string `json:"source"` - Type string `json:"type"` - Payload SignedVaa `json:"payload"` -} - -type SignedVaa struct { - ID string `json:"id"` - EmitterChain uint16 `json:"emitterChain"` - EmitterAddr string `json:"emitterAddr"` - Sequence uint64 `json:"sequence"` - GuardianSetIndex uint32 `json:"guardianSetIndex"` - Timestamp time.Time `json:"timestamp"` - Vaa []byte `json:"vaa"` - TxHash string `json:"txHash"` - Version int `json:"version"` -} - -// NewComposite returns a PushFunc that calls all the given producers. -func NewComposite(producers ...PushFunc) PushFunc { - return func(ctx context.Context, event *NotificationEvent) error { - for _, producer := range producers { - if err := producer(ctx, event); err != nil { - return err - } - } - return nil - } -} diff --git a/fly/producer/types.go b/fly/producer/types.go new file mode 100644 index 00000000..0ac24cdc --- /dev/null +++ b/fly/producer/types.go @@ -0,0 +1,29 @@ +package producer + +import ( + "context" + + "github.com/wormhole-foundation/wormhole-explorer/common/events" + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" +) + +// PushFunc is a function to push VAAEvent. +type PushFunc func(context.Context, *Notification) error + +type Notification struct { + ID string + Event *events.NotificationEvent + EmitterChain sdk.ChainID +} + +// NewComposite returns a PushFunc that calls all the given producers. +func NewComposite(producers ...PushFunc) PushFunc { + return func(ctx context.Context, event *Notification) error { + for _, producer := range producers { + if err := producer(ctx, event); err != nil { + return err + } + } + return nil + } +} diff --git a/fly/producer/vaa_memory.go b/fly/producer/vaa_memory.go index 05c58f87..ab7fb794 100644 --- a/fly/producer/vaa_memory.go +++ b/fly/producer/vaa_memory.go @@ -18,6 +18,6 @@ func NewVAAInMemory(logger *zap.Logger) *VAAInMemory { } // Push pushes a VAAEvent to memory. -func (m *VAAInMemory) Push(ctx context.Context, event *NotificationEvent) error { +func (m *VAAInMemory) Push(context.Context, *Notification) error { return nil } diff --git a/fly/producer/vaa_redis.go b/fly/producer/vaa_redis.go index ff1e4d73..1caf2cea 100644 --- a/fly/producer/vaa_redis.go +++ b/fly/producer/vaa_redis.go @@ -23,8 +23,8 @@ func NewRedisProducer(c *redis.Client, channel string) *RedisProducer { } // Push pushes a NotificationEvent to redis. -func (p *RedisProducer) Push(ctx context.Context, event *NotificationEvent) error { - body, err := json.Marshal(event) +func (p *RedisProducer) Push(ctx context.Context, n *Notification) error { + body, err := json.Marshal(n.Event) if err != nil { return err } diff --git a/fly/producer/vaa_sns.go b/fly/producer/vaa_sns.go index c39f8a96..1d51d6ce 100644 --- a/fly/producer/vaa_sns.go +++ b/fly/producer/vaa_sns.go @@ -31,17 +31,16 @@ func NewSNSProducer(producer *sns.Producer, alertClient alert.AlertClient, metri } // Push pushes a VAAEvent to SNS. -func (p *SNSProducer) Push(ctx context.Context, event *NotificationEvent) error { - body, err := json.Marshal(event) +func (p *SNSProducer) Push(ctx context.Context, n *Notification) error { + body, err := json.Marshal(n.Event) if err != nil { return err } - - deduplicationID := fmt.Sprintf("gossip-event-%s", event.Payload.ID) - p.logger.Debug("Publishing signedVaa event", zap.String("groupID", event.Payload.ID)) - err = p.producer.SendMessage(ctx, event.Payload.ID, deduplicationID, string(body)) + deduplicationID := fmt.Sprintf("gossip-event-%s", n.ID) + p.logger.Debug("Publishing signedVaa event", zap.String("groupID", n.ID)) + err = p.producer.SendMessage(ctx, n.ID, deduplicationID, string(body)) if err == nil { - p.metrics.IncVaaSendNotification(vaa.ChainID(event.Payload.EmitterChain)) + p.metrics.IncVaaSendNotification(vaa.ChainID(n.EmitterChain)) } return err } diff --git a/fly/storage/repository.go b/fly/storage/repository.go index 4c638a6f..a305f17b 100644 --- a/fly/storage/repository.go +++ b/fly/storage/repository.go @@ -12,6 +12,7 @@ import ( eth_common "github.com/ethereum/go-ethereum/common" "github.com/wormhole-foundation/wormhole-explorer/common/client/alert" "github.com/wormhole-foundation/wormhole-explorer/common/domain" + "github.com/wormhole-foundation/wormhole-explorer/common/events" flyAlert "github.com/wormhole-foundation/wormhole-explorer/fly/internal/alert" "github.com/wormhole-foundation/wormhole-explorer/fly/internal/metrics" "github.com/wormhole-foundation/wormhole-explorer/fly/internal/track" @@ -120,24 +121,23 @@ func (s *Repository) UpsertVaa(ctx context.Context, v *vaa.VAA, serializedVaa [] s.updateVAACount(v.EmitterChain) // send signedvaa event to topic. - event := &producer.NotificationEvent{ - TrackID: track.GetTrackID(v.MessageID()), - Source: "fly", - Type: domain.SignedVaaType, - Payload: producer.SignedVaa{ + event, newErr := events.NewNotificationEvent[events.SignedVaa]( + track.GetTrackID(v.MessageID()), "fly", events.SignedVaaType, + events.SignedVaa{ ID: v.MessageID(), EmitterChain: uint16(v.EmitterChain), - EmitterAddr: v.EmitterAddress.String(), + EmitterAddress: v.EmitterAddress.String(), Sequence: v.Sequence, GuardianSetIndex: v.GuardianSetIndex, Timestamp: v.Timestamp, Vaa: serializedVaa, TxHash: vaaDoc.TxHash, Version: int(v.Version), - }, + }) + if newErr != nil { + return newErr } - - err = s.afterUpdate(ctx, event) + err = s.afterUpdate(ctx, &producer.Notification{ID: v.MessageID(), Event: event, EmitterChain: v.EmitterChain}) } return err } diff --git a/jobs/cmd/main.go b/jobs/cmd/main.go index 7c9f7e11..ab849d24 100644 --- a/jobs/cmd/main.go +++ b/jobs/cmd/main.go @@ -7,6 +7,7 @@ import ( "github.com/go-redis/redis" "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/common/prices" "github.com/wormhole-foundation/wormhole-explorer/jobs/config" @@ -67,8 +68,10 @@ func initNotionalJob(ctx context.Context, cfg *config.NotionalConfiguration, log api := coingecko.NewCoingeckoAPI(cfg.CoingeckoURL) // init redis client. redisClient := redis.NewClient(&redis.Options{Addr: cfg.CacheURL}) + // init token provider. + tokenProvider := domain.NewTokenProvider(cfg.P2pNetwork) // create notional job. - notionalJob := notional.NewNotionalJob(api, redisClient, cfg.CachePrefix, cfg.P2pNetwork, cfg.NotionalChannel, logger) + notionalJob := notional.NewNotionalJob(api, redisClient, cfg.CachePrefix, cfg.NotionalChannel, tokenProvider, logger) return notionalJob } @@ -81,7 +84,9 @@ func initTransferReportJob(ctx context.Context, cfg *config.TransferReportConfig } pricesCache := prices.NewCoinPricesCache(cfg.PricesPath) pricesCache.InitCache() - return report.NewTransferReportJob(db.Database, cfg.PageSize, pricesCache, cfg.OutputPath, logger) + // init token provider. + tokenProvider := domain.NewTokenProvider(cfg.P2pNetwork) + return report.NewTransferReportJob(db.Database, cfg.PageSize, pricesCache, cfg.OutputPath, tokenProvider, logger) } func handleExit() { diff --git a/jobs/config/config.go b/jobs/config/config.go index 97bac578..53a41f32 100644 --- a/jobs/config/config.go +++ b/jobs/config/config.go @@ -30,6 +30,7 @@ type TransferReportConfiguration struct { PageSize int64 `env:"PAGE_SIZE,default=100"` PricesPath string `env:"PRICES_PATH,required"` OutputPath string `env:"OUTPUT_PATH,required"` + P2pNetwork string `env:"P2P_NETWORK,required"` } // New creates a default configuration with the values from .env file and environment variables. diff --git a/jobs/internal/coingecko/coingecko.go b/jobs/internal/coingecko/coingecko.go index 8c62b485..bc0102a1 100644 --- a/jobs/internal/coingecko/coingecko.go +++ b/jobs/internal/coingecko/coingecko.go @@ -8,7 +8,6 @@ import ( "strings" "github.com/shopspring/decimal" - "github.com/wormhole-foundation/wormhole-explorer/common/domain" ) // CoingeckoAPI is a client for the coingecko API @@ -83,14 +82,3 @@ func chunkChainIds(slice []string, chunkSize int) [][]string { } return chunks } - -// GetChainIDs returns the coingecko chain ids for the given p2p network. -func GetChainIDs(p2pNetwork string) []string { - - if p2pNetwork == domain.P2pMainNet { - return domain.GetAllCoingeckoIDs() - } - - // TODO: define chains ids for testnet. - return []string{} -} diff --git a/jobs/jobs/notional/notional.go b/jobs/jobs/notional/notional.go index 3059a48d..78da4fe5 100644 --- a/jobs/jobs/notional/notional.go +++ b/jobs/jobs/notional/notional.go @@ -14,23 +14,23 @@ import ( // NotionalJob is the job to get the notional value of assets. type NotionalJob struct { - coingeckoAPI *coingecko.CoingeckoAPI - cacheClient *redis.Client - cachePrefix string - cacheChannel string - p2pNetwork string - logger *zap.Logger + coingeckoAPI *coingecko.CoingeckoAPI + cacheClient *redis.Client + cachePrefix string + cacheChannel string + tokenProvider *domain.TokenProvider + logger *zap.Logger } // NewNotionalJob creates a new notional job. -func NewNotionalJob(api *coingecko.CoingeckoAPI, cacheClient *redis.Client, cachePrefix string, p2pNetwork, cacheChannel string, logger *zap.Logger) *NotionalJob { +func NewNotionalJob(api *coingecko.CoingeckoAPI, cacheClient *redis.Client, cachePrefix string, cacheChannel string, tokenProvider *domain.TokenProvider, logger *zap.Logger) *NotionalJob { return &NotionalJob{ - coingeckoAPI: api, - cacheClient: cacheClient, - cachePrefix: cachePrefix, - cacheChannel: formatChannel(cachePrefix, cacheChannel), - p2pNetwork: p2pNetwork, - logger: logger, + coingeckoAPI: api, + cacheClient: cacheClient, + cachePrefix: cachePrefix, + cacheChannel: formatChannel(cachePrefix, cacheChannel), + tokenProvider: tokenProvider, + logger: logger, } } @@ -38,9 +38,9 @@ func NewNotionalJob(api *coingecko.CoingeckoAPI, cacheClient *redis.Client, cach func (j *NotionalJob) Run() error { // get chains coingecko ids by p2p network. - chainIDs := coingecko.GetChainIDs(j.p2pNetwork) + chainIDs := j.tokenProvider.GetAllCoingeckoIDs() if len(chainIDs) == 0 { - return fmt.Errorf("no chain ids found for p2p network %s", j.p2pNetwork) + return fmt.Errorf("no chain ids found for p2p network %s", j.tokenProvider.GetP2pNewtork()) } // get notional value of assets. @@ -98,7 +98,7 @@ func (j *NotionalJob) convertToSymbols(m map[string]coingecko.NotionalUSD) map[s w := make(map[string]notional.PriceData, len(m)) now := time.Now() - for _, v := range domain.GetAllTokens() { + for _, v := range j.tokenProvider.GetAllTokens() { notionalUSD, ok := m[v.CoingeckoID] if !ok { j.logger.Info("skipping unknown coingecko ID", zap.String("coingeckoID", v.CoingeckoID)) diff --git a/jobs/jobs/report/transfer_report.go b/jobs/jobs/report/transfer_report.go index f67c2b87..b0596dad 100644 --- a/jobs/jobs/report/transfer_report.go +++ b/jobs/jobs/report/transfer_report.go @@ -19,11 +19,12 @@ import ( ) type TransferReportJob struct { - database *mongo.Database - pageSize int64 - logger *zap.Logger - pricesCache *prices.CoinPricesCache - outputPath string + database *mongo.Database + pageSize int64 + logger *zap.Logger + pricesCache *prices.CoinPricesCache + outputPath string + tokenProvider *domain.TokenProvider } type transactionResult struct { @@ -44,8 +45,8 @@ type transactionResult struct { } // NewTransferReportJob creates a new transfer report job. -func NewTransferReportJob(database *mongo.Database, pageSize int64, pricesCache *prices.CoinPricesCache, outputPath string, logger *zap.Logger) *TransferReportJob { - return &TransferReportJob{database: database, pageSize: pageSize, pricesCache: pricesCache, outputPath: outputPath, logger: logger} +func NewTransferReportJob(database *mongo.Database, pageSize int64, pricesCache *prices.CoinPricesCache, outputPath string, tokenProvider *domain.TokenProvider, logger *zap.Logger) *TransferReportJob { + return &TransferReportJob{database: database, pageSize: pageSize, pricesCache: pricesCache, outputPath: outputPath, tokenProvider: tokenProvider, logger: logger} } // Run runs the transfer report job. @@ -94,7 +95,7 @@ func (j *TransferReportJob) Run(ctx context.Context) error { continue } - m, ok := domain.GetTokenByAddress(sdk.ChainID(t.TokenChain), tokenAddress.String()) + m, ok := j.tokenProvider.GetTokenByAddress(sdk.ChainID(t.TokenChain), tokenAddress.String()) if ok { tokenPrice, err := j.pricesCache.GetPriceByTime(m.CoingeckoID, t.Timestamp) if err != nil { diff --git a/parser/cmd/backfiller/run.go b/parser/cmd/backfiller/run.go index d9e9a644..cd419cfb 100644 --- a/parser/cmd/backfiller/run.go +++ b/parser/cmd/backfiller/run.go @@ -2,11 +2,13 @@ package backfiller import ( "context" + "fmt" "time" "github.com/wormhole-foundation/wormhole-explorer/common/client/alert" vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" "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/parser/config" "github.com/wormhole-foundation/wormhole-explorer/parser/http/vaa" @@ -22,7 +24,7 @@ func Run(config *config.BackfillerConfiguration) { logger := logger.New("wormhole-explorer-parser", logger.WithLevel(config.LogLevel)) - logger.Info("Starting wormhole-explorer-parser as backfiller ...") + logger.Info("Starting wormhole-explorer-parser as backfiller ...") startTime, err := time.Parse(time.RFC3339, config.StartTime) if err != nil { @@ -57,8 +59,11 @@ func Run(config *config.BackfillerConfiguration) { parserRepository := parser.NewRepository(db.Database, logger) vaaRepository := vaa.NewRepository(db.Database, logger) + // create a token provider + tokenProvider := domain.NewTokenProvider(config.P2pNetwork) + //create a processor - processor := processor.New(parserVAAAPIClient, parserRepository, alert.NewDummyClient(), metrics.NewDummyMetrics(), logger) + eventProcessor := processor.New(parserVAAAPIClient, parserRepository, alert.NewDummyClient(), metrics.NewDummyMetrics(), tokenProvider, logger) logger.Info("Started wormhole-explorer-parser as backfiller") @@ -81,7 +86,8 @@ func Run(config *config.BackfillerConfiguration) { } for _, v := range vaas { logger.Debug("Processing vaa", zap.String("id", v.ID)) - _, err := processor.Process(rootCtx, v.Vaa) + p := &processor.Params{Vaa: v.Vaa, TrackID: fmt.Sprintf("backfiller-%s", v.ID)} + _, err := eventProcessor.Process(rootCtx, p) if err != nil { logger.Error("Failed to process vaa", zap.String("id", v.ID), zap.Error(err)) } diff --git a/parser/cmd/service/run.go b/parser/cmd/service/run.go index ea22f92d..2e21c199 100644 --- a/parser/cmd/service/run.go +++ b/parser/cmd/service/run.go @@ -14,6 +14,8 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/common/client/alert" vaaPayloadParser "github.com/wormhole-foundation/wormhole-explorer/common/client/parser" "github.com/wormhole-foundation/wormhole-explorer/common/dbutil" + "github.com/wormhole-foundation/wormhole-explorer/common/domain" + "github.com/wormhole-foundation/wormhole-explorer/common/health" "github.com/wormhole-foundation/wormhole-explorer/common/logger" "github.com/wormhole-foundation/wormhole-explorer/parser/config" "github.com/wormhole-foundation/wormhole-explorer/parser/consumer" @@ -26,6 +28,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/parser/parser" "github.com/wormhole-foundation/wormhole-explorer/parser/processor" "github.com/wormhole-foundation/wormhole-explorer/parser/queue" + "go.mongodb.org/mongo-driver/mongo" "go.uber.org/zap" ) @@ -82,20 +85,38 @@ func Run() { logger.Fatal("failed to create parse vaa api client") } - // get consumer function. - sqsConsumer, vaaConsumeFunc := newVAAConsume(rootCtx, config, metrics, logger) + // get vaa consumer function. + vaaConsumeFunc := newVAAConsume(rootCtx, config, metrics, logger) + + //get notification consumer function. + notificationConsumeFunc := newNotificationConsume(rootCtx, config, metrics, logger) + + // create a repository repository := parser.NewRepository(db.Database, logger) - //create a processor - processor := processor.New(parserVAAAPIClient, repository, alertClient, metrics, logger) + // get health check functions. + logger.Info("creating health check functions...") + healthChecks, err := newHealthChecks(rootCtx, config, db.Database) + if err != nil { + logger.Fatal("failed to create health checks", zap.Error(err)) + } + // create a token provider + tokenProvider := domain.NewTokenProvider(config.P2pNetwork) - // create and start a consumer - consumer := consumer.New(vaaConsumeFunc, processor.Process, metrics, logger) - consumer.Start(rootCtx) + //create a processor + processor := processor.New(parserVAAAPIClient, repository, alertClient, metrics, tokenProvider, logger) + + // create and start a vaaConsumer + vaaConsumer := consumer.New(vaaConsumeFunc, processor.Process, metrics, logger) + vaaConsumer.Start(rootCtx) + + // create and start a notificationConsumer + notificationConsumer := consumer.New(notificationConsumeFunc, processor.Process, metrics, logger) + notificationConsumer.Start(rootCtx) vaaRepository := vaa.NewRepository(db.Database, logger) vaaController := vaa.NewController(vaaRepository, processor.Process, logger) - server := infrastructure.NewServer(logger, config.Port, config.PprofEnabled, config.IsQueueConsumer(), sqsConsumer, db.Database, vaaController) + server := infrastructure.NewServer(logger, config.Port, config.PprofEnabled, vaaController, healthChecks...) server.Start() logger.Info("Started wormhole-explorer-parser") @@ -149,25 +170,36 @@ func newAwsConfig(appCtx context.Context, cfg *config.ServiceConfiguration) (aws return awsconfig.LoadDefaultConfig(appCtx, awsconfig.WithRegion(region)) } -func newVAAConsume(appCtx context.Context, config *config.ServiceConfiguration, metrics metrics.Metrics, logger *zap.Logger) (*sqs.Consumer, queue.VAAConsumeFunc) { - sqsConsumer, err := newSQSConsumer(appCtx, config) +func newVAAConsume(appCtx context.Context, config *config.ServiceConfiguration, metrics metrics.Metrics, logger *zap.Logger) queue.ConsumeFunc { + sqsConsumer, err := newSQSConsumer(appCtx, config, config.PipelineSQSUrl) if err != nil { logger.Fatal("failed to create sqs consumer", zap.Error(err)) } filterConsumeFunc := newFilterFunc(config) - vaaQueue := queue.NewVAASQS(sqsConsumer, filterConsumeFunc, metrics, logger) - return sqsConsumer, vaaQueue.Consume + vaaQueue := queue.NewEventSQS(sqsConsumer, queue.NewVaaConverter(logger), filterConsumeFunc, metrics, logger) + return vaaQueue.Consume +} + +func newNotificationConsume(appCtx context.Context, config *config.ServiceConfiguration, metrics metrics.Metrics, logger *zap.Logger) queue.ConsumeFunc { + sqsConsumer, err := newSQSConsumer(appCtx, config, config.NotificationsSQSUrl) + if err != nil { + logger.Fatal("failed to create sqs consumer", zap.Error(err)) + } + + filterConsumeFunc := newFilterFunc(config) + vaaQueue := queue.NewEventSQS(sqsConsumer, queue.NewNotificationEvent(logger), filterConsumeFunc, metrics, logger) + return vaaQueue.Consume } // Create a new SQS consumer. -func newSQSConsumer(appCtx context.Context, config *config.ServiceConfiguration) (*sqs.Consumer, error) { +func newSQSConsumer(appCtx context.Context, config *config.ServiceConfiguration, sqsUrl string) (*sqs.Consumer, error) { awsconfig, err := newAwsConfig(appCtx, config) if err != nil { return nil, err } - return sqs.NewConsumer(awsconfig, config.SQSUrl, + return sqs.NewConsumer(awsconfig, sqsUrl, sqs.WithMaxMessages(10), sqs.WithVisibilityTimeout(120)) } @@ -201,3 +233,22 @@ func newAlertClient(cfg *config.ServiceConfiguration) (alert.AlertClient, error) return alert.NewAlertService(alertConfig, parserAlert.LoadAlerts) } + +func newHealthChecks( + ctx context.Context, + config *config.ServiceConfiguration, + db *mongo.Database, +) ([]health.Check, error) { + + awsConfig, err := newAwsConfig(ctx, config) + if err != nil { + return nil, err + } + + healthChecks := []health.Check{ + health.SQS(awsConfig, config.PipelineSQSUrl), + health.SQS(awsConfig, config.NotificationsSQSUrl), + health.Mongo(db), + } + return healthChecks, nil +} diff --git a/parser/config/config.go b/parser/config/config.go index a094af84..0735fb99 100644 --- a/parser/config/config.go +++ b/parser/config/config.go @@ -26,7 +26,8 @@ type ServiceConfiguration struct { AwsAccessKeyID string `env:"AWS_ACCESS_KEY_ID"` AwsSecretAccessKey string `env:"AWS_SECRET_ACCESS_KEY"` AwsRegion string `env:"AWS_REGION"` - SQSUrl string `env:"SQS_URL"` + PipelineSQSUrl string `env:"PIPELINE_SQS_URL"` + NotificationsSQSUrl string `env:"NOTIFICATIONS_SQS_URL"` VaaPayloadParserURL string `env:"VAA_PAYLOAD_PARSER_URL, required"` VaaPayloadParserTimeout int64 `env:"VAA_PAYLOAD_PARSER_TIMEOUT, required"` PprofEnabled bool `env:"PPROF_ENABLED,default=false"` @@ -47,6 +48,7 @@ type BackfillerConfiguration struct { EndTime string `env:"END_TIME"` PageSize int64 `env:"PAGE_SIZE,default=100"` SortAsc bool `env:"SORT_ASC,default=false"` + P2pNetwork string `env:"P2P_NETWORK,required"` } // New creates a configuration with the values from .env file and environment variables. diff --git a/parser/consumer/consumer.go b/parser/consumer/consumer.go index 1907e3f3..af3f11f5 100644 --- a/parser/consumer/consumer.go +++ b/parser/consumer/consumer.go @@ -11,14 +11,14 @@ import ( // Consumer consumer struct definition. type Consumer struct { - consume queue.VAAConsumeFunc + consume queue.ConsumeFunc process processor.ProcessorFunc metrics metrics.Metrics logger *zap.Logger } // New creates a new vaa consumer. -func New(consume queue.VAAConsumeFunc, process processor.ProcessorFunc, metrics metrics.Metrics, logger *zap.Logger) *Consumer { +func New(consume queue.ConsumeFunc, process processor.ProcessorFunc, metrics metrics.Metrics, logger *zap.Logger) *Consumer { return &Consumer{consume: consume, process: process, metrics: metrics, logger: logger} } @@ -30,19 +30,28 @@ func (c *Consumer) Start(ctx context.Context) { // check id message is expired. if msg.IsExpired() { - c.logger.Warn("Message with vaa expired", zap.String("id", event.ID)) + c.logger.Warn("Event expired", zap.String("id", event.ID)) msg.Failed() continue } c.metrics.IncVaaUnexpired(event.ChainID) - _, err := c.process(ctx, event.Vaa) + params := &processor.Params{ + TrackID: event.TrackID, + Vaa: event.Vaa, + } + _, err := c.process(ctx, params) if err != nil { - c.logger.Error("Error processing parsed vaa", + c.logger.Error("Error processing event", + zap.String("trackId", event.TrackID), zap.String("id", event.ID), zap.Error(err)) msg.Failed() continue + } else { + c.logger.Debug("Event processed", + zap.String("trackId", event.TrackID), + zap.String("id", event.ID)) } msg.Done() } diff --git a/parser/go.mod b/parser/go.mod index d7516503..d0e7345d 100644 --- a/parser/go.mod +++ b/parser/go.mod @@ -7,7 +7,7 @@ require ( github.com/joho/godotenv v1.4.0 // Configuration environment github.com/pkg/errors v0.9.1 github.com/sethvargo/go-envconfig v0.6.0 // Configuration environment - github.com/stretchr/testify v1.8.1 // indirect; Testing + github.com/stretchr/testify v1.8.1 // Testing github.com/wormhole-foundation/wormhole/sdk v0.0.0-20230426150516-e695fad0bed8 go.mongodb.org/mongo-driver v1.11.2 go.uber.org/zap v1.24.0 @@ -33,6 +33,7 @@ require ( github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 // indirect + github.com/aws/aws-sdk-go-v2/service/sns v1.20.2 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.1.1 // indirect github.com/aws/smithy-go v1.13.5 // indirect @@ -41,8 +42,12 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cosmos/btcutil v1.0.5 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect + github.com/deepmap/oapi-codegen v1.8.2 // indirect + github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/ethereum/go-ethereum v1.10.21 // indirect + github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/gofiber/adaptor/v2 v2.1.31 // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.4 // indirect @@ -51,6 +56,8 @@ require ( github.com/hashicorp/go-retryablehttp v0.5.1 // indirect github.com/holiman/uint256 v1.2.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/influxdata/influxdb-client-go/v2 v2.12.2 // indirect + github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 // indirect github.com/klauspost/compress v1.16.3 // indirect github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect github.com/mattn/go-colorable v0.1.13 // indirect @@ -61,6 +68,7 @@ require ( github.com/mr-tron/base58 v1.2.0 // indirect github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.19 // indirect github.com/philhofer/fwd v1.1.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect @@ -83,10 +91,12 @@ require ( go.uber.org/goleak v1.1.12 // indirect go.uber.org/multierr v1.8.0 // indirect golang.org/x/crypto v0.7.0 // indirect + golang.org/x/net v0.8.0 // indirect golang.org/x/sync v0.2.0 // indirect golang.org/x/sys v0.9.0 // indirect golang.org/x/text v0.8.0 // indirect google.golang.org/protobuf v1.30.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) // Needed for cosmos-sdk based chains. See diff --git a/parser/go.sum b/parser/go.sum index 2f3af905..fe4667a0 100644 --- a/parser/go.sum +++ b/parser/go.sum @@ -66,6 +66,8 @@ github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28 h1:KeTxcGdNnQudb46oOl4d90f2I33 github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28/go.mod h1:yRZVr/iT0AqyHeep00SZ4YfBAKojXz08w3XMBscdi0c= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2 h1:4AH9fFjUlVktQMznF+YN33aWNXaR4VgDXyP28qokJC0= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.0.2/go.mod h1:45MfaXZ0cNbeuT0KQ1XJylq8A6+OpVV2E5kvY/Kq+u8= +github.com/aws/aws-sdk-go-v2/service/sns v1.20.2 h1:MU/v2qtfGjKexJ09BMqE8pXo9xYMhT13FXjKgFc0cFw= +github.com/aws/aws-sdk-go-v2/service/sns v1.20.2/go.mod h1:VN2n9SOMS1lNbh5YD7o+ho0/rgfifSrK//YYNiVVF5E= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.2 h1:CSNIo1jiw7KrkdgZjCOnotu6yuB3IybhKLuSQrTLNfo= github.com/aws/aws-sdk-go-v2/service/sqs v1.20.2/go.mod h1:1ttxGjUHZliCQMpPss1sU5+Ph/5NvdMFRzr96bv8gm0= github.com/aws/aws-sdk-go-v2/service/sso v1.1.1 h1:37QubsarExl5ZuCBlnRP+7l1tNwZPBSTqpTBrPH98RU= @@ -97,18 +99,28 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc= +github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= +github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ethereum/go-ethereum v1.10.21 h1:5lqsEx92ZaZzRyOqBEXux4/UR06m296RGzN3ol3teJY= github.com/ethereum/go-ethereum v1.10.21/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -120,6 +132,10 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= +github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gofiber/adaptor/v2 v2.1.31 h1:E7LJre4uBc+RDsQfHCE+LKVkFcciSMYu4KhzbvoWgKU= github.com/gofiber/adaptor/v2 v2.1.31/go.mod h1:vdSG9JhOhOLYjE4j14fx6sJvLJNFVf9o6rSyB5GkU4s= @@ -159,6 +175,7 @@ github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiu github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -188,6 +205,7 @@ github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-retryablehttp v0.5.1 h1:Vsx5XKPqPs3M6sM4U4GWyUqFS8aBiL9U5gkgvpkg4SE= @@ -199,6 +217,10 @@ github.com/holiman/uint256 v1.2.1/go.mod h1:y4ga/t+u+Xwd7CpDgZESaRcWy0I7XMlTMA25 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/influxdb-client-go/v2 v2.12.2 h1:uYABKdrEKlYm+++qfKdbgaHKBPmoWR5wpbmj6MBB/2g= +github.com/influxdata/influxdb-client-go/v2 v2.12.2/go.mod h1:YteV91FiQxRdccyJ2cHvj2f/5sq4y4Njqu1fQzsQCOU= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= +github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= @@ -227,8 +249,19 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= @@ -249,6 +282,9 @@ github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.19 h1:JernwK3Bgd5x+UJPV6S2LPYoBF+DFOYBoQ5JeJPVBNc= github.com/opsgenie/opsgenie-go-sdk-v2 v1.2.19/go.mod h1:4OjcxgwdXzezqytxN534MooNmrxRD50geWZxTD7845s= github.com/philhofer/fwd v1.1.1/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= @@ -318,6 +354,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -337,6 +374,8 @@ github.com/valyala/fasthttp v1.43.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seB github.com/valyala/fasthttp v1.44.0/go.mod h1:f6VbjjoI3z1NDOZOv17o6RvtRSWxC77seBFc2uWtgiY= github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c= github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/wormhole-foundation/wormhole/sdk v0.0.0-20230426150516-e695fad0bed8 h1:rrOyHd+H9a6Op1iUyZNCaI5v9D1syq8jDAYyX/2Q4L8= @@ -378,6 +417,8 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -447,6 +488,7 @@ golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81R golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -457,6 +499,8 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220906165146-f3363e06e74c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -484,6 +528,7 @@ golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -492,11 +537,14 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -511,6 +559,7 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -530,6 +579,7 @@ golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= @@ -538,6 +588,7 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= @@ -546,6 +597,8 @@ golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -680,13 +733,16 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/parser/http/infrastructure/controller.go b/parser/http/infrastructure/controller.go deleted file mode 100644 index f2163f82..00000000 --- a/parser/http/infrastructure/controller.go +++ /dev/null @@ -1,39 +0,0 @@ -package infrastructure - -import ( - "github.com/gofiber/fiber/v2" - "go.uber.org/zap" -) - -// Controller definition. -type Controller struct { - srv *Service - logger *zap.Logger -} - -// NewController creates a Controller instance. -func NewController(serv *Service, logger *zap.Logger) *Controller { - return &Controller{srv: serv, logger: logger} -} - -// HealthCheck handler for the endpoint /health. -func (c *Controller) HealthCheck(ctx *fiber.Ctx) error { - return ctx.JSON(struct { - Status string `json:"status"` - }{Status: "OK"}) -} - -// ReadyCheck handler for the endpoint /ready. -func (c *Controller) ReadyCheck(ctx *fiber.Ctx) error { - ready, err := c.srv.CheckIsReady(ctx.Context()) - if ready { - return ctx.Status(fiber.StatusOK).JSON(struct { - Ready string `json:"ready"` - }{Ready: "OK"}) - } - c.logger.Error("Ready check failed", zap.Error(err)) - return ctx.Status(fiber.StatusInternalServerError).JSON(struct { - Ready string `json:"ready"` - Error string `json:"error"` - }{Ready: "NO", Error: err.Error()}) -} diff --git a/parser/http/infrastructure/model.go b/parser/http/infrastructure/model.go deleted file mode 100644 index 4cbc1b01..00000000 --- a/parser/http/infrastructure/model.go +++ /dev/null @@ -1,19 +0,0 @@ -package infrastructure - -// MongoStatus represent a mongo server status. -type MongoStatus struct { - Ok int32 `bson:"ok"` - Host string `bson:"host"` - Version string `bson:"version"` - Process string `bson:"process"` - Pid int32 `bson:"pid"` - Uptime int32 `bson:"uptime"` - Connections *MongoConnections `bson:"connections"` -} - -// MongoConnections represents a mongo server connection. -type MongoConnections struct { - Current int32 `bson:"current"` - Available int32 `bson:"available"` - TotalCreated int32 `bson:"totalCreated"` -} diff --git a/parser/http/infrastructure/repository.go b/parser/http/infrastructure/repository.go deleted file mode 100644 index 911d984d..00000000 --- a/parser/http/infrastructure/repository.go +++ /dev/null @@ -1,46 +0,0 @@ -package infrastructure - -import ( - "context" - "fmt" - - "github.com/pkg/errors" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.uber.org/zap" -) - -// Repository definition. -type Repository struct { - db *mongo.Database - logger *zap.Logger -} - -// NewRepository create a new Repository instance. -func NewRepository(db *mongo.Database, logger *zap.Logger) *Repository { - return &Repository{db: db, - logger: logger.With(zap.String("module", "InfraestructureRepository")), - } -} - -// GetMongoStatus get mongo server status. -func (r *Repository) GetMongoStatus(ctx context.Context) (*MongoStatus, error) { - command := bson.D{{Key: "serverStatus", Value: 1}} - result := r.db.RunCommand(ctx, command) - if result.Err() != nil { - requestID := fmt.Sprintf("%v", ctx.Value("requestid")) - r.logger.Error("failed execute command mongo serverStatus", - zap.Error(result.Err()), zap.String("requestID", requestID)) - return nil, errors.WithStack(result.Err()) - } - - var mongoStatus MongoStatus - err := result.Decode(&mongoStatus) - if err != nil { - requestID := fmt.Sprintf("%v", ctx.Value("requestid")) - r.logger.Error("failed decoding cursor to *MongoStatus", zap.Error(err), - zap.String("requestID", requestID)) - return nil, errors.WithStack(err) - } - return &mongoStatus, nil -} diff --git a/parser/http/infrastructure/server.go b/parser/http/infrastructure/server.go index 3134356c..d3a10462 100644 --- a/parser/http/infrastructure/server.go +++ b/parser/http/infrastructure/server.go @@ -4,9 +4,8 @@ import ( "github.com/ansrivas/fiberprometheus/v2" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/pprof" + "github.com/wormhole-foundation/wormhole-explorer/common/health" "github.com/wormhole-foundation/wormhole-explorer/parser/http/vaa" - "github.com/wormhole-foundation/wormhole-explorer/parser/internal/sqs" - "go.mongodb.org/mongo-driver/mongo" "go.uber.org/zap" ) @@ -16,11 +15,8 @@ type Server struct { logger *zap.Logger } -func NewServer(logger *zap.Logger, port string, pprofEnabled bool, isQueueConsumer bool, consumer *sqs.Consumer, - db *mongo.Database, vaaController *vaa.Controller) *Server { - repository := NewRepository(db, logger) - service := NewService(repository, consumer, isQueueConsumer, logger) - ctrl := NewController(service, logger) +func NewServer(logger *zap.Logger, port string, pprofEnabled bool, vaaController *vaa.Controller, checks ...health.Check) *Server { + ctrl := health.NewController(checks, logger) app := fiber.New(fiber.Config{DisableStartupMessage: true}) // config use of middlware. diff --git a/parser/http/infrastructure/service.go b/parser/http/infrastructure/service.go deleted file mode 100644 index 2b0a112f..00000000 --- a/parser/http/infrastructure/service.go +++ /dev/null @@ -1,83 +0,0 @@ -package infrastructure - -import ( - "context" - "errors" - "fmt" - - "github.com/wormhole-foundation/wormhole-explorer/parser/internal/sqs" - "go.uber.org/zap" -) - -// Service definition. -type Service struct { - repo *Repository - consumer *sqs.Consumer - isQueueConsumer bool - logger *zap.Logger -} - -// NewService create a new Service instance. -func NewService(dao *Repository, consumer *sqs.Consumer, isQueueConsumer bool, logger *zap.Logger) *Service { - return &Service{repo: dao, consumer: consumer, isQueueConsumer: isQueueConsumer, logger: logger.With(zap.String("module", "Infraestructureervice"))} -} - -// CheckIsReady check if the service is ready. -func (s *Service) CheckIsReady(ctx context.Context) (bool, error) { - // check if mongodb is ready - isMongoReady, err := s.CheckMongoServerStatus(ctx) - if err != nil { - return false, err - } - - // check if aws sqs is ready - isAwsSQSReady, err := s.CheckAwsSQS(ctx) - if err != nil { - return false, err - } - - if !(isMongoReady && isAwsSQSReady) { - return false, errors.New("error services not ready") - } - return true, nil -} - -// CheckMongoServerStatus check mongodb status. -func (s *Service) CheckMongoServerStatus(ctx context.Context) (bool, error) { - mongoStatus, err := s.repo.GetMongoStatus(ctx) - if err != nil { - return false, err - } - - // check mongo server status - mongoStatusCheck := (mongoStatus.Ok == 1 && mongoStatus.Pid > 0 && mongoStatus.Uptime > 0) - if !mongoStatusCheck { - return false, fmt.Errorf("mongo server not ready (Ok = %v, Pid = %v, Uptime = %v)", mongoStatus.Ok, mongoStatus.Pid, mongoStatus.Uptime) - } - - // check mongo connections - if mongoStatus.Connections.Available <= 0 { - return false, fmt.Errorf("mongo server without available connections (availableConection = %v)", mongoStatus.Connections.Available) - } - return true, nil -} - -// CheckAwsSQS check aws sqs status. -func (s *Service) CheckAwsSQS(ctx context.Context) (bool, error) { - // vaa queue handle in memory [local enviroment] - if !s.isQueueConsumer { - return true, nil - } - // get queue attributes - queueAttributes, err := s.consumer.GetQueueAttributes(ctx) - if err != nil || queueAttributes == nil { - return false, err - } - - // check queue created - createdTimestamp := queueAttributes.Attributes["CreatedTimestamp"] - if createdTimestamp == "" { - return false, errors.New("error createdTimestamp attributes does not exist") - } - return createdTimestamp != "", nil -} diff --git a/parser/http/vaa/controller.go b/parser/http/vaa/controller.go index cd686359..b189c636 100644 --- a/parser/http/vaa/controller.go +++ b/parser/http/vaa/controller.go @@ -1,6 +1,8 @@ package vaa import ( + "fmt" + "github.com/gofiber/fiber/v2" "github.com/wormhole-foundation/wormhole-explorer/parser/processor" "go.uber.org/zap" @@ -34,7 +36,9 @@ func (c *Controller) Parse(ctx *fiber.Ctx) error { return err } - vaaParsed, err := c.processor(ctx.Context(), vaa.Vaa) + trackID := fmt.Sprintf("controller-%s", payload.ID) + + vaaParsed, err := c.processor(ctx.Context(), &processor.Params{Vaa: vaa.Vaa, TrackID: trackID}) if err != nil { return err } diff --git a/parser/processor/processor.go b/parser/processor/processor.go index 4b150e60..5e020569 100644 --- a/parser/processor/processor.go +++ b/parser/processor/processor.go @@ -19,26 +19,28 @@ import ( ) type Processor struct { - parser vaaPayloadParser.ParserVAAAPIClient - repository *parser.Repository - alert alert.AlertClient - metrics metrics.Metrics - logger *zap.Logger + parser vaaPayloadParser.ParserVAAAPIClient + repository *parser.Repository + alert alert.AlertClient + metrics metrics.Metrics + tokenProvider *domain.TokenProvider + logger *zap.Logger } -func New(parser vaaPayloadParser.ParserVAAAPIClient, repository *parser.Repository, alert alert.AlertClient, metrics metrics.Metrics, logger *zap.Logger) *Processor { +func New(parser vaaPayloadParser.ParserVAAAPIClient, repository *parser.Repository, alert alert.AlertClient, metrics metrics.Metrics, tokenProvider *domain.TokenProvider, logger *zap.Logger) *Processor { return &Processor{ - parser: parser, - repository: repository, - alert: alert, - metrics: metrics, - logger: logger, + parser: parser, + repository: repository, + alert: alert, + metrics: metrics, + tokenProvider: tokenProvider, + logger: logger, } } -func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.ParsedVaaUpdate, error) { +func (p *Processor) Process(ctx context.Context, params *Params) (*parser.ParsedVaaUpdate, error) { // unmarshal vaa. - vaa, err := sdk.Unmarshal(vaaBytes) + vaa, err := sdk.Unmarshal(params.Vaa) if err != nil { return nil, err } @@ -63,6 +65,7 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse // send alert when exists and error calling vaa-payload-parser component. alertContext := alert.AlertContext{ Details: map[string]string{ + "trackID": params.TrackID, "chainID": vaa.EmitterChain.String(), "emitterAddress": emitterAddress, "sequence": sequence, @@ -74,7 +77,8 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse } p.logger.Info("VAA cannot be parsed", zap.Error(err), - zap.Uint16("chainID", chainID), + zap.String("trackId", params.TrackID), + zap.Uint16("chainId", chainID), zap.String("address", emitterAddress), zap.String("sequence", sequence)) return nil, nil @@ -82,7 +86,7 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse p.metrics.IncVaaPayloadParserSuccessCount(chainID) p.metrics.IncVaaParsed(chainID) - standardizedProperties := p.transformStandarizedProperties(vaa.MessageID(), vaaParseResponse.StandardizedProperties) + standardizedProperties := p.transformStandarizedProperties(params.TrackID, vaa.MessageID(), vaaParseResponse.StandardizedProperties) // create ParsedVaaUpdate to upsert. now := time.Now() @@ -102,11 +106,13 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse err = p.repository.UpsertParsedVaa(ctx, vaaParsed) if err != nil { p.logger.Error("Error inserting vaa in repository", + zap.String("trackId", params.TrackID), zap.String("id", vaaParsed.ID), zap.Error(err)) // send alert when exists and error inserting parsed vaa. alertContext := alert.AlertContext{ Details: map[string]string{ + "trackID": params.TrackID, "chainID": vaa.EmitterChain.String(), "emitterAddress": emitterAddress, "sequence": sequence, @@ -118,16 +124,16 @@ func (p *Processor) Process(ctx context.Context, vaaBytes []byte) (*parser.Parse } p.metrics.IncVaaParsedInserted(chainID) - p.logger.Info("parsed VAA was successfully persisted", zap.String("id", vaaParsed.ID)) + p.logger.Info("parsed VAA was successfully persisted", zap.String("trackId", params.TrackID), zap.String("id", vaaParsed.ID)) return &vaaParsed, nil } // transformStandarizedProperties transform amount and fee amount. -func (p *Processor) transformStandarizedProperties(vaaID string, sp vaaPayloadParser.StandardizedProperties) vaaPayloadParser.StandardizedProperties { +func (p *Processor) transformStandarizedProperties(trackID, vaaID string, sp vaaPayloadParser.StandardizedProperties) vaaPayloadParser.StandardizedProperties { // transform amount. - amount := p.transformAmount(sp.TokenChain, sp.TokenAddress, sp.Amount, vaaID) + amount := p.transformAmount(sp.TokenChain, trackID, sp.TokenAddress, sp.Amount, vaaID) // transform fee amount. - feeAmount := p.transformAmount(sp.FeeChain, sp.FeeAddress, sp.Fee, vaaID) + feeAmount := p.transformAmount(sp.FeeChain, trackID, sp.FeeAddress, sp.Fee, vaaID) // create StandardizedProperties. return vaaPayloadParser.StandardizedProperties{ AppIds: sp.AppIds, @@ -145,7 +151,7 @@ func (p *Processor) transformStandarizedProperties(vaaID string, sp vaaPayloadPa } // transformAmount transform amount and fee amount. -func (p *Processor) transformAmount(chainID sdk.ChainID, nativeAddress, amount, vaaID string) string { +func (p *Processor) transformAmount(chainID sdk.ChainID, trackID, nativeAddress, amount, vaaID string) string { if chainID == sdk.ChainIDUnset || nativeAddress == "" || amount == "" { return "" @@ -154,6 +160,7 @@ func (p *Processor) transformAmount(chainID sdk.ChainID, nativeAddress, amount, nativeHex, err := domain.DecodeNativeAddressToHex(sdk.ChainID(chainID), nativeAddress) if err != nil { p.logger.Warn("Native address cannot be transformed to hex", + zap.String("trackId", trackID), zap.String("vaaId", vaaID), zap.String("nativeAddress", nativeAddress), zap.Uint16("chain", uint16(chainID))) @@ -163,6 +170,7 @@ func (p *Processor) transformAmount(chainID sdk.ChainID, nativeAddress, amount, addr, err := sdk.StringToAddress(nativeHex) if err != nil { p.logger.Warn("Address cannot be parsed", + zap.String("trackId", trackID), zap.String("vaaId", vaaID), zap.String("nativeAddress", nativeAddress), zap.Uint16("chain", uint16(chainID))) @@ -171,9 +179,10 @@ func (p *Processor) transformAmount(chainID sdk.ChainID, nativeAddress, amount, // Get the token metadata // // This is complementary data about the token that is not present in the VAA itself. - tokenMeta, ok := domain.GetTokenByAddress(sdk.ChainID(chainID), addr.String()) + tokenMeta, ok := p.tokenProvider.GetTokenByAddress(sdk.ChainID(chainID), addr.String()) if !ok { p.logger.Warn("Token metadata not found", + zap.String("trackId", trackID), zap.String("vaaId", vaaID), zap.String("nativeAddress", nativeAddress), zap.Uint16("chain", uint16(chainID))) @@ -184,6 +193,7 @@ func (p *Processor) transformAmount(chainID sdk.ChainID, nativeAddress, amount, bigAmount, ok = bigAmount.SetString(amount, 10) if !ok { p.logger.Error("Cannot parse amount", + zap.String("trackId", trackID), zap.String("vaaId", vaaID), zap.String("amount", amount), zap.String("nativeAddress", nativeAddress), diff --git a/parser/processor/types.go b/parser/processor/types.go index be1d3f86..08847588 100644 --- a/parser/processor/types.go +++ b/parser/processor/types.go @@ -6,5 +6,10 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/parser/parser" ) +type Params struct { + TrackID string + Vaa []byte +} + // ProcessorFunc is a function to process vaa message. -type ProcessorFunc func(context.Context, []byte) (*parser.ParsedVaaUpdate, error) +type ProcessorFunc func(context.Context, *Params) (*parser.ParsedVaaUpdate, error) diff --git a/parser/queue/converter.go b/parser/queue/converter.go new file mode 100644 index 00000000..319dc7da --- /dev/null +++ b/parser/queue/converter.go @@ -0,0 +1,116 @@ +package queue + +import ( + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/wormhole-foundation/wormhole-explorer/common/events" + "go.uber.org/zap" +) + +// VaaEvent represents a vaa data to be handle by the pipeline. +type VaaEvent struct { + ID string `json:"id"` + ChainID uint16 `json:"emitterChain"` + EmitterAddress string `json:"emitterAddr"` + Sequence string `json:"sequence"` + GuardianSetIndex uint32 `json:"guardianSetIndex"` + Vaa []byte `json:"vaas"` + IndexedAt time.Time `json:"indexedAt"` + Timestamp *time.Time `json:"timestamp"` + UpdatedAt *time.Time `json:"updatedAt"` + TxHash string `json:"txHash"` + Version uint16 `json:"version"` + Revision uint16 `json:"revision"` +} + +// VaaConverter converts a message from a VAAEvent. +func NewVaaConverter(log *zap.Logger) ConverterFunc { + + return func(msg string) (*Event, error) { + // unmarshal message to vaaEvent + var vaaEvent VaaEvent + err := json.Unmarshal([]byte(msg), &vaaEvent) + if err != nil { + return nil, err + } + return &Event{ + TrackID: fmt.Sprintf("pipeline-%s", vaaEvent.ID), + ID: vaaEvent.ID, + ChainID: vaaEvent.ChainID, + EmitterAddress: vaaEvent.EmitterAddress, + Sequence: vaaEvent.Sequence, + Vaa: vaaEvent.Vaa, + Timestamp: vaaEvent.Timestamp, + TxHash: vaaEvent.TxHash, + }, nil + } +} + +func NewNotificationEvent(log *zap.Logger) ConverterFunc { + + return func(msg string) (*Event, error) { + // unmarshal message to NotificationEvent + var notification events.NotificationEvent + err := json.Unmarshal([]byte(msg), ¬ification) + if err != nil { + return nil, err + } + + if notification.Event != events.SignedVaaType && notification.Event != events.LogMessagePublishedMesageType { + log.Debug("Skip event type", zap.String("trackId", notification.TrackID), zap.String("type", notification.Event)) + return nil, nil + } + + switch notification.Event { + case events.SignedVaaType: + signedVaaEvent, err := events.GetEventData[events.SignedVaa](¬ification) + if err != nil { + log.Error("Error decoding signedVAA from notification event", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, nil + } + + return &Event{ + TrackID: notification.TrackID, + ID: signedVaaEvent.ID, + ChainID: signedVaaEvent.EmitterChain, + EmitterAddress: signedVaaEvent.EmitterAddress, + Sequence: strconv.FormatUint(signedVaaEvent.Sequence, 10), + Vaa: signedVaaEvent.Vaa, + Timestamp: &signedVaaEvent.Timestamp, + TxHash: signedVaaEvent.TxHash, + }, nil + case events.LogMessagePublishedMesageType: + plm, err := events.GetEventData[events.LogMessagePublished](¬ification) + if err != nil { + log.Error("Error decoding publishedLogMessage from notification event", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, nil + } + + vaa, err := events.CreateUnsignedVAA(&plm) + if err != nil { + log.Error("Error creating unsigned vaa", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, err + } + + vaaBytes, err := vaa.MarshalBinary() + if err != nil { + return nil, err + } + + return &Event{ + TrackID: notification.TrackID, + ID: vaa.MessageID(), + ChainID: plm.ChainID, + EmitterAddress: plm.Attributes.Sender, + Sequence: strconv.FormatUint(plm.Attributes.Sequence, 10), + Vaa: vaaBytes, + Timestamp: &plm.BlockTime, + TxHash: plm.TxHash, + }, nil + } + return nil, nil + } +} diff --git a/parser/queue/converter_test.go b/parser/queue/converter_test.go new file mode 100644 index 00000000..2f0a7046 --- /dev/null +++ b/parser/queue/converter_test.go @@ -0,0 +1,87 @@ +package queue + +import ( + "encoding/json" + "testing" + "time" + + "github.com/stretchr/testify/assert" + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" + "go.uber.org/zap" +) + +func TestNotificationEvent(t *testing.T) { + log := zap.NewExample() + converter := NewNotificationEvent(log) + msg := `{ + "trackId":"chain-event-0xb437df51c6c9af58eff89e328f84d8bece25d718baf088899c9692782fe29c43-10012515", + "source":"blockchain-watcher", + "event":"log-message-published", + "timestamp":"2023-11-10T14:20:45.159Z", + "version":"1", + "data":{ + "chainId":2, + "emitter":"0x706abc4e45d419950511e474c7b9ed348a4a716c", + "txHash":"0xb437df51c6c9af58eff89e328f84d8bece25d718baf088899c9692782fe29c43", + "blockHeight":"10012515", + "blockTime":"2023-11-09T09:06:24.000Z", + "attributes":{ + "sender":"0xe9d87dD072B0bcE6aA9335d590cfB0342870d7B0", + "sequence":1, + "payload":"0x7b226e65766572223a7b22676f6e6e61223a7b2267697665223a7b22796f75223a227570227d7d7d7d", + "nonce":1699520760, + "consistencyLevel":200 + } + } + }` + event, err := converter(msg) + assert.NoError(t, err) + assert.NotNil(t, event) + assert.Equal(t, "chain-event-0xb437df51c6c9af58eff89e328f84d8bece25d718baf088899c9692782fe29c43-10012515", event.TrackID) + assert.Equal(t, "2/000000000000000000000000e9d87dd072b0bce6aa9335d590cfb0342870d7b0/1", event.ID) + assert.Equal(t, uint16(2), event.ChainID) + assert.Equal(t, "0xe9d87dD072B0bcE6aA9335d590cfB0342870d7B0", event.EmitterAddress) + vaa, err := sdk.Unmarshal(event.Vaa) + assert.NoError(t, err) + assert.NotNil(t, vaa) + expectedPayload := []byte{123, 34, 110, 101, 118, 101, 114, 34, 58, 123, 34, 103, 111, 110, 110, 97, 34, 58, 123, 34, 103, 105, 118, 101, 34, 58, 123, 34, 121, 111, 117, 34, 58, 34, 117, 112, 34, 125, 125, 125, 125} + assert.Equal(t, expectedPayload, vaa.Payload) +} + +func TestSqsEvent(t *testing.T) { + log := zap.NewExample() + converter := NewNotificationEvent(log) + msg := ` + { + "Type" : "Notification", + "MessageId" : "14d855ca-ad78-59c5-b30e-0802e1362944", + "SequenceNumber" : "10000000000040190002", + "TopicArn" : "arn:aws:sns:us-east-2:581679387567:notification-chain-events-dev-testnet.fifo", + "Subject" : "blockchain-watcher", + "Message" : "{\"trackId\":\"chain-event-0xb6b7af602aa098fbd8c88da2c2e4a316eef22f0ee621c5ca7616992c3fd9d3fe-10012893\",\"source\":\"blockchain-watcher\",\"event\":\"log-message-published\",\"timestamp\":\"2023-11-10T15:19:42.320Z\",\"version\":\"1\",\"data\":{\"chainId\":2,\"emitter\":\"0x706abc4e45d419950511e474c7b9ed348a4a716c\",\"txHash\":\"0xb6b7af602aa098fbd8c88da2c2e4a316eef22f0ee621c5ca7616992c3fd9d3fe\",\"blockHeight\":\"10012893\",\"blockTime\":\"2023-11-09T10:41:24.000Z\",\"attributes\":{\"sender\":\"0x28D8F1Be96f97C1387e94A53e00eCcFb4E75175a\",\"sequence\":3418,\"payload\":\"0x010017000000000000000000000000b5b6bf4224f75762dae40c862dc899431ea1778300000040000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000654cb74d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007a12000000000000000000000000000000000000000000000000000000006a6fd66db0002000000000000000000000000e310c47fa3e3f011a6e3108e3c725cff4900199b00000000000000000000000090995dbd1aae85872451b50a569de947d34ac4ee000000000000000000000000d1463b4fe86166768d2ff51b1a928bebb5c9f375000000000000000000000000e310c47fa3e3f011a6e3108e3c725cff4900199b00\",\"nonce\":0,\"consistencyLevel\":200}}}", + "Timestamp" : "2023-11-10T15:19:42.548Z", + "UnsubscribeURL" : "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-2:581679387567:notification-chain-events-dev-testnet.fifo:2e1cc196-afd8-4efb-b9b3-27c38e688494" + } + ` + + // unmarshal body to sqsEvent from sns/sqs subscription + var sqsEvent sqsEvent + err := json.Unmarshal([]byte(msg), &sqsEvent) + assert.NoError(t, err) + event, err := converter(sqsEvent.Message) + assert.NoError(t, err) + assert.NotNil(t, event) + assert.Equal(t, "2/00000000000000000000000028d8f1be96f97c1387e94a53e00eccfb4e75175a/3418", event.ID) + assert.Equal(t, uint16(2), event.ChainID) + assert.Equal(t, "0x28D8F1Be96f97C1387e94A53e00eCcFb4E75175a", event.EmitterAddress) + assert.Equal(t, "0xb6b7af602aa098fbd8c88da2c2e4a316eef22f0ee621c5ca7616992c3fd9d3fe", event.TxHash) + vaa, err := sdk.Unmarshal(event.Vaa) + assert.NoError(t, err) + assert.NotNil(t, vaa) + expectedTimestamp, err := time.Parse(time.RFC3339, "2023-11-09T10:41:24.000Z") + assert.NoError(t, err) + assert.Equal(t, uint64(3418), vaa.Sequence) + assert.Equal(t, sdk.ChainIDEthereum, vaa.EmitterChain) + assert.Equal(t, expectedTimestamp.UTC(), vaa.Timestamp.UTC()) + assert.Equal(t, uint8(200), vaa.ConsistencyLevel) +} diff --git a/parser/queue/vaa_sqs.go b/parser/queue/event_sqs.go similarity index 76% rename from parser/queue/vaa_sqs.go rename to parser/queue/event_sqs.go index 804025e4..2009dd6a 100644 --- a/parser/queue/vaa_sqs.go +++ b/parser/queue/event_sqs.go @@ -21,18 +21,23 @@ type SQS struct { chSize int wg sync.WaitGroup filterConsume FilterConsumeFunc + converter ConverterFunc metrics metrics.Metrics logger *zap.Logger } // FilterConsumeFunc filter vaaa func definition. -type FilterConsumeFunc func(vaaEvent *VaaEvent) bool +type FilterConsumeFunc func(*Event) bool -// NewVAASQS creates a VAA queue in SQS instances. -func NewVAASQS(consumer *sqs.Consumer, filterConsume FilterConsumeFunc, metrics metrics.Metrics, logger *zap.Logger, opts ...SQSOption) *SQS { +// ConverterFunc converts a message from a sqs message. +type ConverterFunc func(string) (*Event, error) + +// NewEventSQS creates a VAA queue in SQS instances. +func NewEventSQS(consumer *sqs.Consumer, converter ConverterFunc, filterConsume FilterConsumeFunc, metrics metrics.Metrics, logger *zap.Logger, opts ...SQSOption) *SQS { s := &SQS{ consumer: consumer, chSize: 10, + converter: converter, filterConsume: filterConsume, metrics: metrics, logger: logger} @@ -70,28 +75,32 @@ func (q *SQS) Consume(ctx context.Context) <-chan ConsumerMessage { continue } - // unmarshal message to vaaEvent - var vaaEvent VaaEvent - err = json.Unmarshal([]byte(sqsEvent.Message), &vaaEvent) + // unmarshal message to event + event, err := q.converter(sqsEvent.Message) if err != nil { - q.logger.Error("Error decoding vaaEvent message from SQSEvent", zap.Error(err)) + q.logger.Error("Error decoding event message from SQSEvent", zap.Error(err)) continue } - q.metrics.IncVaaConsumedQueue(vaaEvent.ChainID) + + if event == nil { + continue + } + + q.metrics.IncVaaConsumedQueue(event.ChainID) // filter vaaEvent by p2p net. - if q.filterConsume(&vaaEvent) { + if q.filterConsume(event) { if err := q.consumer.DeleteMessage(ctx, msg.ReceiptHandle); err != nil { q.logger.Error("Error deleting message from SQS", zap.Error(err)) } continue } - q.metrics.IncVaaUnfiltered(vaaEvent.ChainID) + q.metrics.IncVaaUnfiltered(event.ChainID) q.wg.Add(1) q.ch <- &sqsConsumerMessage{ id: msg.ReceiptHandle, - data: &vaaEvent, + data: event, wg: &q.wg, logger: q.logger, consumer: q.consumer, @@ -112,7 +121,7 @@ func (q *SQS) Close() { } type sqsConsumerMessage struct { - data *VaaEvent + data *Event consumer *sqs.Consumer wg *sync.WaitGroup id *string @@ -121,7 +130,7 @@ type sqsConsumerMessage struct { ctx context.Context } -func (m *sqsConsumerMessage) Data() *VaaEvent { +func (m *sqsConsumerMessage) Data() *Event { return m.data } diff --git a/parser/queue/filter.go b/parser/queue/filter.go index dc0a1f8b..c6b33051 100644 --- a/parser/queue/filter.go +++ b/parser/queue/filter.go @@ -3,11 +3,11 @@ package queue import "github.com/wormhole-foundation/wormhole/sdk/vaa" // PythFilter filter vaa event from pyth chain. -func PythFilter(vaaEvent *VaaEvent) bool { +func PythFilter(vaaEvent *Event) bool { return vaaEvent.ChainID == uint16(vaa.ChainIDPythNet) } // NonFilter non filter vaa evant. -func NonFilter(vaaEvent *VaaEvent) bool { +func NonFilter(vaaEvent *Event) bool { return false } diff --git a/parser/queue/queue.go b/parser/queue/queue.go deleted file mode 100644 index 9e414076..00000000 --- a/parser/queue/queue.go +++ /dev/null @@ -1,38 +0,0 @@ -package queue - -import ( - "context" - "time" -) - -type sqsEvent struct { - MessageID string `json:"MessageId"` - Message string `json:"Message"` -} - -// VaaEvent represents a vaa data to be handle by the pipeline. -type VaaEvent struct { - ID string `json:"id"` - ChainID uint16 `json:"emitterChain"` - EmitterAddress string `json:"emitterAddr"` - Sequence string `json:"sequence"` - GuardianSetIndex uint32 `json:"guardianSetIndex"` - Vaa []byte `json:"vaas"` - IndexedAt time.Time `json:"indexedAt"` - Timestamp *time.Time `json:"timestamp"` - UpdatedAt *time.Time `json:"updatedAt"` - TxHash string `json:"txHash"` - Version uint16 `json:"version"` - Revision uint16 `json:"revision"` -} - -// ConsumerMessage defition. -type ConsumerMessage interface { - Data() *VaaEvent - Done() - Failed() - IsExpired() bool -} - -// VAAConsumeFunc is a function to consume VAAEvent. -type VAAConsumeFunc func(context.Context) <-chan ConsumerMessage diff --git a/parser/queue/types.go b/parser/queue/types.go new file mode 100644 index 00000000..2544c2f2 --- /dev/null +++ b/parser/queue/types.go @@ -0,0 +1,34 @@ +package queue + +import ( + "context" + "time" +) + +type sqsEvent struct { + MessageID string `json:"MessageId"` + Message string `json:"Message"` +} + +// Event represents a event data to be handle. +type Event struct { + TrackID string + ID string + ChainID uint16 + EmitterAddress string + Sequence string + Vaa []byte + Timestamp *time.Time + TxHash string +} + +// ConsumerMessage defition. +type ConsumerMessage interface { + Data() *Event + Done() + Failed() + IsExpired() bool +} + +// ConsumeFunc is a function to consume Event. +type ConsumeFunc func(context.Context) <-chan ConsumerMessage diff --git a/spy/go.mod b/spy/go.mod index 55031167..9bebacb2 100644 --- a/spy/go.mod +++ b/spy/go.mod @@ -22,8 +22,6 @@ require ( ) require ( - github.com/algorand/go-algorand-sdk v1.23.0 // indirect - github.com/algorand/go-codec/codec v1.1.8 // indirect github.com/andybalholm/brotli v1.0.5 // indirect github.com/aws/aws-sdk-go-v2 v1.17.4 // indirect github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 // indirect @@ -36,7 +34,6 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/cenkalti/backoff/v4 v4.1.3 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cosmos/btcutil v1.0.5 // indirect github.com/davecgh/go-spew v1.1.1 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect github.com/deepmap/oapi-codegen v1.8.2 // indirect diff --git a/spy/go.sum b/spy/go.sum index ce402664..e8d1f4ca 100644 --- a/spy/go.sum +++ b/spy/go.sum @@ -38,11 +38,6 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/algorand/go-algorand-sdk v1.23.0 h1:wlEV6OgDVc/sLeF2y41bwNG/Lr8EoMnN87Ur8N2Gyyo= -github.com/algorand/go-algorand-sdk v1.23.0/go.mod h1:7i2peZBcE48kfoxNZnLA+mklKh812jBKvQ+t4bn0KBQ= -github.com/algorand/go-codec v1.1.8/go.mod h1:XhzVs6VVyWMLu6cApb9/192gBjGRVGm5cX5j203Heg4= -github.com/algorand/go-codec/codec v1.1.8 h1:lsFuhcOH2LiEhpBH3BVUUkdevVmwCRyvb7FCAAPeY6U= -github.com/algorand/go-codec/codec v1.1.8/go.mod h1:tQ3zAJ6ijTps6V+wp8KsGDnPC2uhHVC7ANyrtkIY0bA= github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= @@ -82,8 +77,6 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= -github.com/cosmos/btcutil v1.0.5/go.mod h1:IyB7iuqZMJlthe2tkIFL33xPyzbFYP0XVdS8P5lUPis= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= @@ -368,7 +361,6 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/test-go/testify v1.1.4 h1:Tf9lntrKUMHiXQ07qBScBTSA0dhYQlu83hswqelv1iE= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tinylib/msgp v1.1.6/go.mod h1:75BAfg2hauQhs3qedfdDZmWAPcFMAvJE5b9rGOMufyw= @@ -397,7 +389,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.mongodb.org/mongo-driver v1.11.2 h1:+1v2rDQUWNcGW7/7E0Jvdz51V38XXxJfhzbV17aNHCw= go.mongodb.org/mongo-driver v1.11.2/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= @@ -461,7 +452,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -497,7 +487,6 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -571,7 +560,6 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -646,7 +634,6 @@ golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20201022035929-9cf592e881e9/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/spy/source/redis_subscriber.go b/spy/source/redis_subscriber.go index d7a24e81..b27651b9 100644 --- a/spy/source/redis_subscriber.go +++ b/spy/source/redis_subscriber.go @@ -7,7 +7,7 @@ import ( "fmt" "github.com/go-redis/redis/v8" - "github.com/wormhole-foundation/wormhole-explorer/common/domain" + "github.com/wormhole-foundation/wormhole-explorer/common/events" "go.uber.org/zap" ) @@ -49,16 +49,16 @@ func (r *RedisSubscriber) subscribe(ctx context.Context) { ch := r.pubSub.Channel() go func() { for msg := range ch { - var notification domain.NotificationEvent + var notification events.NotificationEvent err := json.Unmarshal([]byte(msg.Payload), ¬ification) if err != nil { r.logger.Error("Error decoding vaaEvent message from SQSEvent", zap.Error(err)) continue } - switch notification.Type { - case domain.SignedVaaType: - signedVaa, err := domain.GetEventPayload[domain.SignedVaa](¬ification) + switch notification.Event { + case events.SignedVaaType: + signedVaa, err := events.GetEventData[events.SignedVaa](¬ification) if err != nil { r.logger.Error("Error decoding signedVAA from notification event", zap.String("trackId", notification.TrackID), zap.Error(err)) continue diff --git a/tx-tracker/chains/api_evm.go b/tx-tracker/chains/api_evm.go index dc6dacea..4a09807f 100644 --- a/tx-tracker/chains/api_evm.go +++ b/tx-tracker/chains/api_evm.go @@ -33,10 +33,11 @@ func fetchEthTx( } defer client.Close() + nativeTxHash := txHashLowerCaseWith0x(txHash) // query transaction data var txReply ethGetTransactionByHashResponse { - err = client.CallContext(ctx, rateLimiter, &txReply, "eth_getTransactionByHash", "0x"+txHash) + err = client.CallContext(ctx, rateLimiter, &txReply, "eth_getTransactionByHash", nativeTxHash) if err != nil { return nil, fmt.Errorf("failed to get tx by hash: %w", err) } @@ -48,7 +49,7 @@ func fetchEthTx( // build results and return txDetail := &TxDetail{ From: strings.ToLower(txReply.From), - NativeTxHash: fmt.Sprintf("0x%s", strings.ToLower(txHash)), + NativeTxHash: nativeTxHash, } return txDetail, nil } diff --git a/tx-tracker/chains/api_sei.go b/tx-tracker/chains/api_sei.go new file mode 100644 index 00000000..cf957f40 --- /dev/null +++ b/tx-tracker/chains/api_sei.go @@ -0,0 +1,70 @@ +package chains + +import ( + "context" + "time" + + "github.com/wormhole-foundation/wormhole/sdk/vaa" +) + +type seiTx struct { + TxHash string + Sender string +} + +func seiTxSearchExtractor(tx *cosmosTxSearchResponse, logs []cosmosLogWrapperResponse) (*seiTx, error) { + var sender string + for _, l := range logs { + for _, e := range l.Events { + if e.Type == "message" { + for _, attr := range e.Attributes { + if attr.Key == "sender" { + sender = attr.Value + } + } + break + } + } + } + return &seiTx{TxHash: tx.Result.Txs[0].Hash, Sender: sender}, nil +} + +type apiSei struct { + wormchainUrl string + wormchainRateLimiter *time.Ticker + p2pNetwork string +} + +func fetchSeiDetail(ctx context.Context, baseUrl string, rateLimiter *time.Ticker, sequence, timestamp, srcChannel, dstChannel string) (*seiTx, error) { + params := &cosmosTxSearchParams{Sequence: sequence, Timestamp: timestamp, SrcChannel: srcChannel, DstChannel: dstChannel} + return fetchTxSearch[seiTx](ctx, baseUrl, rateLimiter, params, seiTxSearchExtractor) +} + +func (a *apiSei) fetchSeiTx( + ctx context.Context, + rateLimiter *time.Ticker, + baseUrl string, + txHash string, +) (*TxDetail, error) { + txHash = txHashLowerCaseWith0x(txHash) + wormchainTx, err := fetchWormchainDetail(ctx, a.wormchainUrl, a.wormchainRateLimiter, txHash) + if err != nil { + return nil, err + } + seiTx, err := fetchSeiDetail(ctx, baseUrl, rateLimiter, wormchainTx.sequence, wormchainTx.timestamp, wormchainTx.srcChannel, wormchainTx.dstChannel) + if err != nil { + return nil, err + } + return &TxDetail{ + NativeTxHash: txHash, + From: wormchainTx.receiver, + Attribute: &AttributeTxDetail{ + Type: "wormchain-gateway", + Value: &WorchainAttributeTxDetail{ + OriginChainID: vaa.ChainIDSei, + OriginTxHash: seiTx.TxHash, + OriginAddress: seiTx.Sender, + }, + }, + }, nil +} diff --git a/tx-tracker/chains/api_sei_test.go b/tx-tracker/chains/api_sei_test.go new file mode 100644 index 00000000..fde4d5dc --- /dev/null +++ b/tx-tracker/chains/api_sei_test.go @@ -0,0 +1,526 @@ +package chains + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +const jsonTxSearchResponse = ` +{ + "jsonrpc": "2.0", + "id": 1729346572401935400, + "result": { + "txs": [ + { + "hash": "D97FD8EB0FAB7784A8A293A7FEF1F47FDE0C4375C254A19361E0F87CC01EF99A", + "height": "33472147", + "index": 34, + "tx_result": { + "data": "CiYKJC9jb3Ntd2FzbS53YXNtLnYxLk1zZ0V4ZWN1dGVDb250cmFjdA==", + "log": "[{\"events\":[{\"type\":\"burn\",\"attributes\":[{\"key\":\"burner\",\"value\":\"sei19ejy8n9qsectrf4semdp9cpknflld0j6svvmtq\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"},{\"key\":\"burn_from_address\",\"value\":\"sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"}]},{\"type\":\"coin_received\",\"attributes\":[{\"key\":\"receiver\",\"value\":\"sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"},{\"key\":\"receiver\",\"value\":\"sei19ejy8n9qsectrf4semdp9cpknflld0j6svvmtq\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"}]},{\"type\":\"coin_spent\",\"attributes\":[{\"key\":\"spender\",\"value\":\"sei17dxuvdfgxu0gpym3hu8glcct9kjccn4xtdfgfc\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"},{\"key\":\"spender\",\"value\":\"sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"},{\"key\":\"spender\",\"value\":\"sei19ejy8n9qsectrf4semdp9cpknflld0j6svvmtq\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"}]},{\"type\":\"execute\",\"attributes\":[{\"key\":\"_contract_address\",\"value\":\"sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l\"},{\"key\":\"_contract_address\",\"value\":\"sei1yqajzpwm4ud53jkhcndy576p6tfpp3sjecrg6keurm3l46kj6pyq5p2mhw\"},{\"key\":\"_contract_address\",\"value\":\"sei1smzlm9t79kur392nu9egl8p8je9j92q4gzguewj56a05kyxxra0qy0nuf3\"},{\"key\":\"_contract_address\",\"value\":\"sei1yqajzpwm4ud53jkhcndy576p6tfpp3sjecrg6keurm3l46kj6pyq5p2mhw\"},{\"key\":\"_contract_address\",\"value\":\"sei1gjrrme22cyha4ht2xapn3f08zzw6z3d4uxx6fyy9zd5dyr3yxgzqqncdqn\"}]},{\"type\":\"message\",\"attributes\":[{\"key\":\"action\",\"value\":\"/cosmwasm.wasm.v1.MsgExecuteContract\"},{\"key\":\"module\",\"value\":\"wasm\"},{\"key\":\"sender\",\"value\":\"sei17dxuvdfgxu0gpym3hu8glcct9kjccn4xtdfgfc\"}]},{\"type\":\"send_packet\",\"attributes\":[{\"key\":\"packet_data\",\"value\":\"{\\\"publish\\\":{\\\"msg\\\":[{\\\"key\\\":\\\"message.message\\\",\\\"value\\\":\\\"0100000000000000000000000000000000000000000000000000000000000003e8069b8857feab8184fb687f634618c035dac439dc1aeb3b5598a0f000000000010001efe18e2a3342366d5d0823766989514c907a243667dd9ff2a4c3fc46d28ca23f00010000000000000000000000000000000000000000000000000000000000000000\\\"},{\\\"key\\\":\\\"message.sender\\\",\\\"value\\\":\\\"86c5fd957e2db8389553e1728f9c27964b22a8154091ccba54d75f4b10c61f5e\\\"},{\\\"key\\\":\\\"message.chain_id\\\",\\\"value\\\":\\\"32\\\"},{\\\"key\\\":\\\"message.nonce\\\",\\\"value\\\":\\\"0\\\"},{\\\"key\\\":\\\"message.sequence\\\",\\\"value\\\":\\\"15557\\\"},{\\\"key\\\":\\\"message.block_time\\\",\\\"value\\\":\\\"1697810572\\\"}]}}\"},{\"key\":\"packet_data_hex\",\"value\":\"7b227075626c697368223a7b226d7367223a5b7b226b6579223a226d6573736167652e6d657373616765222c2276616c7565223a223031303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303365383036396238383537666561623831383466623638376636333436313863303335646163343339646331616562336235353938613066303030303030303030303130303031656665313865326133333432333636643564303832333736363938393531346339303761323433363637646439666632613463336663343664323863613233663030303130303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030227d2c7b226b6579223a226d6573736167652e73656e646572222c2276616c7565223a2238366335666439353765326462383338393535336531373238663963323739363462323261383135343039316363626135346437356634623130633631663565227d2c7b226b6579223a226d6573736167652e636861696e5f6964222c2276616c7565223a223332227d2c7b226b6579223a226d6573736167652e6e6f6e6365222c2276616c7565223a2230227d2c7b226b6579223a226d6573736167652e73657175656e6365222c2276616c7565223a223135353537227d2c7b226b6579223a226d6573736167652e626c6f636b5f74696d65222c2276616c7565223a2231363937383130353732227d5d7d7d\"},{\"key\":\"packet_timeout_height\",\"value\":\"0-0\"},{\"key\":\"packet_timeout_timestamp\",\"value\":\"1729346572401935236\"},{\"key\":\"packet_sequence\",\"value\":\"15562\"},{\"key\":\"packet_src_port\",\"value\":\"wasm.sei1gjrrme22cyha4ht2xapn3f08zzw6z3d4uxx6fyy9zd5dyr3yxgzqqncdqn\"},{\"key\":\"packet_src_channel\",\"value\":\"channel-4\"},{\"key\":\"packet_dst_port\",\"value\":\"wasm.wormhole1wkwy0xh89ksdgj9hr347dyd2dw7zesmtrue6kfzyml4vdtz6e5ws2y050r\"},{\"key\":\"packet_dst_channel\",\"value\":\"channel-0\"},{\"key\":\"packet_channel_ordering\",\"value\":\"ORDER_UNORDERED\"},{\"key\":\"packet_connection\",\"value\":\"connection-6\"}]},{\"type\":\"transfer\",\"attributes\":[{\"key\":\"recipient\",\"value\":\"sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l\"},{\"key\":\"sender\",\"value\":\"sei17dxuvdfgxu0gpym3hu8glcct9kjccn4xtdfgfc\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"},{\"key\":\"recipient\",\"value\":\"sei19ejy8n9qsectrf4semdp9cpknflld0j6svvmtq\"},{\"key\":\"sender\",\"value\":\"sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l\"},{\"key\":\"amount\",\"value\":\"1000factory/sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l/3ApLjovgkMT4LWAcqyYDPaNiDSKmuJJfMom18Ed29o27\"}]},{\"type\":\"wasm\",\"attributes\":[{\"key\":\"_contract_address\",\"value\":\"sei1yqajzpwm4ud53jkhcndy576p6tfpp3sjecrg6keurm3l46kj6pyq5p2mhw\"},{\"key\":\"action\",\"value\":\"increase_allowance\"},{\"key\":\"owner\",\"value\":\"sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l\"},{\"key\":\"spender\",\"value\":\"sei1smzlm9t79kur392nu9egl8p8je9j92q4gzguewj56a05kyxxra0qy0nuf3\"},{\"key\":\"amount\",\"value\":\"1000\"},{\"key\":\"_contract_address\",\"value\":\"sei1smzlm9t79kur392nu9egl8p8je9j92q4gzguewj56a05kyxxra0qy0nuf3\"},{\"key\":\"transfer.token_chain\",\"value\":\"1\"},{\"key\":\"transfer.token\",\"value\":\"069b8857feab8184fb687f634618c035dac439dc1aeb3b5598a0f00000000001\"},{\"key\":\"transfer.sender\",\"value\":\"397ad473aee22d1cd2829ea2238cbffa8a61c9d8eea3a1f7ccf20dc14ca78188\"},{\"key\":\"transfer.recipient_chain\",\"value\":\"1\"},{\"key\":\"transfer.recipient\",\"value\":\"efe18e2a3342366d5d0823766989514c907a243667dd9ff2a4c3fc46d28ca23f\"},{\"key\":\"transfer.amount\",\"value\":\"1000\"},{\"key\":\"transfer.nonce\",\"value\":\"0\"},{\"key\":\"transfer.block_time\",\"value\":\"1697810572\"},{\"key\":\"_contract_address\",\"value\":\"sei1yqajzpwm4ud53jkhcndy576p6tfpp3sjecrg6keurm3l46kj6pyq5p2mhw\"},{\"key\":\"action\",\"value\":\"burn_from\"},{\"key\":\"from\",\"value\":\"sei189adguawugk3e55zn63z8r9ll29xrjwca636ra7v7gxuzn98sxyqwzt47l\"},{\"key\":\"by\",\"value\":\"sei1smzlm9t79kur392nu9egl8p8je9j92q4gzguewj56a05kyxxra0qy0nuf3\"},{\"key\":\"amount\",\"value\":\"1000\"},{\"key\":\"_contract_address\",\"value\":\"sei1gjrrme22cyha4ht2xapn3f08zzw6z3d4uxx6fyy9zd5dyr3yxgzqqncdqn\"},{\"key\":\"message.message\",\"value\":\"0100000000000000000000000000000000000000000000000000000000000003e8069b8857feab8184fb687f634618c035dac439dc1aeb3b5598a0f000000000010001efe18e2a3342366d5d0823766989514c907a243667dd9ff2a4c3fc46d28ca23f00010000000000000000000000000000000000000000000000000000000000000000\"},{\"key\":\"message.sender\",\"value\":\"86c5fd957e2db8389553e1728f9c27964b22a8154091ccba54d75f4b10c61f5e\"},{\"key\":\"message.chain_id\",\"value\":\"32\"},{\"key\":\"message.nonce\",\"value\":\"0\"},{\"key\":\"message.sequence\",\"value\":\"15557\"},{\"key\":\"message.block_time\",\"value\":\"1697810572\"},{\"key\":\"is_ibc\",\"value\":\"true\"}]}]}]", + "gas_wanted": "903925", + "gas_used": "644246", + "events": [ + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTdkeHV2ZGZneHUwZ3B5bTNodThnbGNjdDlramNjbjR4dGRmZ2Zj", + "index": true + }, + { + "key": "YW1vdW50", + "value": "OTAzOTN1c2Vp", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "ZmVl", + "value": "OTAzOTN1c2Vp", + "index": true + }, + { + "key": "ZmVlX3BheWVy", + "value": "c2VpMTdkeHV2ZGZneHUwZ3B5bTNodThnbGNjdDlramNjbjR4dGRmZ2Zj", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "YWNjX3NlcQ==", + "value": "c2VpMTdkeHV2ZGZneHUwZ3B5bTNodThnbGNjdDlramNjbjR4dGRmZ2ZjLzU3", + "index": true + } + ] + }, + { + "type": "tx", + "attributes": [ + { + "key": "c2lnbmF0dXJl", + "value": "UjBzNWw2NWNvbE9pU1l4c1FMRU10R1craVkzSENROEdvRFFtd2tVNStNVVNnQjVXaWZORThnYzlnQW5uZThQaTdETk5KdVpZTlpXTkFld1NUMjRremc9PQ==", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "YWN0aW9u", + "value": "L2Nvc213YXNtLndhc20udjEuTXNnRXhlY3V0ZUNvbnRyYWN0", + "index": true + } + ] + }, + { + "type": "message", + "attributes": [ + { + "key": "bW9kdWxl", + "value": "d2FzbQ==", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTdkeHV2ZGZneHUwZ3B5bTNodThnbGNjdDlramNjbjR4dGRmZ2Zj", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTdkeHV2ZGZneHUwZ3B5bTNodThnbGNjdDlramNjbjR4dGRmZ2Zj", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2w=", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2w=", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTdkeHV2ZGZneHUwZ3B5bTNodThnbGNjdDlramNjbjR4dGRmZ2Zj", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "execute", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2w=", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2w=", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "coin_received", + "attributes": [ + { + "key": "cmVjZWl2ZXI=", + "value": "c2VpMTllank4bjlxc2VjdHJmNHNlbWRwOWNwa25mbGxkMGo2c3Z2bXRx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "transfer", + "attributes": [ + { + "key": "cmVjaXBpZW50", + "value": "c2VpMTllank4bjlxc2VjdHJmNHNlbWRwOWNwa25mbGxkMGo2c3Z2bXRx", + "index": true + }, + { + "key": "c2VuZGVy", + "value": "c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2w=", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "coin_spent", + "attributes": [ + { + "key": "c3BlbmRlcg==", + "value": "c2VpMTllank4bjlxc2VjdHJmNHNlbWRwOWNwa25mbGxkMGo2c3Z2bXRx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "burn", + "attributes": [ + { + "key": "YnVybmVy", + "value": "c2VpMTllank4bjlxc2VjdHJmNHNlbWRwOWNwa25mbGxkMGo2c3Z2bXRx", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "burn", + "attributes": [ + { + "key": "YnVybl9mcm9tX2FkZHJlc3M=", + "value": "c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2w=", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMGZhY3Rvcnkvc2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wvM0FwTGpvdmdrTVQ0TFdBY3F5WURQYU5pRFNLbXVKSmZNb20xOEVkMjlvMjc=", + "index": true + } + ] + }, + { + "type": "execute", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXlxYWp6cHdtNHVkNTNqa2hjbmR5NTc2cDZ0ZnBwM3NqZWNyZzZrZXVybTNsNDZrajZweXE1cDJtaHc=", + "index": true + } + ] + }, + { + "type": "wasm", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXlxYWp6cHdtNHVkNTNqa2hjbmR5NTc2cDZ0ZnBwM3NqZWNyZzZrZXVybTNsNDZrajZweXE1cDJtaHc=", + "index": true + }, + { + "key": "YWN0aW9u", + "value": "aW5jcmVhc2VfYWxsb3dhbmNl", + "index": true + }, + { + "key": "b3duZXI=", + "value": "c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2w=", + "index": true + }, + { + "key": "c3BlbmRlcg==", + "value": "c2VpMXNtemxtOXQ3OWt1cjM5Mm51OWVnbDhwOGplOWo5MnE0Z3pndWV3ajU2YTA1a3l4eHJhMHF5MG51ZjM=", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMA==", + "index": true + } + ] + }, + { + "type": "execute", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXNtemxtOXQ3OWt1cjM5Mm51OWVnbDhwOGplOWo5MnE0Z3pndWV3ajU2YTA1a3l4eHJhMHF5MG51ZjM=", + "index": true + } + ] + }, + { + "type": "wasm", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXNtemxtOXQ3OWt1cjM5Mm51OWVnbDhwOGplOWo5MnE0Z3pndWV3ajU2YTA1a3l4eHJhMHF5MG51ZjM=", + "index": true + }, + { + "key": "dHJhbnNmZXIudG9rZW5fY2hhaW4=", + "value": "MQ==", + "index": true + }, + { + "key": "dHJhbnNmZXIudG9rZW4=", + "value": "MDY5Yjg4NTdmZWFiODE4NGZiNjg3ZjYzNDYxOGMwMzVkYWM0MzlkYzFhZWIzYjU1OThhMGYwMDAwMDAwMDAwMQ==", + "index": true + }, + { + "key": "dHJhbnNmZXIuc2VuZGVy", + "value": "Mzk3YWQ0NzNhZWUyMmQxY2QyODI5ZWEyMjM4Y2JmZmE4YTYxYzlkOGVlYTNhMWY3Y2NmMjBkYzE0Y2E3ODE4OA==", + "index": true + }, + { + "key": "dHJhbnNmZXIucmVjaXBpZW50X2NoYWlu", + "value": "MQ==", + "index": true + }, + { + "key": "dHJhbnNmZXIucmVjaXBpZW50", + "value": "ZWZlMThlMmEzMzQyMzY2ZDVkMDgyMzc2Njk4OTUxNGM5MDdhMjQzNjY3ZGQ5ZmYyYTRjM2ZjNDZkMjhjYTIzZg==", + "index": true + }, + { + "key": "dHJhbnNmZXIuYW1vdW50", + "value": "MTAwMA==", + "index": true + }, + { + "key": "dHJhbnNmZXIubm9uY2U=", + "value": "MA==", + "index": true + }, + { + "key": "dHJhbnNmZXIuYmxvY2tfdGltZQ==", + "value": "MTY5NzgxMDU3Mg==", + "index": true + } + ] + }, + { + "type": "execute", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXlxYWp6cHdtNHVkNTNqa2hjbmR5NTc2cDZ0ZnBwM3NqZWNyZzZrZXVybTNsNDZrajZweXE1cDJtaHc=", + "index": true + } + ] + }, + { + "type": "wasm", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMXlxYWp6cHdtNHVkNTNqa2hjbmR5NTc2cDZ0ZnBwM3NqZWNyZzZrZXVybTNsNDZrajZweXE1cDJtaHc=", + "index": true + }, + { + "key": "YWN0aW9u", + "value": "YnVybl9mcm9t", + "index": true + }, + { + "key": "ZnJvbQ==", + "value": "c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2w=", + "index": true + }, + { + "key": "Ynk=", + "value": "c2VpMXNtemxtOXQ3OWt1cjM5Mm51OWVnbDhwOGplOWo5MnE0Z3pndWV3ajU2YTA1a3l4eHJhMHF5MG51ZjM=", + "index": true + }, + { + "key": "YW1vdW50", + "value": "MTAwMA==", + "index": true + } + ] + }, + { + "type": "execute", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMWdqcnJtZTIyY3loYTRodDJ4YXBuM2YwOHp6dzZ6M2Q0dXh4NmZ5eTl6ZDVkeXIzeXhnenFxbmNkcW4=", + "index": true + } + ] + }, + { + "type": "wasm", + "attributes": [ + { + "key": "X2NvbnRyYWN0X2FkZHJlc3M=", + "value": "c2VpMWdqcnJtZTIyY3loYTRodDJ4YXBuM2YwOHp6dzZ6M2Q0dXh4NmZ5eTl6ZDVkeXIzeXhnenFxbmNkcW4=", + "index": true + }, + { + "key": "bWVzc2FnZS5tZXNzYWdl", + "value": "MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2U4MDY5Yjg4NTdmZWFiODE4NGZiNjg3ZjYzNDYxOGMwMzVkYWM0MzlkYzFhZWIzYjU1OThhMGYwMDAwMDAwMDAwMTAwMDFlZmUxOGUyYTMzNDIzNjZkNWQwODIzNzY2OTg5NTE0YzkwN2EyNDM2NjdkZDlmZjJhNGMzZmM0NmQyOGNhMjNmMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA=", + "index": true + }, + { + "key": "bWVzc2FnZS5zZW5kZXI=", + "value": "ODZjNWZkOTU3ZTJkYjgzODk1NTNlMTcyOGY5YzI3OTY0YjIyYTgxNTQwOTFjY2JhNTRkNzVmNGIxMGM2MWY1ZQ==", + "index": true + }, + { + "key": "bWVzc2FnZS5jaGFpbl9pZA==", + "value": "MzI=", + "index": true + }, + { + "key": "bWVzc2FnZS5ub25jZQ==", + "value": "MA==", + "index": true + }, + { + "key": "bWVzc2FnZS5zZXF1ZW5jZQ==", + "value": "MTU1NTc=", + "index": true + }, + { + "key": "bWVzc2FnZS5ibG9ja190aW1l", + "value": "MTY5NzgxMDU3Mg==", + "index": true + }, + { + "key": "aXNfaWJj", + "value": "dHJ1ZQ==", + "index": true + } + ] + }, + { + "type": "send_packet", + "attributes": [ + { + "key": "cGFja2V0X2RhdGE=", + "value": "eyJwdWJsaXNoIjp7Im1zZyI6W3sia2V5IjoibWVzc2FnZS5tZXNzYWdlIiwidmFsdWUiOiIwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzZTgwNjliODg1N2ZlYWI4MTg0ZmI2ODdmNjM0NjE4YzAzNWRhYzQzOWRjMWFlYjNiNTU5OGEwZjAwMDAwMDAwMDAxMDAwMWVmZTE4ZTJhMzM0MjM2NmQ1ZDA4MjM3NjY5ODk1MTRjOTA3YTI0MzY2N2RkOWZmMmE0YzNmYzQ2ZDI4Y2EyM2YwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCJ9LHsia2V5IjoibWVzc2FnZS5zZW5kZXIiLCJ2YWx1ZSI6Ijg2YzVmZDk1N2UyZGI4Mzg5NTUzZTE3MjhmOWMyNzk2NGIyMmE4MTU0MDkxY2NiYTU0ZDc1ZjRiMTBjNjFmNWUifSx7ImtleSI6Im1lc3NhZ2UuY2hhaW5faWQiLCJ2YWx1ZSI6IjMyIn0seyJrZXkiOiJtZXNzYWdlLm5vbmNlIiwidmFsdWUiOiIwIn0seyJrZXkiOiJtZXNzYWdlLnNlcXVlbmNlIiwidmFsdWUiOiIxNTU1NyJ9LHsia2V5IjoibWVzc2FnZS5ibG9ja190aW1lIiwidmFsdWUiOiIxNjk3ODEwNTcyIn1dfX0=", + "index": true + }, + { + "key": "cGFja2V0X2RhdGFfaGV4", + "value": "N2IyMjcwNzU2MjZjNjk3MzY4MjIzYTdiMjI2ZDczNjcyMjNhNWI3YjIyNmI2NTc5MjIzYTIyNmQ2NTczNzM2MTY3NjUyZTZkNjU3MzczNjE2NzY1MjIyYzIyNzY2MTZjNzU2NTIyM2EyMjMwMzEzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMzNjUzODMwMzYzOTYyMzgzODM1Mzc2NjY1NjE2MjM4MzEzODM0NjY2MjM2MzgzNzY2MzYzMzM0MzYzMTM4NjMzMDMzMzU2NDYxNjMzNDMzMzk2NDYzMzE2MTY1NjIzMzYyMzUzNTM5Mzg2MTMwNjYzMDMwMzAzMDMwMzAzMDMwMzAzMDMxMzAzMDMwMzE2NTY2NjUzMTM4NjUzMjYxMzMzMzM0MzIzMzM2MzY2NDM1NjQzMDM4MzIzMzM3MzYzNjM5MzgzOTM1MzEzNDYzMzkzMDM3NjEzMjM0MzMzNjM2Mzc2NDY0Mzk2NjY2MzI2MTM0NjMzMzY2NjMzNDM2NjQzMjM4NjM2MTMyMzM2NjMwMzAzMDMxMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAzMDMwMzAyMjdkMmM3YjIyNmI2NTc5MjIzYTIyNmQ2NTczNzM2MTY3NjUyZTczNjU2ZTY0NjU3MjIyMmMyMjc2NjE2Yzc1NjUyMjNhMjIzODM2NjMzNTY2NjQzOTM1Mzc2NTMyNjQ2MjM4MzMzODM5MzUzNTMzNjUzMTM3MzIzODY2Mzk2MzMyMzczOTM2MzQ2MjMyMzI2MTM4MzEzNTM0MzAzOTMxNjM2MzYyNjEzNTM0NjQzNzM1NjYzNDYyMzEzMDYzMzYzMTY2MzU2NTIyN2QyYzdiMjI2YjY1NzkyMjNhMjI2ZDY1NzM3MzYxNjc2NTJlNjM2ODYxNjk2ZTVmNjk2NDIyMmMyMjc2NjE2Yzc1NjUyMjNhMjIzMzMyMjI3ZDJjN2IyMjZiNjU3OTIyM2EyMjZkNjU3MzczNjE2NzY1MmU2ZTZmNmU2MzY1MjIyYzIyNzY2MTZjNzU2NTIyM2EyMjMwMjI3ZDJjN2IyMjZiNjU3OTIyM2EyMjZkNjU3MzczNjE2NzY1MmU3MzY1NzE3NTY1NmU2MzY1MjIyYzIyNzY2MTZjNzU2NTIyM2EyMjMxMzUzNTM1MzcyMjdkMmM3YjIyNmI2NTc5MjIzYTIyNmQ2NTczNzM2MTY3NjUyZTYyNmM2ZjYzNmI1Zjc0Njk2ZDY1MjIyYzIyNzY2MTZjNzU2NTIyM2EyMjMxMzYzOTM3MzgzMTMwMzUzNzMyMjI3ZDVkN2Q3ZA==", + "index": true + }, + { + "key": "cGFja2V0X3RpbWVvdXRfaGVpZ2h0", + "value": "MC0w", + "index": true + }, + { + "key": "cGFja2V0X3RpbWVvdXRfdGltZXN0YW1w", + "value": "MTcyOTM0NjU3MjQwMTkzNTIzNg==", + "index": true + }, + { + "key": "cGFja2V0X3NlcXVlbmNl", + "value": "MTU1NjI=", + "index": true + }, + { + "key": "cGFja2V0X3NyY19wb3J0", + "value": "d2FzbS5zZWkxZ2pycm1lMjJjeWhhNGh0MnhhcG4zZjA4enp3NnozZDR1eHg2Znl5OXpkNWR5cjN5eGd6cXFuY2Rxbg==", + "index": true + }, + { + "key": "cGFja2V0X3NyY19jaGFubmVs", + "value": "Y2hhbm5lbC00", + "index": true + }, + { + "key": "cGFja2V0X2RzdF9wb3J0", + "value": "d2FzbS53b3JtaG9sZTF3a3d5MHhoODlrc2RnajlocjM0N2R5ZDJkdzd6ZXNtdHJ1ZTZrZnp5bWw0dmR0ejZlNXdzMnkwNTBy", + "index": true + }, + { + "key": "cGFja2V0X2RzdF9jaGFubmVs", + "value": "Y2hhbm5lbC0w", + "index": true + }, + { + "key": "cGFja2V0X2NoYW5uZWxfb3JkZXJpbmc=", + "value": "T1JERVJfVU5PUkRFUkVE", + "index": true + }, + { + "key": "cGFja2V0X2Nvbm5lY3Rpb24=", + "value": "Y29ubmVjdGlvbi02", + "index": true + } + ] + } + ] + }, + "tx": "CqgDCocDCiQvY29zbXdhc20ud2FzbS52MS5Nc2dFeGVjdXRlQ29udHJhY3QS3gIKKnNlaTE3ZHh1dmRmZ3h1MGdweW0zaHU4Z2xjY3Q5a2pjY240eHRkZmdmYxI+c2VpMTg5YWRndWF3dWdrM2U1NXpuNjN6OHI5bGwyOXhyandjYTYzNnJhN3Y3Z3h1em45OHN4eXF3enQ0N2wac3siY29udmVydF9hbmRfdHJhbnNmZXIiOnsicmVjaXBpZW50X2NoYWluIjoxLCJyZWNpcGllbnQiOiI3K0dPS2pOQ05tMWRDQ04yYVlsUlRKQjZKRFpuM1oveXBNUDhSdEtNb2o4PSIsImZlZSI6IjAifX0qewpzZmFjdG9yeS9zZWkxODlhZGd1YXd1Z2szZTU1em42M3o4cjlsbDI5eHJqd2NhNjM2cmE3djdneHV6bjk4c3h5cXd6dDQ3bC8zQXBMam92Z2tNVDRMV0FjcXlZRFBhTmlEU0ttdUpKZk1vbTE4RWQyOW8yNxIEMTAwMBIcV29ybWhvbGUgLSBJbml0aWF0ZSBUcmFuc2ZlchJnClAKRgofL2Nvc21vcy5jcnlwdG8uc2VjcDI1NmsxLlB1YktleRIjCiECqpEa+4OSbl7OBOxSFeMJnxZoPsR1kc32WZOujBb4Sk8SBAoCCAEYORITCg0KBHVzZWkSBTkwMzkzEPWVNxpAR0s5l65colOiSYxsQLEMtGW+iY3HCQ8GoDQmwkU5+MUSgB5WifNE8gc9gAnne8Pi7DNNJuZYNZWNAewST24kzg==" + } + ], + "total_count": "1" + } +} +` + +func TestXxx1(t *testing.T) { + result, err := parseTxSearchResponse[seiTx]([]byte(jsonTxSearchResponse), &cosmosTxSearchParams{}, seiTxSearchExtractor) + assert.NoError(t, err) + assert.NotNil(t, result) + assert.Equal(t, "D97FD8EB0FAB7784A8A293A7FEF1F47FDE0C4375C254A19361E0F87CC01EF99A", result.TxHash) + assert.Equal(t, "sei17dxuvdfgxu0gpym3hu8glcct9kjccn4xtdfgfc", result.Sender) +} diff --git a/tx-tracker/chains/api_wormchain.go b/tx-tracker/chains/api_wormchain.go index 6a75013c..b65194b7 100644 --- a/tx-tracker/chains/api_wormchain.go +++ b/tx-tracker/chains/api_wormchain.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "fmt" + "strings" "time" "github.com/wormhole-foundation/wormhole-explorer/common/domain" @@ -13,6 +14,10 @@ import ( type apiWormchain struct { osmosisUrl string osmosisRateLimiter *time.Ticker + kujiraUrl string + kujiraRateLimiter *time.Ticker + evmosUrl string + evmosRateLimiter *time.Ticker p2pNetwork string } @@ -127,8 +132,6 @@ func fetchWormchainDetail(ctx context.Context, baseUrl string, rateLimiter *time } -const queryTemplate = `send_packet.packet_sequence='%s' AND send_packet.packet_timeout_timestamp='%s' AND send_packet.packet_src_channel='%s' AND send_packet.packet_dst_channel='%s'` - type osmosisRequest struct { Jsonrpc string `json:"jsonrpc"` ID int `json:"id"` @@ -174,14 +177,8 @@ type osmosisTx struct { txHash string } -type WorchainAttributeTxDetail struct { - OriginChainID sdk.ChainID `bson:"originChainId"` - OriginTxHash string `bson:"originTxHash"` - OriginAddress string `bson:"originAddress"` -} - func fetchOsmosisDetail(ctx context.Context, baseUrl string, rateLimiter *time.Ticker, sequence, timestamp, srcChannel, dstChannel string) (*osmosisTx, error) { - + queryTemplate := `send_packet.packet_sequence='%s' AND send_packet.packet_timeout_timestamp='%s' AND send_packet.packet_src_channel='%s' AND send_packet.packet_dst_channel='%s'` query := fmt.Sprintf(queryTemplate, sequence, timestamp, srcChannel, dstChannel) q := osmosisRequest{ Jsonrpc: "2.0", @@ -210,7 +207,169 @@ func fetchOsmosisDetail(ctx context.Context, baseUrl string, rateLimiter *time.T if len(oReponse.Result.Txs) == 0 { return nil, fmt.Errorf("can not found hash for sequence %s, timestamp %s, srcChannel %s, dstChannel %s", sequence, timestamp, srcChannel, dstChannel) } - return &osmosisTx{txHash: oReponse.Result.Txs[0].Hash}, nil + return &osmosisTx{txHash: strings.ToLower(oReponse.Result.Txs[0].Hash)}, nil +} + +type evmosRequest struct { + Jsonrpc string `json:"jsonrpc"` + ID int `json:"id"` + Method string `json:"method"` + Params struct { + Query string `json:"query"` + Page string `json:"page"` + } `json:"params"` +} + +type evmosResponse struct { + Jsonrpc string `json:"jsonrpc"` + ID int `json:"id"` + Result struct { + Txs []struct { + Hash string `json:"hash"` + Height string `json:"height"` + Index int `json:"index"` + TxResult struct { + Code int `json:"code"` + Data string `json:"data"` + Log string `json:"log"` + Info string `json:"info"` + GasWanted string `json:"gas_wanted"` + GasUsed string `json:"gas_used"` + Events []struct { + Type string `json:"type"` + Attributes []struct { + Key string `json:"key"` + Value string `json:"value"` + Index bool `json:"index"` + } `json:"attributes"` + } `json:"events"` + Codespace string `json:"codespace"` + } `json:"tx_result"` + Tx string `json:"tx"` + } `json:"txs"` + TotalCount string `json:"total_count"` + } `json:"result"` +} + +type evmosTx struct { + txHash string +} + +func fetchEvmosDetail(ctx context.Context, baseUrl string, rateLimiter *time.Ticker, sequence, timestamp, srcChannel, dstChannel string) (*evmosTx, error) { + queryTemplate := `send_packet.packet_sequence='%s' AND send_packet.packet_timeout_timestamp='%s' AND send_packet.packet_src_channel='%s' AND send_packet.packet_dst_channel='%s'` + query := fmt.Sprintf(queryTemplate, sequence, timestamp, srcChannel, dstChannel) + q := evmosRequest{ + Jsonrpc: "2.0", + ID: 1, + Method: "tx_search", + Params: struct { + Query string `json:"query"` + Page string `json:"page"` + }{ + Query: query, + Page: "1", + }, + } + + response, err := httpPost(ctx, rateLimiter, baseUrl, q) + if err != nil { + return nil, err + } + + var eReponse evmosResponse + err = json.Unmarshal(response, &eReponse) + if err != nil { + return nil, err + } + + if len(eReponse.Result.Txs) == 0 { + return nil, fmt.Errorf("can not found hash for sequence %s, timestamp %s, srcChannel %s, dstChannel %s", sequence, timestamp, srcChannel, dstChannel) + } + return &evmosTx{txHash: strings.ToLower(eReponse.Result.Txs[0].Hash)}, nil +} + +type kujiraRequest struct { + Jsonrpc string `json:"jsonrpc"` + ID int `json:"id"` + Method string `json:"method"` + Params struct { + Query string `json:"query"` + Page string `json:"page"` + } `json:"params"` +} + +type kujiraResponse struct { + Jsonrpc string `json:"jsonrpc"` + ID int `json:"id"` + Result struct { + Txs []struct { + Hash string `json:"hash"` + Height string `json:"height"` + Index int `json:"index"` + TxResult struct { + Code int `json:"code"` + Data string `json:"data"` + Log string `json:"log"` + Info string `json:"info"` + GasWanted string `json:"gas_wanted"` + GasUsed string `json:"gas_used"` + Events []struct { + Type string `json:"type"` + Attributes []struct { + Key string `json:"key"` + Value string `json:"value"` + Index bool `json:"index"` + } `json:"attributes"` + } `json:"events"` + Codespace string `json:"codespace"` + } `json:"tx_result"` + Tx string `json:"tx"` + } `json:"txs"` + TotalCount string `json:"total_count"` + } `json:"result"` +} + +type kujiraTx struct { + txHash string +} + +func fetchKujiraDetail(ctx context.Context, baseUrl string, rateLimiter *time.Ticker, sequence, timestamp, srcChannel, dstChannel string) (*kujiraTx, error) { + queryTemplate := `send_packet.packet_sequence='%s' AND send_packet.packet_timeout_timestamp='%s' AND send_packet.packet_src_channel='%s' AND send_packet.packet_dst_channel='%s'` + query := fmt.Sprintf(queryTemplate, sequence, timestamp, srcChannel, dstChannel) + q := kujiraRequest{ + Jsonrpc: "2.0", + ID: 1, + Method: "tx_search", + Params: struct { + Query string `json:"query"` + Page string `json:"page"` + }{ + Query: query, + Page: "1", + }, + } + + response, err := httpPost(ctx, rateLimiter, baseUrl, q) + if err != nil { + return nil, err + } + + var kReponse kujiraResponse + err = json.Unmarshal(response, &kReponse) + if err != nil { + return nil, err + } + + if len(kReponse.Result.Txs) == 0 { + return nil, fmt.Errorf("can not found hash for sequence %s, timestamp %s, srcChannel %s, dstChannel %s", sequence, timestamp, srcChannel, dstChannel) + } + return &kujiraTx{txHash: strings.ToLower(kReponse.Result.Txs[0].Hash)}, nil +} + +type WorchainAttributeTxDetail struct { + OriginChainID sdk.ChainID `bson:"originChainId"` + OriginTxHash string `bson:"originTxHash"` + OriginAddress string `bson:"originAddress"` } func (a *apiWormchain) fetchWormchainTx( @@ -247,6 +406,46 @@ func (a *apiWormchain) fetchWormchainTx( }, nil } + // Verify if this transaction is from kujira by wormchain + if a.isKujiraTx(wormchainTx) { + kujiraTx, err := fetchKujiraDetail(ctx, a.kujiraUrl, a.kujiraRateLimiter, wormchainTx.sequence, wormchainTx.timestamp, wormchainTx.srcChannel, wormchainTx.dstChannel) + if err != nil { + return nil, err + } + return &TxDetail{ + NativeTxHash: txHash, + From: wormchainTx.receiver, + Attribute: &AttributeTxDetail{ + Type: "wormchain-gateway", + Value: &WorchainAttributeTxDetail{ + OriginChainID: ChainIDKujira, + OriginTxHash: kujiraTx.txHash, + OriginAddress: wormchainTx.sender, + }, + }, + }, nil + } + + // Verify if this transaction is from evmos by wormchain + if a.isEvmosTx(wormchainTx) { + evmosTx, err := fetchEvmosDetail(ctx, a.evmosUrl, a.evmosRateLimiter, wormchainTx.sequence, wormchainTx.timestamp, wormchainTx.srcChannel, wormchainTx.dstChannel) + if err != nil { + return nil, err + } + return &TxDetail{ + NativeTxHash: txHash, + From: wormchainTx.receiver, + Attribute: &AttributeTxDetail{ + Type: "wormchain-gateway", + Value: &WorchainAttributeTxDetail{ + OriginChainID: ChainIDEvmos, + OriginTxHash: evmosTx.txHash, + OriginAddress: wormchainTx.sender, + }, + }, + }, nil + } + return &TxDetail{ NativeTxHash: txHash, From: wormchainTx.receiver, @@ -258,7 +457,29 @@ func (a *apiWormchain) isOsmosisTx(tx *worchainTx) bool { return tx.srcChannel == "channel-2186" && tx.dstChannel == "channel-3" } if a.p2pNetwork == domain.P2pTestNet { - return tx.srcChannel == "channel-486" && tx.dstChannel == "channel-4" + return tx.srcChannel == "channel-3086" && tx.dstChannel == "channel-5" } return false } + +func (a *apiWormchain) isKujiraTx(tx *worchainTx) bool { + if a.p2pNetwork == domain.P2pMainNet { + return tx.srcChannel == "channel-113" && tx.dstChannel == "channel-9" + } + // Pending get channels for testnet + // if a.p2pNetwork == domain.P2pTestNet { + // return tx.srcChannel == "" && tx.dstChannel == "" + // } + return false +} + +func (a *apiWormchain) isEvmosTx(tx *worchainTx) bool { + if a.p2pNetwork == domain.P2pMainNet { + return tx.srcChannel == "channel-94" && tx.dstChannel == "channel-5" + } + // Pending get channels for testnet + // if a.p2pNetwork == domain.P2pTestNet { + // return tx.srcChannel == "" && tx.dstChannel == "" + // } + return false +} diff --git a/tx-tracker/chains/chains.go b/tx-tracker/chains/chains.go index bf069190..5f958a4d 100644 --- a/tx-tracker/chains/chains.go +++ b/tx-tracker/chains/chains.go @@ -25,6 +25,8 @@ var ( // WARNING: The following chain IDs are not supported by the wormhole-sdk: const ChainIDOsmosis sdk.ChainID = 20 +const ChainIDEvmos sdk.ChainID = 4001 +const ChainIDKujira sdk.ChainID = 4002 type WormchainTxDetail struct { } @@ -81,6 +83,7 @@ func Initialize(cfg *config.RpcProviderSettings) { rateLimitersByChain[sdk.ChainIDXpla] = convertToRateLimiter(cfg.XplaRequestsPerMinute) rateLimitersByChain[sdk.ChainIDWormchain] = convertToRateLimiter(cfg.WormchainRequestsPerMinute) rateLimitersByChain[ChainIDOsmosis] = convertToRateLimiter(cfg.OsmosisRequestsPerMinute) + rateLimitersByChain[sdk.ChainIDSei] = convertToRateLimiter(cfg.SeiRequestsPerMinute) // Initialize the RPC base URLs for each chain baseUrlsByChain = make(map[sdk.ChainID]string) @@ -107,6 +110,7 @@ func Initialize(cfg *config.RpcProviderSettings) { baseUrlsByChain[sdk.ChainIDSui] = cfg.SuiBaseUrl baseUrlsByChain[sdk.ChainIDXpla] = cfg.XplaBaseUrl baseUrlsByChain[sdk.ChainIDWormchain] = cfg.WormchainBaseUrl + baseUrlsByChain[sdk.ChainIDSei] = cfg.SeiBaseUrl } func FetchTx( @@ -156,9 +160,25 @@ func FetchTx( apiWormchain := &apiWormchain{ osmosisUrl: cfg.OsmosisBaseUrl, osmosisRateLimiter: rateLimiter, + evmosUrl: cfg.EvmosBaseUrl, + evmosRateLimiter: rateLimiter, + kujiraUrl: cfg.KujiraBaseUrl, + kujiraRateLimiter: rateLimiter, p2pNetwork: p2pNetwork, } fetchFunc = apiWormchain.fetchWormchainTx + case sdk.ChainIDSei: + rateLimiter, ok := rateLimitersByChain[sdk.ChainIDWormchain] + if !ok { + return nil, errors.New("found no rate limiter for chain osmosis") + } + apiSei := &apiSei{ + wormchainRateLimiter: rateLimiter, + wormchainUrl: cfg.WormchainBaseUrl, + p2pNetwork: p2pNetwork, + } + fetchFunc = apiSei.fetchSeiTx + default: return nil, ErrChainNotSupported } diff --git a/tx-tracker/chains/cosmos.go b/tx-tracker/chains/cosmos.go new file mode 100644 index 00000000..c2c2500a --- /dev/null +++ b/tx-tracker/chains/cosmos.go @@ -0,0 +1,113 @@ +package chains + +import ( + "context" + "encoding/json" + "fmt" + "time" +) + +type cosmosRequest struct { + Jsonrpc string `json:"jsonrpc"` + ID int `json:"id"` + Method string `json:"method"` + Params struct { + Query string `json:"query"` + Page string `json:"page"` + } `json:"params"` +} + +type cosmosTxSearchParams struct { + Sequence string + Timestamp string + SrcChannel string + DstChannel string +} + +type cosmosTxSearchResponse struct { + Jsonrpc string `json:"jsonrpc"` + ID int `json:"id"` + Result struct { + Txs []struct { + Hash string `json:"hash"` + Height string `json:"height"` + Index int `json:"index"` + TxResult struct { + Code int `json:"code"` + Data string `json:"data"` + Log string `json:"log"` + Info string `json:"info"` + GasWanted string `json:"gas_wanted"` + GasUsed string `json:"gas_used"` + Events []struct { + Type string `json:"type"` + Attributes []struct { + Key string `json:"key"` + Value string `json:"value"` + Index bool `json:"index"` + } `json:"attributes"` + } `json:"events"` + Codespace string `json:"codespace"` + } `json:"tx_result"` + Tx string `json:"tx"` + } `json:"txs"` + TotalCount string `json:"total_count"` + } `json:"result"` +} + +type cosmosEventResponse struct { + Type string `json:"type"` + Attributes []struct { + Key string `json:"key"` + Value string `json:"value"` + } `json:"attributes"` +} + +type cosmosLogWrapperResponse struct { + Events []cosmosEventResponse `json:"events"` +} + +type txSearchExtractor[T any] func(tx *cosmosTxSearchResponse, log []cosmosLogWrapperResponse) (T, error) + +func fetchTxSearch[T any](ctx context.Context, baseUrl string, rl *time.Ticker, p *cosmosTxSearchParams, extractor txSearchExtractor[*T]) (*T, error) { + queryTemplate := `send_packet.packet_sequence='%s' AND send_packet.packet_timeout_timestamp='%s' AND send_packet.packet_src_channel='%s' AND send_packet.packet_dst_channel='%s'` + query := fmt.Sprintf(queryTemplate, p.Sequence, p.Timestamp, p.SrcChannel, p.DstChannel) + q := cosmosRequest{ + Jsonrpc: "2.0", + ID: 1, + Method: "tx_search", + Params: struct { + Query string `json:"query"` + Page string `json:"page"` + }{ + Query: query, + Page: "1", + }, + } + response, err := httpPost(ctx, rl, baseUrl, q) + if err != nil { + return nil, err + } + + return parseTxSearchResponse[T](response, p, extractor) +} + +func parseTxSearchResponse[T any](body []byte, p *cosmosTxSearchParams, extractor txSearchExtractor[*T]) (*T, error) { + var txSearchReponse cosmosTxSearchResponse + err := json.Unmarshal(body, &txSearchReponse) + if err != nil { + return nil, err + } + + if len(txSearchReponse.Result.Txs) == 0 { + return nil, fmt.Errorf("can not found hash for sequence %s, timestamp %s, srcChannel %s, dstChannel %s", p.Sequence, p.Timestamp, p.SrcChannel, p.DstChannel) + } + + var log []cosmosLogWrapperResponse + err = json.Unmarshal([]byte(txSearchReponse.Result.Txs[0].TxResult.Log), &log) + if err != nil { + return nil, err + } + + return extractor(&txSearchReponse, log) +} diff --git a/tx-tracker/cmd/backfiller/main.go b/tx-tracker/cmd/backfiller/main.go index b7977a59..c7b09055 100644 --- a/tx-tracker/cmd/backfiller/main.go +++ b/tx-tracker/cmd/backfiller/main.go @@ -305,7 +305,7 @@ func consume(ctx context.Context, params *consumerParams) { TxHash: *v.TxHash, Overwrite: true, // Overwrite old contents } - err := consumer.ProcessSourceTx(ctx, params.logger, params.rpcProviderSettings, params.repository, &p, params.p2pNetwork) + _, err := consumer.ProcessSourceTx(ctx, params.logger, params.rpcProviderSettings, params.repository, &p, params.p2pNetwork) if err != nil { params.logger.Error("Failed to track source tx", zap.String("vaaId", globalTx.Id), diff --git a/tx-tracker/cmd/service/main.go b/tx-tracker/cmd/service/main.go index 6c1818bb..3951dc78 100644 --- a/tx-tracker/cmd/service/main.go +++ b/tx-tracker/cmd/service/main.go @@ -21,6 +21,7 @@ import ( "github.com/wormhole-foundation/wormhole-explorer/txtracker/config" "github.com/wormhole-foundation/wormhole-explorer/txtracker/consumer" "github.com/wormhole-foundation/wormhole-explorer/txtracker/http/infrastructure" + "github.com/wormhole-foundation/wormhole-explorer/txtracker/http/vaa" "github.com/wormhole-foundation/wormhole-explorer/txtracker/internal/metrics" "github.com/wormhole-foundation/wormhole-explorer/txtracker/queue" "go.uber.org/zap" @@ -52,19 +53,30 @@ func main() { log.Fatal("Failed to initialize MongoDB client: ", err) } + // create repositories + repository := consumer.NewRepository(logger, db.Database) + vaaRepository := vaa.NewRepository(db.Database, logger) + + // create controller + vaaController := vaa.NewController(vaaRepository, repository, &cfg.RpcProviderSettings, cfg.P2pNetwork, logger) + // start serving /health and /ready endpoints healthChecks, err := makeHealthChecks(rootCtx, cfg, db.Database) if err != nil { logger.Fatal("Failed to create health checks", zap.Error(err)) } - server := infrastructure.NewServer(logger, cfg.MonitoringPort, cfg.PprofEnabled, healthChecks...) + server := infrastructure.NewServer(logger, cfg.MonitoringPort, cfg.PprofEnabled, vaaController, healthChecks...) server.Start() - // create and start a consumer. + // create and start a pipeline consumer. vaaConsumeFunc := newVAAConsumeFunc(rootCtx, cfg, metrics, logger) - repository := consumer.NewRepository(logger, db.Database) - consumer := consumer.New(vaaConsumeFunc, &cfg.RpcProviderSettings, rootCtx, logger, repository, metrics, cfg.P2pNetwork) - consumer.Start(rootCtx) + vaaConsumer := consumer.New(vaaConsumeFunc, &cfg.RpcProviderSettings, rootCtx, logger, repository, metrics, cfg.P2pNetwork) + vaaConsumer.Start(rootCtx) + + // create and start a notification consumer. + notificationConsumeFunc := newNotificationConsumeFunc(rootCtx, cfg, metrics, logger) + notificationConsumer := consumer.New(notificationConsumeFunc, &cfg.RpcProviderSettings, rootCtx, logger, repository, metrics, cfg.P2pNetwork) + notificationConsumer.Start(rootCtx) logger.Info("Started wormhole-explorer-tx-tracker") @@ -96,18 +108,34 @@ func newVAAConsumeFunc( cfg *config.ServiceSettings, metrics metrics.Metrics, logger *zap.Logger, -) queue.VAAConsumeFunc { +) queue.ConsumeFunc { - sqsConsumer, err := newSqsConsumer(ctx, cfg) + sqsConsumer, err := newSqsConsumer(ctx, cfg, cfg.PipelineSqsUrl) if err != nil { logger.Fatal("failed to create sqs consumer", zap.Error(err)) } - vaaQueue := queue.NewVaaSqs(sqsConsumer, metrics, logger) + vaaQueue := queue.NewEventSqs(sqsConsumer, queue.NewVaaConverter(logger), metrics, logger) return vaaQueue.Consume } -func newSqsConsumer(ctx context.Context, cfg *config.ServiceSettings) (*sqs.Consumer, error) { +func newNotificationConsumeFunc( + ctx context.Context, + cfg *config.ServiceSettings, + metrics metrics.Metrics, + logger *zap.Logger, +) queue.ConsumeFunc { + + sqsConsumer, err := newSqsConsumer(ctx, cfg, cfg.NotificationsSqsUrl) + if err != nil { + logger.Fatal("failed to create sqs consumer", zap.Error(err)) + } + + vaaQueue := queue.NewEventSqs(sqsConsumer, queue.NewNotificationEvent(logger), metrics, logger) + return vaaQueue.Consume +} + +func newSqsConsumer(ctx context.Context, cfg *config.ServiceSettings, sqsUrl string) (*sqs.Consumer, error) { awsconfig, err := newAwsConfig(ctx, cfg) if err != nil { @@ -116,7 +144,7 @@ func newSqsConsumer(ctx context.Context, cfg *config.ServiceSettings) (*sqs.Cons consumer, err := sqs.NewConsumer( awsconfig, - cfg.SqsUrl, + sqsUrl, sqs.WithMaxMessages(10), sqs.WithVisibilityTimeout(4*60), ) @@ -166,7 +194,8 @@ func makeHealthChecks( } plugins := []health.Check{ - health.SQS(awsConfig, config.SqsUrl), + health.SQS(awsConfig, config.PipelineSqsUrl), + health.SQS(awsConfig, config.NotificationsSqsUrl), health.Mongo(db), } diff --git a/tx-tracker/config/structs.go b/tx-tracker/config/structs.go index 5e3f7f98..491fb429 100644 --- a/tx-tracker/config/structs.go +++ b/tx-tracker/config/structs.go @@ -49,11 +49,12 @@ type ServiceSettings struct { } type AwsSettings struct { - AwsEndpoint string `split_words:"true" required:"false"` - AwsAccessKeyID string `split_words:"true" required:"false"` - AwsSecretAccessKey string `split_words:"true" required:"false"` - AwsRegion string `split_words:"true" required:"true"` - SqsUrl string `split_words:"true" required:"true"` + AwsEndpoint string `split_words:"true" required:"false"` + AwsAccessKeyID string `split_words:"true" required:"false"` + AwsSecretAccessKey string `split_words:"true" required:"false"` + AwsRegion string `split_words:"true" required:"true"` + PipelineSqsUrl string `split_words:"true" required:"true"` + NotificationsSqsUrl string `split_words:"true" required:"true"` } type MongodbSettings struct { @@ -80,6 +81,8 @@ type RpcProviderSettings struct { CeloRequestsPerMinute uint16 `split_words:"true" required:"true"` EthereumBaseUrl string `split_words:"true" required:"true"` EthereumRequestsPerMinute uint16 `split_words:"true" required:"true"` + EvmosBaseUrl string `split_words:"true" required:"true"` + EvmosRequestsPerMinute uint16 `split_words:"true" required:"true"` FantomBaseUrl string `split_words:"true" required:"true"` FantomRequestsPerMinute uint16 `split_words:"true" required:"true"` InjectiveBaseUrl string `split_words:"true" required:"true"` @@ -88,6 +91,8 @@ type RpcProviderSettings struct { KaruraRequestsPerMinute uint16 `split_words:"true" required:"true"` KlaytnBaseUrl string `split_words:"true" required:"true"` KlaytnRequestsPerMinute uint16 `split_words:"true" required:"true"` + KujiraBaseUrl string `split_words:"true" required:"true"` + KujiraRequestsPerMinute uint16 `split_words:"true" required:"true"` MoonbeamBaseUrl string `split_words:"true" required:"true"` MoonbeamRequestsPerMinute uint16 `split_words:"true" required:"true"` OasisBaseUrl string `split_words:"true" required:"true"` @@ -98,6 +103,8 @@ type RpcProviderSettings struct { OsmosisRequestsPerMinute uint16 `split_words:"true" required:"true"` PolygonBaseUrl string `split_words:"true" required:"true"` PolygonRequestsPerMinute uint16 `split_words:"true" required:"true"` + SeiBaseUrl string `split_words:"true" required:"true"` + SeiRequestsPerMinute uint16 `split_words:"true" required:"true"` SolanaBaseUrl string `split_words:"true" required:"true"` SolanaRequestsPerMinute uint16 `split_words:"true" required:"true"` SuiBaseUrl string `split_words:"true" required:"true"` diff --git a/tx-tracker/consumer/consumer.go b/tx-tracker/consumer/consumer.go index c97ea0d5..10c0dd00 100644 --- a/tx-tracker/consumer/consumer.go +++ b/tx-tracker/consumer/consumer.go @@ -14,7 +14,7 @@ import ( // Consumer consumer struct definition. type Consumer struct { - consumeFunc queue.VAAConsumeFunc + consumeFunc queue.ConsumeFunc rpcProviderSettings *config.RpcProviderSettings logger *zap.Logger repository *Repository @@ -24,7 +24,7 @@ type Consumer struct { // New creates a new vaa consumer. func New( - consumeFunc queue.VAAConsumeFunc, + consumeFunc queue.ConsumeFunc, rpcProviderSettings *config.RpcProviderSettings, ctx context.Context, logger *zap.Logger, @@ -68,7 +68,7 @@ func (c *Consumer) process(ctx context.Context, msg queue.ConsumerMessage) { // Do not process messages from PythNet if event.ChainID == sdk.ChainIDPythNet { - c.logger.Debug("Skipping expired PythNet message", zap.String("vaaId", event.ID)) + c.logger.Debug("Skipping expired PythNet message", zap.String("trackId", event.TrackID), zap.String("vaaId", event.ID)) return } @@ -76,6 +76,7 @@ func (c *Consumer) process(ctx context.Context, msg queue.ConsumerMessage) { // Process the VAA p := ProcessSourceTxParams{ + TrackID: event.TrackID, Timestamp: event.Timestamp, VaaId: event.ID, ChainId: event.ChainID, @@ -84,24 +85,28 @@ func (c *Consumer) process(ctx context.Context, msg queue.ConsumerMessage) { TxHash: event.TxHash, Overwrite: false, // avoid processing the same transaction twice } - err := ProcessSourceTx(ctx, c.logger, c.rpcProviderSettings, c.repository, &p, c.p2pNetwork) + _, err := ProcessSourceTx(ctx, c.logger, c.rpcProviderSettings, c.repository, &p, c.p2pNetwork) // Log a message informing the processing status if errors.Is(err, chains.ErrChainNotSupported) { c.logger.Info("Skipping VAA - chain not supported", + zap.String("trackId", event.TrackID), zap.String("vaaId", event.ID), ) } else if errors.Is(err, ErrAlreadyProcessed) { c.logger.Warn("Message already processed - skipping", + zap.String("trackId", event.TrackID), zap.String("vaaId", event.ID), ) } else if err != nil { c.logger.Error("Failed to process originTx", + zap.String("trackId", event.TrackID), zap.String("vaaId", event.ID), zap.Error(err), ) } else { c.logger.Info("Transaction processed successfully", + zap.String("trackId", event.TrackID), zap.String("id", event.ID), ) c.metrics.IncOriginTxInserted(uint16(event.ChainID)) diff --git a/tx-tracker/consumer/processor.go b/tx-tracker/consumer/processor.go index 3e8e39e9..ba0d4a50 100644 --- a/tx-tracker/consumer/processor.go +++ b/tx-tracker/consumer/processor.go @@ -23,6 +23,7 @@ const ( // ProcessSourceTxParams is a struct that contains the parameters for the ProcessSourceTx method. type ProcessSourceTxParams struct { + TrackID string Timestamp *time.Time ChainId sdk.ChainID VaaId string @@ -45,7 +46,7 @@ func ProcessSourceTx( repository *Repository, params *ProcessSourceTxParams, p2pNetwork string, -) error { +) (*chains.TxDetail, error) { if !params.Overwrite { // If the message has already been processed, skip it. @@ -56,9 +57,9 @@ func ProcessSourceTx( // we don't want to hit the RPC nodes again for performance reasons. processed, err := repository.AlreadyProcessed(ctx, params.VaaId) if err != nil { - return err + return nil, err } else if err == nil && processed { - return ErrAlreadyProcessed + return nil, ErrAlreadyProcessed } } @@ -80,11 +81,12 @@ func ProcessSourceTx( // Keep retrying? if params.Timestamp == nil && retries > minRetries { - return fmt.Errorf("failed to process transaction: %w", err) + return nil, fmt.Errorf("failed to process transaction: %w", err) } else if time.Since(*params.Timestamp) > retryDeadline && retries >= minRetries { - return fmt.Errorf("failed to process transaction: %w", err) + return nil, fmt.Errorf("failed to process transaction: %w", err) } else { logger.Warn("failed to process transaction", + zap.String("trackId", params.TrackID), zap.String("vaaId", params.VaaId), zap.Any("vaaTimestamp", params.Timestamp), zap.Int("retries", retries), @@ -98,10 +100,16 @@ func ProcessSourceTx( // Store source transaction details in the database p := UpsertDocumentParams{ - VaaId: params.VaaId, - ChainId: params.ChainId, - TxDetail: txDetail, - TxStatus: domain.SourceTxStatusConfirmed, + VaaId: params.VaaId, + ChainId: params.ChainId, + Timestamp: params.Timestamp, + TxDetail: txDetail, + TxStatus: domain.SourceTxStatusConfirmed, } - return repository.UpsertDocument(ctx, &p) + + err = repository.UpsertDocument(ctx, &p) + if err != nil { + return nil, err + } + return txDetail, nil } diff --git a/tx-tracker/consumer/repository.go b/tx-tracker/consumer/repository.go index b6f11d7d..9192c8a1 100644 --- a/tx-tracker/consumer/repository.go +++ b/tx-tracker/consumer/repository.go @@ -38,10 +38,11 @@ func NewRepository(logger *zap.Logger, db *mongo.Database) *Repository { // UpsertDocumentParams is a struct that contains the parameters for the upsertDocument method. type UpsertDocumentParams struct { - VaaId string - ChainId sdk.ChainID - TxDetail *chains.TxDetail - TxStatus domain.SourceTxStatus + VaaId string + ChainId sdk.ChainID + TxDetail *chains.TxDetail + TxStatus domain.SourceTxStatus + Timestamp *time.Time } func (r *Repository) UpsertDocument(ctx context.Context, params *UpsertDocumentParams) error { @@ -53,6 +54,9 @@ func (r *Repository) UpsertDocument(ctx context.Context, params *UpsertDocumentP if params.TxDetail != nil { fields = append(fields, primitive.E{Key: "nativeTxHash", Value: params.TxDetail.NativeTxHash}) fields = append(fields, primitive.E{Key: "from", Value: params.TxDetail.From}) + if params.Timestamp != nil { + fields = append(fields, primitive.E{Key: "timestamp", Value: params.Timestamp}) + } if params.TxDetail.Attribute != nil { fields = append(fields, primitive.E{Key: "attribute", Value: params.TxDetail.Attribute}) } diff --git a/tx-tracker/http/infrastructure/server.go b/tx-tracker/http/infrastructure/server.go index 19ba84a5..7f701fc3 100644 --- a/tx-tracker/http/infrastructure/server.go +++ b/tx-tracker/http/infrastructure/server.go @@ -5,6 +5,7 @@ import ( "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/pprof" health "github.com/wormhole-foundation/wormhole-explorer/common/health" + "github.com/wormhole-foundation/wormhole-explorer/txtracker/http/vaa" "go.uber.org/zap" ) @@ -14,7 +15,7 @@ type Server struct { logger *zap.Logger } -func NewServer(logger *zap.Logger, port string, pprofEnabled bool, checks ...health.Check) *Server { +func NewServer(logger *zap.Logger, port string, pprofEnabled bool, vaaController *vaa.Controller, checks ...health.Check) *Server { app := fiber.New(fiber.Config{DisableStartupMessage: true}) prometheus := fiberprometheus.New("wormscan-tx-tracker") prometheus.RegisterAt(app, "/metrics") @@ -25,11 +26,13 @@ func NewServer(logger *zap.Logger, port string, pprofEnabled bool, checks ...hea } app.Use(prometheus.Middleware) - ctrl := NewController(checks, logger) + ctrl := health.NewController(checks, logger) api := app.Group("/api") api.Get("/health", ctrl.HealthCheck) api.Get("/ready", ctrl.ReadyCheck) + api.Post("/vaa/process", vaaController.Process) + return &Server{ app: app, port: port, diff --git a/tx-tracker/http/vaa/controller.go b/tx-tracker/http/vaa/controller.go new file mode 100644 index 00000000..ff371e0f --- /dev/null +++ b/tx-tracker/http/vaa/controller.go @@ -0,0 +1,66 @@ +package vaa + +import ( + "strconv" + + "github.com/gofiber/fiber/v2" + "github.com/wormhole-foundation/wormhole-explorer/txtracker/config" + "github.com/wormhole-foundation/wormhole-explorer/txtracker/consumer" + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" + "go.uber.org/zap" +) + +// Controller definition. +type Controller struct { + logger *zap.Logger + vaaRepository *Repository + repository *consumer.Repository + rpcProviderSettings *config.RpcProviderSettings + p2pNetwork string +} + +// NewController creates a Controller instance. +func NewController(vaaRepository *Repository, repository *consumer.Repository, rpcProviderSettings *config.RpcProviderSettings, p2pNetwork string, logger *zap.Logger) *Controller { + return &Controller{vaaRepository: vaaRepository, repository: repository, rpcProviderSettings: rpcProviderSettings, p2pNetwork: p2pNetwork, logger: logger} +} + +func (c *Controller) Process(ctx *fiber.Ctx) error { + payload := struct { + ID string `json:"id"` + }{} + + if err := ctx.BodyParser(&payload); err != nil { + return err + } + + c.logger.Info("Processing VAA from endpoint", zap.String("id", payload.ID)) + + v, err := c.vaaRepository.FindById(ctx.Context(), payload.ID) + if err != nil { + return err + } + + vaa, err := sdk.Unmarshal(v.Vaa) + if err != nil { + return err + } + + p := &consumer.ProcessSourceTxParams{ + Timestamp: &vaa.Timestamp, + VaaId: vaa.MessageID(), + ChainId: vaa.EmitterChain, + Emitter: vaa.EmitterAddress.String(), + Sequence: strconv.FormatUint(vaa.Sequence, 10), + TxHash: v.TxHash, + Overwrite: true, + } + + result, err := consumer.ProcessSourceTx(ctx.Context(), c.logger, c.rpcProviderSettings, c.repository, p, c.p2pNetwork) + if err != nil { + return err + } + + return ctx.JSON(struct { + Result any `json:"result"` + }{Result: result}) +} diff --git a/tx-tracker/http/vaa/repository.go b/tx-tracker/http/vaa/repository.go new file mode 100644 index 00000000..f064616e --- /dev/null +++ b/tx-tracker/http/vaa/repository.go @@ -0,0 +1,35 @@ +package vaa + +import ( + "context" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + "go.uber.org/zap" +) + +type Repository struct { + db *mongo.Database + logger *zap.Logger + vaas *mongo.Collection +} + +type VaaDoc struct { + ID string `bson:"_id" json:"id"` + Vaa []byte `bson:"vaas" json:"vaa"` + TxHash string `bson:"txHash" json:"txHash"` +} + +// NewRepository create a new Repository. +func NewRepository(db *mongo.Database, logger *zap.Logger) *Repository { + return &Repository{db: db, + logger: logger.With(zap.String("module", "VaaRepository")), + vaas: db.Collection("vaas"), + } +} + +func (r *Repository) FindById(ctx context.Context, id string) (*VaaDoc, error) { + var vaaDoc VaaDoc + err := r.vaas.FindOne(ctx, bson.M{"_id": id}).Decode(&vaaDoc) + return &vaaDoc, err +} diff --git a/tx-tracker/queue/converter.go b/tx-tracker/queue/converter.go new file mode 100644 index 00000000..5672a09d --- /dev/null +++ b/tx-tracker/queue/converter.go @@ -0,0 +1,109 @@ +package queue + +import ( + "encoding/json" + "fmt" + "strconv" + "time" + + "github.com/wormhole-foundation/wormhole-explorer/common/events" + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" + "go.uber.org/zap" +) + +// VaaEvent represents a vaa data to be handle by the pipeline. +type VaaEvent struct { + ID string `json:"id"` + ChainID sdk.ChainID `json:"emitterChain"` + EmitterAddress string `json:"emitterAddr"` + Sequence string `json:"sequence"` + GuardianSetIndex uint32 `json:"guardianSetIndex"` + Vaa []byte `json:"vaas"` + IndexedAt time.Time `json:"indexedAt"` + Timestamp *time.Time `json:"timestamp"` + UpdatedAt *time.Time `json:"updatedAt"` + TxHash string `json:"txHash"` + Version uint16 `json:"version"` + Revision uint16 `json:"revision"` +} + +// VaaConverter converts a message from a VAAEvent. +func NewVaaConverter(log *zap.Logger) ConverterFunc { + + return func(msg string) (*Event, error) { + // unmarshal message to vaaEvent + var vaaEvent VaaEvent + err := json.Unmarshal([]byte(msg), &vaaEvent) + if err != nil { + return nil, err + } + return &Event{ + TrackID: fmt.Sprintf("pipeline-%s", vaaEvent.ID), + ID: vaaEvent.ID, + ChainID: vaaEvent.ChainID, + EmitterAddress: vaaEvent.EmitterAddress, + Sequence: vaaEvent.Sequence, + Timestamp: vaaEvent.Timestamp, + TxHash: vaaEvent.TxHash, + }, nil + } +} + +func NewNotificationEvent(log *zap.Logger) ConverterFunc { + + return func(msg string) (*Event, error) { + // unmarshal message to NotificationEvent + var notification events.NotificationEvent + err := json.Unmarshal([]byte(msg), ¬ification) + if err != nil { + return nil, err + } + + if notification.Event != events.SignedVaaType && notification.Event != events.LogMessagePublishedMesageType { + log.Debug("Skip event type", zap.String("trackId", notification.TrackID), zap.String("type", notification.Event)) + return nil, nil + } + + switch notification.Event { + case events.SignedVaaType: + signedVaa, err := events.GetEventData[events.SignedVaa](¬ification) + if err != nil { + log.Error("Error decoding signedVAA from notification event", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, nil + } + + return &Event{ + TrackID: notification.TrackID, + ID: signedVaa.ID, + ChainID: sdk.ChainID(signedVaa.EmitterChain), + EmitterAddress: signedVaa.EmitterAddress, + Sequence: strconv.FormatUint(signedVaa.Sequence, 10), + Timestamp: &signedVaa.Timestamp, + TxHash: signedVaa.TxHash, + }, nil + case events.LogMessagePublishedMesageType: + plm, err := events.GetEventData[events.LogMessagePublished](¬ification) + if err != nil { + log.Error("Error decoding publishedLogMessage from notification event", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, nil + } + + vaa, err := events.CreateUnsignedVAA(&plm) + if err != nil { + log.Error("Error creating unsigned vaa", zap.String("trackId", notification.TrackID), zap.Error(err)) + return nil, err + } + + return &Event{ + TrackID: notification.TrackID, + ID: vaa.MessageID(), + ChainID: sdk.ChainID(plm.ChainID), + EmitterAddress: plm.Attributes.Sender, + Sequence: strconv.FormatUint(plm.Attributes.Sequence, 10), + Timestamp: &plm.BlockTime, + TxHash: plm.TxHash, + }, nil + } + return nil, nil + } +} diff --git a/tx-tracker/queue/vaa_sqs.go b/tx-tracker/queue/event_sqs.go similarity index 75% rename from tx-tracker/queue/vaa_sqs.go rename to tx-tracker/queue/event_sqs.go index 69de874c..139da86c 100644 --- a/tx-tracker/queue/vaa_sqs.go +++ b/tx-tracker/queue/event_sqs.go @@ -17,24 +17,29 @@ type SQSOption func(*SQS) // SQS represents a VAA queue in SQS. type SQS struct { - consumer *sqs_client.Consumer - ch chan ConsumerMessage - chSize int - wg sync.WaitGroup - metrics metrics.Metrics - logger *zap.Logger + consumer *sqs_client.Consumer + ch chan ConsumerMessage + converter ConverterFunc + chSize int + wg sync.WaitGroup + metrics metrics.Metrics + logger *zap.Logger } // FilterConsumeFunc filter vaaa func definition. type FilterConsumeFunc func(vaaEvent *VaaEvent) bool -// NewVaaSqs creates a VAA queue in SQS instances. -func NewVaaSqs(consumer *sqs_client.Consumer, metrics metrics.Metrics, logger *zap.Logger, opts ...SQSOption) *SQS { +// ConverterFunc converts a message from a sqs message. +type ConverterFunc func(string) (*Event, error) + +// NewEventSqs creates a VAA queue in SQS instances. +func NewEventSqs(consumer *sqs_client.Consumer, converter ConverterFunc, metrics metrics.Metrics, logger *zap.Logger, opts ...SQSOption) *SQS { s := &SQS{ - consumer: consumer, - chSize: 10, - metrics: metrics, - logger: logger} + consumer: consumer, + chSize: 10, + metrics: metrics, + converter: converter, + logger: logger} for _, opt := range opts { opt(s) } @@ -68,19 +73,18 @@ func (q *SQS) Consume(ctx context.Context) <-chan ConsumerMessage { continue } - // unmarshal message to vaaEvent - var vaaEvent VaaEvent - err = json.Unmarshal([]byte(sqsEvent.Message), &vaaEvent) + // unmarshal message to event + event, err := q.converter(sqsEvent.Message) if err != nil { q.logger.Error("Error decoding vaaEvent message from SQSEvent", zap.Error(err)) continue } - q.metrics.IncVaaConsumedQueue(uint16(vaaEvent.ChainID)) + q.metrics.IncVaaConsumedQueue(uint16(event.ChainID)) q.wg.Add(1) q.ch <- &sqsConsumerMessage{ id: msg.ReceiptHandle, - data: &vaaEvent, + data: event, wg: &q.wg, logger: q.logger, consumer: q.consumer, @@ -101,7 +105,7 @@ func (q *SQS) Close() { } type sqsConsumerMessage struct { - data *VaaEvent + data *Event consumer *sqs_client.Consumer wg *sync.WaitGroup id *string @@ -110,7 +114,7 @@ type sqsConsumerMessage struct { ctx context.Context } -func (m *sqsConsumerMessage) Data() *VaaEvent { +func (m *sqsConsumerMessage) Data() *Event { return m.data } diff --git a/tx-tracker/queue/queue.go b/tx-tracker/queue/queue.go deleted file mode 100644 index 2b6990b8..00000000 --- a/tx-tracker/queue/queue.go +++ /dev/null @@ -1,40 +0,0 @@ -package queue - -import ( - "context" - "time" - - sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" -) - -type sqsEvent struct { - MessageID string `json:"MessageId"` - Message string `json:"Message"` -} - -// VaaEvent represents a vaa data to be handle by the pipeline. -type VaaEvent struct { - ID string `json:"id"` - ChainID sdk.ChainID `json:"emitterChain"` - EmitterAddress string `json:"emitterAddr"` - Sequence string `json:"sequence"` - GuardianSetIndex uint32 `json:"guardianSetIndex"` - Vaa []byte `json:"vaas"` - IndexedAt time.Time `json:"indexedAt"` - Timestamp *time.Time `json:"timestamp"` - UpdatedAt *time.Time `json:"updatedAt"` - TxHash string `json:"txHash"` - Version uint16 `json:"version"` - Revision uint16 `json:"revision"` -} - -// ConsumerMessage defition. -type ConsumerMessage interface { - Data() *VaaEvent - Done() - Failed() - IsExpired() bool -} - -// VAAConsumeFunc is a function to consume VAAEvent. -type VAAConsumeFunc func(context.Context) <-chan ConsumerMessage diff --git a/tx-tracker/queue/types.go b/tx-tracker/queue/types.go new file mode 100644 index 00000000..1de0b438 --- /dev/null +++ b/tx-tracker/queue/types.go @@ -0,0 +1,35 @@ +package queue + +import ( + "context" + "time" + + sdk "github.com/wormhole-foundation/wormhole/sdk/vaa" +) + +type sqsEvent struct { + MessageID string `json:"MessageId"` + Message string `json:"Message"` +} + +// Event represents a event data to be handle. +type Event struct { + TrackID string + ID string + ChainID sdk.ChainID + EmitterAddress string + Sequence string + Timestamp *time.Time + TxHash string +} + +// ConsumerMessage defition. +type ConsumerMessage interface { + Data() *Event + Done() + Failed() + IsExpired() bool +} + +// ConsumeFunc is a function to consume Event. +type ConsumeFunc func(context.Context) <-chan ConsumerMessage