@@ -194,7 +200,7 @@ function RecentTransfersUI(props: {
)}
-
+
+ ),
description:
"View trends of transactions, events and unique wallets interacting with this contract over time",
}}
diff --git a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/dex-screener-chains.ts b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/dex-screener-chains.ts
deleted file mode 100644
index 8188a19762c..00000000000
--- a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/dex-screener-chains.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-export const mapChainIdToDexScreenerChainSlug = {
- 8453: "base",
- 1: "ethereum",
- 56: "bsc",
- 369: "pulsechain",
- 137: "polygon",
- 2741: "abstract",
- 43114: "avalanche",
- 999: "hyperliquid",
- 480: "worldchain",
- 42161: "arbitrum",
- 388: "cronos",
- 59144: "linea",
- 1514: "story",
- 397: "near",
- 295: "hedera",
- 146: "sonic",
- 10: "optimism",
- 80094: "berachain",
- 57073: "ink",
- 130: "unichain",
- 5000: "mantle",
- 324: "zksync",
- 466: "apechain",
- 1116: "core",
- 250: "fantom",
- 1868: "soneium",
- 81457: "blast",
- 2000: "dogechain",
- 14: "flare",
- 2040: "vana",
- 4337: "beam",
- 109: "shibarium",
- 747: "flowevm",
- 1088: "metis",
- 1030: "conflux",
- 43113: "avalanchedfk",
- 534352: "scroll",
- 747474: "katana",
- 42220: "celo",
- 1284: "moonbeam",
- 4200: "merlinchain",
- 2222: "kava",
- 39797: "energi",
- 34443: "mode",
- 252: "fraxtal",
- 48900: "zircuit",
- 20: "elastos",
- 100: "gnosischain",
- 204: "opbnb",
- 169: "manta",
- 1313161554: "aurora",
- 3073: "movement",
- 4689: "iotex",
- 23294: "oasissapphire",
- 6001: "bouncebit",
- 42170: "arbitrumnova",
- 1101: "polygonzkevm",
- 40: "telos",
- 592: "astar",
- 42262: "oasisemerald",
- 1285: "moonriver",
- 245022934: "neonevm",
- 7777777: "zora",
- 122: "fuse",
- 321: "kcc",
- 1234: "stepnetwork",
- 106: "velas",
- 167000: "taiko",
- 288: "boba",
- 42766: "zkfair",
- 32520: "bitgert",
- 82: "meter",
-} as const;
-
-export type DexScreenerChainSlug =
- (typeof mapChainIdToDexScreenerChainSlug)[keyof typeof mapChainIdToDexScreenerChainSlug];
diff --git a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/dex-screener.tsx b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/dex-screener.tsx
deleted file mode 100644
index a6d38eb2feb..00000000000
--- a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_components/dex-screener.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-"use client";
-import { Spinner } from "@workspace/ui/components/spinner";
-import { useTheme } from "next-themes";
-import { useMemo } from "react";
-import { ClientOnly } from "@/components/blocks/client-only";
-import type { DexScreenerChainSlug } from "./dex-screener-chains";
-
-function DexScreenerIframe(props: {
- chain: DexScreenerChainSlug;
- contractAddress: string;
-}) {
- const { theme } = useTheme();
-
- const iframeUrl = useMemo(() => {
- const resolvedTheme = theme === "light" ? "light" : "dark";
- const url = new URL("https://dexscreener.com");
- url.pathname = `${props.chain}/${props.contractAddress}`;
- url.searchParams.set("embed", "1");
- url.searchParams.set("loadChartSettings", "0");
- url.searchParams.set("chartTheme", resolvedTheme);
- url.searchParams.set("theme", resolvedTheme);
- url.searchParams.set("trades", "1");
- url.searchParams.set("chartStyle", "1");
- url.searchParams.set("chartLeftToolbar", "0");
- url.searchParams.set("chartType", "usd");
- url.searchParams.set("interval", "15");
- url.searchParams.set("chartDefaultOnMobile", "1");
- return url.toString();
- }, [theme, props.chain, props.contractAddress]);
-
- return (
-
- );
-}
-
-export function DexScreener(props: {
- chain: DexScreenerChainSlug;
- contractAddress: string;
-}) {
- return (
-
-
-
-
- );
-}
diff --git a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_utils/fetch-coin-info.ts b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_utils/fetch-coin-info.ts
index 2db18949a1c..3f2914e7287 100644
--- a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_utils/fetch-coin-info.ts
+++ b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_utils/fetch-coin-info.ts
@@ -1,42 +1,21 @@
import "server-only";
-import { isProd } from "@/constants/env-utils";
-import { DASHBOARD_THIRDWEB_SECRET_KEY } from "@/constants/server-envs";
+import { Bridge, type ThirdwebClient } from "thirdweb";
export async function fetchTokenInfoFromBridge(params: {
chainId: number;
tokenAddress: string;
- clientId: string;
+ client: ThirdwebClient;
}) {
try {
- const res = await fetch(
- `https://bridge.${isProd ? "thirdweb.com" : "thirdweb-dev.com"}/v1/tokens?chainId=${params.chainId}&tokenAddress=${params.tokenAddress}`,
- {
- headers: {
- "x-secret-key": DASHBOARD_THIRDWEB_SECRET_KEY,
- },
- },
- );
-
- if (!res.ok) {
- console.error(
- `Failed to fetch token info from bridge: ${await res.text()}`,
- );
- return null;
- }
-
- const data = (await res.json()) as {
- data: Array<{
- iconUri: string;
- address: string;
- decimals: number;
- name: string;
- symbol: string;
- priceUsd: number;
- }>;
- };
-
- return data.data[0];
+ const res = await Bridge.tokens({
+ client: params.client,
+ chainId: params.chainId,
+ tokenAddress: params.tokenAddress,
+ includePrices: true,
+ limit: 1,
+ });
+ return res[0];
} catch {
- return null;
+ return undefined;
}
}
diff --git a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/erc20.tsx b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/erc20.tsx
index 9330d9a3254..78be8c0b13a 100644
--- a/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/erc20.tsx
+++ b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/erc20.tsx
@@ -1,3 +1,4 @@
+import { BarChart3Icon, DollarSignIcon, TrendingUpIcon } from "lucide-react";
import { cookies } from "next/headers";
import type { ThirdwebContract } from "thirdweb";
import type { ChainMetadata } from "thirdweb/chains";
@@ -13,8 +14,6 @@ import { PageHeader } from "../_components/PageHeader";
import { ContractHeaderUI } from "./_components/ContractHeader";
import { TokenDropClaim } from "./_components/claim-tokens/claim-tokens-ui";
import { ContractAnalyticsOverview } from "./_components/contract-analytics/contract-analytics";
-import { DexScreener } from "./_components/dex-screener";
-import { mapChainIdToDexScreenerChainSlug } from "./_components/dex-screener-chains";
import { RecentTransfers } from "./_components/RecentTransfers";
import { fetchTokenInfoFromBridge } from "./_utils/fetch-coin-info";
import { getCurrencyMeta } from "./_utils/getCurrencyMeta";
@@ -40,7 +39,7 @@ export async function ERC20PublicPage(props: {
}),
fetchTokenInfoFromBridge({
chainId: props.serverContract.chain.id,
- clientId: props.clientContract.client.clientId,
+ client: props.serverContract.client,
tokenAddress: props.serverContract.address,
}),
resolveFunctionSelectors(props.serverContract),
@@ -80,7 +79,7 @@ export async function ERC20PublicPage(props: {