Преглед на файлове

bridge_ui: Use new TVL calculation in useTVL hook, 48h transaction count

Kevin Peters преди 3 години
родител
ревизия
2080c27ef2

+ 17 - 1
bridge_ui/src/App.js

@@ -232,7 +232,23 @@ function App() {
         <div className={classes.headerImage} />
         {["/transfer", "/nft", "/redeem"].includes(pathname) ? (
           <Container maxWidth="md" style={{ paddingBottom: 24 }}>
-            <HeaderText white>Portal Token Bridge</HeaderText>
+            <HeaderText
+              white
+              subtitle={
+                <>
+                  <Typography>
+                    Portal is a bridge that offers unlimited transfers across
+                    chains for tokens and NFTs wrapped by Wormhole.
+                  </Typography>
+                  <Typography>
+                    Unlike many other bridges, you avoid double wrapping and
+                    never have to retrace your steps.
+                  </Typography>
+                </>
+              }
+            >
+              Portal Token Bridge
+            </HeaderText>
             <Tabs
               value={pathname}
               variant="fullWidth"

+ 2 - 2
bridge_ui/src/components/HeaderText.tsx

@@ -30,7 +30,7 @@ export default function HeaderText({
   children: ReactChild;
   white?: boolean;
   small?: boolean;
-  subtitle?: string;
+  subtitle?: ReactChild;
 }) {
   const classes = useStyles();
   return (
@@ -43,7 +43,7 @@ export default function HeaderText({
       >
         {children}
       </Typography>
-      {subtitle ? <Typography>{subtitle}</Typography> : null}
+      {subtitle ? <Typography component="div">{subtitle}</Typography> : null}
     </div>
   );
 }

+ 1 - 1
bridge_ui/src/components/Stats/TransactionMetrics.tsx

@@ -105,7 +105,7 @@ const TransactionMetrics: React.FC<any> = () => {
           noWrap
           className={classes.totalValue}
         >
-          {numeral(transactionCount.data?.total24h || 0).format("0,0")}
+          {numeral(transactionCount.data?.total48h || 0).format("0,0")}
         </Typography>
       </div>
       <div className={classes.totalContainer}>

+ 64 - 491
bridge_ui/src/hooks/useTVL.ts

@@ -1,46 +1,14 @@
-import {
-  ChainId,
-  CHAIN_ID_AVAX,
-  CHAIN_ID_BSC,
-  CHAIN_ID_ETH,
-  CHAIN_ID_POLYGON,
-  CHAIN_ID_SOLANA,
-  CHAIN_ID_TERRA,
-} from "@certusone/wormhole-sdk";
-import { formatUnits } from "@ethersproject/units";
-import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
-import { TokenInfo } from "@solana/spl-token-registry";
-import {
-  AccountInfo,
-  Connection,
-  ParsedAccountData,
-  PublicKey,
-} from "@solana/web3.js";
+import { ChainId } from "@certusone/wormhole-sdk";
 import axios from "axios";
-import { useEffect, useMemo, useState } from "react";
-import { DataWrapper } from "../store/helpers";
-import {
-  AVAX_TOKEN_BRIDGE_ADDRESS,
-  BSC_TOKEN_BRIDGE_ADDRESS,
-  CHAINS_BY_ID,
-  COVALENT_GET_TOKENS_URL,
-  ETH_TOKEN_BRIDGE_ADDRESS,
-  logoOverrides,
-  POLYGON_TOKEN_BRIDGE_ADDRESS,
-  SOLANA_HOST,
-  SOL_CUSTODY_ADDRESS,
-  TERRA_SWAPRATE_URL,
-  TERRA_TOKEN_BRIDGE_ADDRESS,
-} from "../utils/consts";
-import { priceStore, serumMarkets } from "../utils/SolanaPriceStore";
+import { useEffect, useState } from "react";
 import {
-  formatNativeDenom,
-  getNativeTerraIcon,
-  NATIVE_TERRA_DECIMALS,
-} from "../utils/terra";
-import useMetadata, { GenericMetadata } from "./useMetadata";
-import useSolanaTokenMap from "./useSolanaTokenMap";
-import useTerraNativeBalances from "./useTerraNativeBalances";
+  DataWrapper,
+  errorDataWrapper,
+  fetchDataWrapper,
+  receiveDataWrapper,
+} from "../store/helpers";
+import { COIN_GECKO_IMAGE_URLS } from "../utils/coinGecko";
+import { TVL_URL } from "../utils/consts";
 
 export type TVL = {
   logo?: string;
@@ -55,470 +23,75 @@ export type TVL = {
   decimals?: number;
 };
 
-const BAD_PRICES_BY_CHAIN = {
-  [CHAIN_ID_BSC]: [
-    "0x04132bf45511d03a58afd4f1d36a29d229ccc574",
-    "0xa79bd679ce21a2418be9e6f88b2186c9986bbe7d",
-    "0x931c3987040c90b6db09981c7c91ba155d3fa31f",
-    "0x8fb1a59ca2d57b51e5971a85277efe72c4492983",
-  ],
-  [CHAIN_ID_ETH]: [],
-  [CHAIN_ID_POLYGON]: ["0xd52d9ba6fcbadb1fe1e3aca52cbb72c4d9bbb4ec"],
-};
-
-const calcEvmTVL = (covalentReport: any, chainId: ChainId): TVL[] => {
-  const output: TVL[] = [];
-  if (!covalentReport?.data?.items?.length) {
-    return [];
-  }
-
-  covalentReport.data.items.forEach((item: any) => {
-    if (item.balance > 0 && item.contract_address) {
-      const hasUnreliablePrice =
-        BAD_PRICES_BY_CHAIN[chainId]?.includes(item.contract_address) ||
-        item.quote_rate > 1000000;
-      output.push({
-        logo:
-          logoOverrides.get(item.contract_address) ||
-          item.logo_url ||
-          undefined,
-        symbol: item.contract_ticker_symbol || undefined,
-        name: item.contract_name || undefined,
-        amount: formatUnits(item.balance, item.contract_decimals),
-        totalValue: hasUnreliablePrice ? 0 : item.quote,
-        quotePrice: hasUnreliablePrice ? 0 : item.quote_rate,
-        assetAddress: item.contract_address,
-        originChainId: chainId,
-        originChain: CHAINS_BY_ID[chainId].name,
-        decimals: item.contract_decimals,
+interface LockedAsset {
+  Symbol: string;
+  Name: string;
+  Address: string;
+  CoinGeckoId: string;
+  Amount: number;
+  Notional: number;
+  TokenPrice: number;
+}
+
+interface LockedAssets {
+  [tokenAddress: string]: LockedAsset;
+}
+
+interface ChainsAssets {
+  [chainId: string]: LockedAssets;
+}
+
+interface NotionalTvl {
+  Last24HoursChange: ChainsAssets;
+  AllTime: ChainsAssets;
+}
+
+const createTVLArray = (notionalTvl: NotionalTvl) => {
+  const tvl: TVL[] = [];
+  for (const [chainId, chainAssets] of Object.entries(notionalTvl.AllTime)) {
+    if (chainId === "*") continue;
+    for (const [tokenAddress, lockedAsset] of Object.entries(chainAssets)) {
+      if (tokenAddress === "*") continue;
+      tvl.push({
+        logo: COIN_GECKO_IMAGE_URLS[lockedAsset.CoinGeckoId],
+        symbol: lockedAsset.Symbol,
+        name: lockedAsset.Name,
+        amount: lockedAsset.Amount.toString(),
+        totalValue: lockedAsset.Notional,
+        quotePrice: lockedAsset.TokenPrice,
+        assetAddress: tokenAddress,
+        originChainId: +chainId as ChainId,
+        originChain: chainId.toString(),
       });
     }
-  });
-
-  return output;
-};
-const calcSolanaTVL = (
-  accounts:
-    | { pubkey: PublicKey; account: AccountInfo<ParsedAccountData> }[]
-    | undefined,
-  metaData: DataWrapper<Map<string, GenericMetadata>>,
-  solanaPrices: DataWrapper<Map<string, number | undefined>>
-) => {
-  const output: TVL[] = [];
-  if (
-    !accounts ||
-    !accounts.length ||
-    metaData.isFetching ||
-    metaData.error ||
-    !metaData.data ||
-    solanaPrices.isFetching ||
-    !solanaPrices.data
-  ) {
-    return output;
   }
-
-  accounts.forEach((item) => {
-    const genericMetadata = metaData.data?.get(
-      item.account.data.parsed?.info?.mint?.toString()
-    );
-    const mint = item.account.data.parsed?.info?.mint?.toString();
-    const price = solanaPrices?.data?.get(mint);
-    output.push({
-      logo: genericMetadata?.logo || undefined,
-      symbol: genericMetadata?.symbol || undefined,
-      name: genericMetadata?.tokenName || undefined,
-      amount: item.account.data.parsed?.info?.tokenAmount?.uiAmount || "0", //Should always be defined.
-      totalValue: price
-        ? parseFloat(
-            item.account.data.parsed?.info?.tokenAmount?.uiAmount || "0"
-          ) * price
-        : undefined,
-      quotePrice: price,
-      assetAddress: mint,
-      originChainId: CHAIN_ID_SOLANA,
-      originChain: "Solana",
-      decimals: item.account.data.parsed?.info?.tokenAmount?.decimals,
-    });
-  });
-
-  return output;
+  return tvl;
 };
 
-const useTerraTVL = () => {
-  const { isLoading: isTerraNativeLoading, balances: terraNativeBalances } =
-    useTerraNativeBalances(TERRA_TOKEN_BRIDGE_ADDRESS);
-  const [terraSwaprates, setTerraSwaprates] = useState<any[]>([]);
-  useEffect(() => {
-    let cancelled = false;
-    (async () => {
-      try {
-        const result = await axios.get(TERRA_SWAPRATE_URL);
-        if (!cancelled && result && result.data) {
-          setTerraSwaprates(result.data);
-        }
-      } catch (e) {}
-    })();
-    return () => {
-      cancelled = true;
-    };
-  }, []);
-  const terraTVL = useMemo(() => {
-    const arr: TVL[] = [];
-    if (terraNativeBalances) {
-      const denoms = Object.keys(terraNativeBalances);
-      denoms.forEach((denom) => {
-        const amount = formatUnits(
-          terraNativeBalances[denom],
-          NATIVE_TERRA_DECIMALS
-        );
-        const symbol = formatNativeDenom(denom);
-        let matchingSwap = undefined;
-        let quotePrice = 0;
-        let totalValue = 0;
-        try {
-          matchingSwap = terraSwaprates.find((swap) => swap.denom === denom);
-          quotePrice =
-            denom === "uusd"
-              ? 1
-              : matchingSwap
-              ? 1 / Number(matchingSwap.swaprate)
-              : 0;
-          totalValue =
-            denom === "uusd"
-              ? Number(
-                  formatUnits(terraNativeBalances[denom], NATIVE_TERRA_DECIMALS)
-                )
-              : matchingSwap
-              ? Number(amount) / Number(matchingSwap.swaprate)
-              : 0;
-        } catch (e) {}
-        arr.push({
-          amount,
-          assetAddress: denom,
-          originChain: CHAINS_BY_ID[CHAIN_ID_TERRA].name,
-          originChainId: CHAIN_ID_TERRA,
-          quotePrice,
-          totalValue,
-          logo: getNativeTerraIcon(symbol),
-          symbol,
-          decimals: NATIVE_TERRA_DECIMALS,
-        });
-      });
-    }
-    return arr;
-  }, [terraNativeBalances, terraSwaprates]);
-  return useMemo(
-    () => ({ terraTVL, isLoading: isTerraNativeLoading }),
-    [isTerraNativeLoading, terraTVL]
-  );
-};
-
-const useSolanaPrices = (
-  mintAddresses: string[],
-  tokenMap: DataWrapper<TokenInfo[]>
-) => {
-  const [isLoading, setIsLoading] = useState(false);
-  const [priceMap, setPriceMap] = useState<Map<
-    string,
-    number | undefined
-  > | null>(null);
-  const [error] = useState("");
+const useTVL = () => {
+  const [tvl, setTvl] = useState<DataWrapper<TVL[]>>(fetchDataWrapper());
 
   useEffect(() => {
     let cancelled = false;
-
-    if (!mintAddresses || !mintAddresses.length || !tokenMap.data) {
-      return;
-    }
-
-    const relevantMarkets: {
-      publicKey?: PublicKey;
-      name: string;
-      deprecated?: boolean;
-      mintAddress: string;
-    }[] = [];
-    mintAddresses.forEach((address) => {
-      const tokenInfo = tokenMap.data?.find((x) => x.address === address);
-      const relevantMarket = tokenInfo && serumMarkets[tokenInfo.symbol];
-      if (relevantMarket) {
-        relevantMarkets.push({ ...relevantMarket, mintAddress: address });
-      }
-    });
-
-    setIsLoading(true);
-    const priceMap: Map<string, number | undefined> = new Map();
-    const connection = new Connection(SOLANA_HOST);
-    const promises: Promise<void>[] = [];
-    //Load all the revelevant markets into the priceMap
-    relevantMarkets.forEach((market) => {
-      const marketName: string = market.name;
-      promises.push(
-        priceStore
-          .getPrice(connection, marketName)
-          .then((result) => {
-            priceMap.set(market.mintAddress, result);
-          })
-          .catch((e) => {
-            //Do nothing, we just won't load this price.
-            return Promise.resolve();
-          })
-      );
-    });
-
-    Promise.all(promises).then(() => {
-      //By this point all the relevant markets are loaded.
-      if (!cancelled) {
-        setPriceMap(priceMap);
-        setIsLoading(false);
-      }
-    });
-
-    return () => {
-      cancelled = true;
-      return;
-    };
-  }, [mintAddresses, tokenMap.data]);
-
-  return useMemo(() => {
-    return {
-      isFetching: isLoading,
-      data: priceMap || null,
-      error: error,
-      receivedAt: null,
-    };
-  }, [error, priceMap, isLoading]);
-};
-
-const useTVL = (): DataWrapper<TVL[]> => {
-  const [ethCovalentData, setEthCovalentData] = useState(undefined);
-  const [ethCovalentIsLoading, setEthCovalentIsLoading] = useState(false);
-  const [ethCovalentError, setEthCovalentError] = useState("");
-
-  const [bscCovalentData, setBscCovalentData] = useState(undefined);
-  const [bscCovalentIsLoading, setBscCovalentIsLoading] = useState(false);
-  const [bscCovalentError, setBscCovalentError] = useState("");
-
-  const [polygonCovalentData, setPolygonCovalentData] = useState(undefined);
-  const [polygonCovalentIsLoading, setPolygonCovalentIsLoading] =
-    useState(false);
-  const [polygonCovalentError, setPolygonCovalentError] = useState("");
-
-  const [avaxCovalentData, setAvaxCovalentData] = useState(undefined);
-  const [avaxCovalentIsLoading, setAvaxCovalentIsLoading] = useState(false);
-  const [avaxCovalentError, setAvaxCovalentError] = useState("");
-
-  const [solanaCustodyTokens, setSolanaCustodyTokens] = useState<
-    { pubkey: PublicKey; account: AccountInfo<ParsedAccountData> }[] | undefined
-  >(undefined);
-  const [solanaCustodyTokensLoading, setSolanaCustodyTokensLoading] =
-    useState(false);
-  const [solanaCustodyTokensError, setSolanaCustodyTokensError] = useState("");
-  const mintAddresses = useMemo(() => {
-    const addresses: string[] = [];
-    solanaCustodyTokens?.forEach((item) => {
-      const mintKey = item.account.data.parsed?.info?.mint?.toString();
-      if (mintKey) {
-        addresses.push(mintKey);
-      }
-    });
-    return addresses;
-  }, [solanaCustodyTokens]);
-
-  const solanaMetadata = useMetadata(CHAIN_ID_SOLANA, mintAddresses);
-  const solanaTokenMap = useSolanaTokenMap();
-  const solanaPrices = useSolanaPrices(mintAddresses, solanaTokenMap);
-
-  const { isLoading: isTerraLoading, terraTVL } = useTerraTVL();
-
-  const solanaTVL = useMemo(
-    () => calcSolanaTVL(solanaCustodyTokens, solanaMetadata, solanaPrices),
-    [solanaCustodyTokens, solanaMetadata, solanaPrices]
-  );
-  const ethTVL = useMemo(
-    () => calcEvmTVL(ethCovalentData, CHAIN_ID_ETH),
-    [ethCovalentData]
-  );
-  const bscTVL = useMemo(
-    () => calcEvmTVL(bscCovalentData, CHAIN_ID_BSC),
-    [bscCovalentData]
-  );
-  const polygonTVL = useMemo(
-    () => calcEvmTVL(polygonCovalentData, CHAIN_ID_POLYGON),
-    [polygonCovalentData]
-  );
-  const avaxTVL = useMemo(
-    () => calcEvmTVL(avaxCovalentData, CHAIN_ID_AVAX),
-    [avaxCovalentData]
-  );
-
-  useEffect(() => {
-    let cancelled = false;
-    setEthCovalentIsLoading(true);
-    axios
-      .get(
-        COVALENT_GET_TOKENS_URL(CHAIN_ID_ETH, ETH_TOKEN_BRIDGE_ADDRESS, false)
-      )
-      .then(
-        (results) => {
-          if (!cancelled) {
-            setEthCovalentData(results.data);
-            setEthCovalentIsLoading(false);
-          }
-        },
-        (error) => {
-          if (!cancelled) {
-            setEthCovalentError("Unable to retrieve Ethereum TVL.");
-            setEthCovalentIsLoading(false);
-          }
-        }
-      );
-  }, []);
-
-  useEffect(() => {
-    let cancelled = false;
-    setBscCovalentIsLoading(true);
-    axios
-      .get(
-        COVALENT_GET_TOKENS_URL(CHAIN_ID_BSC, BSC_TOKEN_BRIDGE_ADDRESS, false)
-      )
-      .then(
-        (results) => {
-          if (!cancelled) {
-            setBscCovalentData(results.data);
-            setBscCovalentIsLoading(false);
-          }
-        },
-        (error) => {
-          if (!cancelled) {
-            setBscCovalentError("Unable to retrieve BSC TVL.");
-            setBscCovalentIsLoading(false);
-          }
-        }
-      );
-  }, []);
-
-  useEffect(() => {
-    let cancelled = false;
-    setPolygonCovalentIsLoading(true);
     axios
-      .get(
-        COVALENT_GET_TOKENS_URL(
-          CHAIN_ID_POLYGON,
-          POLYGON_TOKEN_BRIDGE_ADDRESS,
-          false
-        )
-      )
-      .then(
-        (results) => {
-          if (!cancelled) {
-            setPolygonCovalentData(results.data);
-            setPolygonCovalentIsLoading(false);
-          }
-        },
-        (error) => {
-          if (!cancelled) {
-            setPolygonCovalentError("Unable to retrieve Polygon TVL.");
-            setPolygonCovalentIsLoading(false);
-          }
+      .get<NotionalTvl>(TVL_URL)
+      .then((response) => {
+        if (!cancelled) {
+          setTvl(receiveDataWrapper(createTVLArray(response.data)));
         }
-      );
-  }, []);
-
-  useEffect(() => {
-    let cancelled = false;
-    setAvaxCovalentIsLoading(true);
-    axios
-      .get(
-        COVALENT_GET_TOKENS_URL(CHAIN_ID_AVAX, AVAX_TOKEN_BRIDGE_ADDRESS, false)
-      )
-      .then(
-        (results) => {
-          if (!cancelled) {
-            setAvaxCovalentData(results.data);
-            setAvaxCovalentIsLoading(false);
-          }
-        },
-        (error) => {
-          if (!cancelled) {
-            setAvaxCovalentError("Unable to retrieve Avax TVL.");
-            setAvaxCovalentIsLoading(false);
-          }
-        }
-      );
-  }, []);
-
-  useEffect(() => {
-    let cancelled = false;
-    const connection = new Connection(SOLANA_HOST, "confirmed");
-    setSolanaCustodyTokensLoading(true);
-    connection
-      .getParsedTokenAccountsByOwner(new PublicKey(SOL_CUSTODY_ADDRESS), {
-        programId: TOKEN_PROGRAM_ID,
       })
-      .then(
-        (results) => {
-          if (!cancelled) {
-            setSolanaCustodyTokens(results.value);
-            setSolanaCustodyTokensLoading(false);
-          }
-        },
-        (error) => {
-          if (!cancelled) {
-            setSolanaCustodyTokensLoading(false);
-            setSolanaCustodyTokensError(
-              "Unable to retrieve Solana locked tokens."
-            );
-          }
+      .catch((error) => {
+        console.log(error);
+        if (!cancelled) {
+          setTvl(errorDataWrapper(error));
         }
-      );
+      });
+    return () => {
+      cancelled = true;
+    };
   }, []);
 
-  return useMemo(() => {
-    const tvlArray = [
-      ...ethTVL,
-      ...bscTVL,
-      ...polygonTVL,
-      ...avaxTVL,
-      ...solanaTVL,
-      ...terraTVL,
-    ];
-
-    return {
-      isFetching:
-        ethCovalentIsLoading ||
-        bscCovalentIsLoading ||
-        polygonCovalentIsLoading ||
-        avaxCovalentIsLoading ||
-        solanaCustodyTokensLoading ||
-        isTerraLoading,
-      error:
-        ethCovalentError ||
-        bscCovalentError ||
-        polygonCovalentError ||
-        avaxCovalentError ||
-        solanaCustodyTokensError,
-      receivedAt: null,
-      data: tvlArray,
-    };
-  }, [
-    ethCovalentError,
-    ethCovalentIsLoading,
-    bscCovalentError,
-    bscCovalentIsLoading,
-    polygonCovalentError,
-    polygonCovalentIsLoading,
-    polygonTVL,
-    avaxCovalentError,
-    avaxCovalentIsLoading,
-    avaxTVL,
-    ethTVL,
-    bscTVL,
-    solanaTVL,
-    solanaCustodyTokensError,
-    solanaCustodyTokensLoading,
-    isTerraLoading,
-    terraTVL,
-  ]);
+  return tvl;
 };
 
 export default useTVL;

+ 10 - 5
bridge_ui/src/hooks/useTransactionCount.ts

@@ -9,24 +9,29 @@ import {
 
 export type TransactionCount = {
   totalAllTime: number;
-  total24h: number;
+  total48h: number;
   mostRecent: any; //This will be a signedVAA
 };
 
 const mergeResults = (totals: any, recents: any): TransactionCount | null => {
   let totalAllTime = 0;
-  let total24h = 0;
+  let total48h = 0;
+  const lastDays = Object.values(totals?.DailyTotals || {});
+  const lastTwoDays: any = lastDays.slice(lastDays.length - 2);
   VAA_EMITTER_ADDRESSES.forEach((address: string) => {
     let totalAll = (totals?.TotalCount && totals.TotalCount[address]) || 0;
-    let total24 = (totals?.LastDayCount && totals.LastDayCount[address]) || 0;
+    let total48 =
+      lastTwoDays.length === 2
+        ? (lastTwoDays[0][address] || 0) + (lastTwoDays[1][address] || 0)
+        : 0;
 
     totalAllTime += totalAll;
-    total24h += total24;
+    total48h += total48;
   });
 
   return {
     totalAllTime,
-    total24h,
+    total48h,
     mostRecent: null,
   };
 };

+ 684 - 0
bridge_ui/src/utils/coinGecko.ts

@@ -0,0 +1,684 @@
+export type CoinGeckoIdToImageUrl = {
+  [id: string]: string;
+};
+
+export const COIN_GECKO_IMAGE_URLS: CoinGeckoIdToImageUrl = {
+  "yearn-finance":
+    "https://assets.coingecko.com/coins/images/11849/small/yfi-192x192.png?1598325330",
+  partneroid:
+    "https://assets.coingecko.com/coins/images/21381/small/144531867-a8016f41-3b31-4d6f-97a1-372a58d48626.png?1639034184",
+  metaseer:
+    "https://assets.coingecko.com/coins/images/17443/small/metas.PNG?1627863142",
+  only1:
+    "https://assets.coingecko.com/coins/images/17501/small/like-token.png?1628036165",
+  floof:
+    "https://assets.coingecko.com/coins/images/19810/small/FLOOF_logo_200x200.png?1635917291",
+  "nole-npc":
+    "https://assets.coingecko.com/coins/images/19981/small/1EXEFTo6_400x400.jpg?1640251890",
+  "solareum-wallet":
+    "https://assets.coingecko.com/coins/images/20958/small/xsb-200.png?1638141904",
+  "synthetify-token":
+    "https://assets.coingecko.com/coins/images/14835/small/synthetify_token.png?1618611507",
+  mim: "https://assets.coingecko.com/coins/images/19927/small/13988.png?1636323160",
+  raydium:
+    "https://assets.coingecko.com/coins/images/13928/small/PSigc4ie_400x400.jpg?1612875614",
+  mixmarvel:
+    "https://assets.coingecko.com/coins/images/8222/small/8878caf93b1e3b6cfb3b414bda3b5250.png?1613945432",
+  ariadne:
+    "https://assets.coingecko.com/coins/images/19401/small/Frame_5_%287%29_%281%29.png?1635176608",
+  apyswap:
+    "https://assets.coingecko.com/coins/images/14163/small/apys.png?1635831990",
+  xhashtag:
+    "https://assets.coingecko.com/coins/images/20912/small/xtag.png?1637922382",
+  "socean-staked-sol":
+    "https://assets.coingecko.com/coins/images/18468/small/biOTzfxE_400x400.png?1633662119",
+  "bamboo-coin":
+    "https://assets.coingecko.com/coins/images/19620/small/FC0hnduacAAHYFC.png?1635496724",
+  "waggle-network":
+    "https://assets.coingecko.com/coins/images/18696/small/waggle.PNG?1633750177",
+  hapi: "https://assets.coingecko.com/coins/images/14298/small/R9i2HjAL_400x400.jpg?1615332438",
+  sail: "https://assets.coingecko.com/coins/images/16657/small/SAIL.png?1624608515",
+  "lido-staked-sol":
+    "https://assets.coingecko.com/coins/images/18369/small/logo_-_2021-09-15T100934.765.png?1631671781",
+  solrazr:
+    "https://assets.coingecko.com/coins/images/18390/small/Sol-Razr-Logo-TICKER.png?1631759669",
+  samoyedcoin:
+    "https://assets.coingecko.com/coins/images/15051/small/IXeEj5e.png?1619560738",
+  babytigergold:
+    "https://assets.coingecko.com/coins/images/22811/small/logo_babytiger.png?1642658264",
+  "rope-token":
+    "https://assets.coingecko.com/coins/images/14661/small/rope-v6.png?1619606776",
+  "usd-coin":
+    "https://assets.coingecko.com/coins/images/6319/small/USD_Coin_icon.png?1547042389",
+  "grape-2":
+    "https://assets.coingecko.com/coins/images/18149/small/fRsuAlcV_400x400.png?1632437325",
+  "terra-luna":
+    "https://assets.coingecko.com/coins/images/8284/small/luna1557227471663.png?1567147072",
+  "tiger-coin":
+    "https://assets.coingecko.com/coins/images/22681/small/tigerlogo.png?1642407729",
+  bitcoin:
+    "https://assets.coingecko.com/coins/images/1/small/bitcoin.png?1547033579",
+  "woof-token":
+    "https://assets.coingecko.com/coins/images/18319/small/woof-logo-svg-true-solana-radient-blackinside.png?1637655115",
+  bilira:
+    "https://assets.coingecko.com/coins/images/10119/small/JBs9jiXO_400x400.jpg?1642668342",
+  sushi:
+    "https://assets.coingecko.com/coins/images/12271/small/512x512_Logo_no_chop.png?1606986688",
+  "star-atlas":
+    "https://assets.coingecko.com/coins/images/17659/small/Icon_Reverse.png?1628759092",
+  aurory:
+    "https://assets.coingecko.com/coins/images/19324/small/logo.png?1635076945",
+  "avalanche-2":
+    "https://assets.coingecko.com/coins/images/12559/small/coin-round-red.png?1604021818",
+  ethereum:
+    "https://assets.coingecko.com/coins/images/279/small/ethereum.png?1595348880",
+  "battle-of-guardians-share":
+    "https://assets.coingecko.com/coins/images/22285/small/K3hU77wS_400x400.jpg?1641365642",
+  bitsong:
+    "https://assets.coingecko.com/coins/images/5041/small/logo_-_2021-01-10T210801.390.png?1610284134",
+  "blocto-token":
+    "https://assets.coingecko.com/coins/images/18657/small/BLT_token.png?1633082645",
+  "wrapped-usdt":
+    "https://assets.coingecko.com/coins/images/19507/small/wusdt.png?1635315186",
+  renbtc:
+    "https://assets.coingecko.com/coins/images/11370/small/Bitcoin.jpg?1628072791",
+  "gari-network":
+    "https://assets.coingecko.com/coins/images/22615/small/gari.png?1642313087",
+  chainlink:
+    "https://assets.coingecko.com/coins/images/877/small/chainlink-new-logo.png?1547034700",
+  cashcow:
+    "https://assets.coingecko.com/coins/images/19388/small/cropped-cropped-CashCowToken_08.png?1635148053",
+  "3x-long-ethereum-token":
+    "https://assets.coingecko.com/coins/images/10163/small/683JEXMN_400x400_%281%29.png?1576504568",
+  defil:
+    "https://assets.coingecko.com/coins/images/17708/small/defillogo200200.png?1629080381",
+  tether:
+    "https://assets.coingecko.com/coins/images/325/small/Tether-logo.png?1598003707",
+  "ptokens-btc":
+    "https://assets.coingecko.com/coins/images/10805/small/J51iIea.png?1583891599",
+  cropperfinance:
+    "https://assets.coingecko.com/coins/images/17883/small/copperfinance.PNG?1629708744",
+  aldrin:
+    "https://assets.coingecko.com/coins/images/16849/small/Aldrin.png?1629959768",
+  "woo-network":
+    "https://assets.coingecko.com/coins/images/12921/small/w2UiemF__400x400.jpg?1603670367",
+  bonfida:
+    "https://assets.coingecko.com/coins/images/13395/small/fida-dark.png?1608112224",
+  victorum:
+    "https://assets.coingecko.com/coins/images/17391/small/Victorum-logo200X200.png?1627525058",
+  "bull-coin":
+    "https://assets.coingecko.com/coins/images/15975/small/bull_ms.94cd70ff.png?1622525834",
+  "twirl-governance-token":
+    "https://assets.coingecko.com/coins/images/16725/small/Yn1ebvX.png?1624850650",
+  monkeyball:
+    "https://assets.coingecko.com/coins/images/20841/small/monkeyball.png?1639023123",
+  sypool:
+    "https://assets.coingecko.com/coins/images/18518/small/sypool.PNG?1632268218",
+  "foxy-equilibrium":
+    "https://assets.coingecko.com/coins/images/17303/small/cmc200x200.png?1627268759",
+  "squirrel-finance":
+    "https://assets.coingecko.com/coins/images/12415/small/transparent_logo200.png?1599690422",
+  genopets:
+    "https://assets.coingecko.com/coins/images/20360/small/gene-token.png?1636945172",
+  goosefx:
+    "https://assets.coingecko.com/coins/images/19793/small/0Kjm9f4.png?1635906737",
+  "solape-token":
+    "https://assets.coingecko.com/coins/images/16930/small/128px-coin.png?1625753550",
+  "galaxy-war":
+    "https://assets.coingecko.com/coins/images/22166/small/e2x7gMJ4_400x400.jpg?1641166277",
+  "1safu":
+    "https://assets.coingecko.com/coins/images/22792/small/145941796-8f7716f4-66bc-4a38-9ad5-441525c3b5b2.png?1642581127",
+  "solpad-finance":
+    "https://assets.coingecko.com/coins/images/16368/small/solpad.PNG?1623820231",
+  dexlab:
+    "https://assets.coingecko.com/coins/images/17276/small/4_Secondary_GradientSymbol_DarkLogo.png?1643018984",
+  "solanasail-governance-token":
+    "https://assets.coingecko.com/coins/images/17658/small/logo_GSAIL.png?1628758657",
+  "parasol-finance":
+    "https://assets.coingecko.com/coins/images/21551/small/icon.png?1642584584",
+  meanfi:
+    "https://assets.coingecko.com/coins/images/21557/small/89934951.png?1639466364",
+  marinade:
+    "https://assets.coingecko.com/coins/images/18867/small/MNDE.png?1643187748",
+  "mango-markets":
+    "https://assets.coingecko.com/coins/images/14773/small/token-mango.png?1628171237",
+  blockasset:
+    "https://assets.coingecko.com/coins/images/21332/small/blockasset.PNG?1638947864",
+  "parrot-protocol":
+    "https://assets.coingecko.com/coins/images/18443/small/PRT.png?1634698095",
+  tudabirds:
+    "https://assets.coingecko.com/coins/images/22839/small/_TOvRxfx_400x400.jpg?1642745695",
+  serum:
+    "https://assets.coingecko.com/coins/images/11970/small/serum-logo.png?1597121577",
+  "sunny-aggregator":
+    "https://assets.coingecko.com/coins/images/18039/small/90dbe787-8e5f-473c-b923-fe138a7a30ea.png?1630314924",
+  saber:
+    "https://assets.coingecko.com/coins/images/17162/small/oYs_YFz8_400x400.jpg?1626678457",
+  "wrapped-solana":
+    "https://assets.coingecko.com/coins/images/21629/small/solana.jpg?1639626543",
+  "step-finance":
+    "https://assets.coingecko.com/coins/images/14988/small/step.png?1619274762",
+  zoints:
+    "https://assets.coingecko.com/coins/images/20376/small/logo_-_2021-11-15T121641.242.png?1636949811",
+  allbridge:
+    "https://assets.coingecko.com/coins/images/18690/small/abr.png?1640742053",
+  "solchicks-token":
+    "https://assets.coingecko.com/coins/images/20978/small/chicks.png?1638162821",
+  aave: "https://assets.coingecko.com/coins/images/12645/small/AAVE.png?1601374110",
+  kin: "https://assets.coingecko.com/coins/images/959/small/kin.png?1586917032",
+  msol: "https://assets.coingecko.com/coins/images/17752/small/mSOL.png?1644541955",
+  orca: "https://assets.coingecko.com/coins/images/17547/small/Orca_Logo.png?1628781615",
+  solanium:
+    "https://assets.coingecko.com/coins/images/15816/small/token-icon.png?1621981387",
+  "tiki-token":
+    "https://assets.coingecko.com/coins/images/16427/small/60cbd8fd912298ca60e1fd7e_logo_TIKI_200_square.png?1623995319",
+  "coin-discovery":
+    "https://assets.coingecko.com/coins/images/18839/small/IdvWAhot_400x400.jpg?1633572605",
+  "huobi-btc":
+    "https://assets.coingecko.com/coins/images/12407/small/Unknown-5.png?1599624896",
+  rai: "https://assets.coingecko.com/coins/images/14004/small/RAI-logo-coin.png?1613592334",
+  "coin-capsule":
+    "https://assets.coingecko.com/coins/images/15921/small/e55393fa-7b4d-40f5-9f36-9a8a6bdcb570.png?1622430581",
+  "wrapped-ecomi":
+    "https://assets.coingecko.com/coins/images/14675/small/ecomi.jpg?1617689100",
+  tomoe:
+    "https://assets.coingecko.com/coins/images/12646/small/tomoe_logo.png?1601377449",
+  math: "https://assets.coingecko.com/coins/images/11335/small/2020-05-19-token-200.png?1589940590",
+  "spell-token":
+    "https://assets.coingecko.com/coins/images/15861/small/abracadabra-3.png?1622544862",
+  "mirror-protocol":
+    "https://assets.coingecko.com/coins/images/13295/small/mirror_logo_transparent.png?1611554658",
+  "governance-ohm":
+    "https://assets.coingecko.com/coins/images/21129/small/token_wsOHM_logo.png?1638764900",
+  wasder:
+    "https://assets.coingecko.com/coins/images/15374/small/wasderlogo200x200.png?1620691729",
+  "basic-attention-token":
+    "https://assets.coingecko.com/coins/images/677/small/basic-attention-token.png?1547034427",
+  decentraland:
+    "https://assets.coingecko.com/coins/images/878/small/decentraland-mana.png?1550108745",
+  "1inch":
+    "https://assets.coingecko.com/coins/images/13469/small/1inch-token.png?1608803028",
+  gala: "https://assets.coingecko.com/coins/images/12493/small/GALA-COINGECKO.png?1600233435",
+  audius:
+    "https://assets.coingecko.com/coins/images/12913/small/AudiusCoinLogo_2x.png?1603425727",
+  ageur:
+    "https://assets.coingecko.com/coins/images/19479/small/agEUR.png?1635283566",
+  usdk: "https://assets.coingecko.com/coins/images/8824/small/usdk.png?1563418517",
+  bancor:
+    "https://assets.coingecko.com/coins/images/736/small/bancor-bnt.png?1628822309",
+  uniswap:
+    "https://assets.coingecko.com/coins/images/12504/small/uniswap-uni.png?1600306604",
+  ovr: "https://assets.coingecko.com/coins/images/13429/small/ovr_logo.png?1608518911",
+  augur:
+    "https://assets.coingecko.com/coins/images/309/small/REP.png?1596339859",
+  "wrapped-bitcoin":
+    "https://assets.coingecko.com/coins/images/7598/small/wrapped_bitcoin_wbtc.png?1548822744",
+  jpyc: "https://assets.coingecko.com/coins/images/17277/small/WoZ8rruL_400x400.png?1627016492",
+  "ufo-gaming":
+    "https://assets.coingecko.com/coins/images/16801/small/ufo.png?1644048038",
+  "dds-store":
+    "https://assets.coingecko.com/coins/images/13946/small/11qbAbzb_400x400.png?1613172588",
+  "hlth-token":
+    "https://assets.coingecko.com/coins/images/18637/small/hlth.png?1639728357",
+  aleph:
+    "https://assets.coingecko.com/coins/images/11676/small/Monochram-aleph.png?1608483725",
+  hex: "https://assets.coingecko.com/coins/images/10103/small/HEX-logo.png?1575942673",
+  "cream-2":
+    "https://assets.coingecko.com/coins/images/11976/small/Cream.png?1596593418",
+  throne:
+    "https://assets.coingecko.com/coins/images/16965/small/aXhD3i_g_400x400.jpg?1625804145",
+  "angle-protocol":
+    "https://assets.coingecko.com/coins/images/19060/small/ANGLE_Token_Logo.png?1635281291",
+  rune: "https://assets.coingecko.com/coins/images/15606/small/rune-200x200.png?1621315121",
+  "akita-inu":
+    "https://assets.coingecko.com/coins/images/14115/small/logo_%282%29.png?1644913173",
+  ramp: "https://assets.coingecko.com/coins/images/12837/small/RAMP-Logo-v2-1000pxsq.png?1617952606",
+  "frax-share":
+    "https://assets.coingecko.com/coins/images/13423/small/frax_share.png?1608478989",
+  chiliz:
+    "https://assets.coingecko.com/coins/images/8834/small/Chiliz.png?1561970540",
+  parsiq:
+    "https://assets.coingecko.com/coins/images/11973/small/DsNgK0O.png?1596590280",
+  "elite-swap":
+    "https://assets.coingecko.com/coins/images/13715/small/logo_-_2021-01-20T105016.992.png?1611111027",
+  kleekai:
+    "https://assets.coingecko.com/coins/images/15548/small/Klee-Kai-Logo.png?1628258448",
+  olympus:
+    "https://assets.coingecko.com/coins/images/14483/small/token_OHM_%281%29.png?1628311611",
+  "the-sandbox":
+    "https://assets.coingecko.com/coins/images/12129/small/sandbox_logo.jpg?1597397942",
+  opendao:
+    "https://assets.coingecko.com/coins/images/21956/small/fo42wXI6_400x400.jpg?1640373810",
+  chain:
+    "https://assets.coingecko.com/coins/images/19678/small/Chain_icon.png?1635741399",
+  civic:
+    "https://assets.coingecko.com/coins/images/788/small/Civic-logo-blue.png?1636393120",
+  "hot-cross":
+    "https://assets.coingecko.com/coins/images/15706/small/Hotcross.png?1632197570",
+  "pax-gold":
+    "https://assets.coingecko.com/coins/images/9519/small/paxg.PNG?1568542565",
+  "gemma-extending-tech":
+    "https://assets.coingecko.com/coins/images/12226/small/200.png?1643188059",
+  "the-4th-pillar":
+    "https://assets.coingecko.com/coins/images/3434/small/four-ticker-2021-256x256.png?1617702287",
+  ridotto:
+    "https://assets.coingecko.com/coins/images/18671/small/200x200_%2832%29.png?1632875527",
+  chronobank:
+    "https://assets.coingecko.com/coins/images/604/small/time-32x32.png?1627130666",
+  hxro: "https://assets.coingecko.com/coins/images/7805/small/Hxro_Profile_Transparent.png?1622443308",
+  fantom:
+    "https://assets.coingecko.com/coins/images/4001/small/Fantom.png?1558015016",
+  "binance-usd":
+    "https://assets.coingecko.com/coins/images/9576/small/BUSD.png?1568947766",
+  "ftx-token":
+    "https://assets.coingecko.com/coins/images/9026/small/F.png?1609051564",
+  vlaunch:
+    "https://assets.coingecko.com/coins/images/20838/small/vlaunch_22.png?1637738535",
+  contentos:
+    "https://assets.coingecko.com/coins/images/8379/small/4036.png?1561085375",
+  "lido-dao":
+    "https://assets.coingecko.com/coins/images/13573/small/Lido_DAO.png?1609873644",
+  "jokermanor-metaverse":
+    "https://assets.coingecko.com/coins/images/20556/small/14732.png?1637208904",
+  "pancake-games":
+    "https://assets.coingecko.com/coins/images/20217/small/6oc-L2UC_400x400.png?1636671365",
+  launchpool:
+    "https://assets.coingecko.com/coins/images/14041/small/dGUvV0HQ_400x400.jpg?1613976219",
+  pixelverse:
+    "https://assets.coingecko.com/coins/images/19934/small/pixelverse.PNG?1636325521",
+  "poolz-finance":
+    "https://assets.coingecko.com/coins/images/13679/small/poolz_logo.png?1610806091",
+  dai: "https://assets.coingecko.com/coins/images/9956/small/4943.png?1636636734",
+  million:
+    "https://assets.coingecko.com/coins/images/16825/small/logo200x200.png?1625834139",
+  gene: "https://assets.coingecko.com/coins/images/14145/small/logo.a60a0c80_%281%29.png?1614653629",
+  "render-token":
+    "https://assets.coingecko.com/coins/images/11636/small/rndr.png?1638840934",
+  "nord-finance":
+    "https://assets.coingecko.com/coins/images/13630/small/nord.jpg?1610465136",
+  "genaro-network":
+    "https://assets.coingecko.com/coins/images/1361/small/genaro-network.png?1547035387",
+  "bird-money":
+    "https://assets.coingecko.com/coins/images/13260/small/favicon-180x180.png?1611546646",
+  "anchor-beth-token":
+    "https://assets.coingecko.com/coins/images/21002/small/bETH.png?1638187691",
+  xsgd: "https://assets.coingecko.com/coins/images/12832/small/StraitsX_Singapore_Dollar_%28XSGD%29_Token_Logo.png?1633936813",
+  "orion-money":
+    "https://assets.coingecko.com/coins/images/18630/small/YtrqPIWc.png?1632710781",
+  xdefi:
+    "https://assets.coingecko.com/coins/images/19524/small/xdefi.png?1637917251",
+  "metaverse-index":
+    "https://assets.coingecko.com/coins/images/14684/small/MVI_logo.png?1617776444",
+  "dogelon-mars":
+    "https://assets.coingecko.com/coins/images/14962/small/6GxcPRo3_400x400.jpg?1619157413",
+  "xcad-network":
+    "https://assets.coingecko.com/coins/images/15857/small/xcad.PNG?1622164789",
+  sarcophagus:
+    "https://assets.coingecko.com/coins/images/15091/small/E2S2-CcUcAAyNxD.jpeg?1622519884",
+  xsigma:
+    "https://assets.coingecko.com/coins/images/14090/small/logo_128.png?1619775781",
+  hedget:
+    "https://assets.coingecko.com/coins/images/12453/small/Hedget.png?1599944809",
+  constitutiondao:
+    "https://assets.coingecko.com/coins/images/20612/small/GN_UVm3d_400x400.jpg?1637294355",
+  "matic-network":
+    "https://assets.coingecko.com/coins/images/4713/small/matic-token-icon.png?1624446912",
+  "wrapped-steth":
+    "https://assets.coingecko.com/coins/images/18834/small/wstETH.png?1633565443",
+  polkastarter:
+    "https://assets.coingecko.com/coins/images/12648/small/polkastarter.png?1609813702",
+  frax: "https://assets.coingecko.com/coins/images/13422/small/frax_logo.png?1608476506",
+  upbots:
+    "https://assets.coingecko.com/coins/images/12476/small/UBXT.png?1600132967",
+  "keep-network":
+    "https://assets.coingecko.com/coins/images/3373/small/IuNzUb5b_400x400.jpg?1589526336",
+  "reserve-rights-token":
+    "https://assets.coingecko.com/coins/images/8365/small/rsr.png?1637983320",
+  "swag-finance":
+    "https://assets.coingecko.com/coins/images/12805/small/photo_2020-10-14_23.17.02.jpeg?1602688642",
+  opium:
+    "https://assets.coingecko.com/coins/images/13758/small/opium-token-black_%281%29.png?1611767960",
+  akropolis:
+    "https://assets.coingecko.com/coins/images/3328/small/Akropolis.png?1547037929",
+  swipe:
+    "https://assets.coingecko.com/coins/images/9368/small/swipe.png?1566792311",
+  dydx: "https://assets.coingecko.com/coins/images/17500/small/hjnIm9bV.jpg?1628009360",
+  "shiba-inu":
+    "https://assets.coingecko.com/coins/images/11939/small/shiba.png?1622619446",
+  "magic-internet-money":
+    "https://assets.coingecko.com/coins/images/16786/small/mimlogopng.png?1624979612",
+  artem:
+    "https://assets.coingecko.com/coins/images/21998/small/ARTM_Logo_MAIN_%281%29.png?1644469331",
+  "binance-wrapped-btc":
+    "https://assets.coingecko.com/coins/images/14867/small/binance-btc_32.png?1618814666",
+  gaj: "https://assets.coingecko.com/coins/images/15257/small/logo200x200.png?1629887093",
+  quiztok:
+    "https://assets.coingecko.com/coins/images/8208/small/QTCON.png?1587543372",
+  "bxmi-token":
+    "https://assets.coingecko.com/coins/images/20859/small/1QE9Pge.png?1637803118",
+  "redfox-labs-2":
+    "https://assets.coingecko.com/coins/images/12956/small/rfox.png?1642926902",
+  "wrapped-ust":
+    "https://assets.coingecko.com/coins/images/15462/small/ust.png?1620910058",
+  lunachow:
+    "https://assets.coingecko.com/coins/images/18805/small/J-MwYfhD_400x400.jpg?1633475157",
+  terrausd:
+    "https://assets.coingecko.com/coins/images/12681/small/UST.png?1601612407",
+  "celsius-degree-token":
+    "https://assets.coingecko.com/coins/images/3263/small/CEL_logo.png?1609598753",
+  "my-neighbor-alice":
+    "https://assets.coingecko.com/coins/images/14375/small/alice_logo.jpg?1615782968",
+  "yield-optimization-platform":
+    "https://assets.coingecko.com/coins/images/13678/small/J7zykPx.jpg?1610802162",
+  "staked-ether":
+    "https://assets.coingecko.com/coins/images/13442/small/steth_logo.png?1608607546",
+  "lua-token":
+    "https://assets.coingecko.com/coins/images/12627/small/Screenshot_2020-09-28_at_6.24.59_PM.jpg?1601288721",
+  "amy-finance":
+    "https://assets.coingecko.com/coins/images/18719/small/9oSy6bTl_400x400.png?1633127387",
+  binancecoin:
+    "https://assets.coingecko.com/coins/images/825/small/bnb-icon2_2x.png?1644979850",
+  "axie-infinity":
+    "https://assets.coingecko.com/coins/images/13029/small/axie_infinity_logo.png?1604471082",
+  "ethernity-chain":
+    "https://assets.coingecko.com/coins/images/14238/small/ethernity_logo.png?1615189750",
+  "perpetual-protocol":
+    "https://assets.coingecko.com/coins/images/12381/small/60d18e06844a844ad75901a9_mark_only_03.png?1628674771",
+  "compound-governance-token":
+    "https://assets.coingecko.com/coins/images/10775/small/COMP.png?1592625425",
+  weth: "https://assets.coingecko.com/coins/images/2518/small/weth.png?1628852295",
+  "ethereum-name-service":
+    "https://assets.coingecko.com/coins/images/19785/small/acatxTm8_400x400.jpg?1635850140",
+  erc20:
+    "https://assets.coingecko.com/coins/images/1141/small/0c213e0a1ee44bd8a3c952ffc5bc5a45.png?1628771346",
+  "chain-games":
+    "https://assets.coingecko.com/coins/images/12257/small/chain-logo-centered-500x500.png?1599617244",
+  "interest-bearing-bitcoin":
+    "https://assets.coingecko.com/coins/images/15500/small/ibbtc.png?1621077589",
+  "free-novak":
+    "https://assets.coingecko.com/coins/images/23370/small/logo_%282%29.png?1643955421",
+  "the-graph":
+    "https://assets.coingecko.com/coins/images/13397/small/Graph_Token.png?1608145566",
+  "vega-protocol":
+    "https://assets.coingecko.com/coins/images/15870/small/vega.PNG?1622178218",
+  "smooth-love-potion":
+    "https://assets.coingecko.com/coins/images/10366/small/SLP.png?1578640057",
+  torg: "https://assets.coingecko.com/coins/images/17596/small/TORG_Logo_200x200.png?1628586056",
+  "terra-virtua-kolect":
+    "https://assets.coingecko.com/coins/images/13330/small/CoinGLogo.png?1607507042",
+  "wrapped-terra":
+    "https://assets.coingecko.com/coins/images/13628/small/wluna.png?1610448334",
+  "zam-io":
+    "https://assets.coingecko.com/coins/images/19522/small/zam.png?1635324134",
+  covalent:
+    "https://assets.coingecko.com/coins/images/14168/small/covalent-cqt.png?1624545218",
+  ampleforth:
+    "https://assets.coingecko.com/coins/images/4708/small/Ampleforth.png?1561684250",
+  "shield-finance":
+    "https://assets.coingecko.com/coins/images/15813/small/3FYKlPka_400x400.png?1621980007",
+  cindicator:
+    "https://assets.coingecko.com/coins/images/1006/small/cindicator.png?1547034913",
+  "curve-dao-token":
+    "https://assets.coingecko.com/coins/images/12124/small/Curve.png?1597369484",
+  "safe-coin":
+    "https://assets.coingecko.com/coins/images/4938/small/safe-coin-logo.png?1547040363",
+  adapad:
+    "https://assets.coingecko.com/coins/images/18273/small/EhSqPTtG_400x400.jpg?1631181091",
+  "crowny-token":
+    "https://assets.coingecko.com/coins/images/14958/small/crowny-icon-rounded_2x.png?1619147225",
+  "gera-coin":
+    "https://assets.coingecko.com/coins/images/13686/small/GeraCoin_Logo-icon-1000px.png?1610919942",
+  husd: "https://assets.coingecko.com/coins/images/9567/small/HUSD.jpg?1568889385",
+  "feisty-doge-nft":
+    "https://assets.coingecko.com/coins/images/17834/small/doge-fractionalized.png?1629390495",
+  curate:
+    "https://assets.coingecko.com/coins/images/13327/small/400x400_%281%29_%283%29_%282%29.png?1613998208",
+  banana:
+    "https://assets.coingecko.com/coins/images/17521/small/bananaa.png?1628091607",
+  "injective-protocol":
+    "https://assets.coingecko.com/coins/images/12882/small/Secondary_Symbol.png?1628233237",
+  pillar:
+    "https://assets.coingecko.com/coins/images/809/small/v2logo-1.png?1624906282",
+  bitspawn:
+    "https://assets.coingecko.com/coins/images/16513/small/token_logo.png?1631603192",
+  defire:
+    "https://assets.coingecko.com/coins/images/15722/small/defire.PNG?1621635373",
+  nftlaunch:
+    "https://assets.coingecko.com/coins/images/18140/small/nftl.PNG?1630652662",
+  pontoon:
+    "https://assets.coingecko.com/coins/images/19575/small/pontoon.PNG?1635467899",
+  chronologic:
+    "https://assets.coingecko.com/coins/images/951/small/Chronologic-network.png?1547034815",
+  everid:
+    "https://assets.coingecko.com/coins/images/5209/small/Everest.jpg?1628042930",
+  botxcoin:
+    "https://assets.coingecko.com/coins/images/6827/small/botx.jpg?1548317786",
+  "ice-token":
+    "https://assets.coingecko.com/coins/images/14586/small/ice.png?1617188825",
+  charli3:
+    "https://assets.coingecko.com/coins/images/15052/small/Charli3-Profile-Icon-1.png?1642643567",
+  "rally-2":
+    "https://assets.coingecko.com/coins/images/12843/small/image.png?1611212077",
+  enjincoin:
+    "https://assets.coingecko.com/coins/images/1102/small/enjin-coin-logo.png?1547035078",
+  "frontier-token":
+    "https://assets.coingecko.com/coins/images/12479/small/frontier_logo.png?1600145472",
+  essentia:
+    "https://assets.coingecko.com/coins/images/2483/small/Essentia-token.jpg?1547036604",
+  orbs: "https://assets.coingecko.com/coins/images/4630/small/Orbs.jpg?1547039896",
+  "nexus-governance-token":
+    "https://assets.coingecko.com/coins/images/19080/small/aK3V5I56_400x400.jpg?1634304970",
+  playnity:
+    "https://assets.coingecko.com/coins/images/21479/small/ply.png?1639651574",
+  starterra:
+    "https://assets.coingecko.com/coins/images/17715/small/starterra-logo.png?1629084125",
+  "mirrored-tesla":
+    "https://assets.coingecko.com/coins/images/13644/small/mirror_logo_transparent.png?1611565294",
+  "anchor-protocol":
+    "https://assets.coingecko.com/coins/images/14420/small/anchor_protocol_logo.jpg?1615965420",
+  "mirrored-amazon":
+    "https://assets.coingecko.com/coins/images/13646/small/mirror_logo_transparent.png?1611565645",
+  bitlocus:
+    "https://assets.coingecko.com/coins/images/20913/small/btl.png?1637922710",
+  "mirrored-spdr-s-p-500":
+    "https://assets.coingecko.com/coins/images/21088/small/mir.png?1638323591",
+  "mirrored-airbnb":
+    "https://assets.coingecko.com/coins/images/14022/small/mirror_logo_transparent.png?1613719600",
+  anchorust:
+    "https://assets.coingecko.com/coins/images/21097/small/aust.png?1638324579",
+  "mirrored-netflix":
+    "https://assets.coingecko.com/coins/images/13643/small/mirror_logo_transparent.png?1611565277",
+  "pylon-protocol":
+    "https://assets.coingecko.com/coins/images/16859/small/pylon_logo.png?1625466331",
+  "mirrored-apple":
+    "https://assets.coingecko.com/coins/images/13514/small/mirror_logo_transparent.png?1611564758",
+  secret:
+    "https://assets.coingecko.com/coins/images/11871/small/Secret.png?1595520186",
+  "ethereum-meta":
+    "https://assets.coingecko.com/coins/images/6586/small/ethereum-meta.png?1548125409",
+  cake: "https://assets.coingecko.com/coins/images/21639/small/cake.png?1639630973",
+  "radio-caca":
+    "https://assets.coingecko.com/coins/images/17841/small/ez44_BSs_400x400.jpg?1629464170",
+  "polychain-monsters":
+    "https://assets.coingecko.com/coins/images/14604/small/polkamon.png?1617238350",
+  "panda-dao":
+    "https://assets.coingecko.com/coins/images/14295/small/logo_Panda_Dao.png?1617277854",
+  lasereyes:
+    "https://assets.coingecko.com/coins/images/22597/small/lsr.png?1643524878",
+  "wall-street-bets-dapp":
+    "https://assets.coingecko.com/coins/images/15093/small/Pe1mrDu.png?1629882480",
+  "binance-eth":
+    "https://assets.coingecko.com/coins/images/13804/small/Binnace.png?1611997829",
+  soldoge:
+    "https://assets.coingecko.com/coins/images/19746/small/2L4aX1r.png?1635822424",
+  "odin-protocol":
+    "https://assets.coingecko.com/coins/images/14934/small/ODIN_iso_black.png?1619076975",
+  recharge:
+    "https://assets.coingecko.com/coins/images/18120/small/thecharge.PNG?1630559768",
+  mysterium:
+    "https://assets.coingecko.com/coins/images/757/small/mysterium.png?1547034503",
+  "plant-vs-undead-token":
+    "https://assets.coingecko.com/coins/images/17461/small/token-200x200.png?1627883446",
+  insurace:
+    "https://assets.coingecko.com/coins/images/14226/small/insur.png?1615124622",
+  cardano:
+    "https://assets.coingecko.com/coins/images/975/small/cardano.png?1547034860",
+  echoin:
+    "https://assets.coingecko.com/coins/images/9354/small/L32_KzNQ_400x400.jpg?1566513096",
+  solana:
+    "https://assets.coingecko.com/coins/images/4128/small/solana.png?1640133422",
+  litecoin:
+    "https://assets.coingecko.com/coins/images/2/small/litecoin.png?1547033580",
+  wolfsafepoorpeople:
+    "https://assets.coingecko.com/coins/images/17090/small/wspplogo.png?1626187594",
+  "spongebob-square":
+    "https://assets.coingecko.com/coins/images/22772/small/Spnge.png?1642576286",
+  "globaltrustfund-token":
+    "https://assets.coingecko.com/coins/images/11817/small/gtf.png?1594679456",
+  "trust-wallet-token":
+    "https://assets.coingecko.com/coins/images/11085/small/Trust.png?1588062702",
+  "crypto-fight-club":
+    "https://assets.coingecko.com/coins/images/21695/small/zGwwAgL.png?1639721544",
+  ztcoin:
+    "https://assets.coingecko.com/coins/images/6566/small/ztcoin.jpg?1547042777",
+  wraith:
+    "https://assets.coingecko.com/coins/images/18099/small/LOGOTRANS-1.png?1630475109",
+  investin:
+    "https://assets.coingecko.com/coins/images/15588/small/ivn_logo.png?1621267247",
+  psyoptions:
+    "https://assets.coingecko.com/coins/images/22784/small/download.png?1642580392",
+  polkadot:
+    "https://assets.coingecko.com/coins/images/12171/small/polkadot.png?1639712644",
+  "binance-bitcoin":
+    "https://assets.coingecko.com/coins/images/14108/small/Binance-bitcoin.png?1617332330",
+  shirtum:
+    "https://assets.coingecko.com/coins/images/16955/small/4fWlpC0.png?1625794164",
+  "planet-finance":
+    "https://assets.coingecko.com/coins/images/15710/small/aqua-icon.png?1621583770",
+  "musk-metaverse":
+    "https://assets.coingecko.com/coins/images/21822/small/Logo-Symbol-kh-ng-n-n.png?1640075758",
+  "oly-sport":
+    "https://assets.coingecko.com/coins/images/19930/small/oly_sport.PNG?1636323685",
+  "wrapped-avax":
+    "https://assets.coingecko.com/coins/images/15075/small/wrapped-avax.png?1629873618",
+  safemoon:
+    "https://assets.coingecko.com/coins/images/14362/small/174x174-white.png?1617174846",
+  hashpanda:
+    "https://assets.coingecko.com/coins/images/15903/small/logo_-_2021-05-31T060013.983.png?1622412025",
+  benqi:
+    "https://assets.coingecko.com/coins/images/16362/small/GergDDN3_400x400.jpg?1644984441",
+  "vent-finance":
+    "https://assets.coingecko.com/coins/images/17925/small/Artboard_29.png?1629804982",
+  gemguardian:
+    "https://assets.coingecko.com/coins/images/18614/small/gemg.PNG?1632697389",
+  nuls: "https://assets.coingecko.com/coins/images/1053/small/Nuls.png?1556868153",
+  openocean:
+    "https://assets.coingecko.com/coins/images/17014/small/ooe_log.png?1626074195",
+  synchrony:
+    "https://assets.coingecko.com/coins/images/19308/small/SYNCHRONY-LOGO.png?1634973091",
+  biswap:
+    "https://assets.coingecko.com/coins/images/16845/small/biswap.png?1625388985",
+  iotex:
+    "https://assets.coingecko.com/coins/images/3334/small/iotex-logo.png?1547037941",
+  "dogemon-go":
+    "https://assets.coingecko.com/coins/images/17480/small/dogemongo.PNG?1627950869",
+  nothing:
+    "https://assets.coingecko.com/coins/images/16090/small/Gecko-200x200.png?1624544349",
+  coin98:
+    "https://assets.coingecko.com/coins/images/17117/small/logo.png?1626412904",
+  "numbers-protocol":
+    "https://assets.coingecko.com/coins/images/20495/small/5J3RAUO2_400x400.jpg?1637131666",
+  maticverse:
+    "https://assets.coingecko.com/coins/images/18403/small/A0782-F05-535-C-45-C8-BE4-F-FEBB4-B8-B5933.jpg?1631792934",
+  dogecoin:
+    "https://assets.coingecko.com/coins/images/5/small/dogecoin.png?1547792256",
+  wbnb: "https://assets.coingecko.com/coins/images/12591/small/binance-coin-logo.png?1600947313",
+  idefiyieldprotocol:
+    "https://assets.coingecko.com/coins/images/21976/small/i-DYP-Logo-1.png?1640570294",
+  catzcoin:
+    "https://assets.coingecko.com/coins/images/15519/small/MX0hFr7.jpeg?1621118815",
+  "lucky-lion":
+    "https://assets.coingecko.com/coins/images/18712/small/lucky-token-200px.png?1633079262",
+  infinitup:
+    "https://assets.coingecko.com/coins/images/18890/small/fc_qo2M7_400x400.jpg?1633749805",
+  "baby-doge-coin":
+    "https://assets.coingecko.com/coins/images/16125/small/Baby_Doge.png?1623044048",
+  "safuyield-protocol":
+    "https://assets.coingecko.com/coins/images/17021/small/safuyield.png?1626098281",
+  "biconomy-exchange-token":
+    "https://assets.coingecko.com/coins/images/18198/small/mGky0OOh_400x400.jpg?1630965301",
+  "green-shiba-inu":
+    "https://assets.coingecko.com/coins/images/15649/small/inu-logo-new-200x200.png?1625578449",
+  "beefy-finance":
+    "https://assets.coingecko.com/coins/images/12704/small/token.png?1601876182",
+  "orion-protocol":
+    "https://assets.coingecko.com/coins/images/11841/small/orion_logo.png?1594943318",
+  catecoin:
+    "https://assets.coingecko.com/coins/images/15364/small/logo.png?1620647627",
+  rougecoin:
+    "https://assets.coingecko.com/coins/images/14621/small/rougecoin.png?1617265377",
+  "token-pocket":
+    "https://assets.coingecko.com/coins/images/7603/small/_E6sbg1g_400x400.jpg?1548828066",
+  starlaunch:
+    "https://assets.coingecko.com/coins/images/20109/small/OP3eksDQ_400x400.png?1636513478",
+  ontology:
+    "https://assets.coingecko.com/coins/images/3447/small/ONT.png?1583481820",
+  chi: "https://assets.coingecko.com/coins/images/20130/small/sIuRXww.png?1636528063",
+  wmatic:
+    "https://assets.coingecko.com/coins/images/14073/small/matic.png?1628852392",
+  "aave-polygon-usdc":
+    "https://assets.coingecko.com/coins/images/17249/small/amUSDC_2x.png?1626941306",
+  "data-economy-index":
+    "https://assets.coingecko.com/coins/images/18500/small/data_32.png?1632209427",
+  ispolink:
+    "https://assets.coingecko.com/coins/images/15283/small/isolink.PNG?1620352267",
+  celo: "https://assets.coingecko.com/coins/images/11090/small/icon-celo-CELO-color-500.png?1592293590",
+  "saitama-inu":
+    "https://assets.coingecko.com/coins/images/16353/small/Capture.PNG?1632126703",
+  "true-usd":
+    "https://assets.coingecko.com/coins/images/3449/small/tusd.png?1618395665",
+  "eagonswap-token":
+    "https://assets.coingecko.com/coins/images/20431/small/IMG-20210912-WA0003.jpg?1637035180",
+  easyfi:
+    "https://assets.coingecko.com/coins/images/12742/small/Logo_Icon.png?1624471467",
+  streamr:
+    "https://assets.coingecko.com/coins/images/17869/small/DATA_new_symbol_3x.png?1629692324",
+  "internet-node-token":
+    "https://assets.coingecko.com/coins/images/2519/small/int-logo-red-transparent_200x200.png?1617251612",
+  "0xmonero":
+    "https://assets.coingecko.com/coins/images/11035/small/0xmnr.PNG?1587357680",
+  one: "https://assets.coingecko.com/coins/images/4960/small/Screenshot_39.png?1561103318",
+  "gaia-everworld":
+    "https://assets.coingecko.com/coins/images/19629/small/gaia_icon_new.png?1637559277",
+  quick:
+    "https://assets.coingecko.com/coins/images/13970/small/1_pOU6pBMEmiL-ZJVb0CYRjQ.png?1613386659",
+  "tixl-new":
+    "https://assets.coingecko.com/coins/images/12432/small/Tixl-Logo-200-transparent.png?1610248504",
+  "hakka-finance":
+    "https://assets.coingecko.com/coins/images/12163/small/Hakka-icon.png?1597746776",
+  "aurora-dao":
+    "https://assets.coingecko.com/coins/images/2565/small/logomark-purple-286x286.png?1638362736",
+  mimatic:
+    "https://assets.coingecko.com/coins/images/15264/small/mimatic-red.png?1620281018",
+  sifchain:
+    "https://assets.coingecko.com/coins/images/14044/small/EROWAN.png?1614656300",
+  "polygon-ecosystem-index":
+    "https://assets.coingecko.com/coins/images/19270/small/amun-peco.png?1634868167",
+  "iron-titanium-token":
+    "https://assets.coingecko.com/coins/images/16031/small/titan.png?1636080284",
+  boozedoge:
+    "https://assets.coingecko.com/coins/images/18852/small/Booze-Logo-CMC.png?1633592459",
+  banano:
+    "https://assets.coingecko.com/coins/images/6226/small/banano-transparent.png?1619589798",
+  tryhards:
+    "https://assets.coingecko.com/coins/images/18624/small/Q22nU_z4_400x400.jpg?1632702444",
+  "dragons-quick":
+    "https://assets.coingecko.com/coins/images/15185/small/quickswap.png?1620044811",
+  "wrapped-memory":
+    "https://assets.coingecko.com/coins/images/22392/small/wmemo.png?1641792100",
+  joe: "https://assets.coingecko.com/coins/images/17569/small/joe_200x200.png?1628497750",
+  livepeer:
+    "https://assets.coingecko.com/coins/images/7137/small/logo-circle-green.png?1619593365",
+  "celer-network":
+    "https://assets.coingecko.com/coins/images/4379/small/Celr.png?1554705437",
+};

+ 6 - 0
bridge_ui/src/utils/consts.ts

@@ -497,6 +497,8 @@ export const COVALENT_GET_TOKENS_URL = (
     nft ? "&nft=true" : ""
   }${noNftMetadata ? "&no-nft-fetch=true" : ""}`;
 };
+export const TVL_URL =
+  "https://europe-west3-wormhole-315720.cloudfunctions.net/mainnet-notionaltvl";
 export const TERRA_SWAPRATE_URL =
   "https://fcd.terra.dev/v1/market/swaprate/uusd";
 
@@ -813,6 +815,10 @@ export const VAA_EMITTER_ADDRESSES = [
   `${CHAIN_ID_BSC}:0000000000000000000000005a58505a96d1dbf8df91cb21b54419fc36e93fde`, //bsc nft
   `${CHAIN_ID_POLYGON}:0000000000000000000000005a58505a96d1dbf8df91cb21b54419fc36e93fde`, //Polygon
   `${CHAIN_ID_POLYGON}:00000000000000000000000090bbd86a6fe93d3bc3ed6335935447e75fab7fcf`, //Polygon nft
+  `${CHAIN_ID_AVAX}:0000000000000000000000000e082f06ff657d94310cb8ce8b0d9a04541d8052`, //AVAX
+  `${CHAIN_ID_AVAX}:000000000000000000000000f7b6737ca9c4e08ae573f75a97b73d7a813f5de5`, //AVAX nft
+  `${CHAIN_ID_OASIS}:0000000000000000000000005848c791e09901b40a9ef749f2a6735b418d7564`, //OASIS
+  `${CHAIN_ID_OASIS}:00000000000000000000000004952D522Ff217f40B5Ef3cbF659EcA7b952a6c1`, //OASIS nft
 ];
 
 export const WORMHOLE_EXPLORER_BASE = "https://wormholenetwork.com/en/explorer";