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 new file mode 100644 index 00000000000..af45befe8e7 --- /dev/null +++ b/apps/dashboard/src/app/(app)/(dashboard)/(chain)/[chain_id]/[contractAddress]/public-pages/erc20/_utils/fetch-coin-info.ts @@ -0,0 +1,32 @@ +import { isProd } from "@/constants/env-utils"; + +export async function fetchTokenInfoFromBridge(params: { + chainId: number; + tokenAddress: string; + clientId: string; +}) { + try { + const res = await fetch( + `https://bridge.${isProd ? "thirdweb.com" : "thirdweb-dev.com"}/v1/tokens?chainId=${params.chainId}&tokenAddress=${params.tokenAddress}&clientId=${params.clientId}`, + ); + + if (!res.ok) { + 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]; + } catch { + return null; + } +} 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 ddbc48b278e..f9c59707790 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 @@ -11,6 +11,7 @@ import { ContractAnalyticsOverview } from "./_components/contract-analytics/cont import { BuyTokenEmbed } from "./_components/PayEmbedSection"; import { TokenStats } from "./_components/PriceChart"; import { RecentTransfers } from "./_components/RecentTransfers"; +import { fetchTokenInfoFromBridge } from "./_utils/fetch-coin-info"; import { getCurrencyMeta } from "./_utils/getCurrencyMeta"; export async function ERC20PublicPage(props: { @@ -22,6 +23,7 @@ export async function ERC20PublicPage(props: { contractMetadata, activeClaimCondition, tokenDecimals, + tokenInfo, functionSelectors, ] = await Promise.all([ getContractMetadata({ @@ -31,9 +33,18 @@ export async function ERC20PublicPage(props: { decimals({ contract: props.serverContract, }), + fetchTokenInfoFromBridge({ + chainId: props.serverContract.chain.id, + clientId: props.clientContract.client.clientId, + tokenAddress: props.serverContract.address, + }), resolveFunctionSelectors(props.serverContract), ]); + if (!contractMetadata.image && tokenInfo) { + contractMetadata.image = tokenInfo.iconUri; + } + const [contractCreator, claimConditionCurrencyMeta] = await Promise.all([ getContractCreator(props.serverContract, functionSelectors), activeClaimCondition