diff --git a/.env.example b/.env.example index eb7fe1530b..5eef4d42e1 100644 --- a/.env.example +++ b/.env.example @@ -21,6 +21,8 @@ NEXT_PUBLIC_FIAT_ON_RAMP=true NEXT_PUBLIC_IS_CYPRESS_ENABLED=false NEXT_PUBLIC_AMPLITUDE_API_KEY=6b28cb736c53d59f0951a50f59597aae NEXT_PUBLIC_PRIVATE_RPC_ENABLED=false +# e.g. 0xabc...,proto_base_v3:0xdef... +NEXT_PUBLIC_HIDDEN_RESERVES= diff --git a/pages/reserve-overview.page.tsx b/pages/reserve-overview.page.tsx index 02c6281c25..e6fca4aaf3 100644 --- a/pages/reserve-overview.page.tsx +++ b/pages/reserve-overview.page.tsx @@ -13,6 +13,7 @@ import { import { AssetCapsProvider } from 'src/hooks/useAssetCaps'; import { AssetCapsProviderSDK } from 'src/hooks/useAssetCapsSDK'; import { MainLayout } from 'src/layouts/MainLayout'; +import { isAssetHidden } from 'src/modules/dashboard/lists/constants'; import { ReserveActions } from 'src/modules/reserve-overview/ReserveActions'; import { ReserveConfigurationWrapper } from 'src/modules/reserve-overview/ReserveConfigurationWrapper'; import { ReserveTopDetailsWrapper } from 'src/modules/reserve-overview/ReserveTopDetailsWrapper'; @@ -51,6 +52,15 @@ export default function ReserveOverview() { const [mode, setMode] = useState<'overview' | 'actions' | ''>('overview'); const trackEvent = useRootStore((store) => store.trackEvent); + const currentMarket = useRootStore((store) => store.currentMarket); + + const reserveHidden = !!underlyingAsset && isAssetHidden(currentMarket, underlyingAsset); + + useEffect(() => { + if (router.isReady && reserveHidden) { + router.replace('/markets'); + } + }, [router, reserveHidden]); //With SDK const reserve = supplyReserves.find((reserve) => { @@ -76,6 +86,10 @@ export default function ReserveOverview() { const isOverview = mode === 'overview'; + if (reserveHidden) { + return null; + } + return ( diff --git a/src/modules/dashboard/lists/constants.ts b/src/modules/dashboard/lists/constants.ts index 3e21ccaa39..6cba180fb8 100644 --- a/src/modules/dashboard/lists/constants.ts +++ b/src/modules/dashboard/lists/constants.ts @@ -3,9 +3,45 @@ import { CustomMarket } from 'src/ui-config/marketsConfig'; export const HIDDEN_ASSETS: Partial> = { [CustomMarket.proto_horizon_v3]: [ '0x17418038ecf73ba4026c4f428547bf099706f27b'.toLowerCase(), // aCRED + '0x7433806912Eae67919e66aea853d46Fa0aef98A8'.toLowerCase(), ], }; +const parseHiddenReservesEnv = () => { + const global = new Set(); + const byMarket: Partial>> = {}; + + const raw = process.env.NEXT_PUBLIC_HIDDEN_RESERVES; + if (!raw) { + return { global, byMarket }; + } + + raw + .split(',') + .map((entry) => entry.trim()) + .filter(Boolean) + .forEach((entry) => { + const [first, second] = entry.split(':').map((part) => part.trim()); + if (second) { + const market = first as CustomMarket; + const address = second.toLowerCase(); + if (!address) return; + (byMarket[market] ??= new Set()).add(address); + } else if (first) { + global.add(first.toLowerCase()); + } + }); + + return { global, byMarket }; +}; + +const { global: ENV_HIDDEN_GLOBAL, byMarket: ENV_HIDDEN_BY_MARKET } = parseHiddenReservesEnv(); + export const isAssetHidden = (market: CustomMarket, underlyingAsset: string) => { - return HIDDEN_ASSETS[market]?.includes(underlyingAsset.toLowerCase()); + const address = underlyingAsset.toLowerCase(); + return Boolean( + HIDDEN_ASSETS[market]?.includes(address) || + ENV_HIDDEN_GLOBAL.has(address) || + ENV_HIDDEN_BY_MARKET[market]?.has(address) + ); };