Create backfiller for influx measurement vaa_volume_v3 (#1475)

* backfiller for vaa_volume_v3

* remove printf
This commit is contained in:
Mariano 2024-06-12 15:37:51 -03:00 committed by GitHub
parent 339a2433ae
commit 97b9217b6b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 556 additions and 29 deletions

View File

@ -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)
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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
}

View File

@ -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")

View File

@ -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")

View File

@ -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},
}
}