From 97b9217b6bef85ddecc039711c1844a52b77535c Mon Sep 17 00:00:00 2001 From: Mariano <9205080+marianososto@users.noreply.github.com> Date: Wed, 12 Jun 2024 15:37:51 -0300 Subject: [PATCH] Create backfiller for influx measurement vaa_volume_v3 (#1475) * backfiller for vaa_volume_v3 * remove printf --- analytics/cmd/main.go | 35 +++ .../cmd/metrics/vaa_volume_v3_backfiller.go | 236 ++++++++++++++++++ analytics/cmd/metrics/volume.go | 47 ++-- analytics/cmd/metrics/volume_csv.go | 15 +- analytics/cmd/metrics/volume_mongo.go | 14 +- analytics/metric/metric.go | 4 +- common/domain/manual_mainnet_tokens.go | 234 ++++++++++++++++- 7 files changed, 556 insertions(+), 29 deletions(-) create mode 100644 analytics/cmd/metrics/vaa_volume_v3_backfiller.go diff --git a/analytics/cmd/main.go b/analytics/cmd/main.go index ae466ad6..56044c0f 100644 --- a/analytics/cmd/main.go +++ b/analytics/cmd/main.go @@ -140,6 +140,40 @@ func addVaaVolumeFromMongoCommand(parent *cobra.Command) { } +func addVaaVolumeV3FromVaasCollectionDump(parent *cobra.Command) { + var vaasBsonFile, output, prices, vaaPayloadParserURL, p2pNetwork string + //vaa-volume from MongoDB + vaaVolumeMongoCmd := &cobra.Command{ + Use: "vaa-volume-v3", + Short: "Generate volume metrics from MongoDB vaas collection dump", + Run: func(_ *cobra.Command, _ []string) { + metrics.RunBackFillerVaaVolumeV3(vaasBsonFile, output, prices, vaaPayloadParserURL, p2pNetwork) + }, + } + + // vaas bson file + vaaVolumeMongoCmd.Flags().StringVar(&vaasBsonFile, "vaas-bson-file", "vaas.bson", "path to vaas bson file") + vaaVolumeMongoCmd.MarkFlagRequired("vaas-bson-file") + + // output flag + vaaVolumeMongoCmd.Flags().StringVar(&output, "output", "", "path to output file") + vaaVolumeMongoCmd.MarkFlagRequired("output") + + // prices flag + vaaVolumeMongoCmd.Flags().StringVar(&prices, "prices", "prices.csv", "path to prices file") + vaaVolumeMongoCmd.MarkFlagRequired("prices") + + //vaa-payload-parser-url flag + 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) +} + func addVaaVolumeCommand(parent *cobra.Command) { vaaVolumeCmd := &cobra.Command{ @@ -149,6 +183,7 @@ func addVaaVolumeCommand(parent *cobra.Command) { addVaaVolumeFromFileCommand(vaaVolumeCmd) addVaaVolumeFromMongoCommand(vaaVolumeCmd) + addVaaVolumeV3FromVaasCollectionDump(vaaVolumeCmd) parent.AddCommand(vaaVolumeCmd) } diff --git a/analytics/cmd/metrics/vaa_volume_v3_backfiller.go b/analytics/cmd/metrics/vaa_volume_v3_backfiller.go new file mode 100644 index 00000000..4f8a2f60 --- /dev/null +++ b/analytics/cmd/metrics/vaa_volume_v3_backfiller.go @@ -0,0 +1,236 @@ +package metrics + +import ( + "context" + "encoding/binary" + "fmt" + "github.com/wormhole-foundation/wormhole-explorer/analytics/cmd/token" + "github.com/wormhole-foundation/wormhole-explorer/analytics/metric" + "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" + "github.com/wormhole-foundation/wormhole-explorer/common/repository" + "github.com/wormhole-foundation/wormhole/sdk/vaa" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/bsonrw" + "go.uber.org/zap" + "io" + "log" + "os" + "time" +) + +func RunBackFillerVaaVolumeV3(vaasBsonFile, outputFile, pricesFile, vaaPayloadParserURL, p2pNetwork string) { + + defer func() { + fmt.Println("exiting RunBackFillerVaaVolumeV3") + }() + + loggerInstance := logger.New("wormhole-explorer-analytics", func(cfg *zap.Config) { + cfg.OutputPaths = []string{"stdout"} + cfg.ErrorOutputPaths = []string{"stderr"} + }) + defer loggerInstance.Sync() + + loggerInstance.Info("starting wormhole-explorer-analytics", zap.String("command", "RunBackFillerVaaVolumeV3")) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Open BSON vaasFile + vaasFile, err := os.Open(vaasBsonFile) + if err != nil { + log.Fatal(err) + } + defer vaasFile.Close() + + failedVaas, err := os.OpenFile("failed_vaas.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + loggerInstance.Fatal("creating failedVaas file", zap.Error(err)) + } + defer failedVaas.Close() + + // create a parserVAAAPIClient + parserVAAAPIClient, err := parser.NewParserVAAAPIClient(10, vaaPayloadParserURL, loggerInstance) + if err != nil { + loggerInstance.Fatal("failed to create parse vaa api client") + } + tokenResolver := token.NewTokenResolver(parserVAAAPIClient, loggerInstance) + tokenProvider := domain.NewTokenProvider(p2pNetwork) + loggerInstance.Info("loading historical prices...") + priceCache := prices.NewCoinPricesCache(pricesFile) + priceCache.InitCache() + converter := NewVaaConverter(priceCache, tokenResolver.GetTransferredTokenByVaa, tokenProvider) + + loggerInstance.Info("loaded historical prices") + + vaasChan := make(chan vaaChanData) + defer close(vaasChan) + + batchSize := 1 + workersPool := make(chan struct{}, batchSize) + for i := 0; i < batchSize; i++ { + workersPool <- struct{}{} + } + + lpChan := make(chan lpChanData) + + go processVaas(ctx, workersPool, vaasChan, converter, loggerInstance, lpChan, failedVaas) + go processLineProtocols(ctx, outputFile, loggerInstance, lpChan, failedVaas) + + i := uint64(1) + offset := uint64(1) + + for { + // Read the length of the next BSON document (first 4 bytes) + var docLength int32 + err = binary.Read(vaasFile, binary.LittleEndian, &docLength) + if err == io.EOF { + loggerInstance.Info("found end of file,exiting main goroutine...") + break + } else if err != nil { + log.Fatal(err) + } + + // Read the complete BSON document based on the length + buffer := make([]byte, docLength) + binary.LittleEndian.PutUint32(buffer[:4], uint32(docLength)) // Set the length in the buffer + _, err = io.ReadFull(vaasFile, buffer[4:]) + if err != nil { + log.Fatal(err) + } + + if i < offset { + i++ + continue + } + + // Create a BSON document reader + docReader := bsonrw.NewBSONDocumentReader(buffer) + if err != nil { + log.Fatal(err) + } + + // Create a BSON decoder + decoder, errDecoder := bson.NewDecoder(docReader) + if errDecoder != nil { + log.Fatal(errDecoder) + } + + // Decode the document + var vaaDoc repository.VaaDoc + err = decoder.Decode(&vaaDoc) + if err != nil { + log.Fatal(err) + } + + // wait for a worker to be available or exit in case the ctx is cancelled + select { + case <-workersPool: + vaasChan <- vaaChanData{vaa: vaaDoc, i: i} + break + case <-ctx.Done(): + return + } + i++ + } + loggerInstance.Info("finished processing vaas") + loggerInstance.Info("waiting for workers to finish...") + <-workersPool + loggerInstance.Info("finished waiting, now cancelling ctx.") + cancel() + +} + +func processVaas(ctx context.Context, workersPool chan struct{}, vaasChan chan vaaChanData, converter *VaaConverter, logger *zap.Logger, lpChan chan lpChanData, failedVaas *os.File) { + for { + select { + case vaaData, isOpen := <-vaasChan: + if !isOpen { + logger.Info("exiting processVaas,vaasChan is closed") + return + } + go processVaa(ctx, workersPool, vaaData, converter, logger, lpChan, failedVaas) + case <-ctx.Done(): + logger.Info("exiting processVaas, ctx cancelled") + return + } + } + +} + +func processVaa(ctx context.Context, workersPool chan struct{}, vaaData vaaChanData, converter *VaaConverter, logger *zap.Logger, lpChan chan lpChanData, failedVaas *os.File) { + defer func() { + workersPool <- struct{}{} + }() + parsedPayload, point, _, err := converter.Convert(context.Background(), vaaData.vaa.Vaa) + + if err != nil { + _, errLog := failedVaas.WriteString("vaa: " + vaaData.vaa.ID + "|error: " + err.Error() + "\n") + if errLog != nil { + fmt.Printf("\n[processVaa]:failed to write to failedVaas.log. error:" + errLog.Error()) + return + } + logger.Error("[processVaa]:failed to convert vaaDoc", zap.Error(err), zap.Uint64("index", vaaData.i)) + return + } + + m := &metric.Metric{} + dummyParams := &metric.Params{Vaa: &vaa.VAA{}} + vaaVolumeV3Point := m.MakePointVaaVolumeV3(point, dummyParams, parsedPayload) + data := lpChanData{ + vaaId: vaaData.vaa.ID, + lp: convertPointToLineProtocol(vaaVolumeV3Point), + index: vaaData.i, + } + + select { + case lpChan <- data: + break + case <-ctx.Done(): + logger.Info("exiting processVaa, ctx cancelled") + break + } + +} + +func processLineProtocols(ctx context.Context, outputFile string, logger *zap.Logger, lpChan chan lpChanData, failedVaas *os.File) { + + fout, err := os.OpenFile(outputFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + logger.Fatal("creating output file", zap.Error(err)) + } + defer fout.Close() + + for { + select { + case lpData := <-lpChan: + _, err = fout.Write([]byte(lpData.lp)) + if err != nil { + _, errLog := failedVaas.WriteString("vaa: " + lpData.vaaId + "|error: " + err.Error() + "\n") + if errLog != nil { + fmt.Printf("\n[%s][processLineProtocols]:failed to write to failedVaas.log. error:%s|output_file_error=%s", time.Now().Format(time.RFC3339), errLog.Error(), err.Error()) + return + } + logger.Error("[processLineProtocols]:failed to write line protocol to file", zap.Error(err)) + } else { + logger.Info("wrote line protocol to file", zap.String("vaaId", lpData.vaaId), zap.Uint64("index", lpData.index)) + } + case <-ctx.Done(): + logger.Info("exiting processLineProtocols, ctx cancelled") + return + } + } +} + +type vaaChanData struct { + vaa repository.VaaDoc + i uint64 // indicate the number of vaa +} + +type lpChanData struct { + vaaId string + lp string + index uint64 +} diff --git a/analytics/cmd/metrics/volume.go b/analytics/cmd/metrics/volume.go index 1bad29ec..37bdc6a7 100644 --- a/analytics/cmd/metrics/volume.go +++ b/analytics/cmd/metrics/volume.go @@ -4,6 +4,8 @@ import ( "context" "errors" "fmt" + "go.uber.org/zap" + "sync" "time" "github.com/influxdata/influxdb-client-go/v2/api/write" @@ -17,18 +19,22 @@ import ( ) type VaaConverter struct { - MissingTokens map[sdk.Address]sdk.ChainID - MissingTokensCounter map[sdk.Address]int + MissingTokens sync.Map + MissingTokensCounter sync.Map PriceCache *prices.CoinPricesCache Metrics metrics.Metrics GetTransferredTokenByVaa token.GetTransferredTokenByVaa TokenProvider *domain.TokenProvider + zap.Logger } -func NewVaaConverter(priceCache *prices.CoinPricesCache, GetTransferredTokenByVaa token.GetTransferredTokenByVaa, tokenProvider *domain.TokenProvider) *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), + MissingTokens: sync.Map{}, + MissingTokensCounter: sync.Map{}, PriceCache: priceCache, Metrics: metrics.NewNoopMetrics(), GetTransferredTokenByVaa: GetTransferredTokenByVaa, @@ -36,27 +42,36 @@ func NewVaaConverter(priceCache *prices.CoinPricesCache, GetTransferredTokenByVa } } -func (c *VaaConverter) Convert(ctx context.Context, vaaBytes []byte) (string, error) { +func (c *VaaConverter) Convert(ctx context.Context, vaaBytes []byte) (*token.TransferredToken, *write.Point, string, error) { // Parse the VAA and payload vaa, err := sdk.Unmarshal(vaaBytes) if err != nil { - return "", fmt.Errorf("error unmarshaling vaa: %v", err) + return nil, nil, "", fmt.Errorf("error unmarshaling vaa: %v", err) } transferredToken, err := c.GetTransferredTokenByVaa(ctx, vaa) if err != nil { - return "", fmt.Errorf("error decoding payload: %v", err) + return transferredToken, nil, "", fmt.Errorf("error decoding payload: %v", err) + } + + if transferredToken == nil { + return nil, nil, "", errors.New("transferred token is nil") } // Look up token metadata + var tokenMetadata *domain.TokenMetadata tokenMetadata, ok := c.TokenProvider.GetTokenByAddress(transferredToken.TokenChain, transferredToken.TokenAddress.String()) if !ok { - // if not found, add to missing tokens - c.MissingTokens[transferredToken.TokenAddress] = transferredToken.TokenChain - c.MissingTokensCounter[transferredToken.TokenAddress] = c.MissingTokensCounter[transferredToken.TokenAddress] + 1 - - return "", fmt.Errorf("unknown token: %s %s", transferredToken.TokenChain.String(), transferredToken.TokenAddress.String()) + c.MissingTokens.Store(transferredToken.TokenAddress, transferredToken.TokenChain) + counter, found := c.MissingTokensCounter.Load(transferredToken.TokenAddress) + missingTokenCounter := uint64(1) + if found { + missingTokenCounter = counter.(uint64) + missingTokenCounter++ + } + c.MissingTokensCounter.Store(transferredToken.TokenAddress, missingTokenCounter) + return transferredToken, nil, "", fmt.Errorf("unknown token: %s %s", transferredToken.TokenChain.String(), transferredToken.TokenAddress.String()) } // Generate a data point for the VAA volume metric @@ -82,15 +97,15 @@ func (c *VaaConverter) Convert(ctx context.Context, vaaBytes []byte) (string, er var err error point, err = metric.MakePointForVaaVolume(&p) if err != nil { - return "", fmt.Errorf("failed to create data point for VAA volume metric: %v", err) + return transferredToken, point, "", fmt.Errorf("failed to create data point for VAA volume metric: %v", err) } if point == nil { // Some VAAs don't generate any data points for this metric (e.g.: PythNet, non-token-bridge VAAs) - return "", errors.New("can't generate point for VAA volume metric") + return transferredToken, point, "", errors.New(fmt.Sprintf("can't generate point for VAA volume metric. vaaId:%s", vaa.MessageID())) } } // Convert the data point to line protocol result := convertPointToLineProtocol(point) - return result, nil + return transferredToken, point, result, nil } diff --git a/analytics/cmd/metrics/volume_csv.go b/analytics/cmd/metrics/volume_csv.go index 9ea6a944..ce2a2d39 100755 --- a/analytics/cmd/metrics/volume_csv.go +++ b/analytics/cmd/metrics/volume_csv.go @@ -106,11 +106,15 @@ func RunVaaVolumeFromFile(inputFile, outputFile, pricesFile, vaaPayloadParserURL } - for k := range converter.MissingTokensCounter { - fmissingTokens.WriteString(fmt.Sprintf("%s,%s,%d\n", k.String(), converter.MissingTokens[k], converter.MissingTokensCounter[k])) - } + missingTokensCount := 0 + converter.MissingTokensCounter.Range( + func(key, value interface{}) bool { + fmissingTokens.WriteString(fmt.Sprintf("%s,%d\n", key.(string), value.(uint64))) + missingTokensCount++ + return true + }) - logger.Info("missing tokens", zap.Int("count", len(converter.MissingTokens))) + logger.Info("missing tokens", zap.Int("count", missingTokensCount)) logger.Info("finished wormhole-explorer-analytics") @@ -137,5 +141,6 @@ func (lp *LineParser) ParseLine(ctx context.Context, line []byte) (string, error return "", fmt.Errorf("error decoding: %v", err) } - return lp.converter.Convert(ctx, vaaBytes) + _, _, s, err := lp.converter.Convert(ctx, vaaBytes) + return s, err } diff --git a/analytics/cmd/metrics/volume_mongo.go b/analytics/cmd/metrics/volume_mongo.go index 5f3a982a..5054ab23 100755 --- a/analytics/cmd/metrics/volume_mongo.go +++ b/analytics/cmd/metrics/volume_mongo.go @@ -93,7 +93,7 @@ func RunVaaVolumeFromMongo(mongoUri, mongoDb, outputFile, pricesFile, vaaPayload } for i, v := range vaas { logger.Debug("Processing vaa", zap.String("id", v.ID)) - nl, err := converter.Convert(rootCtx, v.Vaa) + _, _, nl, err := converter.Convert(rootCtx, v.Vaa) if err != nil { //fmt.Printf(",") } else { @@ -117,11 +117,15 @@ func RunVaaVolumeFromMongo(mongoUri, mongoDb, outputFile, pricesFile, vaaPayload logger.Info("closing MongoDB connection...") db.DisconnectWithTimeout(10 * time.Second) - for k := range converter.MissingTokensCounter { - fmissingTokens.WriteString(fmt.Sprintf("%s,%s,%d\n", k.String(), converter.MissingTokens[k], converter.MissingTokensCounter[k])) - } + missingTokensCount := 0 + converter.MissingTokensCounter.Range( + func(key, value interface{}) bool { + fmissingTokens.WriteString(fmt.Sprintf("%s,%d\n", key.(string), value.(uint64))) + missingTokensCount++ + return true + }) - logger.Info("missing tokens", zap.Int("count", len(converter.MissingTokens))) + logger.Info("missing tokens", zap.Int("count", missingTokensCount)) logger.Info("finished wormhole-explorer-analytics") diff --git a/analytics/metric/metric.go b/analytics/metric/metric.go index 185da25d..c275f2d1 100644 --- a/analytics/metric/metric.go +++ b/analytics/metric/metric.go @@ -269,7 +269,7 @@ func (m *Metric) volumeMeasurement(ctx context.Context, params *Params, token *t return nil } - vaaVolumeV3point := m.makePointVaaVolumeV3(point, params, token) + vaaVolumeV3point := m.MakePointVaaVolumeV3(point, params, token) // Write the point to influx err = m.apiBucketInfinite.WritePoint(ctx, point, vaaVolumeV3point) @@ -289,7 +289,7 @@ func (m *Metric) volumeMeasurement(ctx context.Context, params *Params, token *t return nil } -func (m *Metric) makePointVaaVolumeV3(vaaVolumeV2Point *write.Point, params *Params, transferredToken *token.TransferredToken) *write.Point { +func (m *Metric) MakePointVaaVolumeV3(vaaVolumeV2Point *write.Point, params *Params, transferredToken *token.TransferredToken) *write.Point { point := influxdb2.NewPointWithMeasurement("vaa_volume_v3") diff --git a/common/domain/manual_mainnet_tokens.go b/common/domain/manual_mainnet_tokens.go index d4c57804..ed950762 100644 --- a/common/domain/manual_mainnet_tokens.go +++ b/common/domain/manual_mainnet_tokens.go @@ -19,5 +19,237 @@ func manualMainnetTokenList() []TokenMetadata { // mainnetTokenList returns a list of all tokens on the mainnet. func mainnetTokenList() []TokenMetadata { - return append(generatedMainnetTokenList(), manualMainnetTokenList()...) + res := append(generatedMainnetTokenList(), manualMainnetTokenList()...) + return append(res, unknownTokenList()...) +} + +func unknownTokenList() []TokenMetadata { + return []TokenMetadata{ + {TokenChain: 23, TokenAddress: "00000000000000000000000007dd5beaffb65b8ff2e575d500bdf324a05295dc", Symbol: "arbi", CoingeckoID: "arbipad", Decimals: 18}, + {TokenChain: 23, TokenAddress: "0000000000000000000000003d9907f9a368ad0a51be60f7da3b97cf940982d8", Symbol: "grail", CoingeckoID: "camelot-token", Decimals: 18}, + {TokenChain: 23, TokenAddress: "0000000000000000000000004186bfc76e2e237523cbc30fd220fe055156b41f", Symbol: "rseth", CoingeckoID: "layerzero-bridged-rseth-linea", Decimals: 18}, + {TokenChain: 23, TokenAddress: "000000000000000000000000788d86e00ab31db859c3d6b80d5a9375801d7f2a", Symbol: "tenet", CoingeckoID: "tenet-1b000f7b-59cb-4e06-89ce-d62b32d362b9", Decimals: 18}, + {TokenChain: 23, TokenAddress: "000000000000000000000000e66998533a1992ece9ea99cdf47686f4fc8458e0", Symbol: "jusdc", CoingeckoID: "jones-usdc", Decimals: 18}, + {TokenChain: 9, TokenAddress: "000000000000000000000000c42c30ac6cc15fac9bd938618bcaa1a1fae8501d", Symbol: "wnear", CoingeckoID: "wrapped-near", Decimals: 24}, + {TokenChain: 9, TokenAddress: "000000000000000000000000f4eb217ba2454613b15dbdea6e5f22276410e89e", Symbol: "wbtc", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, + {TokenChain: 6, TokenAddress: "000000000000000000000000027dbca046ca156de9622cd1e2d907d375e53aa7", Symbol: "ampl", CoingeckoID: "ampleforth", Decimals: 9}, + {TokenChain: 6, TokenAddress: "000000000000000000000000184ff13b3ebcb25be44e860163a5d8391dd568c1", Symbol: "kimbo", CoingeckoID: "kimbo", Decimals: 18}, + {TokenChain: 6, TokenAddress: "0000000000000000000000001c20e891bab6b1727d14da358fae2984ed9b59eb", Symbol: "tusd", CoingeckoID: "true-usd", Decimals: 18}, + {TokenChain: 6, TokenAddress: "0000000000000000000000001db749847c4abb991d8b6032102383e6bfd9b1c7", Symbol: "don", CoingeckoID: "dogeon", Decimals: 18}, + {TokenChain: 6, TokenAddress: "00000000000000000000000037b608519f91f70f2eeb0e5ed9af4061722e4f76", Symbol: "sushi", CoingeckoID: "sushi", Decimals: 18}, + {TokenChain: 6, TokenAddress: "00000000000000000000000039fc9e94caeacb435842fadedecb783589f50f5f", Symbol: "knc", CoingeckoID: "kyber-network-crystal", Decimals: 18}, + {TokenChain: 6, TokenAddress: "000000000000000000000000420fca0121dc28039145009570975747295f2329", Symbol: "coq", CoingeckoID: "coq-inu", Decimals: 18}, + {TokenChain: 6, TokenAddress: "0000000000000000000000005c49b268c9841aff1cc3b0a418ff5c3442ee3f3b", Symbol: "mimatic", CoingeckoID: "mai-avalanche", Decimals: 18}, + {TokenChain: 6, TokenAddress: "00000000000000000000000065378b697853568da9ff8eab60c13e1ee9f4a654", Symbol: "husky", CoingeckoID: "husky-avax", Decimals: 18}, + {TokenChain: 6, TokenAddress: "0000000000000000000000008729438eb15e2c8b576fcc6aecda6a148776c0f5", Symbol: "qi", CoingeckoID: "benqi", Decimals: 18}, + {TokenChain: 6, TokenAddress: "0000000000000000000000009c9e5fd8bbc25984b178fdce6117defa39d2db39", Symbol: "busd", CoingeckoID: "binance-peg-busd", Decimals: 18}, + {TokenChain: 6, TokenAddress: "000000000000000000000000abc9547b534519ff73921b1fba6e672b5f58d083", Symbol: "woo", CoingeckoID: "woo-network", Decimals: 18}, + {TokenChain: 6, TokenAddress: "000000000000000000000000acfb898cff266e53278cc0124fc2c7c94c8cb9a5", Symbol: "nochill", CoingeckoID: "avax-has-no-chill", Decimals: 18}, + {TokenChain: 6, TokenAddress: "000000000000000000000000afe3d2a31231230875dee1fa1eef14a412443d22", Symbol: "dfiat", CoingeckoID: "defiato", Decimals: 18}, + {TokenChain: 6, TokenAddress: "000000000000000000000000b09fe1613fe03e7361319d2a43edc17422f36b09", Symbol: "bog", CoingeckoID: "bogged-finance", Decimals: 18}, + {TokenChain: 6, TokenAddress: "000000000000000000000000bd83010eb60f12112908774998f65761cf9f6f9a", Symbol: "boo", CoingeckoID: "spookyswap", Decimals: 18}, + {TokenChain: 6, TokenAddress: "000000000000000000000000fc6da929c031162841370af240dec19099861d3b", Symbol: "domi", CoingeckoID: "domi", Decimals: 18}, + {TokenChain: 30, TokenAddress: "0000000000000000000000000a1d576f3efef75b330424287a95a366e8281d54", Symbol: "ausdbc", CoingeckoID: "aave-v3-usdbc", Decimals: 6}, + {TokenChain: 30, TokenAddress: "00000000000000000000000017931cfc3217261ce0fa21bb066633c463ed8634", Symbol: "based", CoingeckoID: "basedchad", Decimals: 18}, + {TokenChain: 30, TokenAddress: "00000000000000000000000019b50c63d3d7f7a22308cb0fc8d41b66ff9c318a", Symbol: "gpx", CoingeckoID: "grabpenny", Decimals: 18}, + {TokenChain: 30, TokenAddress: "0000000000000000000000001c7a460413dd4e964f96d8dfc56e7223ce88cd85", Symbol: "seam", CoingeckoID: "seamless-protocol", Decimals: 18}, + {TokenChain: 30, TokenAddress: "0000000000000000000000002598c30330d5771ae9f983979209486ae26de875", Symbol: "ai", CoingeckoID: "any-inu", Decimals: 18}, + {TokenChain: 30, TokenAddress: "00000000000000000000000074ccbe53f77b08632ce0cb91d3a545bf6b8e0979", Symbol: "bomb", CoingeckoID: "fbomb", Decimals: 18}, + {TokenChain: 30, TokenAddress: "00000000000000000000000076734b57dfe834f102fb61e1ebf844adf8dd931e", Symbol: "weirdo", CoingeckoID: "weirdo-2", Decimals: 8}, + {TokenChain: 30, TokenAddress: "00000000000000000000000096419929d7949d6a801a6909c145c8eef6a40431", Symbol: "spec", CoingeckoID: "spectral", Decimals: 18}, + {TokenChain: 30, TokenAddress: "0000000000000000000000009a3b7959e998bf2b50ef1969067d623877050d92", Symbol: "pbb", CoingeckoID: "pepe-but-blue", Decimals: 18}, + {TokenChain: 30, TokenAddress: "000000000000000000000000a88594d404727625a9437c3f886c7643872296ae", Symbol: "well", CoingeckoID: "moonwell-artemis", Decimals: 18}, + {TokenChain: 30, TokenAddress: "000000000000000000000000ba5e6fa2f33f3955f0cef50c63dcc84861eab663", Symbol: "based", CoingeckoID: "based-markets", Decimals: 18}, + {TokenChain: 30, TokenAddress: "000000000000000000000000c1cba3fcea344f92d9239c08c0568f6f2f0ee452", Symbol: "wsteth", CoingeckoID: "wrapped-steth", Decimals: 18}, + {TokenChain: 30, TokenAddress: "000000000000000000000000f7c1cefcf7e1dd8161e00099facd3e1db9e528ee", Symbol: "tower", CoingeckoID: "tower", Decimals: 18}, + {TokenChain: 4, TokenAddress: "00000000000000000000000014016e85a25aeb13065688cafb43044c2ef86784", Symbol: "tusd", CoingeckoID: "bridged-trueusd", Decimals: 18}, + {TokenChain: 4, TokenAddress: "00000000000000000000000016faf9daa401aa42506af503aa3d80b871c467a3", Symbol: "dck", CoingeckoID: "dexcheck", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000001d8e589379cf74a276952b56856033ad0d489fb3", Symbol: "milkai", CoingeckoID: "milkai", Decimals: 8}, + {TokenChain: 4, TokenAddress: "0000000000000000000000001dacbcd9b3fc2d6a341dca3634439d12bc71ca4d", Symbol: "bvt", CoingeckoID: "bovineverse-bvt", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000002a45a892877ef383c5fc93a5206546c97496da9e", Symbol: "x", CoingeckoID: "x-ai", Decimals: 9}, + {TokenChain: 4, TokenAddress: "0000000000000000000000002b72867c32cf673f7b02d208b26889fed353b1f8", Symbol: "sqr", CoingeckoID: "magic-square", Decimals: 8}, + {TokenChain: 4, TokenAddress: "0000000000000000000000003f56e0c36d275367b8c502090edf38289b3dea0d", Symbol: "mimatic", CoingeckoID: "mai-arbitrum", Decimals: 18}, + {TokenChain: 4, TokenAddress: "00000000000000000000000042c95788f791a2be3584446854c8d9bb01be88a9", Symbol: "hbr", CoingeckoID: "harbor-3", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000465707181acba42ed01268a33f0507e320a154bd", Symbol: "step", CoingeckoID: "step", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000005e7f472b9481c80101b22d0ba4ef4253aa61dabc", Symbol: "mudol2", CoingeckoID: "hero-blaze-three-kingdoms", Decimals: 18}, + {TokenChain: 4, TokenAddress: "00000000000000000000000069b14e8d3cebfdd8196bfe530954a0c226e5008e", Symbol: "spacepi", CoingeckoID: "spacepi-token", Decimals: 9}, + {TokenChain: 4, TokenAddress: "000000000000000000000000734548a9e43d2d564600b1b2ed5be9c2b911c6ab", Symbol: "peel", CoingeckoID: "meta-apes-peel", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000740df024ce73f589acd5e8756b377ef8c6558bab", Symbol: "hlg", CoingeckoID: "holograph", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000007deb9906bd1d77b410a56e5c23c36340bd60c983", Symbol: "static", CoingeckoID: "chargedefi-static", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000007f280dac515121dcda3eac69eb4c13a52392cace", Symbol: "fnc", CoingeckoID: "fancy-games", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000007f792db54b0e580cdc755178443f0430cf799aca", Symbol: "volt", CoingeckoID: "volt-inu-2", Decimals: 9}, + {TokenChain: 4, TokenAddress: "0000000000000000000000008729438eb15e2c8b576fcc6aecda6a148776c0f5", Symbol: "qi", CoingeckoID: "benqi", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000008bfca09e5877ea59f85883d13a6873334b937d41", Symbol: "madpepe", CoingeckoID: "mad-pepe", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000008db1d28ee0d822367af8d220c0dc7cb6fe9dc442", Symbol: "ethpad", CoingeckoID: "ethpad", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000008f0528ce5ef7b51152a59745befdd91d97091d2f", Symbol: "alpaca", CoingeckoID: "alpaca-finance", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000009b83f827928abdf18cf1f7e67053572b9bceff3a", Symbol: "artem", CoingeckoID: "artem", Decimals: 18}, + {TokenChain: 4, TokenAddress: "0000000000000000000000009bf543d8460583ff8a669aae01d9cdbee4defe3c", Symbol: "sko", CoingeckoID: "sugar-kingdom-odyssey", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000a25199a79a34cc04b15e5c0bba4e3a557364e532", Symbol: "rim", CoingeckoID: "metarim", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000b0e1fc65c1a741b4662b813eb787d369b8614af1", Symbol: "if", CoingeckoID: "impossible-finance", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000b64e280e9d1b5dbec4accedb2257a87b400db149", Symbol: "lvl", CoingeckoID: "level", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000bbca42c60b5290f2c48871a596492f93ff0ddc82", Symbol: "domi", CoingeckoID: "domi", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000bceee918077f63fb1b9e10403f59ca40c7061341", Symbol: "papadoge", CoingeckoID: "papa-doge", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000bededdf2ef49e87037c4fb2ca34d1ff3d3992a11", Symbol: "feg", CoingeckoID: "feg-bsc", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000c17c30e98541188614df99239cabd40280810ca3", Symbol: "rise", CoingeckoID: "everrise", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000c28e27870558cf22add83540d2126da2e4b464c2", Symbol: "sashimi", CoingeckoID: "sashimi", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000c6759a4fc56b3ce9734035a56b36e8637c45b77e", Symbol: "grimace", CoingeckoID: "grimace-coin", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000c703da39ae3b9db67c207c7bad8100e1afdc0f9c", Symbol: "frgx", CoingeckoID: "frgx-finance", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000c7981767f644c7f8e483dabdc413e8a371b83079", Symbol: "liq", CoingeckoID: "liquidus", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000cc7a91413769891de2e9ebbfc96d2eb1874b5760", Symbol: "gov", CoingeckoID: "govworld", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000ce7de646e7208a4ef112cb6ed5038fa6cc6b12e3", Symbol: "trx", CoingeckoID: "tron-bsc", Decimals: 6}, + {TokenChain: 4, TokenAddress: "000000000000000000000000d0aa796e2160ed260c668e90ac5f237b4ebd4b0d", Symbol: "waifu", CoingeckoID: "waifu", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000d8047afecb86e44eff3add991b9f063ed4ca716b", Symbol: "ggg", CoingeckoID: "good-games-guild", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000d9c2d319cd7e6177336b0a9c93c21cb48d84fb54", Symbol: "hapi", CoingeckoID: "hapi", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000e7f72bc0252ca7b16dbb72eeee1afcdb2429f2dd", Symbol: "nftl", CoingeckoID: "nftlaunch", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000e8377a076adabb3f9838afb77bee96eac101ffb1", Symbol: "msu", CoingeckoID: "metasoccer", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000f00600ebc7633462bc4f9c61ea2ce99f5aaebd4a", Symbol: "rose", CoingeckoID: "oasis-network", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000f93f6b686f4a6557151455189a9173735d668154", Symbol: "lfg", CoingeckoID: "gamerse", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000f95a5532d67c944dfa7eddd2f8c358fe0dc7fac2", Symbol: "mbx", CoingeckoID: "marblex", Decimals: 18}, + {TokenChain: 4, TokenAddress: "000000000000000000000000fa4ba88cf97e282c505bea095297786c16070129", Symbol: "cusd", CoingeckoID: "coin98-dollar", Decimals: 6}, + {TokenChain: 14, TokenAddress: "00000000000000000000000048065fbbe25f71c9282ddf5e1cd6d6a887483d5e", Symbol: "usdt", CoingeckoID: "tether", Decimals: 6}, + {TokenChain: 14, TokenAddress: "0000000000000000000000006e512bfc33be36f2666754e996ff103ad1680cc9", Symbol: "abr", CoingeckoID: "allbridge", Decimals: 18}, + {TokenChain: 14, TokenAddress: "000000000000000000000000d15ec721c2a896512ad29c671997dd68f9593226", Symbol: "sushi", CoingeckoID: "sushi", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000005d1123878fc55fbd56b54c73963b234a64af3c", Symbol: "kiba", CoingeckoID: "kiba-inu", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000009395a2a58db45db0da254c7eaa5ac469d8bdc85", Symbol: "sqt", CoingeckoID: "subquery-network", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000009f098b155d561fc9f7bccc97038b7e3d20baf74", Symbol: "zoo", CoingeckoID: "zoodao", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000000f2d719407fdbeff09d87557abb7232601fd9f29", Symbol: "syn", CoingeckoID: "synapse-2", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000001155db64b59265f57533bc0f9ae012fffd34eb7f", Symbol: "yaku", CoingeckoID: "yaku", Decimals: 9}, + {TokenChain: 2, TokenAddress: "00000000000000000000000012970e6868f88f6557b76120662c1b3e50a646bf", Symbol: "ladys", CoingeckoID: "milady-meme-coin", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000191557728e4d8caa4ac94f86af842148c0fa8f7e", Symbol: "eco", CoingeckoID: "ormeus-ecosystem", Decimals: 8}, + {TokenChain: 2, TokenAddress: "0000000000000000000000001a4b46696b2bb4794eb3d4c26f1c55f9170fa4c5", Symbol: "bit", CoingeckoID: "bitdao", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000001a57367c6194199e5d9aea1ce027431682dfb411", Symbol: "mdf", CoingeckoID: "matrixetf", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000001da87b114f35e1dc91f72bf57fc07a768ad40bb0", Symbol: "eqz", CoingeckoID: "equalizer", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000001e4e46b7bf03ece908c88ff7cc4975560010893a", Symbol: "ioen", CoingeckoID: "internet-of-energy-network", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000001fc5ef0337aea85c5f9198853a6e3a579a7a6987", Symbol: "reap", CoingeckoID: "reapchain", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000020a62aca58526836165ca53fe67dd884288c8abf", Symbol: "rnb", CoingeckoID: "rentible", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000024fcfc492c1393274b6bcd568ac9e225bec93584", Symbol: "mavia", CoingeckoID: "heroes-of-mavia", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000026c8afbbfe1ebaca03c2bb082e69d0476bffe099", Symbol: "cell", CoingeckoID: "cellframe", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000298d492e8c1d909d3f63bc4a36c66c64acb3d695", Symbol: "pbr", CoingeckoID: "polkabridge", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000299a1503e88433c0fd1bd68625c25c5a703eb64f", Symbol: "tear", CoingeckoID: "tear", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000002a8e1e676ec238d8a992307b495b45b3feaa5e86", Symbol: "ousd", CoingeckoID: "origin-dollar", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000002b867efd2de4ad2b583ca0cb3df9c4040ef4d329", Symbol: "lblock", CoingeckoID: "lucky-block", Decimals: 9}, + {TokenChain: 2, TokenAddress: "0000000000000000000000002b89bf8ba858cd2fcee1fada378d5cd6936968be", Symbol: "wscrt", CoingeckoID: "secret-erc20", Decimals: 6}, + {TokenChain: 2, TokenAddress: "0000000000000000000000003b79a28264fc52c7b4cea90558aa0b162f7faf57", Symbol: "wmemo", CoingeckoID: "wrapped-memory", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000003e9bc21c9b189c09df3ef1b824798658d5011937", Symbol: "lina", CoingeckoID: "linear", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000003ea8ea4237344c9931214796d9417af1a1180770", Symbol: "flx", CoingeckoID: "flux-token", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000042bbfa2e77757c645eeaad1655e0911a7553efbc", Symbol: "boba", CoingeckoID: "boba-network", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000430ef9263e76dae63c84292c3409d61c598e9682", Symbol: "pyr", CoingeckoID: "vulcan-forged", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000043dfc4159d86f3a37a5a4b3d4580b888ad7d4ddd", Symbol: "dodo", CoingeckoID: "dodo", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe", Symbol: "radar", CoingeckoID: "dappradar", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000044f5909e97e1cbf5fbbdf0fc92fd83cde5d5c58a", Symbol: "acria", CoingeckoID: "acria", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000046d0dac0926fa16707042cadc23f1eb4141fe86b", Symbol: "snm", CoingeckoID: "sonm", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000004c9edd5852cd905f086c759e8383e09bff1e68b3", Symbol: "usde", CoingeckoID: "ethena-usde", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000004cf89ca06ad997bc732dc876ed2a7f26a9e7f361", Symbol: "myst", CoingeckoID: "mysterium", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000004dd942baa75810a3c1e876e79d5cd35e09c97a76", Symbol: "d2t", CoingeckoID: "dash-2-trade", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000004ddc2d193948926d02f9b1fe9e1daa0718270ed5", Symbol: "ceth", CoingeckoID: "compound-ether", Decimals: 8}, + {TokenChain: 2, TokenAddress: "0000000000000000000000004e3fbd56cd56c3e72c1403e103b45db9da5b9d2b", Symbol: "cvx", CoingeckoID: "convex-finance", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000054012cdf4119de84218f7eb90eeb87e25ae6ebd7", Symbol: "luffy", CoingeckoID: "luffy-inu", Decimals: 9}, + {TokenChain: 2, TokenAddress: "0000000000000000000000005faa989af96af85384b8a938c2ede4a7378d9875", Symbol: "gal", CoingeckoID: "project-galaxy", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000614da3b37b6f66f7ce69b4bbbcf9a55ce6168707", Symbol: "mmx", CoingeckoID: "m2-global-wealth-limited-mmx", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000006226e00bcac68b0fe55583b90a1d727c14fab77f", Symbol: "mtv", CoingeckoID: "multivac", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000062d0a8458ed7719fdaf978fe5929c6d342b0bfce", Symbol: "beam", CoingeckoID: "beam-2", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000630d98424efe0ea27fb1b3ab7741907dffeaad78", Symbol: "peak", CoingeckoID: "marketpeak", Decimals: 8}, + {TokenChain: 2, TokenAddress: "000000000000000000000000667102bd3413bfeaa3dffb48fa8288819e480a88", Symbol: "tkx", CoingeckoID: "tokenize-xchange", Decimals: 8}, + {TokenChain: 2, TokenAddress: "000000000000000000000000668dbf100635f593a3847c0bdaf21f0a09380188", Symbol: "bnsd", CoingeckoID: "bnsd-finance", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000006781a0f84c7e9e846dcb84a9a5bd49333067b104", Symbol: "zap", CoingeckoID: "zap", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000068bbed6a47194eff1cf514b50ea91895597fc91e", Symbol: "andy", CoingeckoID: "andy-the-wisguy", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000069fa0fee221ad11012bab0fdb45d444d3d2ce71c", Symbol: "xrune", CoingeckoID: "thorstarter", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000006a6c2ada3ce053561c2fbc3ee211f23d9b8c520a", Symbol: "ton", CoingeckoID: "tontoken", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000006c28aef8977c9b773996d0e8376d2ee379446f2f", Symbol: "quick", CoingeckoID: "quick", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000722a89f1b925fe41883978219c2176aecc7d6699", Symbol: "xnk", CoingeckoID: "kinka", Decimals: 18}, + {TokenChain: 2, TokenAddress: "00000000000000000000000075d86078625d1e2f612de2627d34c7bc411c18b8", Symbol: "agii", CoingeckoID: "agii", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000799ebfabe77a6e34311eeee9825190b9ece32824", Symbol: "btrst", CoingeckoID: "braintrust", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000007fd4d7737597e7b4ee22acbf8d94362343ae0a79", Symbol: "wmc", CoingeckoID: "wrapped-mistcoin", Decimals: 2}, + {TokenChain: 2, TokenAddress: "0000000000000000000000008185bc4757572da2a610f887561c32298f1a5748", Symbol: "aln", CoingeckoID: "aluna", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000008503a7b00b4b52692cc6c14e5b96f142e30547b7", Symbol: "meed", CoingeckoID: "meeds-dao", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000008a2279d4a90b6fe1c4b30fa660cc9f926797baa2", Symbol: "chr", CoingeckoID: "chromaway", Decimals: 6}, + {TokenChain: 2, TokenAddress: "000000000000000000000000909e34d3f6124c324ac83dcca84b74398a6fa173", Symbol: "zkp", CoingeckoID: "panther", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000009506d37f70eb4c3d79c398d326c871abbf10521d", Symbol: "mlt", CoingeckoID: "media-licensing-token", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000968cbe62c830a0ccf4381614662398505657a2a9", Symbol: "tpy", CoingeckoID: "thrupenny", Decimals: 8}, + {TokenChain: 2, TokenAddress: "000000000000000000000000970b9bb2c0444f5e81e9d0efb84c8ccdcdcaf84d", Symbol: "fuse", CoingeckoID: "fuse-network-token", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000993864e43caa7f7f12953ad6feb1d1ca635b875f", Symbol: "sdao", CoingeckoID: "singularitydao", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000009ba021b0a9b958b5e75ce9f6dff97c7ee52cb3e6", Symbol: "apxeth", CoingeckoID: "dinero-apxeth", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000009d409a0a012cfba9b15f6d4b36ac57a46966ab9a", Symbol: "yvboost", CoingeckoID: "yvboost", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000009ee91f9f426fa633d227f7a9b000e28b9dfd8599", Symbol: "stmatic", CoingeckoID: "lido-staked-matic", Decimals: 18}, + {TokenChain: 2, TokenAddress: "0000000000000000000000009fb83c0635de2e815fd1c21b3a292277540c2e8d", Symbol: "fevr", CoingeckoID: "realfevr", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000a0b73e1ff0b80914ab6fe0444e65848c4c34450b", Symbol: "cro", CoingeckoID: "crypto-com-chain", Decimals: 8}, + {TokenChain: 2, TokenAddress: "000000000000000000000000a1faa113cbe53436df28ff0aee54275c13b40975", Symbol: "alpha", CoingeckoID: "alpha-finance", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000a41f142b6eb2b164f8164cae0716892ce02f311f", Symbol: "avg", CoingeckoID: "avaocado-dao", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000a58a4f5c4bb043d2cc1e170613b74e767c94189b", Symbol: "utu", CoingeckoID: "utu-coin", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000aa6e8127831c9de45ae56bb1b0d4d4da6e5665bd", Symbol: "eth2x-fli", CoingeckoID: "eth-2x-flexible-leverage-index", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000aa8330fb2b4d5d07abfe7a72262752a8505c6b37", Symbol: "polc", CoingeckoID: "polka-city", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000aaef88cea01475125522e117bfe45cf32044e238", Symbol: "gf", CoingeckoID: "guildfi", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000ac6db8954b73ebf10e84278ac8b9b22a781615d9", Symbol: "bwb", CoingeckoID: "bitget-wallet-token", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000aea46a60368a7bd060eec7df8cba43b7ef41ad85", Symbol: "fet", CoingeckoID: "fetch-ai", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000af5191b0de278c7286d6c7cc6ab6bb8a73ba2cd6", Symbol: "stg", CoingeckoID: "stargate-finance", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000b369daca21ee035312176eb8cf9d88ce97e0aa95", Symbol: "$skol", CoingeckoID: "skol", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000b3999f658c0391d94a37f7ff328f3fec942bcadc", Symbol: "hft", CoingeckoID: "hashflow", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000b62132e35a6c13ee1ee0f84dc5d40bad8d815206", Symbol: "nexo", CoingeckoID: "nexo", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000b9f599ce614feb2e1bbe58f180f370d05b39344e", Symbol: "pork", CoingeckoID: "pepefork", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000bbc2ae13b23d715c30720f079fcd9b4a74093505", Symbol: "ern", CoingeckoID: "ethernity-chain", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000bd100d061e120b2c67a24453cf6368e63f1be056", Symbol: "idyp", CoingeckoID: "idefiyieldprotocol", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000be9895146f7af43049ca1c1ae358b0541ea49704", Symbol: "cbeth", CoingeckoID: "coinbase-wrapped-staked-eth", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000beef01060047522408756e0000a90ce195a70000", Symbol: "aptr", CoingeckoID: "aperture-finance", Decimals: 6}, + {TokenChain: 2, TokenAddress: "000000000000000000000000c55126051b22ebb829d00368f4b12bde432de5da", Symbol: "btrfly", CoingeckoID: "redacted", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000ce246eea10988c495b4a90a905ee9237a0f91543", Symbol: "vcx", CoingeckoID: "vaultcraft", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000cf0c122c6b73ff809c693db761e7baebe62b6a2e", Symbol: "floki", CoingeckoID: "floki", Decimals: 9}, + {TokenChain: 2, TokenAddress: "000000000000000000000000cfeb09c3c5f0f78ad72166d55f9e6e9a60e96eec", Symbol: "vemp", CoingeckoID: "vempire-ddao", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000d1420af453fd7bf940573431d416cace7ff8280c", Symbol: "agov", CoingeckoID: "answer-governance", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000d1d2eb1b1e90b638588728b4130137d262c87cae", Symbol: "gala", CoingeckoID: "gala", Decimals: 8}, + {TokenChain: 2, TokenAddress: "000000000000000000000000d31695a1d35e489252ce57b129fd4b1b05e6acac", Symbol: "tkp", CoingeckoID: "tokpie", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000d567b5f02b9073ad3a982a099a23bf019ff11d1c", Symbol: "game", CoingeckoID: "gamestarter", Decimals: 5}, + {TokenChain: 2, TokenAddress: "000000000000000000000000da816459f1ab5631232fe5e97a05bbbb94970c95", Symbol: "yvdai", CoingeckoID: "yvdai", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000dc5e9445169c73cf21e1da0b270e8433cac69959", Symbol: "ethereum", CoingeckoID: "ketaicoin", Decimals: 9}, + {TokenChain: 2, TokenAddress: "000000000000000000000000ddf7fd345d54ff4b40079579d4c4670415dbfd0a", Symbol: "sg", CoingeckoID: "social-good-project", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000e86df1970055e9caee93dae9b7d5fd71595d0e18", Symbol: "btc20", CoingeckoID: "bitcoin20", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000eeaa40b28a2d1b0b08f6f97bb1dd4b75316c6107", Symbol: "govi", CoingeckoID: "govi", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000ef19f4e48830093ce5bc8b3ff7f903a0ae3e9fa1", Symbol: "botx", CoingeckoID: "botxcoin", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000f1c9acdc66974dfb6decb12aa385b9cd01190e38", Symbol: "oseth", CoingeckoID: "stakewise-v3-oseth", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000f29ae508698bdef169b89834f76704c3b205aedf", Symbol: "yvsnx", CoingeckoID: "snx-yvault", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000f519381791c03dd7666c142d4e49fd94d3536011", Symbol: "asia", CoingeckoID: "asia-coin", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000f94b5c5651c888d928439ab6514b93944eee6f48", Symbol: "yld", CoingeckoID: "yield-app", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000faba6f8e4a5e8ab82f62fe7c39859fa577269be3", Symbol: "ondo", CoingeckoID: "ondo-finance", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000fae4ee59cdd86e3be9e8b90b53aa866327d7c090", Symbol: "cpc", CoingeckoID: "cpchain", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000fbeea1c75e4c4465cb2fccc9c6d6afe984558e20", Symbol: "ddim", CoingeckoID: "duckdaodime", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000fc82bb4ba86045af6f327323a46e80412b91b27d", Symbol: "prom", CoingeckoID: "prometeus", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000fceb206e1a80527908521121358b5e26caabaa75", Symbol: "main", CoingeckoID: "main", Decimals: 18}, + {TokenChain: 2, TokenAddress: "000000000000000000000000ff20817765cb7f73d4bde2e66e067e58d11095c2", Symbol: "amp", CoingeckoID: "amp-token", Decimals: 18}, + {TokenChain: 10, TokenAddress: "00000000000000000000000002838746d9e1413e07ee064fcbada57055417f21", Symbol: "grain", CoingeckoID: "granary", Decimals: 18}, + {TokenChain: 10, TokenAddress: "00000000000000000000000027749e79ad796c4251e0a0564aef45235493a0b6", Symbol: "onx", CoingeckoID: "onx-finance", Decimals: 18}, + {TokenChain: 10, TokenAddress: "00000000000000000000000029b0da86e484e1c0029b56e817912d778ac0ec69", Symbol: "yfi", CoingeckoID: "yearn-finance", Decimals: 18}, + {TokenChain: 10, TokenAddress: "0000000000000000000000005f7f94a1dd7b15594d17543beb8b30b111dd464c", Symbol: "space", CoingeckoID: "space-token-bsc", Decimals: 18}, + {TokenChain: 10, TokenAddress: "0000000000000000000000007d016eec9c25232b01f23ef992d98ca97fc2af5a", Symbol: "fxs", CoingeckoID: "frax-share", Decimals: 18}, + {TokenChain: 10, TokenAddress: "00000000000000000000000091fa20244fb509e8289ca630e5db3e9166233fdc", Symbol: "gohm", CoingeckoID: "governance-ohm", Decimals: 18}, + {TokenChain: 10, TokenAddress: "0000000000000000000000009bd0611610a0f5133e4dd1bfdd71c5479ee77f37", Symbol: "ftmo", CoingeckoID: "fantom-oasis", Decimals: 18}, + {TokenChain: 10, TokenAddress: "000000000000000000000000c758295cd1a564cdb020a78a681a838cf8e0627d", Symbol: "fs", CoingeckoID: "fantomstarter", Decimals: 18}, + {TokenChain: 10, TokenAddress: "000000000000000000000000ddc0385169797937066bbd8ef409b5b3c0dfeb52", Symbol: "wmemo", CoingeckoID: "wrapped-memory", Decimals: 18}, + {TokenChain: 10, TokenAddress: "000000000000000000000000ddcb3ffd12750b45d32e084887fdf1aabab34239", Symbol: "any", CoingeckoID: "anyswap", Decimals: 18}, + {TokenChain: 10, TokenAddress: "000000000000000000000000e1e6b01ae86ad82b1f1b4eb413b219ac32e17bf6", Symbol: "xrune", CoingeckoID: "thorstarter", Decimals: 18}, + {TokenChain: 13, TokenAddress: "00000000000000000000000017d2628d30f8e9e966c9ba831c9b9b01ea8ea75c", Symbol: "isk", CoingeckoID: "iskra-token", Decimals: 18}, + {TokenChain: 13, TokenAddress: "000000000000000000000000574e9c26bda8b95d7329505b4657103710eb32ea", Symbol: "obnb", CoingeckoID: "orbit-bridge-klaytn-binance-coin", Decimals: 18}, + {TokenChain: 16, TokenAddress: "000000000000000000000000524d524b4c9366be706d3a90dcf70076ca037ae3", Symbol: "rmrk", CoingeckoID: "rmrk", Decimals: 18}, + {TokenChain: 16, TokenAddress: "0000000000000000000000006a2d262d56735dba19dd70682b39f6be9a931d98", Symbol: "ceusdc", CoingeckoID: "usd-coin-celer", Decimals: 6}, + {TokenChain: 16, TokenAddress: "0000000000000000000000007cd3e6e1a69409def0d78d17a492e8e143f40ec5", Symbol: "zoo", CoingeckoID: "zoodao", Decimals: 18}, + {TokenChain: 16, TokenAddress: "000000000000000000000000922d641a426dcffaef11680e5358f34d97d112e1", Symbol: "wbtc", CoingeckoID: "wrapped-bitcoin", Decimals: 8}, + {TokenChain: 16, TokenAddress: "000000000000000000000000dfa46478f9e5ea86d57387849598dbfb2e964b02", Symbol: "mimatic", CoingeckoID: "mimatic", Decimals: 18}, + {TokenChain: 24, TokenAddress: "00000000000000000000000048a9f8b4b65a55cc46ea557a610acf227454ab09", Symbol: "opc", CoingeckoID: "op-chads", Decimals: 18}, + {TokenChain: 24, TokenAddress: "000000000000000000000000b0b195aefa3650a6908f15cdac7d92f8a5791b0b", Symbol: "bob", CoingeckoID: "bob", Decimals: 18}, + {TokenChain: 24, TokenAddress: "000000000000000000000000dd69db25f6d620a7bad3023c5d32761d353d3de9", Symbol: "geth", CoingeckoID: "goerli-eth", Decimals: 18}, + {TokenChain: 24, TokenAddress: "000000000000000000000000dfa46478f9e5ea86d57387849598dbfb2e964b02", Symbol: "mimatic", CoingeckoID: "mai-optimism", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000111111111117dc0aa78b770fa6a738034120c302", Symbol: "1inch", CoingeckoID: "1inch", Decimals: 18}, + {TokenChain: 5, TokenAddress: "0000000000000000000000001796ae0b0fa4862485106a0de9b654efe301d0b2", Symbol: "pmon", CoingeckoID: "polychain-monsters", Decimals: 18}, + {TokenChain: 5, TokenAddress: "00000000000000000000000028424507fefb6f7f8e9d3860f56504e4e5f5f390", Symbol: "amweth", CoingeckoID: "aave-polygon-weth", Decimals: 18}, + {TokenChain: 5, TokenAddress: "0000000000000000000000002da719db753dfa10a62e140f436e1d67f2ddb0d6", Symbol: "cere", CoingeckoID: "cere-network", Decimals: 10}, + {TokenChain: 5, TokenAddress: "0000000000000000000000004f604735c1cf31399c6e711d5962b2b3e0225ad3", Symbol: "usdglo", CoingeckoID: "glo-dollar", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000580e933d90091b9ce380740e3a4a39c67eb85b4c", Symbol: "gswift", CoingeckoID: "gameswift", Decimals: 18}, + {TokenChain: 5, TokenAddress: "0000000000000000000000006d80113e533a2c0fe82eabd35f1875dcea89ea97", Symbol: "aeurs", CoingeckoID: "aave-v3-eurs", Decimals: 2}, + {TokenChain: 5, TokenAddress: "00000000000000000000000092868a5255c628da08f550a858a802f5351c5223", Symbol: "bridge", CoingeckoID: "cross-chain-bridge", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000aa9654becca45b5bdfa5ac646c939c62b527d394", Symbol: "dino", CoingeckoID: "dinoswap", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000bc5b59ea1b6f8da8258615ee38d40e999ec5d74f", Symbol: "paw", CoingeckoID: "paw-v2", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000cd7361ac3307d1c5a46b63086a90742ff44c63b3", Symbol: "raider", CoingeckoID: "crypto-raiders", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000d13cfd3133239a3c73a9e535a5c4dadee36b395c", Symbol: "vai", CoingeckoID: "vaiot", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000d5d86fc8d5c0ea1ac1ac5dfab6e529c9967a45e9", Symbol: "wrld", CoingeckoID: "nft-worlds", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000e580074a10360404af3abfe2d524d5806d993ea3", Symbol: "pay", CoingeckoID: "paybolt", Decimals: 18}, + {TokenChain: 5, TokenAddress: "000000000000000000000000e7a24ef0c5e95ffb0f6684b813a78f2a3ad7d171", Symbol: "am3crv", CoingeckoID: "curve-fi-amdai-amusdc-amusdt", Decimals: 18}, + } }