From 8d482898a1bef3652dcfc67b12d0710a77f8cfc9 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 8 Dec 2025 12:14:37 -0700 Subject: [PATCH 1/4] migrate apps to data layer --- app/[locale]/apps/[application]/page.tsx | 38 +++++++++++++------ .../apps/categories/[catetgoryName]/page.tsx | 17 ++++++--- app/[locale]/apps/page.tsx | 32 +++++++++------- 3 files changed, 57 insertions(+), 30 deletions(-) diff --git a/app/[locale]/apps/[application]/page.tsx b/app/[locale]/apps/[application]/page.tsx index b01482de762..020748289a0 100644 --- a/app/[locale]/apps/[application]/page.tsx +++ b/app/[locale]/apps/[application]/page.tsx @@ -6,7 +6,13 @@ import { setRequestLocale, } from "next-intl/server" -import type { ChainName, CommitHistory, Lang, PageParams } from "@/lib/types" +import type { + AppData, + ChainName, + CommitHistory, + Lang, + PageParams, +} from "@/lib/types" import ChainImages from "@/components/ChainImages" import { ChevronNext } from "@/components/Chevron" @@ -32,7 +38,6 @@ import { Tag } from "@/components/ui/tag" import { APP_TAG_VARIANTS } from "@/lib/utils/apps" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { isValidDate } from "@/lib/utils/date" import { getMetadata } from "@/lib/utils/metadata" import { @@ -42,6 +47,9 @@ import { import { slugify } from "@/lib/utils/url" import { formatStringList } from "@/lib/utils/wallets" +import { FETCH_APPS_TASK_ID } from "@/data-layer/api/fetchApps" +import { getCachedData } from "@/data-layer/storage/cachedGetter" + import { BASE_TIME_UNIT } from "@/lib/constants" import AppCard from "../_components/AppCard" @@ -49,13 +57,9 @@ import AppCard from "../_components/AppCard" import ScreenshotSwiper from "./_components/ScreenshotSwiper" import AppsAppJsonLD from "./page-jsonld" -import { fetchApps } from "@/lib/api/fetchApps" - // 24 hours const REVALIDATE_TIME = BASE_TIME_UNIT * 24 -const loadData = dataLoader([["appsData", fetchApps]], REVALIDATE_TIME * 1000) - const Page = async ({ params, }: { @@ -72,11 +76,17 @@ const Page = async ({ const requiredNamespaces = getRequiredNamespacesForPage("/apps") const messages = pick(allMessages, requiredNamespaces) - // const [application] = application - const [appsData] = await loadData() + // Fetch data from data layer with Next.js caching + const appsDataResult = await getCachedData>( + FETCH_APPS_TASK_ID, + REVALIDATE_TIME + ) + + // Handle missing data gracefully + const appsData = appsDataResult || {} const app = Object.values(appsData) .flat() - .find((app) => slugify(app.name) === application)! + .find((app) => slugify(app.name) === application) if (!app) { notFound() @@ -394,11 +404,17 @@ export async function generateMetadata({ }) { const { locale, application } = params - const [appsData] = await loadData() + // Fetch data from data layer with Next.js caching + const appsDataResult = await getCachedData>( + FETCH_APPS_TASK_ID, + REVALIDATE_TIME + ) + // Handle missing data gracefully + const appsData = appsDataResult || {} const app = Object.values(appsData) .flat() - .find((app) => slugify(app.name) === application)! + .find((app) => slugify(app.name) === application) if (!app) { notFound() diff --git a/app/[locale]/apps/categories/[catetgoryName]/page.tsx b/app/[locale]/apps/categories/[catetgoryName]/page.tsx index 01fea8251c9..5297d87b0bc 100644 --- a/app/[locale]/apps/categories/[catetgoryName]/page.tsx +++ b/app/[locale]/apps/categories/[catetgoryName]/page.tsx @@ -8,6 +8,7 @@ import { import { AppCategoryEnum, + type AppData, type CommitHistory, type Lang, type PageParams, @@ -29,11 +30,12 @@ import TabNav from "@/components/ui/TabNav" import { getHighlightedApps } from "@/lib/utils/apps" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" import { appsCategories } from "@/data/apps/categories" +import { FETCH_APPS_TASK_ID } from "@/data-layer/api/fetchApps" +import { getCachedData } from "@/data-layer/storage/cachedGetter" import { BASE_TIME_UNIT } from "@/lib/constants" @@ -43,8 +45,6 @@ import SuggestAnApp from "../../_components/SuggestAnApp" import AppsCategoryJsonLD from "./page-jsonld" -import { fetchApps } from "@/lib/api/fetchApps" - const VALID_CATEGORIES = Object.values(AppCategoryEnum) const isValidCategory = (category: string): category is AppCategoryEnum => @@ -53,8 +53,6 @@ const isValidCategory = (category: string): category is AppCategoryEnum => // 24 hours const REVALIDATE_TIME = BASE_TIME_UNIT * 24 -const loadData = dataLoader([["appsData", fetchApps]], REVALIDATE_TIME * 1000) - const Page = async ({ params, }: { @@ -63,7 +61,14 @@ const Page = async ({ const { locale, catetgoryName } = params setRequestLocale(locale) - const [appsData] = await loadData() + // Fetch data from data layer with Next.js caching + const appsDataResult = await getCachedData>( + FETCH_APPS_TASK_ID, + REVALIDATE_TIME + ) + + // Handle missing data gracefully + const appsData = appsDataResult || {} const t = await getTranslations({ locale, namespace: "page-apps" }) diff --git a/app/[locale]/apps/page.tsx b/app/[locale]/apps/page.tsx index 7a5e40c9596..1cdb4db117a 100644 --- a/app/[locale]/apps/page.tsx +++ b/app/[locale]/apps/page.tsx @@ -5,6 +5,7 @@ import { setRequestLocale, } from "next-intl/server" +import type { AppData, CommunityPick } from "@/lib/types" import { CommitHistory, Lang, PageParams } from "@/lib/types" import Breadcrumbs from "@/components/Breadcrumbs" @@ -15,11 +16,13 @@ import SubpageCard from "@/components/SubpageCard" import { getDiscoverApps, getHighlightedApps } from "@/lib/utils/apps" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" import { appsCategories } from "@/data/apps/categories" +import { FETCH_APPS_TASK_ID } from "@/data-layer/api/fetchApps" +import { FETCH_COMMUNITY_PICKS_TASK_ID } from "@/data-layer/api/fetchCommunityPicks" +import { getCachedData } from "@/data-layer/storage/cachedGetter" import { BASE_TIME_UNIT } from "@/lib/constants" @@ -30,26 +33,29 @@ import SuggestAnApp from "./_components/SuggestAnApp" import TopApps from "./_components/TopApps" import AppsJsonLD from "./page-jsonld" -import { fetchApps } from "@/lib/api/fetchApps" -import { fetchCommunityPicks } from "@/lib/api/fetchCommunityPicks" - // 24 hours const REVALIDATE_TIME = BASE_TIME_UNIT * 24 -const loadData = dataLoader( - [ - ["appsData", fetchApps], - ["communityPicks", fetchCommunityPicks], - ], - REVALIDATE_TIME * 1000 -) - const Page = async ({ params }: { params: PageParams }) => { const { locale } = params setRequestLocale(locale) - const [appsData, communityPicks] = await loadData() + // Fetch data from data layer with Next.js caching + const [appsDataResult, communityPicksResult] = await Promise.all([ + getCachedData>( + FETCH_APPS_TASK_ID, + REVALIDATE_TIME + ), + getCachedData( + FETCH_COMMUNITY_PICKS_TASK_ID, + REVALIDATE_TIME + ), + ]) + + // Handle missing data gracefully + const appsData = appsDataResult || {} + const communityPicks = communityPicksResult || [] // Get 3 random highlighted apps const highlightedApps = getHighlightedApps(appsData, 3) From caed0b32e4f8b2f7d85a1a4b6ca61253b4ac8268 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 8 Dec 2025 14:42:14 -0700 Subject: [PATCH 2/4] migrate pages --- app/[locale]/[...slug]/page.tsx | 20 ++- .../developers/local-environment/page.tsx | 29 ++++- app/[locale]/enterprise/page.tsx | 72 +++++++---- app/[locale]/layer-2/page.tsx | 39 ++++-- app/[locale]/page.tsx | 115 ++++++++++++------ app/[locale]/resources/page.tsx | 61 +++++----- app/[locale]/stablecoins/page.tsx | 72 ++++++----- app/[locale]/staking/page.tsx | 48 +++++--- src/lib/api/ghRepoData.ts | 2 +- 9 files changed, 297 insertions(+), 161 deletions(-) diff --git a/app/[locale]/[...slug]/page.tsx b/app/[locale]/[...slug]/page.tsx index b731f3f7c87..7ae7f672f2e 100644 --- a/app/[locale]/[...slug]/page.tsx +++ b/app/[locale]/[...slug]/page.tsx @@ -7,26 +7,29 @@ import { } from "next-intl/server" import type { SlugPageParams } from "@/lib/types" +import type { GHIssue } from "@/lib/types" import I18nProvider from "@/components/I18nProvider" import mdComponents from "@/components/MdComponents" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { dateToString } from "@/lib/utils/date" import { getLayoutFromSlug } from "@/lib/utils/layout" import { checkPathValidity, getPostSlugs } from "@/lib/utils/md" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" -import { LOCALES_CODES } from "@/lib/constants" +import { FETCH_GFIS_TASK_ID } from "@/data-layer/api/fetchGFIs" +import { getCachedData } from "@/data-layer/storage/cachedGetter" + +import { BASE_TIME_UNIT, LOCALES_CODES } from "@/lib/constants" import SlugJsonLD from "./page-jsonld" import { componentsMapping, layoutMapping } from "@/layouts" -import { fetchGFIs } from "@/lib/api/fetchGFIs" import { getPageData } from "@/lib/md/data" import { getMdMetadata } from "@/lib/md/metadata" -const loadData = dataLoader([["gfissues", fetchGFIs]]) +// In seconds - GFIs don't change frequently, so use 24 hours +const REVALIDATE_TIME = BASE_TIME_UNIT * 24 export default async function Page({ params }: { params: SlugPageParams }) { const { locale, slug: slugArray } = params @@ -40,7 +43,14 @@ export default async function Page({ params }: { params: SlugPageParams }) { // Enable static rendering setRequestLocale(locale) - const [gfissues] = await loadData() + // Fetch data from data layer with Next.js caching + const gfissuesResult = await getCachedData( + FETCH_GFIS_TASK_ID, + REVALIDATE_TIME + ) + + // Handle missing data gracefully + const gfissues = gfissuesResult || [] const slug = slugArray.join("/") diff --git a/app/[locale]/developers/local-environment/page.tsx b/app/[locale]/developers/local-environment/page.tsx index c8cf206e3e0..433a24ee6e2 100644 --- a/app/[locale]/developers/local-environment/page.tsx +++ b/app/[locale]/developers/local-environment/page.tsx @@ -6,29 +6,46 @@ import { } from "next-intl/server" import type { CommitHistory, Lang, PageParams } from "@/lib/types" +import type { Framework } from "@/lib/interfaces" import I18nProvider from "@/components/I18nProvider" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" +import { FETCH_GITHUB_REPO_DATA_TASK_ID } from "@/data-layer/api/fetchGithubRepoData" +import { getCachedData } from "@/data-layer/storage/cachedGetter" + +import { BASE_TIME_UNIT } from "@/lib/constants" + import LocalEnvironmentPage from "./_components/local-environment" import LocalEnvironmentJsonLD from "./page-jsonld" -import { getLocalEnvironmentFrameworkData } from "@/lib/api/ghRepoData" +import { frameworksList } from "@/lib/api/ghRepoData" -const loadData = dataLoader([ - ["frameworksListData", getLocalEnvironmentFrameworkData], -]) +// In seconds - GitHub repo data doesn't change frequently, so use 24 hours +const REVALIDATE_TIME = BASE_TIME_UNIT * 24 const Page = async ({ params }: { params: PageParams }) => { const { locale } = params setRequestLocale(locale) - const [frameworksListData] = await loadData() + // Fetch GitHub repo data from data layer with Next.js caching + const githubRepoDataResult = await getCachedData< + Record + >(FETCH_GITHUB_REPO_DATA_TASK_ID, REVALIDATE_TIME) + + // Combine static framework list with GitHub repo data + const frameworksListData: Framework[] = frameworksList.map((framework) => { + const repoData = githubRepoDataResult?.[framework.githubUrl] + return { + ...framework, + starCount: repoData?.starCount, + languages: repoData?.languages?.slice(0, 2), + } + }) // Get i18n messages const allMessages = await getMessages({ locale }) diff --git a/app/[locale]/enterprise/page.tsx b/app/[locale]/enterprise/page.tsx index 2547db4cb45..f4ea39e8957 100644 --- a/app/[locale]/enterprise/page.tsx +++ b/app/[locale]/enterprise/page.tsx @@ -3,8 +3,11 @@ import dynamic from "next/dynamic" import { getTranslations } from "next-intl/server" import type { + BeaconchainEpochData, CommitHistory, + GrowThePieData, Lang, + MetricReturnData, PageParams, StatsBoxMetric, } from "@/lib/types" @@ -49,9 +52,14 @@ import { Skeleton, SkeletonLines } from "@/components/ui/skeleton" import { cn } from "@/lib/utils/cn" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" +import { FETCH_BEACONCHAIN_EPOCH_TASK_ID } from "@/data-layer/api/fetchBeaconChainEpoch" +import { FETCH_ETHEREUM_STABLECOINS_MCAP_TASK_ID } from "@/data-layer/api/fetchEthereumStablecoinsMcap" +import { FETCH_ETH_PRICE_TASK_ID } from "@/data-layer/api/fetchEthPrice" +import { FETCH_GROW_THE_PIE_TASK_ID } from "@/data-layer/api/fetchGrowThePie" +import { getCachedData } from "@/data-layer/storage/cachedGetter" + import { BASE_TIME_UNIT } from "@/lib/constants" import CasesColumn from "./_components/CasesColumn" @@ -67,10 +75,6 @@ import EnterprisePageJsonLD from "./page-jsonld" import type { Case, EcosystemPlayer, Feature } from "./types" import { parseActivity } from "./utils" -import { fetchBeaconchainEpoch } from "@/lib/api/fetchBeaconchainEpoch" -import { fetchEthereumStablecoinsMcap } from "@/lib/api/fetchEthereumStablecoinsMcap" -import { fetchEthPrice } from "@/lib/api/fetchEthPrice" -import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie" import EthGlyph from "@/public/images/assets/svgs/eth-diamond-rainbow.svg" import heroImage from "@/public/images/heroes/enterprise-hero-white.png" @@ -97,31 +101,57 @@ const CasesSwiper = dynamic(() => import("./_components/CasesSwiper"), { ), }) -const loadData = dataLoader( - [ - ["growThePieData", fetchGrowThePie], - ["ethereumStablecoins", fetchEthereumStablecoinsMcap], - ["ethPrice", fetchEthPrice], - ["beaconchainEpoch", fetchBeaconchainEpoch], - ], - BASE_TIME_UNIT * 1000 -) +// In seconds +const REVALIDATE_TIME = BASE_TIME_UNIT * 1 const Page = async ({ params }: { params: PageParams }) => { const { locale } = params const t = await getTranslations({ locale, namespace: "page-enterprise" }) + // Fetch data from data layer with Next.js caching const [ - { txCount, txCostsMedianUsd }, - stablecoinMarketCap, - ethPrice, - { totalEthStaked }, - ] = await loadData() + growThePieDataResult, + stablecoinMarketCapResult, + ethPriceResult, + beaconchainEpochResult, + ] = await Promise.all([ + getCachedData(FETCH_GROW_THE_PIE_TASK_ID, REVALIDATE_TIME), + getCachedData( + FETCH_ETHEREUM_STABLECOINS_MCAP_TASK_ID, + REVALIDATE_TIME + ), + getCachedData(FETCH_ETH_PRICE_TASK_ID, REVALIDATE_TIME), + getCachedData( + FETCH_BEACONCHAIN_EPOCH_TASK_ID, + REVALIDATE_TIME + ), + ]) + + // Handle missing data gracefully + const growThePieData = growThePieDataResult || { + dailyTxCosts: {}, + activeAddresses: {}, + txCount: { value: 0, timestamp: Date.now() }, + txCostsMedianUsd: { value: 0, timestamp: Date.now() }, + } + const stablecoinMarketCap: MetricReturnData = stablecoinMarketCapResult || { + value: 0, + timestamp: Date.now(), + } + const ethPrice: MetricReturnData = ethPriceResult || { + value: 0, + timestamp: Date.now(), + } + const totalEthStaked: MetricReturnData = + beaconchainEpochResult?.totalEthStaked || { + value: 0, + timestamp: Date.now(), + } const metrics = await parseActivity({ - txCount, - txCostsMedianUsd, + txCount: growThePieData.txCount, + txCostsMedianUsd: growThePieData.txCostsMedianUsd, stablecoinMarketCap, ethPrice, totalEthStaked, diff --git a/app/[locale]/layer-2/page.tsx b/app/[locale]/layer-2/page.tsx index 80b317c6f51..0ea2f765e0b 100644 --- a/app/[locale]/layer-2/page.tsx +++ b/app/[locale]/layer-2/page.tsx @@ -6,16 +6,19 @@ import { } from "next-intl/server" import type { CommitHistory, Lang, PageParams } from "@/lib/types" +import type { GrowThePieData } from "@/lib/types" import I18nProvider from "@/components/I18nProvider" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" import { networkMaturity } from "@/lib/utils/networkMaturity" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" import { layer2Data } from "@/data/networks/networks" +import { FETCH_GROW_THE_PIE_TASK_ID } from "@/data-layer/api/fetchGrowThePie" +import { FETCH_L2BEAT_TASK_ID } from "@/data-layer/api/fetchL2beat" +import { getCachedData } from "@/data-layer/storage/cachedGetter" import { BASE_TIME_UNIT } from "@/lib/constants" @@ -23,26 +26,38 @@ import Layer2Page from "./_components/layer-2" import Layer2PageJsonLD from "./page-jsonld" import { routing } from "@/i18n/routing" -import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie" -import { fetchL2beat } from "@/lib/api/fetchL2beat" // In seconds const REVALIDATE_TIME = BASE_TIME_UNIT * 24 -const loadData = dataLoader( - [ - ["growThePieData", fetchGrowThePie], - ["l2beatData", fetchL2beat], - ], - REVALIDATE_TIME * 1000 -) - const Page = async ({ params }: { params: PageParams }) => { const { locale } = params setRequestLocale(locale) - const [growThePieData, l2beatData] = await loadData() + // Fetch data from data layer with Next.js caching + const [growThePieDataResult, l2beatDataResult] = await Promise.all([ + getCachedData(FETCH_GROW_THE_PIE_TASK_ID, REVALIDATE_TIME), + getCachedData<{ + projects: Record< + string, + { + stage?: string + tvl?: { total: number } + risks?: Array<{ name: string; sentiment: string }> + } + > + }>(FETCH_L2BEAT_TASK_ID, REVALIDATE_TIME), + ]) + + // Handle missing data gracefully + const growThePieData = growThePieDataResult || { + dailyTxCosts: {}, + activeAddresses: {}, + txCount: { value: 0, timestamp: Date.now() }, + txCostsMedianUsd: { value: 0, timestamp: Date.now() }, + } + const l2beatData = l2beatDataResult || { projects: {} } const getRandomL2s = () => { let randomL2s = layer2Data.filter( diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index ec1513556dd..f0d6ef26e18 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -5,11 +5,16 @@ import { getTranslations, setRequestLocale } from "next-intl/server" import type { AllHomepageActivityData, + AppData, + BeaconchainEpochData, CommunityBlog, + GrowThePieData, + MetricReturnData, PageParams, + RSSItem, ValuesPairing, } from "@/lib/types" -import { CodeExample } from "@/lib/interfaces" +import { CodeExample, type CommunityEventsReturnType } from "@/lib/interfaces" import ActivityStats from "@/components/ActivityStats" import FusakaBanner from "@/components/Banners/FusakaBanner" @@ -62,18 +67,24 @@ import WindowBox from "@/components/WindowBox" import { parseAppsOfTheWeek } from "@/lib/utils/apps" import { cn } from "@/lib/utils/cn" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { isValidDate } from "@/lib/utils/date" import { getDirection } from "@/lib/utils/direction" import { getMetadata } from "@/lib/utils/metadata" import { polishRSSList } from "@/lib/utils/rss" import events from "@/data/community-events.json" +import { FETCH_APPS_TASK_ID } from "@/data-layer/api/fetchApps" +import { FETCH_BEACONCHAIN_EPOCH_TASK_ID } from "@/data-layer/api/fetchBeaconChainEpoch" +import { FETCH_CALENDAR_EVENTS_TASK_ID } from "@/data-layer/api/fetchCalendarEvents" +import { FETCH_ETH_PRICE_TASK_ID } from "@/data-layer/api/fetchEthPrice" +import { FETCH_GROW_THE_PIE_TASK_ID } from "@/data-layer/api/fetchGrowThePie" +import { FETCH_POSTS_TASK_ID } from "@/data-layer/api/fetchPosts" +import { FETCH_RSS_TASK_ID } from "@/data-layer/api/fetchRSS" +import { FETCH_TOTAL_VALUE_LOCKED_TASK_ID } from "@/data-layer/api/fetchTotalValueLocked" +import { getCachedData } from "@/data-layer/storage/cachedGetter" import { - ATTESTANT_BLOG, BASE_TIME_UNIT, - BLOG_FEEDS, BLOGS_WITHOUT_FEED, CALENDAR_DISPLAY_COUNT, DEFAULT_LOCALE, @@ -87,14 +98,6 @@ import IndexPageJsonLD from "./page-jsonld" import { getActivity, getUpcomingEvents } from "./utils" import { routing } from "@/i18n/routing" -import { fetchCommunityEvents } from "@/lib/api/calendarEvents" -import { fetchApps } from "@/lib/api/fetchApps" -import { fetchBeaconchainEpoch } from "@/lib/api/fetchBeaconchainEpoch" -import { fetchEthPrice } from "@/lib/api/fetchEthPrice" -import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie" -import { fetchAttestantPosts } from "@/lib/api/fetchPosts" -import { fetchRSS } from "@/lib/api/fetchRSS" -import { fetchTotalValueLocked } from "@/lib/api/fetchTotalValueLocked" import EventFallback from "@/public/images/events/event-placeholder.png" import RoadmapFusakaImage from "@/public/images/roadmap/roadmap-fusaka.png" @@ -132,28 +135,9 @@ const ValuesMarquee = dynamic( } ) -const fetchXmlBlogFeeds = async () => { - const xmlUrls = BLOG_FEEDS.filter((feed) => ![ATTESTANT_BLOG].includes(feed)) - return await fetchRSS(xmlUrls) -} - // In seconds const REVALIDATE_TIME = BASE_TIME_UNIT * 1 -const loadData = dataLoader( - [ - ["ethPrice", fetchEthPrice], - ["beaconchainEpoch", fetchBeaconchainEpoch], - ["totalValueLocked", fetchTotalValueLocked], - ["growThePieData", fetchGrowThePie], - ["communityEvents", fetchCommunityEvents], - ["attestantPosts", fetchAttestantPosts], - ["rssData", fetchXmlBlogFeeds], - ["appsData", fetchApps], - ], - REVALIDATE_TIME * 1000 -) - const Page = async ({ params }: { params: PageParams }) => { const { locale } = params @@ -165,16 +149,67 @@ const Page = async ({ params }: { params: PageParams }) => { const tCommon = await getTranslations({ locale, namespace: "common" }) const { direction: dir, isRtl } = getDirection(locale) + // Fetch data from data layer with Next.js caching const [ - ethPrice, - { totalEthStaked }, - totalValueLocked, - growThePieData, - communityEvents, - attestantPosts, - xmlBlogs, - appsData, - ] = await loadData() + ethPriceResult, + beaconchainEpochResult, + totalValueLockedResult, + growThePieDataResult, + communityEventsResult, + attestantPostsResult, + rssDataResult, + appsDataResult, + ] = await Promise.all([ + getCachedData(FETCH_ETH_PRICE_TASK_ID, REVALIDATE_TIME), + getCachedData( + FETCH_BEACONCHAIN_EPOCH_TASK_ID, + REVALIDATE_TIME + ), + getCachedData( + FETCH_TOTAL_VALUE_LOCKED_TASK_ID, + REVALIDATE_TIME + ), + getCachedData(FETCH_GROW_THE_PIE_TASK_ID, REVALIDATE_TIME), + getCachedData( + FETCH_CALENDAR_EVENTS_TASK_ID, + REVALIDATE_TIME + ), + getCachedData(FETCH_POSTS_TASK_ID, REVALIDATE_TIME), + getCachedData(FETCH_RSS_TASK_ID, REVALIDATE_TIME), + getCachedData>( + FETCH_APPS_TASK_ID, + REVALIDATE_TIME + ), + ]) + + // Handle missing data gracefully + const ethPrice: MetricReturnData = ethPriceResult || { + value: 0, + timestamp: Date.now(), + } + const totalEthStaked: MetricReturnData = + beaconchainEpochResult?.totalEthStaked || { + value: 0, + timestamp: Date.now(), + } + const totalValueLocked: MetricReturnData = totalValueLockedResult || { + value: 0, + timestamp: Date.now(), + } + const growThePieData: GrowThePieData = growThePieDataResult || { + dailyTxCosts: {}, + activeAddresses: {}, + txCount: { value: 0, timestamp: Date.now() }, + txCostsMedianUsd: { value: 0, timestamp: Date.now() }, + } + const communityEvents: CommunityEventsReturnType = communityEventsResult || { + pastEventData: [], + upcomingEventData: [], + } + const attestantPosts: RSSItem[] = attestantPostsResult || [] + // fetchRSS already filters out ATTESTANT_BLOG, so no need to filter again + const xmlBlogs: RSSItem[][] = rssDataResult || [] + const appsData: Record = appsDataResult || {} const appsOfTheWeek = parseAppsOfTheWeek(appsData) diff --git a/app/[locale]/resources/page.tsx b/app/[locale]/resources/page.tsx index 8e813db2d94..8cd5ee1b1d7 100644 --- a/app/[locale]/resources/page.tsx +++ b/app/[locale]/resources/page.tsx @@ -1,6 +1,7 @@ import { getTranslations } from "next-intl/server" import type { CommitHistory, Lang, PageParams } from "@/lib/types" +import type { GrowThePieData } from "@/lib/types" import BannerNotification from "@/components/Banners/BannerNotification" import { HubHero } from "@/components/Hero" @@ -16,55 +17,59 @@ import TabNav, { StickyContainer } from "@/components/ui/TabNav" import { cn } from "@/lib/utils/cn" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" -import { GITHUB_REPO_URL } from "@/lib/constants" -import { BASE_TIME_UNIT } from "@/lib/constants" +import { FETCH_BLOBSCAN_STATS_TASK_ID } from "@/data-layer/api/fetchBlobscanStats" +import { FETCH_GROW_THE_PIE_TASK_ID } from "@/data-layer/api/fetchGrowThePie" +import { getCachedData } from "@/data-layer/storage/cachedGetter" + +import { BASE_TIME_UNIT, GITHUB_REPO_URL } from "@/lib/constants" import { ResourceItem, ResourcesContainer } from "./_components/ResourcesUI" import ResourcesPageJsonLD from "./page-jsonld" import { getResources } from "./utils" -import { fetchBlobscanStats } from "@/lib/api/fetchBlobscanStats" -import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie" import heroImg from "@/public/images/heroes/guides-hub-hero.jpg" // In seconds const REVALIDATE_TIME = BASE_TIME_UNIT * 1 const EVENT_CATEGORY = "dashboard" -const loadData = dataLoader( - [ - ["growThePieData", fetchGrowThePie], - ["blobscanOverallStats", fetchBlobscanStats], - ], - REVALIDATE_TIME * 1000 -) - const Page = async ({ params }: { params: PageParams }) => { const { locale } = params const t = await getTranslations({ locale, namespace: "page-resources" }) - // Load data - const [growThePieData, blobscanOverallStats] = await loadData() + // Fetch data from data layer with Next.js caching + const [growThePieDataResult, blobscanOverallStatsResult] = await Promise.all([ + getCachedData(FETCH_GROW_THE_PIE_TASK_ID, REVALIDATE_TIME), + getCachedData<{ + avgBlobFee: number + totalBlobs: number + }>(FETCH_BLOBSCAN_STATS_TASK_ID, REVALIDATE_TIME), + ]) + // Handle missing data gracefully + const growThePieData = growThePieDataResult || { + dailyTxCosts: {}, + activeAddresses: {}, + txCount: { value: 0, timestamp: Date.now() }, + txCostsMedianUsd: { value: 0, timestamp: Date.now() }, + } const { txCostsMedianUsd } = growThePieData - const blobStats = - "error" in blobscanOverallStats - ? { - avgBlobFee: "—", - totalBlobs: "—", - } - : { - avgBlobFee: blobscanOverallStats.value.avgBlobFee, - totalBlobs: new Intl.NumberFormat(undefined, { - notation: "compact", - maximumFractionDigits: 1, - }).format(blobscanOverallStats.value.totalBlobs), - } + const blobStats = blobscanOverallStatsResult + ? { + avgBlobFee: blobscanOverallStatsResult.avgBlobFee, + totalBlobs: new Intl.NumberFormat(undefined, { + notation: "compact", + maximumFractionDigits: 1, + }).format(blobscanOverallStatsResult.totalBlobs), + } + : { + avgBlobFee: "—", + totalBlobs: "—", + } const resourceSections = await getResources({ txCostsMedianUsd, diff --git a/app/[locale]/stablecoins/page.tsx b/app/[locale]/stablecoins/page.tsx index 8db7c9c01ce..500562613d5 100644 --- a/app/[locale]/stablecoins/page.tsx +++ b/app/[locale]/stablecoins/page.tsx @@ -32,16 +32,17 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { cn } from "@/lib/utils/cn" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" +import { FETCH_STABLECOINS_DATA_TASK_ID } from "@/data-layer/api/fetchStablecoinsData" +import { getCachedData } from "@/data-layer/storage/cachedGetter" + import { BASE_TIME_UNIT } from "@/lib/constants" import { stablecoins } from "./data" import StablecoinsPageJsonLD from "./page-jsonld" -import { fetchEthereumStablecoinsData } from "@/lib/api/stablecoinsData" import sparkfiImg from "@/public/images/dapps/sparkfi.png" import summerfiImg from "@/public/images/dapps/summerfi.png" import dogeComputerImg from "@/public/images/doge-computer.png" @@ -88,11 +89,6 @@ const Section = ({
) -const loadData = dataLoader<[CoinGeckoCoinMarketResponse]>( - [["ethereumStablecoinsData", fetchEthereumStablecoinsData]], - REVALIDATE_TIME * 1000 -) - async function Page({ params }: { params: PageParams }) { const { locale } = params const t = await getTranslations({ locale, namespace: "page-stablecoins" }) @@ -111,32 +107,44 @@ async function Page({ params }: { params: PageParams }) { try { marketsHasError = false - const [stablecoinsData] = await loadData() - - const ethereumStablecoinData = stablecoins - .map(({ id, ...rest }) => { - const coinMarketData = stablecoinsData.find((coin) => coin.id === id) - if (!coinMarketData) { - console.warn("CoinGecko stablecoin data not found:", id) - return null - } - return { ...coinMarketData, ...rest } - }) - .filter( - (coin): coin is Exclude => - coin !== null && coin.market_cap >= MIN_MARKET_CAP_USD + // Fetch data from data layer with Next.js caching + const stablecoinsDataResult = + await getCachedData( + FETCH_STABLECOINS_DATA_TASK_ID, + REVALIDATE_TIME ) - .sort((a, b) => b.market_cap - a.market_cap) - .map(({ market_cap, ...rest }) => ({ - ...rest, - marketCap: new Intl.NumberFormat("en-US", { - style: "currency", - currency: "USD", - minimumFractionDigits: 0, - maximumFractionDigits: 0, - }).format(market_cap), - })) - coinDetails.push(...ethereumStablecoinData) + + // Handle missing data gracefully + if (!stablecoinsDataResult || !Array.isArray(stablecoinsDataResult)) { + marketsHasError = true + } else { + const ethereumStablecoinData = stablecoins + .map(({ id, ...rest }) => { + const coinMarketData = stablecoinsDataResult.find( + (coin) => coin.id === id + ) + if (!coinMarketData) { + console.warn("CoinGecko stablecoin data not found:", id) + return null + } + return { ...coinMarketData, ...rest } + }) + .filter( + (coin): coin is Exclude => + coin !== null && coin.market_cap >= MIN_MARKET_CAP_USD + ) + .sort((a, b) => b.market_cap - a.market_cap) + .map(({ market_cap, ...rest }) => ({ + ...rest, + marketCap: new Intl.NumberFormat("en-US", { + style: "currency", + currency: "USD", + minimumFractionDigits: 0, + maximumFractionDigits: 0, + }).format(market_cap), + })) + coinDetails.push(...ethereumStablecoinData) + } } catch (error) { console.error(error) marketsHasError = true // TODO: Handle error state diff --git a/app/[locale]/staking/page.tsx b/app/[locale]/staking/page.tsx index ae0f9750650..3c41c5515b0 100644 --- a/app/[locale]/staking/page.tsx +++ b/app/[locale]/staking/page.tsx @@ -5,45 +5,61 @@ import { setRequestLocale, } from "next-intl/server" +import type { BeaconchainEpochData, MetricReturnData } from "@/lib/types" import { CommitHistory, Lang, PageParams, StakingStatsData } from "@/lib/types" import I18nProvider from "@/components/I18nProvider" import { getAppPageContributorInfo } from "@/lib/utils/contributors" -import { dataLoader } from "@/lib/utils/data/dataLoader" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" +import { FETCH_BEACONCHAIN_EPOCH_TASK_ID } from "@/data-layer/api/fetchBeaconChainEpoch" +import { FETCH_BEACONCHAIN_ETHSTORE_TASK_ID } from "@/data-layer/api/fetchBeaconChainEthstore" +import { getCachedData } from "@/data-layer/storage/cachedGetter" + import { BASE_TIME_UNIT } from "@/lib/constants" import StakingPage from "./_components/staking" import StakingPageJsonLD from "./page-jsonld" -import { fetchBeaconchainEpoch } from "@/lib/api/fetchBeaconchainEpoch" -import { fetchBeaconchainEthstore } from "@/lib/api/fetchBeaconchainEthstore" - // In seconds const REVALIDATE_TIME = BASE_TIME_UNIT * 1 -const loadData = dataLoader( - [ - ["beaconchainEpoch", fetchBeaconchainEpoch], - ["beaconchainApr", fetchBeaconchainEthstore], - ], - REVALIDATE_TIME * 1000 -) - const Page = async ({ params }: { params: PageParams }) => { const { locale } = params setRequestLocale(locale) - const [{ totalEthStaked, validatorscount }, apr] = await loadData() + // Fetch data from data layer with Next.js caching + const [beaconchainEpochResult, aprResult] = await Promise.all([ + getCachedData( + FETCH_BEACONCHAIN_EPOCH_TASK_ID, + REVALIDATE_TIME + ), + getCachedData( + FETCH_BEACONCHAIN_ETHSTORE_TASK_ID, + REVALIDATE_TIME + ), + ]) + + // Handle missing data gracefully + const totalEthStaked = + beaconchainEpochResult?.totalEthStaked && + "value" in beaconchainEpochResult.totalEthStaked + ? beaconchainEpochResult.totalEthStaked.value + : 0 + const validatorscount = + beaconchainEpochResult?.validatorscount && + "value" in beaconchainEpochResult.validatorscount + ? beaconchainEpochResult.validatorscount.value + : 0 + const apr = aprResult && "value" in aprResult ? aprResult.value : 0 const data: StakingStatsData = { - totalEthStaked: "value" in totalEthStaked ? totalEthStaked.value : 0, - validatorscount: "value" in validatorscount ? validatorscount.value : 0, - apr: "value" in apr ? apr.value : 0, + totalEthStaked, + validatorscount, + apr, } // Get i18n messages diff --git a/src/lib/api/ghRepoData.ts b/src/lib/api/ghRepoData.ts index 876e72d2e14..614928a0ed4 100644 --- a/src/lib/api/ghRepoData.ts +++ b/src/lib/api/ghRepoData.ts @@ -6,7 +6,7 @@ import HardhatImage from "@/public/images/dev-tools/hardhat.png" import KurtosisImage from "@/public/images/dev-tools/kurtosis.png" import ScaffoldEthImage from "@/public/images/dev-tools/scaffoldeth.png" -const frameworksList: Array = [ +export const frameworksList: Array = [ { id: "Kurtosis Ethereum Package", url: "https://github.com/kurtosis-tech/ethereum-package", From cfaa878b311f4b64854405c6bc45015cdc36562c Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 8 Dec 2025 14:42:58 -0700 Subject: [PATCH 3/4] deprecate dataloader, old api calls, and old mocks --- src/data/mocks/appsData.json | 4840 ---------- src/data/mocks/attestantPosts.json | 22 - src/data/mocks/beaconchainApr.json | 1 - src/data/mocks/beaconchainEpoch.json | 4 - src/data/mocks/blobscanOverallStats.json | 18 - src/data/mocks/communityEvents.json | 1 - src/data/mocks/communityPicks.json | 26 - src/data/mocks/ethPrice.json | 1 - src/data/mocks/ethereumEcosystemData.json | 1 - src/data/mocks/ethereumMarketcapData.json | 1 - src/data/mocks/ethereumStablecoins.json | 1 - src/data/mocks/ethereumStablecoinsData.json | 1 - src/data/mocks/fetched10YearEvents.json | 392 - src/data/mocks/fetched10YearStories.json | 230 - src/data/mocks/fetchedTorchHolders.json | 1 - src/data/mocks/frameworksListData.json | 1 - src/data/mocks/gfissues.json | 92 - src/data/mocks/growThePieBlockspaceData.json | 65 - src/data/mocks/growThePieData.json | 60 - src/data/mocks/growThePieMasterData.json | 32 - src/data/mocks/l2beatData.json | 8810 ------------------ src/data/mocks/rssData.json | 66 - src/data/mocks/stakingStatsData.json | 1 - src/data/mocks/totalEthStaked.json | 1 - src/data/mocks/totalValueLocked.json | 1 - src/data/mocks/translatathonTranslators.json | 602 -- src/lib/api/calendarEvents.ts | 47 - src/lib/api/fetchApps.ts | 181 - src/lib/api/fetchBeaconchainEpoch.ts | 62 - src/lib/api/fetchBeaconchainEthstore.ts | 50 - src/lib/api/fetchBlobscanStats.ts | 38 - src/lib/api/fetchCommunityPicks.ts | 41 - src/lib/api/fetchEthPrice.ts | 12 - src/lib/api/fetchEthereumMarketcap.ts | 13 - src/lib/api/fetchEthereumStablecoinsMcap.ts | 38 - src/lib/api/fetchGFIs.ts | 35 - src/lib/api/fetchGitHistory.ts | 83 - src/lib/api/fetchGrowThePie.ts | 89 - src/lib/api/fetchGrowThePieBlockspace.ts | 24 - src/lib/api/fetchGrowThePieMaster.ts | 28 - src/lib/api/fetchL2beat.ts | 9 - src/lib/api/fetchPosts.ts | 50 - src/lib/api/fetchRSS.ts | 158 - src/lib/api/fetchTotalEthStaked.ts | 32 - src/lib/api/fetchTotalValueLocked.ts | 16 - src/lib/api/ghRepoData.ts | 140 - src/lib/api/stablecoinsData.ts | 22 - src/lib/utils/data/cacheAsyncFn.ts | 54 - src/lib/utils/data/dataLoader.ts | 52 - src/lib/utils/data/loadMockData.ts | 15 - src/lib/utils/data/utils.ts | 66 - 51 files changed, 16626 deletions(-) delete mode 100644 src/data/mocks/appsData.json delete mode 100644 src/data/mocks/attestantPosts.json delete mode 100644 src/data/mocks/beaconchainApr.json delete mode 100644 src/data/mocks/beaconchainEpoch.json delete mode 100644 src/data/mocks/blobscanOverallStats.json delete mode 100644 src/data/mocks/communityEvents.json delete mode 100644 src/data/mocks/communityPicks.json delete mode 100644 src/data/mocks/ethPrice.json delete mode 100644 src/data/mocks/ethereumEcosystemData.json delete mode 100644 src/data/mocks/ethereumMarketcapData.json delete mode 100644 src/data/mocks/ethereumStablecoins.json delete mode 100644 src/data/mocks/ethereumStablecoinsData.json delete mode 100644 src/data/mocks/fetched10YearEvents.json delete mode 100644 src/data/mocks/fetched10YearStories.json delete mode 100644 src/data/mocks/fetchedTorchHolders.json delete mode 100644 src/data/mocks/frameworksListData.json delete mode 100644 src/data/mocks/gfissues.json delete mode 100644 src/data/mocks/growThePieBlockspaceData.json delete mode 100644 src/data/mocks/growThePieData.json delete mode 100644 src/data/mocks/growThePieMasterData.json delete mode 100644 src/data/mocks/l2beatData.json delete mode 100644 src/data/mocks/rssData.json delete mode 100644 src/data/mocks/stakingStatsData.json delete mode 100644 src/data/mocks/totalEthStaked.json delete mode 100644 src/data/mocks/totalValueLocked.json delete mode 100644 src/data/mocks/translatathonTranslators.json delete mode 100644 src/lib/api/calendarEvents.ts delete mode 100644 src/lib/api/fetchApps.ts delete mode 100644 src/lib/api/fetchBeaconchainEpoch.ts delete mode 100644 src/lib/api/fetchBeaconchainEthstore.ts delete mode 100644 src/lib/api/fetchBlobscanStats.ts delete mode 100644 src/lib/api/fetchCommunityPicks.ts delete mode 100644 src/lib/api/fetchEthPrice.ts delete mode 100644 src/lib/api/fetchEthereumMarketcap.ts delete mode 100644 src/lib/api/fetchEthereumStablecoinsMcap.ts delete mode 100644 src/lib/api/fetchGFIs.ts delete mode 100644 src/lib/api/fetchGitHistory.ts delete mode 100644 src/lib/api/fetchGrowThePie.ts delete mode 100644 src/lib/api/fetchGrowThePieBlockspace.ts delete mode 100644 src/lib/api/fetchGrowThePieMaster.ts delete mode 100644 src/lib/api/fetchL2beat.ts delete mode 100644 src/lib/api/fetchPosts.ts delete mode 100644 src/lib/api/fetchRSS.ts delete mode 100644 src/lib/api/fetchTotalEthStaked.ts delete mode 100644 src/lib/api/fetchTotalValueLocked.ts delete mode 100644 src/lib/api/ghRepoData.ts delete mode 100644 src/lib/api/stablecoinsData.ts delete mode 100644 src/lib/utils/data/cacheAsyncFn.ts delete mode 100644 src/lib/utils/data/dataLoader.ts delete mode 100644 src/lib/utils/data/loadMockData.ts delete mode 100644 src/lib/utils/data/utils.ts diff --git a/src/data/mocks/appsData.json b/src/data/mocks/appsData.json deleted file mode 100644 index 7719d2407a3..00000000000 --- a/src/data/mocks/appsData.json +++ /dev/null @@ -1,4840 +0,0 @@ -{ - "DeFi": [ - { - "name": "Aave", - "url": "https://aave.com", - "description": "Aave is a decentralised non-custodial liquidity protocol where users can participate as suppliers or borrowers. Suppliers provide liquidity to the market while earning interest, and borrowers can access liquidity by providing collateral that exceeds the borrowed amount.", - "image": "https://i.imgur.com/iaxZ9N8.png", - "category": "DeFi", - "subCategory": [ - "Lending and borrowing" - ], - "networks": [ - "Base", - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/gfy4ae2.png", - "https://i.imgur.com/RRyZ9HN.png" - ], - "bannerImage": "https://i.imgur.com/lCDltCK.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/aave", - "github": "https://github.com/aave", - "discord": "https://discord.com/invite/aave", - "kpiUrl": "", - "sortingWeight": 1, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Avara", - "parentCompanyURL": "https://avara.xyz", - "openSource": true, - "contractAddress": "https://aave.com/docs/resources/addresses", - "dateOfLaunch": "9/18/2018", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Sky/Maker - USDS", - "url": "https://sky.money/", - "description": "Sky.money is a non-custodial gateway to the decentralized Sky Protocol, which centers around the USDS stablecoin.", - "image": "https://i.imgur.com/qwvHjfZ.png", - "category": "DeFi", - "subCategory": [ - "Stablecoin issuance", - "RWA", - "Lending and borrowing" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/YrlOLfQ.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/SkyEcosystem", - "github": "https://github.com/sky-ecosystem", - "discord": "https://discord.com/invite/skyecosystem", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Sky Ecosystem", - "parentCompanyURL": "https://sky.money/", - "openSource": true, - "contractAddress": "https://developers.sky.money/quick-start/deployments-tracker/", - "dateOfLaunch": "9/18/2024", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Ethena - USDE", - "url": "https://ethena.fi/", - "description": "Ethena is a synthetic dollar protocol built on Ethereum that provides a crypto-native solution for money, USDe, alongside a globally accessible dollar savings asset, sUSDe.", - "image": "https://i.imgur.com/4Y0s8zC.png", - "category": "DeFi", - "subCategory": [ - "RWA", - "Stablecoin issuance", - "Yield" - ], - "networks": [ - "Base", - "Linea", - "Blast", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/jE4oO4N.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/ethena_labs", - "github": "https://github.com/ethena-labs", - "discord": "https://discord.com/invite/ethena", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Ethena Labs", - "parentCompanyURL": "https://ethena.fi/", - "openSource": true, - "contractAddress": "https://docs.ethena.fi/api-documentation/overview", - "dateOfLaunch": "2/19/2024", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Uniswap", - "url": "https://app.uniswap.org/", - "description": "Uniswap is an automated liquidity protocol powered by a constant product formula and implemented in a system of non-upgradeable smart contracts on the Ethereum blockchain. It obviates the need for trusted intermediaries, prioritizing decentralization, censorship resistance, and security.", - "image": "https://i.imgur.com/6NqxUnZ.png", - "category": "DeFi", - "subCategory": [ - "DEX" - ], - "networks": [ - "Base", - "Blast", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/rah0enO.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://x.com/Uniswap/", - "github": "https://github.com/uniswap", - "discord": "https://discord.com/invite/uniswap", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English", - "Chinese", - "Japanese", - "French", - "Portuguese", - "Spanish", - "Vietnamese" - ], - "parentCompany": "Uniswap Labs", - "parentCompanyURL": "https://uniswap.org", - "openSource": true, - "contractAddress": "https://docs.uniswap.org/contracts/v4/deployments", - "dateOfLaunch": "11/2/2018", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Pendle", - "url": "https://www.pendle.finance/", - "description": "Pendle is a DeFi protocol focused on yield trading, allowing users to both fix or leverage their yield.", - "image": "https://i.imgur.com/WyUeZqC.png", - "category": "DeFi", - "subCategory": [ - "RWA" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/Ki7C0XF.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/pendle_fi/", - "github": "https://github.com/pendle-finance", - "discord": "https://discord.com/invite/EAujvncY2R", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English", - "Chinese" - ], - "parentCompany": "Pendle Finance", - "parentCompanyURL": "https://www.pendle.finance/", - "openSource": true, - "contractAddress": "https://github.com/pendle-finance/pendle-core-v2-public/blob/main/deployments/1-core.json", - "dateOfLaunch": "6/17/2021", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Spark", - "url": "https://spark.fi/", - "description": "Spark Fi is a non-custodial DeFi protocol that allows users to lend and borrow digital assets through SparkLend, while earning passive income via the USDS stablecoin and its associated Sky Savings Rate.", - "image": "https://i.imgur.com/XsBN52D.png", - "category": "DeFi", - "subCategory": [ - "Lending and borrowing", - "RWA" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/54aFOoV.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/sparkdotfi", - "github": "https://github.com/sparkdotfi", - "discord": "https://discord.com/invite/sparkdotfi", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Spark Foundation", - "parentCompanyURL": "https://spark.fi/", - "openSource": true, - "contractAddress": "https://github.com/sparkdotfi/spark-address-registry/tree/master/src", - "dateOfLaunch": "5/9/2023", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Morpho", - "url": "https://morpho.org/", - "description": "Morpho is an open, efficient, and resilient platform that allows anyone to earn yield and borrow assets. At the same time, developers or businesses can create markets, curate vaults, and build a range of applications on its flexible, permissionless infrastructure.", - "image": "https://i.imgur.com/IPLyiMT.png", - "category": "DeFi", - "subCategory": [ - "Lending and borrowing" - ], - "networks": [ - "Base", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/VrzR6Pp.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/MorphoLabs/", - "github": "https://github.com/morpho-org", - "discord": "https://discord.com/invite/BWXbJMHMdz/", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Morpho Labs", - "parentCompanyURL": "https://morpho.org/", - "openSource": true, - "contractAddress": "https://docs.morpho.org/overview/resources/addresses#addresses", - "dateOfLaunch": "12/20/2022", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Compound", - "url": "https://compound.finance/", - "description": "Compound is an EVM compatible protocol that enables supplying of crypto assets as collateral in order to borrow the base asset. Accounts can also earn interest by supplying the base asset to the protocol.", - "image": "https://i.imgur.com/yFoeO1U.png", - "category": "DeFi", - "subCategory": [ - "Lending and borrowing" - ], - "networks": [ - "Base", - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/oBflT3o.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/compoundfinance/", - "github": "https://github.com/compound-finance", - "discord": "https://discord.com/invite/rps4rfjeGz", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Compound Labs Inc.", - "parentCompanyURL": "https://compound.finance/", - "openSource": true, - "contractAddress": "https://docs.compound.finance/", - "dateOfLaunch": "9/27/2018", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Curve", - "url": "https://www.curve.finance/", - "description": "Curve.fi is a non-custodial decentralized exchange that revolutionized stablecoin trading. It began by offering superior exchange rates for stablecoin swaps (like DAI to USDC) through liquidity pools, where users earn yield by depositing their assets.", - "image": "https://i.imgur.com/NmXvivo.png", - "category": "DeFi", - "subCategory": [ - "DEX" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/8q4O5Hd.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/CurveFinance/", - "github": "https://github.com/curvefi", - "discord": "https://discord.com/invite/9uEHakc", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Curve DAO", - "parentCompanyURL": "https://www.curve.finance/dao/", - "openSource": true, - "contractAddress": "https://docs.curve.finance/deployments/amm/", - "dateOfLaunch": "2/20/2020", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Balancer", - "url": "https://balancer.fi/", - "description": "Balancer is a decentralized automated market maker (AMM) protocol built on Ethereum with a clear focus on fungible and yield-bearing liquidity. Balancer's success is intrinsically linked to the success of protocols and products built on the platform.", - "image": "https://i.imgur.com/9yZ7IJ8.png", - "category": "DeFi", - "subCategory": [ - "DEX" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/u2l56hQ.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/Balancer", - "github": "https://github.com/balancer", - "discord": "https://discord.com/invite/fEPBpe6F", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Balancer Labs", - "parentCompanyURL": "https://balancer.fi/", - "openSource": true, - "contractAddress": "https://docs.balancer.fi/developer-reference/contracts/deployment-addresses/mainnet.html", - "dateOfLaunch": "3/31/2020", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Usual ", - "url": "https://usual.money/", - "description": "Usual is a decentralized protocol, embracing the shape of a decentralized banking system. It issues a fiat-backed stablecoin, collateralized by Real-World Assets (RWAs), combining the security of real assets with the composability and liquidity of DeFi.", - "image": "https://i.imgur.com/MPWo9qE.png", - "category": "DeFi", - "subCategory": [ - "RWA", - "Stablecoin issuance", - "Yield" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/MPWo9qE.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/usualmoney", - "github": "https://github.com/usual-dao", - "discord": "https://discord.usual.money/", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Usual Protocol", - "parentCompanyURL": "https://usual.money", - "openSource": true, - "contractAddress": "https://tech.usual.money/smart-contracts/contract-deployments", - "dateOfLaunch": "5/23/2024", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Fluid", - "url": "https://fluid.io/", - "description": "Fluid is a DeFi protocol combining a liquidity layer, automated limits, lending and vault protocols, robust oracle system, and DEX protocol,", - "image": "https://i.imgur.com/5Oh1Lek.png", - "category": "DeFi", - "subCategory": [ - "Lending and borrowing", - "DEX" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/G2JQeje.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/0xfluid", - "github": "https://github.com/Instadapp", - "discord": "https://discord.com/invite/C76CeZc", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Instadapp", - "parentCompanyURL": "https://instadapp.io/", - "openSource": true, - "contractAddress": "https://github.com/Instadapp/fluid-contracts-public/blob/main/deployments/deployments.md", - "dateOfLaunch": "10/29/2024", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Frax", - "url": "https://frax.finance/", - "description": "Frax currently issues 3 stablecoins: FRAX, FPI, and frxETH, along with numerous other non-stablecoin tokens. There are also multiple contract groups or \"subprotocols\" within it that integrate these tokens to provide utility and stability, including Fraxtal, a modular L2 chain.", - "image": "https://i.imgur.com/2lwTQ6d.png", - "category": "DeFi", - "subCategory": [ - "RWA", - "Stablecoin issuance", - "Lending and borrowing" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/Q2AXkzE.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/fraxfinance", - "github": "https://github.com/FraxFinance", - "discord": "https://discord.gg/fraxfinance", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Frax Finance", - "parentCompanyURL": "https://frax.finance", - "openSource": true, - "contractAddress": "https://docs.frax.com/protocol/assets/frxusd/addresses", - "dateOfLaunch": "12/20/2020", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Aerodrome", - "url": "https://aerodrome.finance/", - "description": "Aerodrome is a decentralized exchange where you can execute low-fee swaps, deposit tokens to earn rewards, and actively participate in the onchain economy.", - "image": "https://i.imgur.com/ESTKcyO.png", - "category": "DeFi", - "subCategory": [ - "DEX" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/fJWk5bn.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/AerodromeFi", - "github": "https://github.com/aerodrome-finance", - "discord": "https://discord.gg/aerodrome", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Aerodrome Finance", - "parentCompanyURL": "https://aerodrome.finance", - "openSource": true, - "contractAddress": "https://aerodrome.finance/security", - "dateOfLaunch": "8/28/2023", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Moonwell", - "url": "https://moonwell.fi/", - "description": "Put your digital assets to work. Lend or borrow to handle whatever life throws your way. Pay it back on your own schedule, with no monthly payments or additional fees.", - "image": "https://i.imgur.com/cIgVDSd.png", - "category": "DeFi", - "subCategory": [ - "Lending and borrowing" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/WeCuzJq.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/MoonwellDeFi", - "github": "https://github.com/moonwell-fi/", - "discord": "https://discord.com/invite/moonwellfi", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Moonwell", - "parentCompanyURL": "https://moonwell.fi", - "openSource": true, - "contractAddress": "https://docs.moonwell.fi/moonwell/protocol-information/contracts", - "dateOfLaunch": "8/9/2023", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Franklin Templeton - BENJI", - "url": "https://digitalassets.franklintempleton.com/benji/", - "description": "Benji is Franklin Templeton's proprietary blockchain-integrated recordkeeping system that enables the tokenization and servicing of mutual funds on public blockchain infrastructure.", - "image": "https://i.imgur.com/e7QgHwP.png", - "category": "DeFi", - "subCategory": [ - "RWA" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/8FU1YZ3.png", - "platforms": [ - "Browser" - ], - "twitter": "", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Franklin Templeton", - "parentCompanyURL": "https://franklintempleton.com", - "openSource": false, - "contractAddress": "https://digitalassets.franklintempleton.com/benji/benji-contracts/", - "dateOfLaunch": "11/14/2024", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Synthetix", - "url": "https://synthetix.io/", - "description": "Synthetix provides liquidity for permissionless derivatives like perpetual futures, options, parimutuel markets, and more across EVM chains.", - "image": "https://i.imgur.com/v4Xkjp7.png", - "category": "DeFi", - "subCategory": [ - "Prediction" - ], - "networks": [ - "Ethereum Mainnet", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/eOcFBl5.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/synthetix_io", - "github": "https://github.com/synthetixio", - "discord": "https://discord.gg/synthetix", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Synthetix", - "parentCompanyURL": "https://synthetix.io", - "openSource": true, - "contractAddress": "https://github.com/Synthetixio/synthetix-deployments", - "dateOfLaunch": "6/26/2018", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "ZeroLend", - "url": "https://zerolend.xyz/", - "description": "ZeroLend is a user-friendly and frictionless lending experience to onboard the masses to Defi. Built on L2s.", - "image": "https://i.imgur.com/WKj2WDX.png", - "category": "DeFi", - "subCategory": [ - "Lending and borrowing" - ], - "networks": [ - "Linea", - "Blast", - "Ethereum Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/MjlZo57.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/zerolendxyz", - "github": "https://github.com/zerolend", - "discord": "https://discord.gg/zerolend", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "ZeroLend", - "parentCompanyURL": "https://zerolend.xyz", - "openSource": true, - "contractAddress": "https://docs.zerolend.xyz/security/deployed-addresses", - "dateOfLaunch": "1/1/2023", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "SyncSwap", - "url": "https://syncswap.xyz/", - "description": "Powered by zero-knowledge technology, SyncSwap brings more people easy-to-use and low-cost DeFi with complete Ethereum security.", - "image": "https://i.imgur.com/vpk2LXa.png", - "category": "DeFi", - "subCategory": [ - "DEX" - ], - "networks": [ - "Scroll", - "Linea", - "zkSync Mainnet", - "Taiko Alethia" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/CEPC1m9.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/syncswap", - "github": "https://github.com/syncswap", - "discord": "https://discord.gg/syncswap", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "SyncSwap", - "parentCompanyURL": "https://syncswap.xyz", - "openSource": true, - "contractAddress": "https://docs.syncswap.xyz/syncswap/smart-contracts/smart-contracts", - "dateOfLaunch": "3/4/2023", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Ekubo", - "url": "https://ekubo.org/", - "description": "Ekubo is an automated market maker, with several unique features including concentrated liquidity and a extensible and gas efficient architecture.", - "image": "https://i.imgur.com/xFOVA9S.png", - "category": "DeFi", - "subCategory": [ - "DEX" - ], - "networks": [ - "Starknet", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/VCZaLrd.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/EkuboProtocol", - "github": "https://github.com/EkuboProtocol", - "discord": "https://discord.com/invite/RFbSXxtqUG", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Ekubo", - "parentCompanyURL": "https://ekubo.org", - "openSource": true, - "contractAddress": "https://docs.ekubo.org/integration-guides/reference/contract-addresses", - "dateOfLaunch": "8/26/2023", - "lastUpdated": "7/7/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Maple", - "url": "https://maple.finance/", - "description": "Maple delivers full-spectrum yield strategies and financing across USDC, USDT, BTC, and more – for institutions and onchain participants around the world.", - "image": "https://i.imgur.com/39h1fde.png", - "category": "DeFi", - "subCategory": [ - "RWA", - "Lending and borrowing" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/tpdQ0Hx.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/maplefinance", - "github": "https://github.com/maple-labs/address-registry/blob/main/MapleAddressRegistryETH.md", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Maple Finance", - "parentCompanyURL": "https://maple.finance", - "openSource": true, - "contractAddress": "https://github.com/maple-labs/address-registry/blob/main/MapleAddressRegistryETH.md", - "dateOfLaunch": "5/12/2021", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Centrifuge", - "url": "https://centrifuge.io/", - "description": "Centrifuge is the platform for tokenized real-world assets, providing the infrastructure and ecosystem to tokenize, manage, and invest into RWAs.", - "image": "https://i.imgur.com/JSO0lIV.png", - "category": "DeFi", - "subCategory": [ - "RWA" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/blvCZ8y.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/centrifuge", - "github": "https://github.com/centrifuge/", - "discord": "https://discord.com/invite/yEzyUq5gxF", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Centrifuge", - "parentCompanyURL": "https:.//centrifuge.io", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "5/22/2023", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Goldfinch", - "url": "https://goldfinch.finance/", - "description": "Goldfinch is a decentralized credit protocol that enables crypto borrowing without crypto collateral. It connects investors with real-world businesses.", - "image": "https://i.imgur.com/iPhuqPh.png", - "category": "DeFi", - "subCategory": [ - "RWA" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/K1R5KEC.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/goldfinch_fi", - "github": "https://github.com/goldfinch-eng", - "discord": "https://discord.com/invite/HVeaca3fN8", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Goldfinch", - "parentCompanyURL": "https://goldfinch.finance", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "1/31/2021", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Superstate", - "url": "https://superstate.com/", - "description": "Superstate connects financial assets with crypto capital markets through on-chain public listings and tokenized securities.", - "image": "https://i.imgur.com/xDIoI7M.png", - "category": "DeFi", - "subCategory": [ - "RWA" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/q3KFe1l.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/superstatefunds", - "github": "https://github.com/superstateinc", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Superstate", - "parentCompanyURL": "https://superstate.co", - "openSource": true, - "contractAddress": "https://docs.superstate.com/introduction-to-superstate/smart-contracts", - "dateOfLaunch": "1/3/2024", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Ondo", - "url": "https://ondo.finance/", - "description": "Ondo designs institutional-grade platforms, assets, and infrastructure to bring financial markets onchain.", - "image": "https://i.imgur.com/lI0Kd4R.png", - "category": "DeFi", - "subCategory": [ - "RWA" - ], - "networks": [ - "Arbitrum One", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/6wE3z1t.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/OndoFinance", - "github": "https://github.com/ondoprotocol", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Ondo", - "parentCompanyURL": "https://ondo.finance", - "openSource": true, - "contractAddress": "https://docs.ondo.finance/addresses", - "dateOfLaunch": "7/27/2021", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "PayPal - PYUSD", - "url": "https://www.paypal.com/pyusd", - "description": "PayPal USD (PYUSD) is a stablecoin backed by secure and highly liquid assets. Buy, sell, hold, and transfer it in the PayPal app or website.", - "image": "https://i.imgur.com/0MC9QNU.png", - "category": "DeFi", - "subCategory": [ - "RWA", - "Stablecoin issuance" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/pDessgi.jpeg", - "https://i.imgur.com/rHoNrFW.jpeg", - "https://i.imgur.com/bRa61P0.jpeg" - ], - "bannerImage": "https://i.imgur.com/N98oDCJ.png", - "platforms": [ - "Browser" - ], - "twitter": "", - "github": "https://github.com/paxosglobal/pyusd-contract", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Paypal", - "parentCompanyURL": "https://paypal.com", - "openSource": false, - "contractAddress": "https://etherscan.io/token/0x6c3ea9036406852006290770bedfcaba0e23a0e8", - "dateOfLaunch": "8/7/2023", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Etherisc", - "url": "https://etherisc.com/", - "description": "Etherisc provides a complete suite of solutions to build, manage, and inspect decentralized insurance products.", - "image": "https://i.imgur.com/ZVOa4fY.png", - "category": "DeFi", - "subCategory": [ - "Insurance" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/EBgQucz.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/etherisc?lang=en", - "github": "https://github.com/etherisc", - "discord": "https://discord.gg/cVsgakVG4R", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Etherisc", - "parentCompanyURL": "https://etherisc.com", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "7/28/2016", - "lastUpdated": "7/28/2016", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Polymarket", - "url": "https://polymarket.com/", - "description": "Polymarket is the world’s largest prediction market, allowing you to stay informed and profit from your knowledge by betting on future events across various topics.", - "image": "https://i.imgur.com/2YlJ2Jq.png", - "category": "DeFi", - "subCategory": [ - "Prediction" - ], - "networks": [], - "screenshots": [], - "bannerImage": "https://i.imgur.com/pXUEFwa.png", - "platforms": [ - "Browser", - "Android", - "iOS" - ], - "twitter": "https://twitter.com/Polymarket", - "github": "", - "discord": "https://discord.gg/Polymarket", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Adventure One QSS Inc", - "parentCompanyURL": "a1qss.com", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "6/16/2020", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "1inch", - "url": "https://1inch.io/", - "description": "1inch is an exchange aggregator that scans decentralized exchanges to find the lowest cryptocurrency prices for traders.", - "image": "https://i.imgur.com/8NYV5YL.png", - "category": "DeFi", - "subCategory": [ - "DEX" - ], - "networks": [ - "Base", - "Linea", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/v9VqXmC.png", - "platforms": [ - "Browser", - "Android", - "iOS" - ], - "twitter": "https://twitter.com/intent/follow?screen_name=1inch", - "github": "https://github.com/1inch", - "discord": "https://discord.com/invite/1inch", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "1inch", - "parentCompanyURL": "https://1inch.io", - "openSource": true, - "contractAddress": "https://portal.1inch.dev/documentation/contracts/aggregation-protocol/aggregation-introduction", - "dateOfLaunch": "5/9/2019", - "lastUpdated": "7/15/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Liquity", - "url": "https://www.liquity.org/", - "description": "Liquity v2 is a decentralized borrowing protocol that lets users deposit ETH or LSTs as collateral, and mint the stablecoin BOLD.", - "image": "https://i.imgur.com/mG928HR.png", - "category": "DeFi", - "subCategory": [ - "RWA", - "Lending and borrowing" - ], - "networks": [ - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/4EWjy7M.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/LiquityProtocol", - "github": "https://github.com/liquity/bold", - "discord": "https://discord.com/invite/HFKpCdgQm6", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Liquity", - "parentCompanyURL": "https://liquity.org", - "openSource": true, - "contractAddress": "https://discord.com/invite/HFKpCdgQm6", - "dateOfLaunch": "4/5/2021", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Cowswap", - "url": "https://cowswap.exchange/", - "description": "CoW Swap finds the lowest prices from all decentralized exchanges and DEX aggregators & saves you more with p2p trading and protection from MEV.", - "image": "https://i.imgur.com/9wgR8rv.png", - "category": "DeFi", - "subCategory": [ - "DEX" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/s6mJj9Z.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/CoWSwap", - "github": "https://github.com/cowprotocol", - "discord": "https://discord.com/invite/cowprotocol", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "CoW DAO", - "parentCompanyURL": "https://cowswap.exchange", - "openSource": true, - "contractAddress": "https://docs.cow.fi/cow-protocol/reference/contracts/core", - "dateOfLaunch": "4/28/2021", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "PoolTogether", - "url": "https://pooltogether.com/", - "description": "PoolTogether is a prize savings game, where users pool yield from their tokens for a chance to win prizes. The protocol is a gamification layer that allows users to have a chance to win big while holding their favourite token.", - "image": "https://i.imgur.com/wtLeg1K.png", - "category": "DeFi", - "subCategory": [ - "Yield" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/0Kmydrv.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/PoolTogether_", - "github": "https://github.com/pooltogether", - "discord": "https://discord.com/invite/hFJh4zJx", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "PoolTogether", - "parentCompanyURL": "https://pooltogether.com", - "openSource": true, - "contractAddress": "https://dev.pooltogether.com/protocol/deployments/", - "dateOfLaunch": "6/24/2019", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Yearn", - "url": "https://yearn.finance/", - "description": "Yearn Finance is yield aggregator that automatically seeks out profit-generating strategies for crypto users through smart contracts.", - "image": "https://i.imgur.com/HR0IJKk.png", - "category": "DeFi", - "subCategory": [ - "Yield", - "Lending and borrowing" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/aCh22JJ.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/yearnfi", - "github": "https://github.com/yearn", - "discord": "https://discord.com/invite/yearn", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Yearn", - "parentCompanyURL": "https://yearn.finance", - "openSource": true, - "contractAddress": "https://docs.yearn.fi/developers/addresses/", - "dateOfLaunch": "7/17/2020", - "lastUpdated": "7/15/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "True Markets", - "url": "https://app.truemarkets.org/en", - "description": "TrueMarkets is a decentralized prediction market platform that enables users to forecast real-world event outcomes by trading binary options, facilitating real-time sentiment analysis and information discovery.", - "image": "https://i.imgur.com/DOJRAj0.png", - "category": "DeFi", - "subCategory": [ - "Prediction" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/kgDbq7g.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/TrueMarketsOrg", - "github": "https://github.com/truemarketsorg", - "discord": "https://discord.gg/truemarkets", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "truemarkets.org", - "parentCompanyURL": "https://truemarkets.org", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "3/11/2025", - "lastUpdated": "7/15/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Flaunch", - "url": "https://flaunch.gg/", - "description": "Flaunch is a permissionless protocol and engine for all forms of tokenization — memes, AI agents, products, art, RWAs and more. The protocol allows builders to create their own Token Managers, providing complete flexibility in the monetization of the assets launched.", - "image": "https://i.imgur.com/NgyChQC.png", - "category": "DeFi", - "subCategory": [ - "Launchpad" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/tw4fnPz.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/flaunchgg", - "github": "https://github.com/flayerlabs/flaunchgg-contracts", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Flaunch", - "parentCompanyURL": "https://flaunch.gg", - "openSource": true, - "contractAddress": "https://docs.flaunch.gg/developer-resources/contract-addresses", - "dateOfLaunch": "2/1/2025", - "lastUpdated": "7/15/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Octant", - "url": "https://octant.build/", - "description": "Octant aims to become the first self-sustaining global public goods funding ecosystem that balances the common good and individual financial empowerment.", - "image": "https://i.imgur.com/f7NBrxB.png", - "category": "DeFi", - "subCategory": [ - "Crowdfunding" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/Mxu9vWC.jpeg" - ], - "bannerImage": "https://i.imgur.com/DZKTArI.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/octantapp", - "github": "https://github.com/golemfoundation/octant", - "discord": "https://discord.gg/octant", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Golem Foundation", - "parentCompanyURL": "https://golem.foundation/", - "openSource": true, - "contractAddress": "https://github.com/golemfoundation/octant/tree/develop/contracts-v1", - "dateOfLaunch": "8/8/2023", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "SuperFluid", - "url": "https://superfluid.org/", - "description": "Earn every second. Superfluid is the money streaming protocol, powering apps for earning, investing, and trading by the second onchain.", - "image": "https://i.imgur.com/kGnnASt.png", - "category": "DeFi", - "subCategory": [ - "Salary distribution", - "Lending and borrowing" - ], - "networks": [ - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/wRkER30.png" - ], - "bannerImage": "https://i.imgur.com/xiI2Rsk.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/Superfluid_HQ", - "github": "https://github.com/superfluid-finance", - "discord": "https://discord.gg/EFAUmTnPd9", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Superfluid Finance LTD", - "parentCompanyURL": "https://superfluid.org/", - "openSource": true, - "contractAddress": "0x4E583d9390082B65Bef884b629DFA426114CED6d", - "dateOfLaunch": "", - "lastUpdated": "7/7/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Splits.org", - "url": "https://splits.org", - "description": "Splits.org is a decentralized platform for easy, automated on-chain payment splitting and revenue sharing across multiple blockchains.", - "image": "https://i.imgur.com/YNFXeUv.png", - "category": "DeFi", - "subCategory": [ - "Payments" - ], - "networks": [ - "Base", - "Blast", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/J87FFyg.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/0xsplits", - "github": "https://github.com/0xSplits", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Splits Protocols, Inc", - "parentCompanyURL": "https://splits.org", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "2/15/2022", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "JuiceboxETH", - "url": "https://juicebox.money", - "description": "Juicebox is a programmable treasury and community funding protocol on Ethereum that lets users launch projects with configurable funding cycles, allocate funds transparently, and issue tokens or NFTs in return—commonly used for DAOs, creative initiatives, and experimental public goods.", - "image": "https://i.imgur.com/Iqlc83m.png", - "category": "DeFi", - "subCategory": [ - "Crowdfunding" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/SUqxpOa.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/juiceboxETH", - "github": "https://github.com/jbx-protocol", - "discord": "https://discord.com/invite/wFTh4QnDzk", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Juicebox", - "parentCompanyURL": "https://juicebox.money", - "openSource": true, - "contractAddress": "https://docs.juicebox.money/v4/addresses/", - "dateOfLaunch": "7/15/2021", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "zkp2p", - "url": "https://zkp2p.xyz", - "description": "ZKP2P is a trust-minimized, peer-to-peer fiat-to-crypto on-ramp/off-ramp protocol using zero-knowledge proofs (ZKPs) to verify off-chain payments (e.g., Venmo, Revolut) without exposing sensitive data—enabling secure fiat conversion to crypto.", - "image": "https://i.imgur.com/HalUEnr.png", - "category": "DeFi", - "subCategory": [ - "Onramp / offramp" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/a7zBmeQ.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/zkp2p", - "github": "https://github.com/zkp2p", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "P2P Labs Inc.", - "parentCompanyURL": "https://zkp2p.xyz", - "openSource": true, - "contractAddress": "https://docs.zkp2p.xyz/developer/smart-contracts/deployments", - "dateOfLaunch": "2/3/2025", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Teller", - "url": "https://teller.org", - "description": "Teller is a decentralized, peer-to-peer lending protocol on Ethereum and Polygon that offers time-based, fixed-term loans with no margin liquidations—borrowers pay fixed interest and return the full collateral at maturity.", - "image": "https://i.imgur.com/AoqkHhy.png", - "category": "DeFi", - "subCategory": [ - "Lending and borrowing" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/a6SgPLC.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/useteller", - "github": "https://github.com/teller-protocol", - "discord": "https://discord.com/invite/teller", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Teller", - "parentCompanyURL": "https://teller.org", - "openSource": true, - "contractAddress": "https://docs.teller.org/v2/resources/deployed-contracts", - "dateOfLaunch": "1/4/2021", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "EigenCloud", - "url": "https://eigencloud.xyz", - "description": "EigenLayer (EigenCloud) is a restaking protocol on Ethereum enabling ETH and LST (Liquid Staking Token) holders to reuse their staked assets to secure additional protocols (called AVSs) and earn extra yield.", - "image": "https://i.imgur.com/FvUtF9r.png", - "category": "DeFi", - "subCategory": [ - "Infrastructure" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/XhOY5jZ.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/eigenlayer", - "github": "https://github.com/Layr-Labs", - "discord": "https://discord.gg/eigenlayer", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Eigen Labs", - "parentCompanyURL": "https://eigencloud.xyz", - "openSource": true, - "contractAddress": "https://github.com/Layr-Labs/eigenlayer-contracts", - "dateOfLaunch": "6/14/2023", - "lastUpdated": "7/15/2025", - "ready": "true", - "devconnect": "false" - } - ], - "Social": [ - { - "name": "Zora", - "url": "https://zora.co/", - "description": "Zora is an onchain social network revealing new opportunities to create, connect, and earn from your life online.", - "image": "https://i.imgur.com/3ti964X.png", - "category": "Social", - "subCategory": [ - "Social network" - ], - "networks": [ - "Base", - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/6OxNqMF.jpeg" - ], - "bannerImage": "https://i.imgur.com/GBBRB59.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://twitter.com/zora", - "github": "https://github.com/ourzora", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Zora Labs", - "parentCompanyURL": "https://zora.co", - "openSource": true, - "contractAddress": "0xaD031EeE55f595dF6Dbd61e9ef3B908FaD1B3671", - "dateOfLaunch": "1/1/2021", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Rodeo", - "url": "https://rodeo.club/", - "description": "Rodeo is a creative social network where artists, makers, and creators come together to share and celebrate their work. It combines the familiar features of social platforms with unique ways to support and earn from creativity.", - "image": "https://i.imgur.com/R3AaFkG.png", - "category": "Social", - "subCategory": [ - "Social network" - ], - "networks": [ - "Base" - ], - "screenshots": [ - "https://i.imgur.com/stYV9Rv.png", - "https://i.imgur.com/zEPpsoL.png", - "https://i.imgur.com/2hnlwsV.png", - "https://i.imgur.com/X0wUCxY.png" - ], - "bannerImage": "https://i.imgur.com/FDduCHZ.png", - "platforms": [ - "Browser", - "iOS" - ], - "twitter": "https://x.com/rodeodotclub", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Rodeo Club", - "parentCompanyURL": "https://rodeo.club", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "12/24/2024", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Towns", - "url": "https://www.towns.com/", - "description": "Towns Protocol is an open source protocol for building decentralized real-time messaging apps. It consists of an EVM-compatible L2 chain, decentralized off-chain stream nodes, and smart contracts that are deployed on Base.", - "image": "https://i.imgur.com/1XjFcVW.png", - "category": "Social", - "subCategory": [ - "Messaging" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/YNOquL3.png", - "platforms": [ - "Browser", - "iOS" - ], - "twitter": "https://x.com/townsxyz", - "github": "https://github.com/river-build", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Here Not There Labs", - "parentCompanyURL": "https://towns.com", - "openSource": true, - "contractAddress": "https://docs.towns.com/towns-smart-contracts/contracts", - "dateOfLaunch": "2/23/2023", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Farcaster", - "url": "https://farcaster.xyz/", - "description": "Farcaster is a sufficiently decentralized social network built on Ethereum. It is a public social network similar to X and Reddit. Users can create profiles, post \"casts\" and follow others. They own their accounts and relationships with other users and are free to move between different apps.", - "image": "https://i.imgur.com/Xv6wvV9.png", - "category": "Social", - "subCategory": [ - "Social network", - "Messaging" - ], - "networks": [ - "Base", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/Dpb0JFt.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://x.com/farcaster_xyz", - "github": "https://github.com/farcasterxyz", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Farcaster Labs", - "parentCompanyURL": "https://farcaster.xyz", - "openSource": true, - "contractAddress": "https://docs.farcaster.xyz/reference/contracts/deployments", - "dateOfLaunch": "2/23/2023", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Orb", - "url": "https://orb.club/", - "description": "Orb.club is a consumer social mobile app built on Lens Protocol, known for its viral sticker drops, collectible posts, native tipping, and creator-first features.", - "image": "https://i.imgur.com/Rx9ooN8.png", - "category": "Social", - "subCategory": [ - "Social network" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/9mRCEGT.png", - "platforms": [ - "iOS", - "Android" - ], - "twitter": "https://x.com/orb_club", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Orb Technology Inc.", - "parentCompanyURL": "https://orb.club", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "10/18/2024", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Shibuya Films", - "url": "https://www.shibuya.film/", - "description": "Shibuya is a crowdfunding platform for bold, independent filmmakers, that gives creators the tools to raise capital, build community, and bring original stories to life—one episode at a time.", - "image": "https://i.imgur.com/ERgwg6l.png", - "category": "Social", - "subCategory": [ - "Video" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/WM93RX5.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/shibuyaxyz", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Shibuya.xyz", - "parentCompanyURL": "https://shibuya.xyz", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "2/28/2022", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Hey.xyz", - "url": "https://hey.xyz/", - "description": "Hey is a decentralized and permissionless social media app built with Lens Protocol.", - "image": "https://i.imgur.com/gOpRfUD.png", - "category": "Social", - "subCategory": [ - "Social network" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/yFCtj1d.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/heydotxyz", - "github": "https://github.com/heyverse/hey", - "discord": "https://hey.xyz/discord", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Hey.xyz", - "parentCompanyURL": "https://hey.xyz", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "9/29/2023", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Audius", - "url": "https://audius.co/", - "description": "Audius is an innovative music streaming platform that uses blockchain technology to give artists and listeners more control and freedom. With Audius, artists can easily upload their music and keep full control over their content, while listeners get to enjoy a vast and diverse library of tunes from talented musicians and producers all around the world. ", - "image": "https://i.imgur.com/8oeEo3l.png", - "category": "Social", - "subCategory": [ - "Music" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/GodKnNZ.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/AudiusProject", - "github": "https://github.com/AudiusProject", - "discord": "https://discord.gg/audius", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Open Audio Foundation", - "parentCompanyURL": "https://audius.org/", - "openSource": true, - "contractAddress": "0x44617F9dCEd9787C3B06a05B35B4C779a2AA1334", - "dateOfLaunch": "10/23/2020", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Paragraph", - "url": "https://paragraph.com", - "description": "Paragraph is a Web3 publishing platform that lets writers create token-gated newsletters and mint content as NFTs on Ethereum and Base.", - "image": "https://i.imgur.com/qn3J0qz.png", - "category": "Social", - "subCategory": [ - "Publishing" - ], - "networks": [ - "Base", - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/3VKBKAn.jpeg" - ], - "bannerImage": "https://i.imgur.com/s7v5uty.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/paragraph_xyz", - "github": "", - "discord": "https://paragraph.xyz/discord", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Paragraph", - "parentCompanyURL": "https://paragraph.com", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "10/1/2021", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Ethereum Follow Protocol", - "url": "https://efp.app", - "description": "EFP is an on‑chain social graph protocol, enabling Ethereum users to \"follow\" or \"tag\" other addresses via NFT-powered lists. It complements ENS and Sign‑In with Ethereum (SIWE)—forming part of the emerging Ethereum identity stack ", - "image": "https://i.imgur.com/mk6kT65.png", - "category": "Social", - "subCategory": [ - "Social network" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "OP Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/M7BSS6c.jpeg" - ], - "bannerImage": "https://i.imgur.com/pzYxz9M.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/efp", - "github": "https://github.com/ethereumfollowprotocol", - "discord": "https://discord.com/invite/ZUyG3mSXFD", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Ethereum Identity Foundation", - "parentCompanyURL": "https://efp.app", - "openSource": true, - "contractAddress": "https://docs.efp.app/production/deployments/", - "dateOfLaunch": "9/24/2024", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - } - ], - "Privacy": [ - { - "name": "Fluidkey", - "url": "https://fluidkey.com/", - "description": "Fluidkey allows users to seamlessly manage, receive, and send onchain assets while protecting their privacy.", - "image": "https://i.imgur.com/lkEMfCo.png", - "category": "Privacy", - "subCategory": [ - "Stealth address", - "Payments", - "Identity" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/CnsW57W.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/fluidkey", - "github": "https://github.com/fluidkey", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Fluidkey SA", - "parentCompanyURL": "https://fluidkey.com/", - "openSource": true, - "contractAddress": "0xa238cbeb142c10ef7ad8442c6d1f9e89e07e7761", - "dateOfLaunch": "2/24/2024", - "lastUpdated": "7/9/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Rarimo", - "url": "https://rarimo.com/", - "description": "Unlocking a new generation of social apps, where users stay private without losing historical actions, networks, and identities", - "image": "https://i.imgur.com/53RT7xX.png", - "category": "Privacy", - "subCategory": [ - "Identity" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/2XGpnYg.png", - "platforms": [ - "Browser", - "Android" - ], - "twitter": "https://x.com/Rarimo_protocol", - "github": "https://github.com/rarimo", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Rarilabs Ltd.", - "parentCompanyURL": "https://rarimo.com/", - "openSource": true, - "contractAddress": "https://docs.rarimo.com/zk-passport/contracts/#deployments", - "dateOfLaunch": "4/24/2025", - "lastUpdated": "7/9/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Privacy Pools", - "url": "https://privacypools.com/", - "description": "Privacy Pools by 0xbow is a compliant way to anonymously transact on Ethereum. 0xbow blocks illicit actors to ensure pool integrity.", - "image": "https://i.imgur.com/eTwgSVR.png", - "category": "Privacy", - "subCategory": [ - "Pools", - "Compliance" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/vdqDZB5.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/0xbowio", - "github": "https://github.com/0xbow-io/privacy-pools-core", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "0xbow", - "parentCompanyURL": "https://0xbow.io/", - "openSource": true, - "contractAddress": "0xf241d57c6debae225c0f2e6ea1529373c9a9c9fb", - "dateOfLaunch": "3/31/2025", - "lastUpdated": "7/7/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Tornado Cash", - "url": "http://tornadocash.eth.limo/", - "description": "Secure, Decentralized, Private protocol", - "image": "https://i.imgur.com/9S2K8kO.png", - "category": "Privacy", - "subCategory": [ - "Pools" - ], - "networks": [ - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/P8xZqf8.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/TornadoCash", - "github": "https://github.com/tornadocash", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "Ukrainian", - "Turkish", - "English", - "Spanish", - "French", - "Chinese" - ], - "parentCompany": "Tornado Cash", - "parentCompanyURL": "https://tornadocash.eth.limo/", - "openSource": true, - "contractAddress": "https://github.com/tornadocash/docs/blob/b91f1a469ff7c7094e535fd41c4586d1080869c4/general/tornado-cash-smart-contracts.md", - "dateOfLaunch": "12/17/2019", - "lastUpdated": "7/7/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "0xbow", - "url": "https://0xbow.io/", - "description": "0xbow is a privacy protocol for Ethereum that enables compliant, zero-knowledge-based private transactions through customizable Privacy Pools.", - "image": "https://i.imgur.com/PAb3BvU.png", - "category": "Privacy", - "subCategory": [ - "Pools" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/REXrQxe.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/0xbowio", - "github": "https://github.com/0xbow-io/privacy-pools-core", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "0xbow", - "parentCompanyURL": "https://0xbow.io", - "openSource": true, - "contractAddress": "https://docs.privacypools.com/deployments", - "dateOfLaunch": "3/31/2025", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - } - ], - "Collectibles": [ - { - "name": "OpenSea", - "url": "https://opensea.io/", - "description": "OpenSea is an online marketplace for non-fungible tokens (NFTs), enabling users to buy, sell, and create NFTs. It functions as a decentralized platform where users can trade various digital assets, including art, music, gaming items, and more, across multiple blockchains. ", - "image": "https://i.imgur.com/J4vZUTN.png", - "category": "Collectibles", - "subCategory": [ - "Market" - ], - "networks": [ - "Base", - "Blast", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/bxhdZRK.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://twitter.com/opensea", - "github": "https://github.com/projectopensea", - "discord": "https://discord.gg/opensea", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English", - "Chinese Traditional", - "Chinese", - "German", - "French", - "Japanese", - "Korean", - "Spanish" - ], - "parentCompany": "OpenSea", - "parentCompanyURL": "https://opensea.io", - "openSource": true, - "contractAddress": "0xA5409eC958C83C3f309868bABaCA7c86DCB077c1 ", - "dateOfLaunch": "12/20/2017", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Blur", - "url": "https://blur.io/", - "description": "Blur is a professional NFT marketplace offering zero-fee NFT trading and features for intermediate and advanced traders.", - "image": "https://i.imgur.com/qaTlXOZ.png", - "category": "Collectibles", - "subCategory": [ - "Market" - ], - "networks": [ - "Blast", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/XYzhlqX.png", - "platforms": [ - "Browser", - "Android", - "iOS" - ], - "twitter": "https://twitter.com/blur_io", - "github": "", - "discord": "https://discord.gg/blurdao", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Blur LLC", - "parentCompanyURL": "https://blur.io", - "openSource": false, - "contractAddress": "https://docs.blur.foundation/contracts", - "dateOfLaunch": "10/19/2022", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Highlight", - "url": "https://highlight.xyz/", - "description": "Highlight is a platform for creating and collecting digital art and culture.", - "image": "https://i.imgur.com/gvbFr2a.png", - "category": "Collectibles", - "subCategory": [ - "Art" - ], - "networks": [ - "Base", - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/FxFbMqo.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/Highlight_xyz", - "github": "https://github.com/highlightxyz", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Highlight, Inc.", - "parentCompanyURL": "https://highlight.xyz", - "openSource": true, - "contractAddress": "https://support.highlight.xyz/knowledge-base/for-developers/nft-contracts/official-addresses", - "dateOfLaunch": "7/26/2023", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Manifold", - "url": "https://manifold.xyz/", - "description": "Manifold Studio is a series of tools that allow you to build your own web3 creative platform. Studio allows for the creation and distribution of digital assets known as non-fungible tokens(NFTs).", - "image": "https://i.imgur.com/2WZrZfG.png", - "category": "Collectibles", - "subCategory": [ - "Art" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/D0J823R.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/manifoldxyz", - "github": "https://github.com/manifoldxyz", - "discord": "https://discord.gg/XNVfgutbeK", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Manifold Technologies Ltd.", - "parentCompanyURL": "https://manifold.xyz", - "openSource": true, - "contractAddress": "https://github.com/manifoldxyz/royalty-registry-solidity", - "dateOfLaunch": "10/1/2021", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Rarible", - "url": "https://rarible.com/", - "description": "Rarible is a multi-chain platform where you can buy, sell, and create non-fungible tokens (NFTs).", - "image": "https://i.imgur.com/0dhVyXp.png", - "category": "Collectibles", - "subCategory": [ - "Market" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/WhOG44D.png", - "platforms": [ - "Browser", - "iOS" - ], - "twitter": "https://x.com/rarible", - "github": "https://github.com/rarible", - "discord": "http://discord.gg/rarible", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Rarible, Inc.", - "parentCompanyURL": "https://rarible.com", - "openSource": true, - "contractAddress": "https://docs.rarible.org/reference/contract-addresses", - "dateOfLaunch": "8/17/2020", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Pudgy Penguins", - "url": "https://www.pudgypenguins.com/", - "description": "Pudgy Penguins is a global IP focused on proliferating the penguin, memetic culture, and good vibes.", - "image": "https://i.imgur.com/jdf0uFw.png", - "category": "Collectibles", - "subCategory": [ - "Art", - "IP" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/fBRUbxB.png", - "platforms": [ - "iOS", - "Browser" - ], - "twitter": "https://x.com/pudgypenguins", - "github": "", - "discord": "https://discord.gg/pudgypenguins", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "LSLTTT Holdings, Inc.", - "parentCompanyURL": "https://pudgypenguins.com", - "openSource": false, - "contractAddress": "https://etherscan.io/address/0xBd3531dA5CF5857e7CfAA92426877b022e612cf8", - "dateOfLaunch": "7/22/2021", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Bored Ape Yacht Club", - "url": "https://boredapeyachtclub.com/", - "description": "The Bored Ape Yacht Club is a collection of 10000 unique Bored Ape NFTs— unique digital collectibles living on the Ethereum blockchain.", - "image": "https://i.imgur.com/EmOxvhI.png", - "category": "Collectibles", - "subCategory": [ - "Art", - "IP" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/CAAi7lV.png", - "platforms": [ - "iOS", - "Browser" - ], - "twitter": "https://x.com/BoredApeYC", - "github": "", - "discord": "https://discord.com/invite/3P5K3dzgdB", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Yuga Labs LLC", - "parentCompanyURL": "https://yuga.com", - "openSource": false, - "contractAddress": "https://etherscan.io/address/0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D", - "dateOfLaunch": "4/23/2021", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Art Blocks", - "url": "https://www.artblocks.io/", - "description": "Art Blocks is a digital platform where generative artists publish unique artworks using creative code. With historical roots in conceptual art, generative art involves the creation of an algorithm using computer code, with randomness introduced into the artist’s algorithm to produce unique works.", - "image": "https://i.imgur.com/6POOwm3.png", - "category": "Collectibles", - "subCategory": [ - "Art" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/Rs44gsk.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/artblocks_io", - "github": "https://github.com/ArtBlocks", - "discord": "https://discord.com/invite/artblocks", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Art Blocks, Inc.", - "parentCompanyURL": "https://artblocks.io", - "openSource": true, - "contractAddress": "https://github.com/ArtBlocks/artblocks-contracts/blob/main/packages/contracts/README.md", - "dateOfLaunch": "11/27/2020", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Cool Cats", - "url": "https://www.coolcatsnft.com/", - "description": "Cool Cats is a collection of 9,999 randomly generated NFT avatars, each featuring a unique Blue Cat with various traits like clothing, hairstyles, and accessories.", - "image": "https://i.imgur.com/Z20S33T.png", - "category": "Collectibles", - "subCategory": [ - "IP", - "Art" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/tYwCO41.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/coolcatsnft", - "github": "", - "discord": "https://discord.gg/coolcatsnft", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Cool Cats", - "parentCompanyURL": "https://coolcatsnft.com", - "openSource": false, - "contractAddress": "https://etherscan.io/address/0x1a92f7381b9f03921564a437210bb9396471050c", - "dateOfLaunch": "6/9/2021", - "lastUpdated": "7/4/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Doodles", - "url": "https://www.doodles.app/", - "description": "Doodles is a next-generation entertainment company focused on immersive storytelling through the creation and distribution of live and digital experiences, original content, and lifestyle products.", - "image": "https://i.imgur.com/xgn185K.png", - "category": "Collectibles", - "subCategory": [ - "IP", - "Art" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/SEx1boH.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/doodles", - "github": "", - "discord": "https://discord.gg/doodles", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Doodles, Inc.", - "parentCompanyURL": "https://doodles.app`", - "openSource": false, - "contractAddress": "https://etherscan.io/address/0x8a90cab2b38dba80c64b7734e58ee1db38b8992e", - "dateOfLaunch": "10/16/2021", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Basepaint", - "url": "https://basepaint.xyz/", - "description": "BasePaint.xyz is a collaborative, onchain pixel art application where artists create daily, shared canvases that are then minted as NFTs.", - "image": "https://i.imgur.com/svBfl50.png", - "category": "Collectibles", - "subCategory": [ - "IP", - "Art" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/dtcQL5j.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/basepaint_xyz", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "BasePaint", - "parentCompanyURL": "https://basepaint.xyz", - "openSource": false, - "contractAddress": "https://hackmd.io/@uTlMZA23Qz-cK8e7PqQt0A/rkOAbFIhn", - "dateOfLaunch": "8/8/2023", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Foundation", - "url": "https://foundation.app/", - "description": "Foundation.app is an NFT marketplace that allows artists to tokenize their creations as NFTs and provides a platform for collectors to buy, sell, and trade these digital artworks.", - "image": "https://i.imgur.com/s5zw9NG.png", - "category": "Collectibles", - "subCategory": [ - "Market" - ], - "networks": [ - "Base", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/fyNzBFy.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/foundation", - "github": "https://github.com/f8n", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Foundation Labs, Inc.", - "parentCompanyURL": "https://foundation.app", - "openSource": true, - "contractAddress": "https://os.foundation.app/docs/creator-tools/drop", - "dateOfLaunch": "2/1/2021", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Sandbox", - "url": "https://www.sandbox.game/", - "description": "The Sandbox is a community-driven creative platform that empowers artists, storytellers, and game makers to create, publish, own, and monetise a myriad of unique content on a decentralised platform on the blockchain.", - "image": "https://i.imgur.com/u2UXDq4.png", - "category": "Collectibles", - "subCategory": [ - "Gaming", - "Market" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/m9DGm5H.png", - "platforms": [ - "Browser", - "Desktop", - "iOS" - ], - "twitter": "https://twitter.com/thesandboxgame", - "github": "https://discord.gg/thesandboxgame", - "discord": "https://discord.gg/thesandboxgame", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English", - "Chinese", - "Chinese Traditional", - "Korean", - "Japanese", - "Turkish", - "Thai" - ], - "parentCompany": "Animoca Brands", - "parentCompanyURL": "https://www.animocabrands.com/", - "openSource": true, - "contractAddress": "https://etherscan.io/token/0x3845badade8e6dff049820680d1f14bd3903a5d0", - "dateOfLaunch": "11/29/2021", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "SuperRare", - "url": "https://superrare.com/", - "description": "SuperRare is a platform to issue, collect, and trade rare digital art backed by non-fungible tokens (NFTs) on the Ethereum blockchain. Every piece of art on SuperRare is a single edition - this means each artwork is unique without duplicates.", - "image": "https://i.imgur.com/HRl4kUv.png", - "category": "Collectibles", - "subCategory": [ - "Art", - "Market" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/n9YsZCt.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://twitter.com/SuperRare", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "SuperRare Labs, Inc.", - "parentCompanyURL": "https://superrare.com", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "4/4/2018", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Decentraland", - "url": "https://decentraland.org/", - "description": "Decentraland was the world’s first fully decentralized, social virtual world, empowering users to own, create, and control their digital assets and experiences. Launched in 2020, Decentraland features an open, traversable landscape filled with user-generated content that evolves and changes in real-time.", - "image": "https://i.imgur.com/1cghrNy.png", - "category": "Collectibles", - "subCategory": [ - "Gaming", - "Art", - "Market" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/V1mpz2o.png", - "platforms": [ - "Browser", - "iOS", - "Android", - "Desktop" - ], - "twitter": "https://twitter.com/decentraland", - "github": "https://github.com/decentraland", - "discord": "https://dcl.gg/discord", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English", - "Chinese", - "Chinese Traditional", - "Japanese", - "Korean", - "Thai", - "Turkish" - ], - "parentCompany": "Decentraland Foundation", - "parentCompanyURL": "https;//decentraland.org", - "openSource": true, - "contractAddress": "https://github.com/decentraland/marketplace/tree/master/indexer", - "dateOfLaunch": "2/20/2020", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Magic Eden", - "url": "https://magiceden.io/", - "description": "Magic Eden is a non-fungible token marketplace that allows users to buy, sell, mint, and manage NFTs. It's a popular platform for both creators launching new NFT projects and for trading on the secondary market. ", - "image": "https://i.imgur.com/oSGwPR4.png", - "category": "Collectibles", - "subCategory": [ - "Market" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/mtBvmC3.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://twitter.com/MagicEden", - "github": "https://github.com/magiceden", - "discord": "https://discord.gg/magiceden", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Magic Eden", - "parentCompanyURL": "https://magiceden.io", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "9/17/2021", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Azuki", - "url": "https://www.azuki.com/", - "description": "Azuki is a brand born at the intersection of art, technology, and internet culture. What started as a web3 project has evolved into a global community of artists and builders shaping original characters, stories, and experiences together. From digital collectibles to fashion and real-world events, Azuki is building a universe for digital natives drawn to what's next.", - "image": "https://i.imgur.com/fe1Tipo.png", - "category": "Collectibles", - "subCategory": [ - "IP", - "Art", - "Membership" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/3Rqf7Dp.png", - "platforms": [ - "Browser" - ], - "twitter": "https://www.azuki.com/icons/x-twitter-solid-black.svg", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Chiru Labs", - "parentCompanyURL": "https://azuki.com", - "openSource": false, - "contractAddress": "https://nfthud.io/collection/azuki", - "dateOfLaunch": "1/12/2022", - "lastUpdated": "7/6/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "POAP", - "url": "https://poap.xyz/", - "description": "POAP are the bookmarks for your life. Mint the most important memories of your life as digital collectibles (NFTs) forever on the blockchain.", - "image": "https://i.imgur.com/U3ZyEUt.png", - "category": "Collectibles", - "subCategory": [ - "Attendance", - "Collect", - "Membership" - ], - "networks": [ - "Gnosis", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/tGp8SmS.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://x.com/poapxyz", - "github": "https://github.com/poapxyz", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "POAP Inc", - "parentCompanyURL": "https://poap.xyz", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "1/1/2021", - "lastUpdated": "7/15/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Courtyard", - "url": "https://courtyard.io", - "description": "Courtyard is a platform for minting and trading NFTs backed by real-world collectibles like trading cards, with assets stored in insured vaults and redeemable on-chain.", - "image": "https://i.imgur.com/a50EywS.png", - "category": "Collectibles", - "subCategory": [ - "Market" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/y5nQjIL.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/Courtyard_NFT", - "github": "", - "discord": "https://discord.gg/courtyard-io", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Courtyard, Inc.", - "parentCompanyURL": "https://courtyard.io", - "openSource": false, - "contractAddress": "https://docs.courtyard.io/courtyard/resources/useful-links#ethereum-mainnet", - "dateOfLaunch": "5/8/2022", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - } - ], - "Gaming": [ - { - "name": "EVE Frontier", - "url": "https://evefrontier.com/en", - "description": "EVE Frontier is a sandbox shaped by player-driven activity. From player-made factions, to bases, private economies and the stargate network, you create the ultimate living world.", - "image": "https://i.imgur.com/8VI7Xmb.png", - "category": "Gaming", - "subCategory": [ - "MMORPG" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/pylOP7f.png" - ], - "bannerImage": "https://i.imgur.com/YGuDW8X.png", - "platforms": [ - "Desktop" - ], - "twitter": "https://x.com/EVE_Frontier", - "github": "", - "discord": "https://discord.com/invite/evefrontier", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "CCP Games", - "parentCompanyURL": "https://www.ccpgames.com/", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "6/11/2025", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Remix", - "url": "https://remix.gg/", - "description": "Remix is a platform combining AI and mobile gaming, designed to offer on-chain, AI-powered games.", - "image": "https://i.imgur.com/KBHOee9.png", - "category": "Gaming", - "subCategory": [ - "retro gaming", - "Casual", - "AI gaming" - ], - "networks": [ - "Base", - "world" - ], - "screenshots": [ - "https://i.imgur.com/RHH5ukf.jpeg" - ], - "bannerImage": "https://i.imgur.com/ILekHLM.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/RemixGG_", - "github": "", - "discord": "https://discord.gg/a3bgdr4RC6", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Remix (formerly Farcade)", - "parentCompanyURL": "https://remix.gg/", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "4/4/2021", - "lastUpdated": "2025", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Illuvium", - "url": "https://illuvium.io/", - "description": "Illuvium is a collectible RPG game and auto-battler rolled into one. There is an open-world RPG experience in the overworld, where you mine, harvest, capture, and fight Illuvials. Once you have assembled your team you can join the autobattler to build your teams to beat your opponents in battle.", - "image": "https://i.imgur.com/LBo34WC.png", - "category": "Gaming", - "subCategory": [], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/ONlCXAt.png", - "platforms": [ - "Windows", - "Mac", - "Android", - "iOS" - ], - "twitter": "https://x.com/illuviumio", - "github": "https://github.com/illuviumgame", - "discord": "https://discord.com/invite/illuvium", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Illuvium", - "parentCompanyURL": "https://illuvium.io", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "7/25/2024", - "lastUpdated": "", - "ready": "true", - "devconnect": "true" - }, - { - "name": "Parallel", - "url": "https://parallel.life", - "description": "Parallel is a free-to-play, turn-based strategy game where players build 40-card decks using cards from five factions or universal cards to battle each other.", - "image": "https://i.imgur.com/OcpP6tZ.png", - "category": "Gaming", - "subCategory": [ - "Card & deck building" - ], - "networks": [ - "Base", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/zLLypAz.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/ParallelTCG", - "github": "", - "discord": "https://discord.com/invite/paralleltcg", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Parallel Studios", - "parentCompanyURL": "https://parallel.life", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "4/22/2024", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - } - ], - "DAO": [ - { - "name": "Snapshot", - "url": "https://snapshot.box/", - "description": "Snapshot is a voting platform that allows DAOs, DeFi protocols, or NFT communities to vote easily and without gas fees.The tool allows high customization of the voting process to cater to the diverse needs of the users and organizations.", - "image": "https://i.imgur.com/B2nGDiy.png", - "category": "DAO", - "subCategory": [ - "Governance", - "Organization", - "Offchain voting" - ], - "networks": [ - "Starknet", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/lyAL0O7.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/SnapshotLabs", - "github": "https://github.com/snapshot-labs", - "discord": "https://discord.snapshot.org", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Snapshot", - "parentCompanyURL": "https://snapshot.box", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "1/8/2020", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Tally", - "url": "https://www.tally.xyz/", - "description": "Tally is a platform focused on onchain governance for decentralized autonomous organizations and blockchain protocols by providing tools and infrastructure for launching, managing, and participating in DAOs.", - "image": "https://i.imgur.com/uFbNLmO.png", - "category": "DAO", - "subCategory": [ - "Onchain voting", - "Analytics", - "Tokenomics", - "DAO creation", - "Governor" - ], - "networks": [ - "Base", - "Blast", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [ - "https://i.imgur.com/LpyPBZv.png" - ], - "bannerImage": "https://i.imgur.com/9Jo8BK3.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/tallyxyz", - "github": "https://github.com/withtally/", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Tally", - "parentCompanyURL": "https://www.tally.xyz/", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Hats Protocol", - "url": "https://www.hatsprotocol.xyz/", - "description": "Hats turns organizations into a digital object, ready to be programmed. All of the properties of your organization and its individual roles and permissions can now be automated, just like any other software system.", - "image": "https://i.imgur.com/78IAtVT.png", - "category": "DAO", - "subCategory": [ - "Role management", - "Permissions", - "Organization" - ], - "networks": [ - "Base", - "Celo", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/XKumEus.png" - ], - "bannerImage": "https://i.imgur.com/CPBwsLj.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/hatsprotocol", - "github": "https://github.com/Hats-Protocol", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Haberdasher Labs", - "parentCompanyURL": "https://www.hatsprotocol.xyz/open-roles", - "openSource": true, - "contractAddress": "0x3bc1A0Ad72417f2d411118085256fC53CBdDd137", - "dateOfLaunch": "6/27/2024", - "lastUpdated": "7/7/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Aragon", - "url": "https://aragon.org/", - "description": "Aragon builds full-stack DAO technology that enables organizations to easily and securely govern their protocols and assets onchain.", - "image": "https://i.imgur.com/K7oLCS6.png", - "category": "DAO", - "subCategory": [ - "DAO creation", - "Governance", - "Framework" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/4Krl2j6.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/aragonproject", - "github": "https://github.com/aragon", - "discord": "https://discord.gg/aragonorg", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Aragon Foundation", - "parentCompanyURL": "https://www.aragonfoundation.org/", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "10/30/2018", - "lastUpdated": "7/15/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "DAOhaus", - "url": "https://daohaus.club/", - "description": "DAOhaus allows communities to create a DAO and manage, grow, and distribute a shared treasury.", - "image": "https://i.imgur.com/E6DLY0N.png", - "category": "DAO", - "subCategory": [ - "DAO creation", - "Treasury management", - "Framework", - "Moloch" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/QkydX2p.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/daohaus", - "github": "https://github.com/HausDAO", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "", - "parentCompanyURL": "", - "openSource": false, - "contractAddress": "https://docs.daohaus.club/contracts", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Event Horizon", - "url": "https://eventhorizon.vote/", - "description": "Event Horizon is a public good that helps DAOs improve their voter participation, token participation, and generally improve the governance process of DAOs with the help of agentic governance and Incentivized Delegation Vaults. ", - "image": "https://i.imgur.com/uAwjyR8.png", - "category": "DAO", - "subCategory": [ - "Governance", - "Delegation", - "Agentic" - ], - "networks": [ - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/xKdrkcq.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/EventHorizonDAO", - "github": "", - "discord": "https://discord.gg/pJwYfRUcjK", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Event Horizon", - "parentCompanyURL": "https://eventhorizon.vote/", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "7/7/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Splits", - "url": "https://app.splits.org/", - "description": "Splits is a platform offering financial infrastructure for onchain teams, specializing in managing onchain payments using audited, open-source smart contracts.", - "image": "https://i.imgur.com/CAiSLc5.png", - "category": "DAO", - "subCategory": [ - "Treasury management" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/yfMGVxo.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/0xsplits", - "github": "https://github.com/0xSplits", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "", - "parentCompanyURL": "", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Safe", - "url": "https://safe.global/", - "description": "Own the Internet. Ethereum Smart Accounts to safeguard your digital assets and build the future of ownership.", - "image": "https://i.imgur.com/kRMy55h.png", - "category": "DAO", - "subCategory": [ - "Treasury management", - "Multi-sig", - "Smart account" - ], - "networks": [ - "Base", - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/skOZTBy.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://x.com/safe", - "github": "https://github.com/safe-global", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Safe Ecosystem Foundation ", - "parentCompanyURL": "https://safe.global", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "7/7/2022", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Coordinape", - "url": "https://coordinape.com/", - "description": "Coordinape provides tools to discover, recognize and collaborate in onchain networks of trust.", - "image": "https://i.imgur.com/Rkky5a1.png", - "category": "DAO", - "subCategory": [ - "Recognition", - "Compensation", - "Signalling" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/bmKyuk1.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://x.com/coordinape", - "github": "https://github.com/coordinape", - "discord": "https://discord.coordinape.com/", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "", - "parentCompanyURL": "", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Endaoment", - "url": "https://endaoment.org/", - "description": "Endaoment is a public charity that offers Donor-Advised Funds (DAFs) and facilitates donations to non-profits.", - "image": "https://i.imgur.com/iXSGSbp.png", - "category": "DAO", - "subCategory": [ - "Philanthropy" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/A8Xu5E5.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/endaomentdotorg", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Endaoment (501(c)(3) nonprofit)", - "parentCompanyURL": "https://endaoment.org", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "ResearchHub", - "url": "https://researchhub.com/", - "description": "ResearchHub is designed to accelerate the pace of scientific research by encouraging academics to interact in a fully open and collaborative manner. ", - "image": "https://i.imgur.com/bs1ElQd.png", - "category": "DAO", - "subCategory": [ - "Governance" - ], - "networks": [ - "Base", - "Ethereum Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/2tqDp6c.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/researchhub", - "github": "https://github.com/ResearchHub", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "ResearchHub Technologies, Inc. / ResearchHub Foundation", - "parentCompanyURL": "https://researchhub.foundation", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "2/25/2019", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Prime Intellect", - "url": "https://www.primeintellect.ai/", - "description": "Prime Intellect democratizes AI development at scale by making it easy to find global compute resources and train state-of-the-art models through distributed training across clusters.", - "image": "https://i.imgur.com/GlSYmTI.png", - "category": "DAO", - "subCategory": [ - "AI" - ], - "networks": [ - "Base" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/5lnpIGl.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/PrimeIntellect", - "github": "https://github.com/PrimeIntellect-ai", - "discord": "https://discord.gg/aHXbW7gtzY", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Prime Intellect", - "parentCompanyURL": "https://www.primeintellect.ai", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Agora", - "url": "https://agora.xyz", - "description": "Agora is an advanced on-chain governance platform that empowers protocols and communities (like Uniswap, Optimism, ENS) with scalable, secure, and user-friendly voting systems—eliminating the need for custom code.", - "image": "https://i.imgur.com/a1KpeEc.png", - "category": "DAO", - "subCategory": [ - "Governance" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/GPmgEFp.png" - ], - "bannerImage": "https://i.imgur.com/zQV6jJ3.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/agoragovernance", - "github": "https://github.com/voteagora", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Agora", - "parentCompanyURL": "https://agora.xyz", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "5/31/2024", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Sablier", - "url": "https://sablier.finance/", - "description": "Sablier is a protocol that facilitates the automated distribution of tokens over time. This \"streaming\" functionality removes the need for manual transactions, saving time and resources.", - "image": "https://i.imgur.com/w5i4Q5k.png", - "category": "DAO", - "subCategory": [ - "Payments" - ], - "networks": [ - "Base", - "Scroll", - "Linea", - "Blast", - "Mode", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/CNIkIB0.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/Sablier", - "github": "https://github.com/sablier-labs", - "discord": "https://discord.gg/bSwRCwWRsT", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Sablier Labs", - "parentCompanyURL": "https://sablier.com", - "openSource": true, - "contractAddress": "https://github.com/sablier-labs", - "dateOfLaunch": "12/13/2019", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - } - ], - "Productivity": [ - { - "name": "ENS", - "url": "https://ens.domains/", - "description": "The Ethereum Name Service or ENS is the decentralized naming protocol that is built on the Ethereum blockchain. It adheres to open-source standards and is based on a set of decentralized smart contracts that translate blockchain addresses into human-readable names.", - "image": "https://i.imgur.com/Ocl9okb.png", - "category": "Productivity", - "subCategory": [ - "DNS", - "Identity" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/YZGOPFM.png" - ], - "bannerImage": "https://i.imgur.com/Oq3MDGp.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/ensdomains", - "github": "https://github.com/ensdomains", - "discord": "https://discord.com/invite/faTEB36", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "ENS Labs", - "parentCompanyURL": "https://www.enslabs.org/", - "openSource": true, - "contractAddress": "https://docs.ens.domains/learn/deployments", - "dateOfLaunch": "5/4/2017", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Huddle01", - "url": "https://huddle01.com/", - "description": "Huddle01 is a decentralized real-time communication platform that offers an alternative to centralized video conferencing systems and aims to reduce latency, improve performance, and cut infrastructure costs, making communication more efficient and scalable.", - "image": "https://i.imgur.com/GcVR2ag.png", - "category": "Productivity", - "subCategory": [ - "Communication" - ], - "networks": [ - "Arbitrum One", - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/9oqfxDM.png" - ], - "bannerImage": "https://i.imgur.com/fJ2npPi.png", - "platforms": [ - "Browser", - "iOS", - "Android" - ], - "twitter": "https://x.com/huddle01com", - "github": "https://github.com/huddle01", - "discord": "https://discord.com/invite/huddle01", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Huddle01 Labs Inc.", - "parentCompanyURL": "https://huddle01.com/", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Livepeer", - "url": "https://www.livepeer.org/", - "description": "Livepeer is a decentralized network for limitless video computing, enabling AI processing and transcoding jobs to power the future of video.", - "image": "https://i.imgur.com/rwonhAA.png", - "category": "Productivity", - "subCategory": [ - "Storage", - "Video" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/mgAUNbe.png" - ], - "bannerImage": "https://i.imgur.com/beqsMqo.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/Livepeer", - "github": "https://github.com/livepeer", - "discord": "https://discord.com/invite/livepeer", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Livepeer Inc.", - "parentCompanyURL": "https://www.livepeer.org/", - "openSource": true, - "contractAddress": "https://docs.livepeer.org/references/contract-addresses", - "dateOfLaunch": "4/30/2018", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "ZK / Open Passport", - "url": "https://zkpassport.id/", - "description": "ZKPassport SDK enables privacy-preserving identity verification using passports and ID cards. It allows developers to request and verify specific identity attributes without exposing unnecessary personal information.", - "image": "https://i.imgur.com/sBVlmsl.png", - "category": "Productivity", - "subCategory": [ - "Identity" - ], - "networks": [], - "screenshots": [ - "https://i.imgur.com/nj8j1E2.jpeg" - ], - "bannerImage": "https://i.imgur.com/6Y8auId.png", - "platforms": [], - "twitter": "https://x.com/zkpassport", - "github": "https://github.com/zk-passport/", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Self Protocol ", - "parentCompanyURL": "https://self.xyz/", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "7/21/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "QuarkID", - "url": "https://quarkid.org/", - "description": "QuarkID is the digital trust framework developed by the Government of the City of Buenos Aires that creates a new digital identity system.", - "image": "https://i.imgur.com/K3T8EYJ.png", - "category": "Productivity", - "subCategory": [ - "Identity" - ], - "networks": [ - "Ethereum Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/cdB0kAC.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/quark_id", - "github": "https://github.com/ssi-quarkid", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English", - "Spanish" - ], - "parentCompany": "Extrimian S.A.", - "parentCompanyURL": "https://extrimian.io/", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "1/20/2025", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Rotki", - "url": "https://rotki.com/", - "description": "Rotki is an open source, self-hosted portfolio manager, accounting and analytics tool that protects your privacy.", - "image": "https://i.imgur.com/0AVcfDU.png", - "category": "Productivity", - "subCategory": [ - "DePIN" - ], - "networks": [ - "Base", - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/ouKp1Dq.jpeg" - ], - "bannerImage": "https://i.imgur.com/Zjtf2Rc.png", - "platforms": [ - "Browser", - "Desktop" - ], - "twitter": "https://x.com/rotkiapp", - "github": "https://github.com/rotki/", - "discord": "https://discord.rotki.com/", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Rotki Software GmbH", - "parentCompanyURL": "https://rotki.com/", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "10/1/2019", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Fileverse - ddocs", - "url": "https://docs.fileverse.io/document/create", - "description": "Fileverse is the decentralized alternative to Notion and Google Workspace. Use it to write notes, collab on docs & sheets, sketch ideas, organize your files, manage a knowledgebase, create a personal webpage and more - individually or as a group.", - "image": "https://i.imgur.com/micDfkJ.png", - "category": "Productivity", - "subCategory": [ - "DePIN" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/XAdzWtj.png" - ], - "bannerImage": "https://i.imgur.com/VqQG462.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/fileverse", - "github": "https://x.com/fileverse", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": " Fileverse PTE. LTD", - "parentCompanyURL": "https://fileverse.io", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "4/7/2024", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Fileverse - dsheets", - "url": "https://sheets.fileverse.io/sheet/create", - "description": "dSheets is an open-source spreadsheet tool focused on privacy and onchain interactions that allows users to import onchain data, execute smart contracts and access Web3 features. It's equipped with end-to-end encryption and zero data storage capabilities.", - "image": "https://i.imgur.com/micDfkJ.png", - "category": "Productivity", - "subCategory": [ - "DePIN" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/kGl5UXb.png" - ], - "bannerImage": "https://i.imgur.com/VqQG462.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/fileverse", - "github": "https://x.com/fileverse", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": " Fileverse PTE. LTD", - "parentCompanyURL": "https://fileverse.io", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "6/23/2025", - "lastUpdated": "7/11/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "EAS", - "url": "https://attest.org/", - "description": "Ethereum Attestation Service (EAS) is an infrastructure public good for making attestations onchain or offchain about anything.", - "image": "https://i.imgur.com/d8kqvW4.png", - "category": "Productivity", - "subCategory": [ - "Governance" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/eZUAXjc.png" - ], - "bannerImage": "https://i.imgur.com/gBWM7Ez.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/eas_eth", - "github": "https://github.com/ethereum-attestation-service", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Ethereum Attestation Service", - "parentCompanyURL": "https://attest.org", - "openSource": true, - "contractAddress": "https://github.com/ethereum-attestation-service/eas-contracts", - "dateOfLaunch": "2/27/2023", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Unlock", - "url": "https://unlock-protocol.com/", - "description": "Unlock Protocol is a protocol that enables creators to monetize their content with a few lines of code in a fully decentralized way. It focuses on memberships and subscription NFTs with features like time constraints, pricing updates, and recurring payments. It is trusted by thousands of developers and community members for building next-generation membership products", - "image": "https://i.imgur.com/4p38CFx.png", - "category": "Productivity", - "subCategory": [ - "Governance", - "Ticketing", - "Memberships" - ], - "networks": [ - "Polygon", - "Celo", - "Gnosis", - "Base", - "Linea", - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/ZVki3qp.png" - ], - "bannerImage": "https://i.imgur.com/SZ5K9mw.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/UnlockProtocol", - "github": "https://github.com/unlock-protocol/unlock", - "discord": "https://discord.unlock-protocol.com/", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Unlock Inc", - "parentCompanyURL": "https://unlock-protocol.com", - "openSource": true, - "contractAddress": "https://docs.unlock-protocol.com/core-protocol/unlock/networks", - "dateOfLaunch": "3/28/2021", - "lastUpdated": "7/15/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Human Passport", - "url": "https://passport.human.tech/", - "description": "Human Passport is an identity verification application and Sybil resistance protocol. Developers can utilize the different Human Passport products and services to build a unique humanity solution for their app or project, enabling more trustworthy and fair participation in their community.", - "image": "https://i.imgur.com/qvNkDAK.png", - "category": "Productivity", - "subCategory": [ - "Identity", - "Privacy", - "Proof-of-personhood" - ], - "networks": [ - "Base", - "Linea", - "Shape", - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/WutTNUy.png" - ], - "bannerImage": "https://i.imgur.com/IjoDBkB.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/HumnPassport", - "github": "https://github.com/passportxyz/passport", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Human Tech", - "parentCompanyURL": "https://holonym.io", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "6/13/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Sequence", - "url": "https://sequence.xyz", - "description": "Sequence is a developer platform offering smart contract wallets, SDKs, and infrastructure for building Web3 apps and games on Ethereum and EVM chains.", - "image": "https://i.imgur.com/POagFpG.png", - "category": "Productivity", - "subCategory": [ - "Gaming" - ], - "networks": [ - "Base", - "Polygon", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/z3huNf6.png", - "platforms": [ - "Browser" - ], - "twitter": "https://www.twitter.com/0xsequence", - "github": "https://github.com/0xsequence", - "discord": "https://discord.gg/sequence", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Sequence", - "parentCompanyURL": "https://sequence.xyz", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "1/20/2021", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Eternal AI", - "url": "https://eternalai.org/", - "description": "Eternal AI is a blockchain-based platform for creating, deploying, and monetizing cryptographically secure AI agents as smart contracts.", - "image": "https://i.imgur.com/AFYIGAo.png", - "category": "Productivity", - "subCategory": [ - "Privacy", - "AI Agents" - ], - "networks": [ - "Base", - "Ethereum Mainnet", - "Arbitrum One" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/UGkjMLB.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/CryptoEternalAI", - "github": "https://github.com/eternalai-org", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "EternalAI DAO ", - "parentCompanyURL": "https://eternalai.org", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Virtuals", - "url": "https://app.virtuals.io/", - "description": "Virtuals Protocol is a society of productive AI agents, each designed to generate services or products and autonomously engage in onchain commerce. These agents are tokenized, allowing for capital formation, permissionless participation, and aligned incentives among creators, investors, and agents.", - "image": "https://i.imgur.com/fZ0nGYw.png", - "category": "Productivity", - "subCategory": [ - "AI Agents" - ], - "networks": [ - "Base" - ], - "screenshots": [ - "https://i.imgur.com/QWIvUfZ.png" - ], - "bannerImage": "https://i.imgur.com/wx6PJpU.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/virtuals_io", - "github": "", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Virtuals", - "parentCompanyURL": "https://virtuals.io", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "", - "lastUpdated": "", - "ready": "true", - "devconnect": "false" - } - ], - "Bridge": [ - { - "name": "Particle Network", - "url": "https://particle.network/", - "description": "Pay with any asset. Transact across chains effortlessly. Never bridge again.", - "image": "https://i.imgur.com/IX6ESQ7.png", - "category": "Bridge", - "subCategory": [ - "Chain abstraction" - ], - "networks": [ - "Base", - "Scroll", - "Starknet", - "Linea", - "Blast", - "Mode", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "Taiko Alethia", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/gYm3FIR.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/ParticleNtwrk", - "github": "", - "discord": "https://discord.com/invite/2y44qr6CR2", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Particle Network", - "parentCompanyURL": "https://particle.network/", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "9/9/2024", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Layerswap", - "url": "https://layerswap.io/", - "description": "Layerswap is the reliable solution for transferring crypto assets across networks in a matter of minutes. The app enables frictionless cross-chain transfers across 35+ blockchains as well as direct transfers between chains and 15+ exchanges.", - "image": "https://i.imgur.com/H8Mp3kO.png", - "category": "Bridge", - "subCategory": [ - "Liquidity network" - ], - "networks": [ - "Base", - "Starknet", - "Scroll", - "ZKSync Era", - "Linea", - "Blast", - "Mode", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/S3R1wzQ.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/layerswap", - "github": "https://github.com/layerswap/layerswapapp", - "discord": "https://discord.gg/layerswap", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Layerswap", - "parentCompanyURL": "https://layerswap.io", - "openSource": true, - "contractAddress": "0x2Fc617E933a52713247CE25730f6695920B3befe", - "dateOfLaunch": "6/11/2021", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Hop", - "url": "https://app.hop.exchange/", - "description": "Hop is a scalable rollup-to-rollup general token bridge. It allows users to send tokens from one rollup or sidechain to another almost immediately without having to wait for the networks challenge period.", - "image": "https://i.imgur.com/xraNXM1.png", - "category": "Bridge", - "subCategory": [ - "Liquidity network" - ], - "networks": [ - "Base", - "Linea", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/9Yjx6vL.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/HopProtocol", - "github": "https://github.com/hop-protocol", - "discord": "https://discord.gg/PwCF88emV4", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Hop Protocol", - "parentCompanyURL": "https://hop.exchange", - "openSource": true, - "contractAddress": "0x914f986a44acb623a277d6bd17368171fcbe4273", - "dateOfLaunch": "7/12/2021", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Stargate", - "url": "https://stargate.finance/bridge", - "description": "Stargate is a composable cross-chain liquidity transport protocol enabling seamless asset transfers between blockchains.", - "image": "https://i.imgur.com/E9Jw36o.png", - "category": "Bridge", - "subCategory": [ - "Liquidity network", - "Generalized message passing" - ], - "networks": [ - "Base", - "Scroll", - "Linea", - "Blast", - "Mode", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "Taiko Alethia", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/BpaHCYm.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/StargateFinance", - "github": "https://github.com/stargate-protocol", - "discord": "https://stargate.finance/discord", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Stargate", - "parentCompanyURL": "https://stargate.finance/discord", - "openSource": true, - "contractAddress": "0x296f55f8fb28e498b858d0bcda06d955b2cb3f97", - "dateOfLaunch": "3/18/2022", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Across", - "url": "https://app.across.to/bridge", - "description": "Across is a cross-chain bridge for L2s and rollups secured by UMA's optimistic oracle. It is optimized for capital efficiency with a single liquidity pool, a competitive relayer landscape, and a no-slippage fee model.", - "image": "https://i.imgur.com/70fOLRm.png", - "category": "Bridge", - "subCategory": [ - "Validator or oracle", - "Liquidity network" - ], - "networks": [ - "Base", - "Blast", - "Linea", - "Scroll", - "Mode", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/ug6iZSa.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/AcrossProtocol", - "github": "https://github.com/across-protocol", - "discord": "https://discord.across.to/", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "Across", - "parentCompanyURL": "https://across.to/", - "openSource": true, - "contractAddress": "0x7355Efc63Ae731f584380a9838292c7046c1e433", - "dateOfLaunch": "11/8/2021", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Meson", - "url": "https://meson.fi/", - "description": "Meson is the faster and safer way to execute low-cost, zero-slippage universal cross-chain swaps across all leading blockchains and layer-2 rollups.", - "image": "https://i.imgur.com/lDCO7eA.png", - "category": "Bridge", - "subCategory": [ - "Liquidity network" - ], - "networks": [ - "Mode", - "Blast", - "Linea", - "Scroll", - "Starknet", - "Base", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "Taiko Alethia", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/TSj3ccw.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/mesonfi", - "github": "https://github.com/mesonfi", - "discord": "https://discord.gg/mesonfi", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Meson", - "parentCompanyURL": "https://meson.fi", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "12/1/2021", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "deBridge", - "url": "https://app.debridge.finance/", - "description": "DeBridge is DeFi's internet of liquidity, enabling real-time movement of assets and information across the DeFi landscape. Without the bottlenecks and risks of liquidity pools, deBridge can power all type of cross-chain interactions with deep liquidity, tight spreads, and guaranteed rates.", - "image": "https://i.imgur.com/O1iVt88.png", - "category": "Bridge", - "subCategory": [ - "Validator or oracle" - ], - "networks": [ - "Base", - "Linea", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/3aBiKjz.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/deBridge", - "github": "https://github.com/debridge-finance/", - "discord": "https://discord.com/invite/debridge", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "deBridge", - "parentCompanyURL": "https://debridge.finance/", - "openSource": true, - "contractAddress": "0x43de2d77bf8027e25dbd179b491e8d64f38398aa", - "dateOfLaunch": "2/17/2022", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Orbiter Finance", - "url": "https://www.orbiter.finance/bridge/", - "description": "Orbiter Finance enables cross-rollup transactions of Ethereum/Bitcoin native assets in a trustless and seamless manner.", - "image": "https://i.imgur.com/xkJIVGd.png", - "category": "Bridge", - "subCategory": [ - "Liquidity network" - ], - "networks": [ - "Base", - "Starknet", - "Scroll", - "Linea", - "Blast", - "Mode", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "Taiko Alethia", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/aYA1Ei0.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/Orbiter_Finance", - "github": "https://github.com/Orbiter-Finance", - "discord": "https://discord.gg/FFT5wfmTXT", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English", - "Korean" - ], - "parentCompany": "Orbiter Finance", - "parentCompanyURL": "https://orbiter.finance", - "openSource": true, - "contractAddress": "", - "dateOfLaunch": "12/30/2021", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Celer cBridge", - "url": "https://cbridge.celer.network/", - "description": "Celer is a blockchain interoperability protocol enabling a one-click user experience accessing tokens, DeFi, GameFi, NFTs, governance, and more across multiple chains.", - "image": "https://i.imgur.com/TyZdpEU.png", - "category": "Bridge", - "subCategory": [ - "Liquidity network" - ], - "networks": [ - "Base", - "Scroll", - "Blast", - "Linea", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/FEr4emk.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/CelerNetwork", - "github": "https://github.com/celer-network", - "discord": "https://discord.com/invite/uGx4fjQ", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Celer", - "parentCompanyURL": "https://celer.network", - "openSource": true, - "contractAddress": "0x5427FEFA711Eff984124bFBB1AB6fbf5E3DA1820", - "dateOfLaunch": "6/10/2021", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Synapse", - "url": "https://synapseprotocol.com/", - "description": "Synapse Bridge is built on top of the cross-chain infrastructure enabling users to seamlessly transfer assets across all blockchains.", - "image": "https://i.imgur.com/07lCxpa.png", - "category": "Bridge", - "subCategory": [ - "Liquidity network" - ], - "networks": [ - "Base", - "Blast", - "Linea", - "Scroll", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/hp1Fnlu.png", - "platforms": [ - "Browser" - ], - "twitter": "https://twitter.com/SynapseProtocol", - "github": "https://github.com/synapsecns", - "discord": "htts://discord.gg/synapseprotocol", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Synapse", - "parentCompanyURL": "https://synapseprotocol.com", - "openSource": true, - "contractAddress": "0x7E7A0e201FD38d3ADAA9523Da6C109a07118C96a", - "dateOfLaunch": "8/29/2021", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Gas.zip", - "url": "https://gas.zip", - "description": "Fastest one-stop gas refuel bridge for over 350+ chains. Bridge and explore all your favorite alt-chains and L2s, instantly.", - "image": "https://i.imgur.com/BE9zVpY.png", - "category": "Bridge", - "subCategory": [ - "Liquidity network" - ], - "networks": [ - "Base", - "Scroll", - "Linea", - "Blast", - "Mode", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet", - "Taiko Alethia", - "zkSync Mainnet" - ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/EfeBVwX.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/gasdotzip", - "github": "https://github.com/gasdotzip", - "discord": "https://discord.com/invite/gasdotzip", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": false, - "languages": [ - "English" - ], - "parentCompany": "Gas.zip", - "parentCompanyURL": "https://gas.zip", - "openSource": true, - "contractAddress": "0x2a37D63EAdFe4b4682a3c28C1c2cD4F109Cc2762", - "dateOfLaunch": "8/9/2023", - "lastUpdated": "7/3/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Staking Launchpad", - "url": "https://launchpad.ethereum.org", - "description": "Become a validator and help secure the future of Ethereum.", - "image": "https://i.imgur.com/PO19A9T.png", - "category": "Bridge", - "subCategory": [ - "Validator or oracle" - ], - "networks": [ - "Ethereum Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/UoV3Mfn.png" - ], - "bannerImage": "https://i.imgur.com/PO19A9T.png", - "platforms": [ - "Browser" - ], - "twitter": "", - "github": "https://github.com/ethereum/staking-launchpad", - "discord": "", - "kpiUrl": "", - "sortingWeight": 0, - "discover": false, - "highlight": true, - "languages": [ - "Arabic", - "German", - "Greek", - "Hungarian", - "Indonesian", - "Italian", - "Japanese", - "Korean", - "Polish", - "Portuguese (Brazilian)", - "Romanian", - "Russian", - "Slovenian", - "Spanish", - "Turkish" - ], - "parentCompany": "Ethereum Foundation", - "parentCompanyURL": "https://ethereum.foundation", - "openSource": true, - "contractAddress": "0x00000000219ab540356cBB839Cbe05303d7705Fa", - "dateOfLaunch": "12/1/2020", - "lastUpdated": "7/7/2025", - "ready": "true", - "devconnect": "false" - }, - { - "name": "Bungee", - "url": "https://bungee.exchange/", - "description": "Bungee provides seamless swaps between any blockchain. With over $20B in volume and trusted by major wallets and dApps, Bungee makes moving assets between networks efficient, secure, and accessible to everyone.", - "image": "https://i.imgur.com/X2vpia7.png", - "category": "Bridge", - "subCategory": [ - "Chain abstraction", - "swap" - ], - "networks": [ - "Base", - "Scroll", - "Mode", - "Blast", - "Linea", - "Ethereum Mainnet", - "Arbitrum One", - "OP Mainnet" - ], - "screenshots": [ - "https://i.imgur.com/axNSOBz.png" - ], - "bannerImage": "https://i.imgur.com/254aaAe.png", - "platforms": [ - "Browser" - ], - "twitter": "https://x.com/BungeeExchange", - "github": "https://github.com/SocketDotTech", - "discord": "https://discord.com/invite/DrvfYq6fvc", - "kpiUrl": "", - "sortingWeight": 0, - "discover": true, - "highlight": true, - "languages": [ - "English" - ], - "parentCompany": "SocketDotTech", - "parentCompanyURL": "https://www.socket.tech/", - "openSource": true, - "contractAddress": "https://github.com/SocketDotTech/bungee-contracts-public/tree/master/deployments", - "dateOfLaunch": "10/10/2023", - "lastUpdated": "7/14/2025", - "ready": "true", - "devconnect": "false" - } - ] -} \ No newline at end of file diff --git a/src/data/mocks/attestantPosts.json b/src/data/mocks/attestantPosts.json deleted file mode 100644 index af8dbbdb9f0..00000000000 --- a/src/data/mocks/attestantPosts.json +++ /dev/null @@ -1,22 +0,0 @@ -[ - { - "title": "EigenLayer: What do we know so far?", - "link": "https://www.attestant.io/posts/eigenlayer-so-far/", - "content": "Exploring the underlying mechanics, the economics of the marketplace, as well as insights derived from the testing phase to date.", - "source": "Attestant", - "sourceUrl": "https://www.attestant.io/posts/", - "sourceFeedUrl": "https://www.attestant.io/posts/", - "imgSrc": "/images/attestant-logo.svg", - "pubDate": "1 May 2024" - }, - { - "title": "The Rocket Pool Protocol", - "link": "https://www.attestant.io/posts/rocketpool-protocol/", - "content": "Analysis of Rocket Pool including a performance simulation and a PnL investigation.", - "source": "Attestant", - "sourceUrl": "https://www.attestant.io/posts/", - "sourceFeedUrl": "https://www.attestant.io/posts/", - "imgSrc": "/images/attestant-logo.svg", - "pubDate": "1 Mar 2024" - } -] diff --git a/src/data/mocks/beaconchainApr.json b/src/data/mocks/beaconchainApr.json deleted file mode 100644 index 1fdfd185287..00000000000 --- a/src/data/mocks/beaconchainApr.json +++ /dev/null @@ -1 +0,0 @@ -{ "value": 0.025, "timestamp": 1759687080325 } diff --git a/src/data/mocks/beaconchainEpoch.json b/src/data/mocks/beaconchainEpoch.json deleted file mode 100644 index b5022fcaacc..00000000000 --- a/src/data/mocks/beaconchainEpoch.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "totalEthStaked": { "value": 35000000, "timestamp": 1759687080325 }, - "validatorscount": { "value": 1000000, "timestamp": 1759687080325 } -} diff --git a/src/data/mocks/blobscanOverallStats.json b/src/data/mocks/blobscanOverallStats.json deleted file mode 100644 index 9eb9561c4c0..00000000000 --- a/src/data/mocks/blobscanOverallStats.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "avgBlobAsCalldataFee": 18402670294113620, - "avgBlobFee": 1337454615991715, - "avgBlobGasPrice": 4657716809.805255, - "avgMaxBlobGasFee": 19666167416.48503, - "totalBlobGasUsed": "875492278272", - "totalBlobAsCalldataGasUsed": "12165759474144", - "totalBlobFee": "4174952855822794358784", - "totalBlobAsCalldataFee": "57445149899315095107588", - "totalBlobs": 6679476, - "totalBlobSize": "875492278272", - "totalBlocks": 1664933, - "totalTransactions": 3121566, - "totalUniqueBlobs": 6575105, - "totalUniqueReceivers": 5361, - "totalUniqueSenders": 5941, - "updatedAt": "2025-03-25T11:45:00.590Z" -} diff --git a/src/data/mocks/communityEvents.json b/src/data/mocks/communityEvents.json deleted file mode 100644 index 3a6cb06e812..00000000000 --- a/src/data/mocks/communityEvents.json +++ /dev/null @@ -1 +0,0 @@ -{"pastEventData":[{"date":"2024-09-18T16:30:00+01:00","title":"🛠 QA session - ethereum.org portal","calendarLink":"https://www.google.com/calendar/event?eid=MGlzdW85ZjV1azVsdmNqOG8yMnZwbWhnZGYgY185ZTRiMWIyNzYwNzQzNDYzODE2MTAwYTE2OWQxNDI0MzAzNTJhN2NmYzMzNDRiMWU3ODVkYjUyMzg1YzlmZDM2QGc"},{"date":"2024-09-05T16:00:00+01:00","title":"☎️ ethereum.org Community Call - August 2024","calendarLink":"https://www.google.com/calendar/event?eid=NnY4NWhvN3IxajVsbGFqM3VyOWx1cDRnbDYgY185ZTRiMWIyNzYwNzQzNDYzODE2MTAwYTE2OWQxNDI0MzAzNTJhN2NmYzMzNDRiMWU3ODVkYjUyMzg1YzlmZDM2QGc"},{"date":"2024-09-04T17:00:00+01:00","title":"🛠 QA session - ethereum.org portal","calendarLink":"https://www.google.com/calendar/event?eid=NmdwYWF1bmozODhzaTc1ZW5rZ3BlNW5jNWwgY185ZTRiMWIyNzYwNzQzNDYzODE2MTAwYTE2OWQxNDI0MzAzNTJhN2NmYzMzNDRiMWU3ODVkYjUyMzg1YzlmZDM2QGc"},{"date":"2024-09-24T15:15:00+01:00","title":"New Event","calendarLink":"https://www.google.com/calendar/event?eid=Xzg5MWsyZHBoNjkzM2FiOW42Y28zNGI5azg4cTNpYmExNjUxM2FiYTY4OHMzY2Q5azhwMTQ4ZTIxNjQgY185ZTRiMWIyNzYwNzQzNDYzODE2MTAwYTE2OWQxNDI0MzAzNTJhN2NmYzMzNDRiMWU3ODVkYjUyMzg1YzlmZDM2QGc"}],"upcomingEventData":[{"date":"2024-10-31T15:00:00Z","title":"☎️ ethereum.org Community Call - October 2024","calendarLink":"https://www.google.com/calendar/event?eid=NWRja2UwaGxnbm5oMzh2ZTBiNW9lZ3QwcWYgY185ZTRiMWIyNzYwNzQzNDYzODE2MTAwYTE2OWQxNDI0MzAzNTJhN2NmYzMzNDRiMWU3ODVkYjUyMzg1YzlmZDM2QGc"},{"date":"2024-10-16T16:30:00+01:00","title":"🛠 QA session - ethereum.org portal","calendarLink":"https://www.google.com/calendar/event?eid=NGtrdGE3cDV0NTk4MzdsbjBuNzI2NTQ4Z2EgY185ZTRiMWIyNzYwNzQzNDYzODE2MTAwYTE2OWQxNDI0MzAzNTJhN2NmYzMzNDRiMWU3ODVkYjUyMzg1YzlmZDM2QGc"},{"date":"2024-10-02T16:30:00+01:00","title":"🛠 QA session - ethereum.org portal","calendarLink":"https://www.google.com/calendar/event?eid=NmlycGRhNTkwNmNvdmFpMmozcW1lb20wbWkgY185ZTRiMWIyNzYwNzQzNDYzODE2MTAwYTE2OWQxNDI0MzAzNTJhN2NmYzMzNDRiMWU3ODVkYjUyMzg1YzlmZDM2QGc"}]} \ No newline at end of file diff --git a/src/data/mocks/communityPicks.json b/src/data/mocks/communityPicks.json deleted file mode 100644 index 84e4b2483cf..00000000000 --- a/src/data/mocks/communityPicks.json +++ /dev/null @@ -1,26 +0,0 @@ -[ - { - "name": "Tim Beiko", - "twitterURL": "https://x.com/TimBeiko", - "twitterHandle": "@TimBeiko", - "app1Name": "Matcha", - "app2Name": "Farcaster", - "app3Name": "Mirror" - }, - { - "name": "Trent Van Epps", - "twitterURL": "https://x.com/trent_vanepps", - "twitterHandle": "@trent_vanepps", - "app1Name": "zkp2p", - "app2Name": null, - "app3Name": null - }, - { - "name": "Jason Chaskin", - "twitterURL": "https://x.com/jchaskin22", - "twitterHandle": "@jchaskin", - "app1Name": "Aave", - "app2Name": "Farcaster", - "app3Name": "Fileverse" - } -] \ No newline at end of file diff --git a/src/data/mocks/ethPrice.json b/src/data/mocks/ethPrice.json deleted file mode 100644 index d8eb75a4f2b..00000000000 --- a/src/data/mocks/ethPrice.json +++ /dev/null @@ -1 +0,0 @@ -{ "value": 4000, "timestamp": 1759687080325 } diff --git a/src/data/mocks/ethereumEcosystemData.json b/src/data/mocks/ethereumEcosystemData.json deleted file mode 100644 index 3f724c49ffb..00000000000 --- a/src/data/mocks/ethereumEcosystemData.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"ethereum","symbol":"eth","name":"Ethereum","image":"https://coin-images.coingecko.com/coins/images/279/large/ethereum.png?1696501628","current_price":2617.85,"market_cap":315023225315,"market_cap_rank":2,"fully_diluted_valuation":315023225315,"total_volume":16169667032,"high_24h":2652.65,"low_24h":2581.66,"price_change_24h":-14.782659630350736,"price_change_percentage_24h":-0.56152,"market_cap_change_24h":-1839423832.9405518,"market_cap_change_percentage_24h":-0.58051,"circulating_supply":120369473.880651,"total_supply":120369473.880651,"max_supply":null,"ath":4878.26,"ath_change_percentage":-46.23268,"ath_date":"2021-11-10T14:24:19.604Z","atl":0.432979,"atl_change_percentage":605682.48721,"atl_date":"2015-10-20T00:00:00.000Z","roi":{"times":54.07426262592152,"currency":"btc","percentage":5407.426262592152},"last_updated":"2024-10-01T13:11:16.598Z"},{"id":"tether","symbol":"usdt","name":"Tether","image":"https://coin-images.coingecko.com/coins/images/325/large/Tether.png?1696501661","current_price":0.9998,"market_cap":119527752495,"market_cap_rank":3,"fully_diluted_valuation":119527752495,"total_volume":49641535208,"high_24h":1.001,"low_24h":0.997043,"price_change_24h":-0.000002781420216369,"price_change_percentage_24h":-0.00028,"market_cap_change_24h":-44336733.83843994,"market_cap_change_percentage_24h":-0.03708,"circulating_supply":119632023784.447,"total_supply":119632023784.447,"max_supply":null,"ath":1.32,"ath_change_percentage":-24.4271,"ath_date":"2018-07-24T00:00:00.000Z","atl":0.572521,"atl_change_percentage":74.64887,"atl_date":"2015-03-02T00:00:00.000Z","roi":null,"last_updated":"2024-10-01T13:11:12.649Z"},{"id":"binancecoin","symbol":"bnb","name":"BNB","image":"https://coin-images.coingecko.com/coins/images/825/large/bnb-icon2_2x.png?1696501970","current_price":575.73,"market_cap":83987141058,"market_cap_rank":4,"fully_diluted_valuation":83987141058,"total_volume":809491690,"high_24h":582.39,"low_24h":564.88,"price_change_24h":-0.6508231312770931,"price_change_percentage_24h":-0.11292,"market_cap_change_24h":-102425352.41564941,"market_cap_change_percentage_24h":-0.12181,"circulating_supply":145887575.79,"total_supply":145887575.79,"max_supply":200000000,"ath":717.48,"ath_change_percentage":-19.48651,"ath_date":"2024-06-06T14:10:59.816Z","atl":0.0398177,"atl_change_percentage":1450673.13919,"atl_date":"2017-10-19T00:00:00.000Z","roi":null,"last_updated":"2024-10-01T13:11:03.457Z"},{"id":"usd-coin","symbol":"usdc","name":"USDC","image":"https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694","current_price":0.999581,"market_cap":35309586606,"market_cap_rank":7,"fully_diluted_valuation":35309540001,"total_volume":7774438079,"high_24h":1.002,"low_24h":0.997063,"price_change_24h":-0.000170002231663524,"price_change_percentage_24h":-0.017,"market_cap_change_24h":-693591993.4392319,"market_cap_change_percentage_24h":-1.92647,"circulating_supply":35339998239.7757,"total_supply":35339951594.3419,"max_supply":null,"ath":1.17,"ath_change_percentage":-14.7322,"ath_date":"2019-05-08T00:40:28.300Z","atl":0.877647,"atl_change_percentage":13.93432,"atl_date":"2023-03-11T08:02:13.981Z","roi":null,"last_updated":"2024-10-01T13:11:10.525Z"}] \ No newline at end of file diff --git a/src/data/mocks/ethereumMarketcapData.json b/src/data/mocks/ethereumMarketcapData.json deleted file mode 100644 index e244f818224..00000000000 --- a/src/data/mocks/ethereumMarketcapData.json +++ /dev/null @@ -1 +0,0 @@ -{ "value": 419233099014.7839, "timestamp": 1732568502485 } diff --git a/src/data/mocks/ethereumStablecoins.json b/src/data/mocks/ethereumStablecoins.json deleted file mode 100644 index abd2b306de6..00000000000 --- a/src/data/mocks/ethereumStablecoins.json +++ /dev/null @@ -1 +0,0 @@ -{ "value": 126900000000 } \ No newline at end of file diff --git a/src/data/mocks/ethereumStablecoinsData.json b/src/data/mocks/ethereumStablecoinsData.json deleted file mode 100644 index 337cc731b65..00000000000 --- a/src/data/mocks/ethereumStablecoinsData.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"tether","symbol":"usdt","name":"Tether","image":"https://coin-images.coingecko.com/coins/images/325/large/Tether.png?1696501661","current_price":0.9998,"market_cap":119527752495,"market_cap_rank":3,"fully_diluted_valuation":119527752495,"total_volume":49641535208,"high_24h":1.001,"low_24h":0.997043,"price_change_24h":-0.000002781420216369,"price_change_percentage_24h":-0.00028,"market_cap_change_24h":-44336733.83843994,"market_cap_change_percentage_24h":-0.03708,"circulating_supply":119632023784.447,"total_supply":119632023784.447,"max_supply":null,"ath":1.32,"ath_change_percentage":-24.4271,"ath_date":"2018-07-24T00:00:00.000Z","atl":0.572521,"atl_change_percentage":74.64887,"atl_date":"2015-03-02T00:00:00.000Z","roi":null,"last_updated":"2024-10-01T13:11:12.649Z"},{"id":"usd-coin","symbol":"usdc","name":"USDC","image":"https://coin-images.coingecko.com/coins/images/6319/large/usdc.png?1696506694","current_price":0.999581,"market_cap":35309586606,"market_cap_rank":7,"fully_diluted_valuation":35309540001,"total_volume":7774438079,"high_24h":1.002,"low_24h":0.997063,"price_change_24h":-0.000170002231663524,"price_change_percentage_24h":-0.017,"market_cap_change_24h":-693591993.4392319,"market_cap_change_percentage_24h":-1.92647,"circulating_supply":35339998239.7757,"total_supply":35339951594.3419,"max_supply":null,"ath":1.17,"ath_change_percentage":-14.7322,"ath_date":"2019-05-08T00:40:28.300Z","atl":0.877647,"atl_change_percentage":13.93432,"atl_date":"2023-03-11T08:02:13.981Z","roi":null,"last_updated":"2024-10-01T13:11:10.525Z"},{"id":"dai","symbol":"dai","name":"Dai","image":"https://coin-images.coingecko.com/coins/images/9956/large/Badge_Dai.png?1696509996","current_price":0.99987,"market_cap":5851938256,"market_cap_rank":22,"fully_diluted_valuation":5852300959,"total_volume":93115819,"high_24h":1.002,"low_24h":0.997201,"price_change_24h":-0.000344276117198117,"price_change_percentage_24h":-0.03442,"market_cap_change_24h":380085133,"market_cap_change_percentage_24h":6.94619,"circulating_supply":5857680087.46236,"total_supply":5858043146.42038,"max_supply":null,"ath":1.22,"ath_change_percentage":-17.96519,"ath_date":"2020-03-13T03:02:50.373Z","atl":0.88196,"atl_change_percentage":13.37787,"atl_date":"2023-03-11T07:50:50.514Z","roi":null,"last_updated":"2024-10-01T13:11:13.082Z"}] \ No newline at end of file diff --git a/src/data/mocks/fetched10YearEvents.json b/src/data/mocks/fetched10YearEvents.json deleted file mode 100644 index 6900acbb09a..00000000000 --- a/src/data/mocks/fetched10YearEvents.json +++ /dev/null @@ -1,392 +0,0 @@ -{ - "africa": { - "label": "Africa", - "events": [ - { - "host": "Nnamdi Oji ", - "eventLink": "https://lu.ma/d75tlbfw", - "pingedForURL": "FALSE", - "eventLocation": "TheBuidl, Kaduna, Nigeria", - "address": "10 Algeria Crescent, Barnawa, Kaduna 800283, Kaduna, Nigeria", - "city": "Kaduna", - "country": "Nigeria", - "region": "Africa", - "continent": "Africa", - "lat": "10.5036", - "lng": "7.4337", - "readyToShow": "TRUE", - "countryFlag": "🇳🇬" - }, - { - "host": "Built Different Foundation", - "eventLink": "https://lu.ma/6yotpgq5", - "pingedForURL": "FALSE", - "eventLocation": "Eight 2 Five Innovation Hub, Third Floor Anchor House, J Moyo Avenue, Harare", - "address": "Eight 2 Five Innovation Hub, Third Floor Anchor House, J Moyo Avenue, Harare", - "city": "Harare", - "country": "Zimbabwe", - "region": "Africa", - "continent": "Africa", - "lat": "-17.8263", - "lng": "31.0504", - "readyToShow": "TRUE", - "countryFlag": "🇿🇼" - }, - { - "host": "Africa Blockchain Community", - "eventLink": "https://lu.ma/xatik06o", - "pingedForURL": "FALSE", - "eventLocation": "Rue 186 AFG, Lomé, Togo", - "address": "Rue 186 AFG, Lomé, Togo", - "city": "Lomé", - "country": "Togo", - "region": "Africa", - "continent": "Africa", - "lat": "6.1296", - "lng": "1.2197", - "readyToShow": "TRUE", - "countryFlag": "🇹🇬" - }, - { - "host": "BLOCKFUSE LABS", - "eventLink": "https://lu.ma/sttk0wd5", - "pingedForURL": "FALSE", - "eventLocation": "Blockfuse Labs HQ, ", - "address": "Rhomat Plaza, 29 Jonah David Jang Wy, Local, Rayfield, Jos 930101, Plateau, Nigeria", - "city": "Jos", - "country": "Nigeria", - "region": "Africa", - "continent": "Africa", - "lat": "9.8965", - "lng": "8.8583", - "readyToShow": "TRUE", - "countryFlag": "🇳🇬" - }, - { - "host": "ETHCongo", - "eventLink": "https://lu.ma/1mha555b?locale=fr", - "pingedForURL": "FALSE", - "eventLocation": "kinshasa/ DRC", - "address": "TBD", - "city": "Kinshasa", - "country": "Democratic Republic of the Congo", - "region": "Africa", - "continent": "Africa", - "lat": "-4.3033", - "lng": "15.3105", - "readyToShow": "TRUE", - "countryFlag": "🇨🇩" - } - ] - }, - "asia": { - "label": "Asia", - "events": [ - { - "host": "Gryffindors", - "eventLink": "https://lu.ma/e1ctjffh", - "pingedForURL": "FALSE", - "eventLocation": "Chennai", - "address": "53/23, 3rd Main Road, Gandhi Nagar, Adyar, Chennai, Tamil Nadu 600020, India", - "city": "Chennai", - "country": "India", - "region": "India", - "continent": "Asia", - "lat": "13.0843", - "lng": "80.2705", - "readyToShow": "TRUE", - "countryFlag": "🇮🇳" - }, - { - "host": "Song ", - "eventLink": "https://lu.ma/alwo0o2j", - "pingedForURL": "TRUE", - "eventLocation": "Found8 Tanjong Pagar, Singapore (co-working event space)", - "address": "1 N Bridge Rd, #08-08 High Street Centre, Singapore 179094", - "city": "Singapore", - "country": "Singapore", - "region": "East Asia", - "continent": "Asia", - "lat": "1.3521", - "lng": "103.8198", - "readyToShow": "TRUE", - "countryFlag": "🇸🇬" - }, - { - "host": "ETHMumbai", - "eventLink": "https://lu.ma/vmtviber", - "pingedForURL": "FALSE", - "eventLocation": "Mumbai", - "address": "TBD", - "city": "Mumbai", - "country": "India", - "region": "India", - "continent": "Asia", - "lat": "19.076", - "lng": "72.8777", - "readyToShow": "TRUE", - "countryFlag": "🇮🇳" - }, - { - "host": "Gangwal ", - "eventLink": "https://platform.serotonin.co/events/10-years-of-ethereum-iiit-hyderabad-hyderabad-india-maabsu", - "pingedForURL": "TRUE", - "eventLocation": "IIIT Hyderabad, India", - "address": "IIIT Hyderabad, India", - "city": "Hyderabad", - "country": "India", - "region": "India", - "continent": "Asia", - "lat": "17.4065", - "lng": "78.4772", - "readyToShow": "TRUE", - "countryFlag": "🇮🇳" - }, - { - "host": "Coding Catalyst", - "eventLink": "https://lu.ma/b9tnoyl2", - "pingedForURL": "TRUE", - "eventLocation": "Local co-working space / Cafe", - "address": "TBD", - "city": "Delhi", - "country": "India", - "region": "India", - "continent": "Asia", - "lat": "28.7041", - "lng": "77.1025", - "readyToShow": "TRUE", - "countryFlag": "🇮🇳" - }, - { - "host": "Sahu ", - "eventLink": "https://lu.ma/sc3s8xcl", - "pingedForURL": "TRUE", - "eventLocation": "TBD", - "address": "TBD", - "city": "Bhopal", - "country": "India", - "region": "India", - "continent": "Asia", - "lat": "24.6912", - "lng": "78.4138", - "readyToShow": "TRUE", - "countryFlag": "🇮🇳" - }, - { - "host": "Shenzhen University", - "eventLink": "https://lu.ma/ejoo0fb5", - "pingedForURL": "FALSE", - "eventLocation": "SZTU", - "address": "TBD", - "city": "Shenzen", - "country": "China", - "region": "China", - "continent": "Asia", - "lat": "22.5429", - "lng": "114.0596", - "readyToShow": "TRUE", - "countryFlag": "🇨🇳" - } - ] - }, - "central & south america": { - "label": "Central & South America", - "events": [ - { - "host": "Nodo Serrano", - "eventLink": "https://lu.ma/lb7dtked", - "pingedForURL": "TRUE", - "eventLocation": "San Martín 864", - "address": "San Martín 864, B7000 Tandil, Provincia de Buenos Aires, Argentina", - "city": "Tandil", - "country": "Argentina", - "region": "Central & South America", - "continent": "Central & South America", - "lat": "-37.3288", - "lng": "-59.1367", - "readyToShow": "TRUE", - "countryFlag": "🇦🇷" - }, - { - "host": "Ethereum Monterrey", - "eventLink": "https://lu.ma/8njndqrw", - "pingedForURL": "TRUE", - "eventLocation": "LaCuraduria", - "address": "Santa Catarina, Calle Hidalgo Nte 306-308, La Fama, 66100 Cdad. Santa Catarina, N.L., Mexico", - "city": "Monterrey", - "country": "Mexico", - "region": "Central & South America", - "continent": "Central & South America", - "lat": "25.6866", - "lng": "-100.3161", - "readyToShow": "TRUE", - "countryFlag": "🇲🇽" - }, - { - "host": "CochaBlock", - "eventLink": "https://app.unlock-protocol.com/event/celebra-los-10-aos-de-ethereum-junto-a-cocha-block-2", - "pingedForURL": "FALSE", - "eventLocation": "Trotamundos Recoleta Video BAR", - "address": "591, Cochabamba, Bolivia", - "city": "Cochabamba", - "country": "Bolivia", - "region": "Central & South America", - "continent": "Central & South America", - "lat": "-17.382", - "lng": "-66.1596", - "readyToShow": "TRUE", - "countryFlag": "🇧🇴" - }, - { - "host": "Novak ", - "eventLink": "https://lu.ma/kq1nul4t", - "pingedForURL": "FALSE", - "eventLocation": "Founder Haus, Florianópolis - SC (Brazil)", - "address": "Av. dos Merlins, 156 - Jurerê Internacional, Florianópolis - SC, 88053-370, Brazil", - "city": "Florianópolis", - "country": "Brazil", - "region": "Central & South America", - "continent": "Central & South America", - "lat": "-27.5969", - "lng": "-48.5468", - "readyToShow": "TRUE", - "countryFlag": "🇧🇷" - } - ] - }, - "europe": { - "label": "Europe", - "events": [ - { - "host": "ETHTurin", - "eventLink": "https://platform.serotonin.co/events/decentralized-by-nature-ethereums-10th-at-stone-oven-house-ror-italy-isrcoe", - "pingedForURL": "TRUE", - "eventLocation": "stoneovenhouse.com", - "address": "Via Maestra, 4 - 10060 Rorà TO", - "city": "Rorà", - "country": "Italy", - "region": "Europe", - "continent": "Europe", - "lat": "44.7923", - "lng": "7.1966", - "readyToShow": "TRUE", - "countryFlag": "🇮🇹" - }, - { - "host": "Imperial College London", - "eventLink": "https://lu.ma/8ejysqky", - "pingedForURL": "TRUE", - "eventLocation": "Imperial College London, South Kensington Campus, London SW7 2AZ, United Kingdom", - "address": "TBD", - "city": "London", - "country": "United Kingdom", - "region": "Europe", - "continent": "Europe", - "lat": "51.5072", - "lng": "-0.1276", - "readyToShow": "TRUE", - "countryFlag": "🇬🇧" - }, - { - "host": "Brighton Blockchain", - "eventLink": "https://www.meetup.com/brighton-blockchain/events/307527140/", - "pingedForURL": "FALSE", - "eventLocation": "Freedom Works, Black Lion Street, Brighton and Hove, BN1 1JE", - "address": "Freedom Works, Black Lion Street, Brighton and Hove, BN1 1JE", - "city": "Brighton", - "country": "United Kingdom", - "region": "Europe", - "continent": "Europe", - "lat": "50.8229", - "lng": "-0.1363", - "readyToShow": "TRUE", - "countryFlag": "🇬🇧" - }, - { - "host": "ETHBratislava", - "eventLink": "https://lu.ma/t41op9nb", - "pingedForURL": "FALSE", - "eventLocation": "The Spot", - "address": "Bottova 2/A, 811 09 Bratislava, Slovakia", - "city": "Bratislava", - "country": "Slovakia", - "region": "Europe", - "continent": "Europe", - "lat": "48.1486", - "lng": "17.1077", - "readyToShow": "TRUE", - "countryFlag": "🇸🇰" - }, - { - "host": "Klapf ", - "eventLink": "https://lu.ma/0wh4fh5d", - "pingedForURL": "TRUE", - "eventLocation": "Butchers Bar & Grill", - "address": "Marktpl. 10, 85229 Markt Indersdorf, Germany", - "city": "Markt Indersdorf", - "country": "Germany", - "region": "Europe", - "continent": "Europe", - "lat": "48.3622", - "lng": "11.3743", - "readyToShow": "TRUE", - "countryFlag": "🇩🇪" - }, - { - "host": "PWN DAO Foundation", - "eventLink": "https://lu.ma/xdjlepmh", - "pingedForURL": "FALSE", - "eventLocation": "Přístav 18600", - "address": "Rohanský ostrov 8, 186 00 Praha 8-", - "city": "Prague", - "country": "Czech Republic", - "region": "Europe", - "continent": "Europe", - "lat": "50.0755", - "lng": "14.4378", - "readyToShow": "TRUE", - "countryFlag": "🇨🇿" - } - ] - }, - "north america": { - "label": "North America", - "events": [ - { - "host": "Ethereum Austin", - "eventLink": "https://www.meetup.com/ethereum-austin/events/307661745", - "pingedForURL": "FALSE", - "eventLocation": "2410 San Antonio Ave, Austin TX", - "address": "2410 San Antonio Ave, Austin TX", - "city": "Austin", - "country": "United States", - "region": "North America", - "continent": "North America", - "lat": "30.2672", - "lng": "-97.7431", - "readyToShow": "TRUE", - "countryFlag": "🇺🇸" - } - ] - }, - "oceania": { - "label": "Oceania", - "events": [ - { - "host": "ETHSydney", - "eventLink": "https://lu.ma/qx0g2942", - "pingedForURL": "FALSE", - "eventLocation": "Helix Collective Sydney Office", - "address": "level 1/2/14 Vine St, Redfern NSW 2016, Australia", - "city": "Sydney", - "country": "Australia", - "region": "Oceania", - "continent": "Oceania", - "lat": "-33.8688", - "lng": "151.2093", - "readyToShow": "TRUE", - "countryFlag": "🇦🇺" - } - ] - } -} diff --git a/src/data/mocks/fetched10YearStories.json b/src/data/mocks/fetched10YearStories.json deleted file mode 100644 index 4b25058452c..00000000000 --- a/src/data/mocks/fetched10YearStories.json +++ /dev/null @@ -1,230 +0,0 @@ -[ - { - "storyEnglish": "I had a transaction with a friend who was overseas, and I was surprised that sending and receiving money through Ethereum was much faster and easier than I thought. It's much more transparent than the existing banking system, and there are no complicated procedures in the middle.", - "storyOriginal": "특히 해외에 있는 친구랑 거래를 할 일이 있었는데, 이더리움을 통해 돈을 보내고 받는 게 생각보다 훨씬 빠르고 간편해서 놀랐어요. 기존 은행 시스템보다 훨씬 투명하고, 중간에 복잡한 절차도 없고요. 작은 경험들이긴 하지만 이런 것들이 쌓이면서 제 삶에도, 그리고 제 주변에도 이더리움이 긍정적인 변화를 주고 있다는 걸 느껴요.", - "date": "11.4.", - "country": "South Korea", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "Ethereum has empowered Kenyan communities by improving financial inclusion, supporting agriculture, fostering education, and enabling cost-effective remittances. big up to ETH", - "storyOriginal": "", - "category": "Financial Inclusion, International transfers", - "name": "Thomas", - "date": "10.4.", - "country": "Kenya", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "Self-custody in the increasingly restrictive (and sometimes even hostile) world of traditional finance has opened the doors to a parallel system of finance for me.", - "storyOriginal": "", - "category": "Self-Custody", - "name": "-", - "date": "10.4.", - "country": "Canada", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "In the past, when the community held some charity events, the fund raising channels were limited and the management transparency was low. With the decentralized nature of Ethereum, we can launch crowdfunding activities worldwide, and all fund flows can be clearly recorded on the blockchain. Community members can check the use of funds at any time, which not only broadens the source of funds, but also improves the transparency and credibility of fund management.", - "storyOriginal": "以往社区举办一些公益活动时,资金募集渠道有限且管理透明度低。借助以太坊的去中心化特性,我们可以在全球范围内发起众筹活动,并且所有的资金流向都能在区块链上清晰记录。社区成员可以随时查看资金的使用情况,这不仅拓宽了资金来源,还提高了资金管理的透明度和公信力。\n", - "category": "Community Collaboration, Transparency", - "name": "Shangzi", - "date": "14.4.", - "country": "China", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "Ethereum has reduce poverty on average Nigeria youth. Young guys and ladies either trade or writing codes. This has help to reduce unemployment in my community.", - "storyOriginal": "", - "category": "Financial Inclusion", - "name": "Emmanuel", - "date": "9.4.", - "country": "Nigeria", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "In emerging regions, instability, distrust, and social inequality are commonplace. Ethereum offers not only a technological alternative, but a philosophical one. It allows us to build systems where transparency is default, trust is programmable, and access is open.", - "storyOriginal": "", - "category": "Self-custody, Transparency, Community Collaboration", - "name": "Thiago", - "date": "15.4.", - "country": "Brazil", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "In March 2020, toward the end of the COVID pandemic, I simply decided to try buying crypto. I bought Bitcoin and Ethereum without really understanding the difference between them at the time. Now, I'm an ETH maxi. As a citizen of my country, I've always been interested in one question: why can laws be so easily ignored? How can we make contracts enforceable and finally make the law work? Today, after five years on my crypto journey, I have the answer. And that answer is Ethereum — a tool for autonomous individuals. I believe in a bright future for humanity. I believe in a bright future for Ethereum. Thanks to every builder for making this future real.", - "storyOriginal": "", - "category": "Self-custody, Transparency", - "name": "Dorgo.eth", - "date": "15.4.", - "country": "Ukraine", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "How DeFi has made an impact on my life: Spent 8 years working regular jobs, perfect credit, no debt and all banks denied my loan apps after months of back n forth. In less than 30 minutes I took a loan agains't my ETH which allowed me to buy the land and start construction.", - "storyOriginal": "", - "category": "Financial Inclusion", - "name": "Casio", - "date": "24.3.", - "country": "", - "twitter": "https://x.com/0xCasio/status/1506951476433895425", - "region": "-" - }, - { - "storyEnglish": "Sent some money back home to Afghanistan to support my family with stablecoins and turns out exchange centers are willing to pay an extra 10$ on 1000$ because there's more demand to keep their capital in stablecoins than holding US Dollars in fiat. Reasons? 1. Government can't control their money 2. Easier to transfer across the country and outside of the country as well. 3. Banks are very difficult to deal with 4. Since the demand for stables is high, They can transfer it to fiat whenever they want. Some of you may not see it because you're focused on memecoins but people with genuine problems are turning to crypto.", - "storyOriginal": "", - "category": "International transfers, Self-custody", - "name": "Abbas", - "date": "23.1.", - "country": "Afghanistan", - "twitter": "https://x.com/KhanAbbas201/status/1882473370664812814", - "region": "Asia" - }, - { - "storyEnglish": "I started as a local group in my city Warri south of Nigeria, two years ago, has metamorphosed into a vibrant community of over 400 people with some already developing smart contracts and getting immersed in Ethereum. One of the most significant differences Ethereum made in my community - the web3 Warri - was bringing together individuals with no background in blockchain and transforming them into smart contracts developers. Ethereum has helped my community - the web3 Warri - overcome some of these challenges 1. Centralization: Members of my community now understand that they have control over how they use the internet and their data 2. Seamless and cross-border payments: Most members of my community work as freelancers and remote workers. And receiving their payments have already been a challenger but with Ethereum, they have been able to receive their payments via stable coins and in almost an instance. 3. They also don't need to provide numerous documents to support their identity in making and receiving payments.", - "storyOriginal": "", - "category": "International transfers, Financial Inclusion, Self-custody", - "name": "Charles", - "date": "16.4.", - "country": "Nigeria", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "Ethereum has made a huge difference in my life. Around eight months ago, I didn't know much about development within the blockchain space. But as I started exploring and joined Web3 communities in Costa Rica like Dojo Coding and Web3Mentorhood, my perspective on Web3 completely changed. Thanks to Ethereum and these communities, I've had access to opportunities I never imagined. For instance, I was able to travel outside my country for the first time through Web3 initiatives—something I hadn't achieved through Web2-related activities. Ethereum has also helped spark events in Costa Rica, strengthening crypto adoption and building a more vibrant local ecosystem. Personally, Ethereum has opened my eyes to a world full of possibilities: collaborating with people from around the globe, constantly learning, and dreaming about building solutions that truly make an impact.", - "storyOriginal": "", - "category": "Community collaboration", - "name": "Sebastián", - "date": "16.4.", - "country": "Costa Rica", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "I couldn't withdraw funds on offshore cryptocurrency apps, but Ethereum made it so easy.", - "storyOriginal": "من نمی‌توانستم برداشت مالی در اپلیکیشن های رمز ارز برون مرزی داشته باشم ولی اتریوم این کار رو به این راحتی انجام داد.", - "category": "Financial inclusion, International transfers", - "name": "Lida", - "date": "17.4.", - "country": "Iran", - "twitter": "من نمی‌توانستم برداشت مالی در اپلیکیشن های رمز ارز برون مرزی داشته باشم ولی اتریوم این کار رو به این راحتی انجام داد.", - "region": "#REF!" - }, - { - "storyEnglish": "Ethereum helped us break down many barriers we took for granted. Not just technical ones, but also mental ones: believing that technology was foreign, that you had to speak a certain language, live in a certain place, or have a specific profile to access real opportunities.For me and my community, it opened the door to global spaces, where what matters is what you contribute, not where you come from. It allowed us to explore, learn, and build on what we already knew but with a totally new vision. And that also showed us that we can be in both worlds—creative and technological—and add value from there.", - "storyOriginal": "", - "category": "Community Collaboration", - "name": "Yamille\t", - "date": "17.4.", - "country": "Peru", - "twitter": "https://x.com/yamiyami_eth\t", - "region": "#REF!" - }, - { - "storyEnglish": "what people have used the most are remittances, I believe that's the most common use and it's very useful", - "storyOriginal": "", - "category": "Financial inclusion, International transfers", - "name": "Cryptonautas", - "date": "20.4.", - "country": "Mexico", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "Growing up in Argentina, I experienced how economic instability, inflation, and a lack of trust in institutions can deeply affect daily life. These challenges pushed me to explore alternative systems that don't rely on centralized authorities or intermediaries. That's how I found Ethereum, and it's made a profound difference in how I view the future. Ethereum offered me and my community a new way to think about trust, identity, and value. It's not just a technology; it's a tool for empowerment. With this public good, financial inclusion becomes real. People who were previously shut out of traditional systems now have access to decentralized finance, secure transactions, and even new forms of income and expression through NFTs, DAOs, and other innovations.", - "storyOriginal": "", - "category": "Self-custody, Community Collaboration", - "name": " 0x3liza.eth", - "date": "20.4.", - "country": "Argentina", - "twitter": "https://x.com/Elizapancake01", - "region": "#REF!" - }, - { - "storyEnglish": "Ethereum has helped Argentinians overcome the limits of a broken financial system. It gave us a way to earn and save (mostly in stablecoins), despite inflation, currency controls, and constant uncertainty.", - "storyOriginal": "", - "category": "Financial Inclusion", - "name": "Facu", - "date": "24.4.", - "country": "Argentina", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "I use Ethereum on a daily basis. With my Gnosis Pay card it's very easy to link my wallet to my daily expenses, and the best of it all is that I can leverage DeFi at the same time. That means that even my current account is earning yield, while keeping my funds accessible and easy to spend.", - "storyOriginal": "", - "category": "Payments", - "name": "Nico", - "date": "25.4.", - "country": "Netherlands", - "twitter": "https://x.com/nicnode", - "region": "Europe" - }, - { - "storyEnglish": "My family lives in Bolivia, and when my brother went to study abroad it was extremely expensive to send him money. Bank transfers are extremely expensive, and solutions like MoneyGram or Western Union would take huge cuts on the transfer. It was a big relief when we discovered that we could send him money with crypto at a fraction of the cost.", - "storyOriginal": "", - "category": "International transfers", - "name": "Nico", - "date": "25.4.", - "country": "Netherlands", - "twitter": "https://x.com/nicnode", - "region": "Europe" - }, - { - "storyEnglish": "I'm Cuban. I live in Serbia. From Cuba, opening a bank account was almost impossible. Paying online… even more difficult. When I arrived in Serbia, I thought everything would be easier. But in 2021, something happened to me that I'll never forget. A client asked me for a website. He paid me via PayPal. And PayPal… blocked my money. Just when I needed it most. That same day, I started looking for solutions. And I found Ethereum. That's when everything changed. Thanks to Ethereum, I was able to receive direct payments. Without banks. Without blocks. Without asking permission. Since then, I fell in love with Ethereum. Because it's not just money. It's freedom. It's being able to work and get paid, no matter where you come from. Every time I have something on another network, I try to move it to Ethereum. Because I believe in its potential. In its ability to give opportunities to people like me. People who come from countries where the system closes its doors to you. For me, Ethereum isn't just technology. It's a tool for living a better life.", - "storyOriginal": "Soy cubano. Vivo en Serbia. Desde Cuba, abrir una cuenta bancaria era casi imposible. Pagar online… aún más difícil. Cuando llegué a Serbia, pensé que todo sería más fácil. Pero en 2021 me pasó algo que no olvido. Un cliente me pidió una página web. Me pagó por PayPal. Y PayPal… me bloqueó el dinero. Justo cuando más lo necesitaba. Ese mismo día me puse a buscar soluciones. Y encontré Ethereum. Ahí cambió todo. Gracias a Ethereum pude recibir pagos directo. Sin bancos. Sin bloqueos. Sin pedir permiso. Desde entonces, me enamoré de Ethereum. Porque no es solo dinero. Es libertad. Es poder trabajar y cobrar, sin importar de dónde vengas. Cada vez que tengo algo en otra red, trato de moverlo a Ethereum. Porque creo en su potencial. En su capacidad de darle oportunidades a gente como yo. Gente que viene de países donde el sistema te cierra las puertas. Ethereum, para mí, no es solo tecnología. Es una herramienta para vivir mejor.", - "category": "International transfers", - "name": "imrulo.eth ", - "date": "26.4.", - "country": "Serbia", - "twitter": "https://farcaster.xyz/guinoki.eth ", - "region": "Europe" - }, - { - "storyEnglish": "Ethereum has helped our community overcome several significant challenges, particularly around transparency, trust, and efficient resource allocation. By leveraging smart contracts, we have been able to automate and secure the distribution of funding for social impact projects, ensuring that resources are used for their intended purposes and that all transactions are transparent and publicly auditable. This has greatly reduced the risk of mismanagement and fostered greater trust among stakeholders.", - "storyOriginal": "", - "category": "Transparency, Community Collaboration", - "name": "Rodrigo NuñΞz ", - "date": "28.4.", - "country": "Mexico", - "twitter": "https://x.com/Cypherpunkfish1 ", - "region": "#REF!" - }, - { - "storyEnglish": "We are using Ethereum to create new coordination mechanisms within a DeSciDAO, allowing us to allocate various forms of capital with smart contracts and accelerate research and citizen science in coral reef conservation initiatives and programs in Mesoamerica, with plans to scale these efforts worldwide.", - "storyOriginal": "", - "category": "Transparency, Community Collaboration", - "name": "MesoReefDAO ", - "date": "28.4.", - "country": "Mexico", - "twitter": "https://x.com/MesoReefDAO ", - "region": "#REF!" - }, - { - "storyEnglish": "Before Ethereum, opportunities for many developers like me, especially in Nigeria and across Africa, were very limited. Access to global tech communities, funding, mentorship, and even simply being seen was incredibly hard. Ethereum changed that for me and for many people I know. It helped us overcome barriers of geography, background, and limited resources. Through Ethereum, we could contribute to open-source projects, earn real experience, build real products, and be part of something bigger than ourselves, without needing permission from institutions or borders. ", - "storyOriginal": "", - "category": "Community Collaboration", - "name": "Samuel", - "date": "28.4.", - "country": "Nigeria", - "twitter": "", - "region": "#REF!" - }, - { - "storyEnglish": "I use Ethereum on a day-to-day basis to build art projects, deploy websites via ENS, manage my tokens, and anonymize accounts to create new projects unrelated to me.", - "storyOriginal": "J'utilise Ethereum au jour le jour pour construire des projets artistiques, déployer des sites web via ENS, gérer mes tokens, et anonymiser des comptes pour créer de nouveaux projets non reliées à moi.", - "category": "", - "name": "Alex", - "date": "5.5", - "country": "France", - "twitter": "", - "region": "Europe" - } - ] \ No newline at end of file diff --git a/src/data/mocks/fetchedTorchHolders.json b/src/data/mocks/fetchedTorchHolders.json deleted file mode 100644 index fe51488c706..00000000000 --- a/src/data/mocks/fetchedTorchHolders.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/src/data/mocks/frameworksListData.json b/src/data/mocks/frameworksListData.json deleted file mode 100644 index a5f36cf79eb..00000000000 --- a/src/data/mocks/frameworksListData.json +++ /dev/null @@ -1 +0,0 @@ -[{"id":"Kurtosis Ethereum Package","url":"https://github.com/kurtosis-tech/ethereum-package","githubUrl":"https://github.com/kurtosis-tech/ethereum-package","background":"#000000","name":"Kurtosis Ethereum Package","description":"page-developers-local-environment:page-local-environment-kurtosis-desc","alt":"page-developers-local-environment:page-local-environment-kurtosis-logo-alt","image":{"src":"/_next/static/media/kurtosis.2d89f1e0.png","height":500,"width":500,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAGFBMVEVMaXEAwSMAxCYAyCIAwiIAwiMAwSMAvyM0GQgYAAAACHRSTlMASRMJYVeGMThI5+sAAAAJcEhZcwAACxMAAAsTAQCanBgAAAAtSURBVHicRYrJCQAwEISc2av/jsNCQnyJCB8TNjBttQClaoAoZa5sUdemN18ODtQAaWHwWFMAAAAASUVORK5CYII=","blurWidth":8,"blurHeight":8},"starCount":235,"languages":["Starlark","Python"]},{"id":"hardhat","url":"https://hardhat.org/","githubUrl":"https://github.com/nomiclabs/hardhat","background":"#faf8fb","name":"Hardhat","description":"page-developers-local-environment:page-local-environment-hardhat-desc","alt":"page-developers-local-environment:page-local-environment-hardhat-logo-alt","image":{"src":"/_next/static/media/hardhat.e5431960.png","height":200,"width":629,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAADCAMAAACZFr56AAAALVBMVEX59vr5+O3cw6f59tr9/P7Wk2Dm2VHz7bbev5Li4N69g2HTpHPy4tjh14Dr5HRySo1GAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAI0lEQVR4nGNgYGBg4eNlY2Zg52Rk4OJm5WFgZmRkYWLiYAQABpAAdvjWgdcAAAAASUVORK5CYII=","blurWidth":8,"blurHeight":3},"starCount":7212,"languages":["TypeScript","Solidity"]},{"id":"brownie","url":"https://github.com/eth-brownie/brownie","githubUrl":"https://github.com/eth-brownie/brownie","background":"#ffffff","name":"Brownie","description":"page-developers-local-environment:page-local-environment-brownie-desc","alt":"page-developers-local-environment:page-local-environment-brownie-logo-alt","image":{"src":"/_next/static/media/eth-diamond-black.a042df77.png","height":1303,"width":800,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAMAAAAGL8UJAAAALVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBoCg+AAAAD3RSTlMBFGnLX7GnI4A6UpOP4/dIbsMDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAK0lEQVR4nAXBhwHAMAgAIIya0fX/uQVUYHURNTNU53erfnNb13gOZ24Y4QcPHACtv+HuBAAAAABJRU5ErkJggg==","blurWidth":5,"blurHeight":8},"starCount":2640,"languages":["Python","Solidity"]},{"id":"epirus","url":"https://www.web3labs.com/epirus","githubUrl":"https://github.com/web3labs/epirus-free","background":"#ffffff","name":"Epirus","description":"page-developers-local-environment:page-local-environment-epirus-desc","alt":"page-developers-local-environment:page-local-environment-epirus-logo-alt","image":{"src":"/_next/static/media/epirus.5f7d05a1.png","height":105,"width":105,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAASFBMVEVMaXE+MuxJOv2Khvpyetx1b+hIOP1LPf+Wkv9IOf1HOfyTkP8eEqcaEZ4UCp4PA5qPi/+QjP9vZ/xgVfyem/9BM/YgFLNFPNK67oEUAAAAFHRSTlMA9LqdCxiR/brL2NPbOpSlfPf9/SnJx9EAAAAJcEhZcwAACxMAAAsTAQCanBgAAAA+SURBVHicHYtJFsAgCMW+FQS0s2jvf9M+ySbZBE8fIiIbmr/VrBawujKC2zXM15eXj32etCKNZIVaRrzk+gNNUgH0EjhMjQAAAABJRU5ErkJggg==","blurWidth":8,"blurHeight":8},"starCount":245,"languages":["HTML","Shell"]},{"id":"createethapp","url":"https://github.com/PaulRBerg/create-eth-app","githubUrl":"https://github.com/PaulRBerg/create-eth-app","background":"#ffffff","name":"Create Eth App","description":"page-developers-local-environment:page-local-environment-eth-app-desc","alt":"page-developers-local-environment:page-local-environment-eth-app-logo-alt","image":{"src":"/_next/static/media/eth-diamond-black.a042df77.png","height":1303,"width":800,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAMAAAAGL8UJAAAALVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBoCg+AAAAD3RSTlMBFGnLX7GnI4A6UpOP4/dIbsMDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAK0lEQVR4nAXBhwHAMAgAIIya0fX/uQVUYHURNTNU53erfnNb13gOZ24Y4QcPHACtv+HuBAAAAABJRU5ErkJggg==","blurWidth":5,"blurHeight":8},"starCount":2743,"languages":["JavaScript","TypeScript"]},{"id":"scaffoldeth","url":"https://scaffoldeth.io/","githubUrl":"https://github.com/scaffold-eth/scaffold-eth-2","background":"#ffffff","name":"Scaffold-ETH-2","description":"page-developers-local-environment:page-local-environment-scaffold-eth-desc","alt":"page-local-environment-scaffold-eth-logo-alt","image":{"src":"/_next/static/media/scaffoldeth.cd548199.png","height":100,"width":100,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAAMFBMVEUAAAAAAAAAAAAAAAAXFxeGhoYMDAx1dXVeXl4tLS1JSUmVlZWhoaG7u7vR0dHp6emgnumOAAAAA3RSTlP3hItveKZsAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAOElEQVR4nC2LSQ7AIAzEBhwStsL/f4to65Mly8q8JInW3ZCwZ41iCGohPgnb/UoMv0ltzupI6d8PK9kBO0fyA1cAAAAASUVORK5CYII=","blurWidth":8,"blurHeight":8},"starCount":1320,"languages":["TypeScript","JavaScript"]},{"id":"soliditytemplate","url":"https://github.com/paulrberg/solidity-template","githubUrl":"https://github.com/paulrberg/solidity-template","background":"#ffffff","name":"Solidity template","description":"page-developers-local-environment:page-local-environment-solidity-template-desc","alt":"page-developers-local-environment:page-local-environment-solidity-template-logo-alt","image":{"src":"/_next/static/media/eth-diamond-black.a042df77.png","height":1303,"width":800,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAICAMAAAAGL8UJAAAALVBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADBoCg+AAAAD3RSTlMBFGnLX7GnI4A6UpOP4/dIbsMDAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAK0lEQVR4nAXBhwHAMAgAIIya0fX/uQVUYHURNTNU53erfnNb13gOZ24Y4QcPHACtv+HuBAAAAABJRU5ErkJggg==","blurWidth":5,"blurHeight":8},"starCount":1955,"languages":["TypeScript","Solidity"]},{"id":"foundry","url":"https://getfoundry.sh/","githubUrl":"https://github.com/foundry-rs/foundry","background":"#ffffff","name":"Foundry","description":"page-developers-local-environment:page-local-environment-foundry-desc","alt":"page-developers-local-environment:page-local-environment-foundry-logo-alt","image":{"src":"/_next/static/media/foundry.1018b0c1.png","height":200,"width":200,"blurDataURL":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAMAAADz0U65AAAATlBMVEV1dXXCwsKjo6Ofn5/z8/N4eHjo6OhxcXGJiYnKysqNjY2Li4uWlpaZmZmxsbGysrLR0dHT09O9vb1CQkK0tLShoaFwcHBUVFT////W1tYM2FdSAAAAFnRSTlMCX6uk/f78qP7+XKVf/F+k+177+aWoKC52FAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAEFJREFUeJwVy0cSgDAMALFNtdMIbRz4/0cZdBfQRTpAMzNrUFeKUVdFLKvmJMx46ijlxpWx58sOCI+lN/xt897BB1iEAl23XQdDAAAAAElFTkSuQmCC","blurWidth":8,"blurHeight":8},"starCount":8167,"languages":["Rust","Shell"]}] \ No newline at end of file diff --git a/src/data/mocks/gfissues.json b/src/data/mocks/gfissues.json deleted file mode 100644 index d5598104d06..00000000000 --- a/src/data/mocks/gfissues.json +++ /dev/null @@ -1,92 +0,0 @@ -[ - { - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/issues/13992", - "html_url": "https://github.com/ethereum/ethereum-org-website/issues/13992", - "title": "Bug report ...... PAGE NOT FOUND broken link", - "user": { - "login": "Xcertik-Realist", - "id": 63165931, - "avatar_url": "https://avatars.githubusercontent.com/u/63165931?v=4" - }, - "labels": [ - { - "id": 796509427, - "node_id": "MDU6TGFiZWw3OTY1MDk0Mjc=", - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/labels/bug%20%F0%9F%90%9B", - "name": "bug 🐛", - "color": "ee0701", - "default": false, - "description": "Something isn't working" - }, - { - "id": 2847180148, - "node_id": "MDU6TGFiZWwyODQ3MTgwMTQ4", - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/labels/good%20first%20issue", - "name": "good first issue", - "color": "6C5DF6", - "default": true, - "description": "Good item to try if you're new to contributing" - }, - { - "id": 7537785110, - "node_id": "LA_kwDOBvEA_s8AAAABwUl5Fg", - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/labels/hacktoberfest", - "name": "hacktoberfest", - "color": "F2B767", - "default": false, - "description": "Track hacktoberfest activity" - }, - { - "id": 7538280799, - "node_id": "LA_kwDOBvEA_s8AAAABwVEJXw", - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/labels/hacktoberfest-beginner", - "name": "hacktoberfest-beginner", - "color": "F5D720", - "default": false, - "description": "GFI for hacktoberfest participants" - } - ] - }, - { - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/issues/13930", - "html_url": "https://github.com/ethereum/ethereum-org-website/issues/13930", - "title": "Bug in \"Merkle patricia trie\" page on mobile", - "user": { - "login": "UNOFFICIALbgd", - "id": 71248977, - "avatar_url": "https://avatars.githubusercontent.com/u/71248977?v=4" - }, - "labels": [ - { - "id": 796509427, - "node_id": "MDU6TGFiZWw3OTY1MDk0Mjc=", - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/labels/bug%20%F0%9F%90%9B", - "name": "bug 🐛", - "color": "ee0701", - "default": false, - "description": "Something isn't working" - } - ] - }, - { - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/issues/13711", - "html_url": "https://github.com/ethereum/ethereum-org-website/issues/13711", - "title": "Remove Atom Editor from IDE List on Ethereum.org", - "user": { - "login": "Shiva-Sai-ssb", - "id": 112751524, - "avatar_url": "https://avatars.githubusercontent.com/u/112751524?v=4" - }, - "labels": [ - { - "id": 796509427, - "node_id": "MDU6TGFiZWw3OTY1MDk0Mjc=", - "url": "https://api.github.com/repos/ethereum/ethereum-org-website/labels/bug%20%F0%9F%90%9B", - "name": "bug 🐛", - "color": "ee0701", - "default": false, - "description": "Something isn't working" - } - ] - } -] diff --git a/src/data/mocks/growThePieBlockspaceData.json b/src/data/mocks/growThePieBlockspaceData.json deleted file mode 100644 index cf0a3b797d9..00000000000 --- a/src/data/mocks/growThePieBlockspaceData.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "arbitrum": { - "nft": 0.009984110324308348, - "defi": 0.2689309579893618, - "social": 0.013193695696229522, - "token_transfers": 0.07476154340049304, - "unlabeled": 0.38455596099648726 - }, - "base": { - "nft": 0.002593480219368002, - "defi": 0.16181484824754763, - "social": 0.002398326678753112, - "token_transfers": 0.013594959061503868, - "unlabeled": 0.39771564417346245 - }, - "optimism": { - "nft": 0.006050200017338907, - "defi": 0.11765117644545392, - "social": 0.0015029766506283954, - "token_transfers": 0.05259639266672885, - "unlabeled": 0.6267918657739237 - }, - "zksync_era": { - "nft": 0.038278961109126736, - "defi": 0.2259351484816336, - "social": 0.06337112937904162, - "token_transfers": 0.12729344240157583, - "unlabeled": 0.36825569044252693 - }, - "linea": { - "nft": 0.0038632595191378104, - "defi": 0.2517927233961308, - "social": 0.03613045257699356, - "token_transfers": 0.10803153398456405, - "unlabeled": 0.45033652616056297 - }, - "scroll": { - "nft": 0.0013058170066607409, - "defi": 0.2478282405353744, - "social": 0.005091328390763437, - "token_transfers": 0.11046016886464602, - "unlabeled": 0.4692471830612916 - }, - "mode": { - "nft": 0.0001816884900918849, - "defi": 0.34959814229232583, - "social": 0.0026860360526779923, - "token_transfers": 0.03147479525602267, - "unlabeled": 0.30152985600916654 - }, - "ink": { - "nft": 0.006050200017338907, - "defi": 0.11765117644545392, - "social": 0.0015029766506283954, - "token_transfers": 0.05259639266672885, - "unlabeled": 0.6267918657739237 - }, - "unichain": { - "nft": 0.006050200017338907, - "defi": 0.11765117644545392, - "social": 0.0015029766506283954, - "token_transfers": 0.05259639266672885, - "unlabeled": 0.6267918657739237 - } -} diff --git a/src/data/mocks/growThePieData.json b/src/data/mocks/growThePieData.json deleted file mode 100644 index 8f5bfd2cbe9..00000000000 --- a/src/data/mocks/growThePieData.json +++ /dev/null @@ -1,60 +0,0 @@ -{ - "txCount": { "value": 20113689, "timestamp": 1732561036299 }, - "txCostsMedianUsd": { - "value": 0.10252370826740381, - "timestamp": 1732561036299 - }, - "dailyTxCosts": { - "ethereum": 1.5642321147439395, - "arbitrum": 0.010201116846622714, - "gravity": 0.004178700263687191, - "optimism": 0.0027902374152419173, - "base": 0.007764349788577658, - "zksync_era": 0.019537763079284804, - "polygon_zkevm": 0.07562885045422585, - "zora": 0.009432662720468029, - "linea": 0.05821396831420389, - "mantle": 0.010820152133569856, - "scroll": 0.035543140792205316, - "starknet": 0.025402769983550386, - "metis": 0.0069948957204748925, - "blast": 0.007134756036862854, - "manta": 0.0003705215201380192, - "mode": 0.004033647940964035, - "taiko": 0.011915191008957854, - "redstone": 0.0018557582938633012, - "derive": 0.03414083342479006, - "orderly": 0.0010056552980039267, - "worldchain": 0.006684175070209207, - "ink": 0.000084959363439004, - "unichain": 0.000060453342918528 - }, - "activeAddresses": { - "mantle": 32493, - "scroll": 22191, - "loopring": 351, - "rhino": 1559, - "starknet": 9365, - "metis": 22629, - "blast": 22010, - "manta": 110254, - "mode": 2099, - "taiko": 147292, - "redstone": 316, - "derive": 26, - "orderly": 10, - "gravity": 67650, - "worldchain": 25225, - "ethereum": 395400, - "arbitrum": 412248, - "imx": 3349, - "optimism": 59747, - "base": 1026819, - "zksync_era": 47007, - "polygon_zkevm": 2708, - "zora": 18101, - "linea": 77067, - "ink": 92296, - "unichain": 49158 - } -} diff --git a/src/data/mocks/growThePieMasterData.json b/src/data/mocks/growThePieMasterData.json deleted file mode 100644 index 7cbdbf5e5f2..00000000000 --- a/src/data/mocks/growThePieMasterData.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "launchDates": { - "ethereum": "2015-07-30", - "all-l2s": null, - "arbitrum": "2021-08-31", - "base": "2023-07-13", - "blast": "2024-02-29", - "derive": "2023-12-15", - "gravity": "2024-08-13", - "immutable-x": "2021-03-26", - "linea": "2023-07-12", - "loopring": "2019-12-04", - "manta": "2023-09-12", - "mantle": "2023-07-14", - "metis": "2021-11-19", - "mode": "2024-01-31", - "multiple": null, - "optimism": "2021-12-16", - "orderly": "2024-01-22", - "polygon-zkevm": "2023-03-24", - "redstone": "2024-05-01", - "rhino-fi": "2022-07-13", - "scroll": "2023-10-17", - "starknet": "2021-11-29", - "taiko": "2024-05-27", - "worldchain": "2024-10-17", - "zksync-era": "2023-03-24", - "zora": "2023-06-21", - "ink": "2024-12-07", - "unichain": "2025-02-12" - } -} diff --git a/src/data/mocks/l2beatData.json b/src/data/mocks/l2beatData.json deleted file mode 100644 index cc0ad0ad4c0..00000000000 --- a/src/data/mocks/l2beatData.json +++ /dev/null @@ -1,8810 +0,0 @@ -{ - "success": true, - "data": { - "chart": { - "types": ["timestamp", "native", "canonical", "external", "ethPrice"], - "data": [ - [1728518400, 12951959828.64, 14204896668.91, 7959907185.79, 2367.4463], - [1728540000, 13095797476.8, 14349993739.95, 8021137975.78, 2402.3308], - [1728561600, 13064721409.03, 14380101166.75, 8013415842.96, 2403.682], - [1728583200, 12773905140.3, 14084207609.29, 7910627060.18, 2345.8108], - [1728604800, 13028933205.11, 14291035037.03, 7988387880.45, 2383.5962], - [1728626400, 13065020190.76, 14405682133.06, 8025243608.47, 2405.225], - [1728648000, 13190400893.25, 14562683977.4, 8040207494.94, 2420.7122], - [1728669600, 13502604881.53, 14712192165.01, 8096222950.38, 2450.921], - [1728691200, 13417493226, 14664999489.02, 8093424933.46, 2437.9148], - [1728712800, 13477041742.8, 14709922139.83, 8116234911.27, 2446.363], - [1728734400, 13580677817.47, 14786962819.99, 8142265642.5, 2451.5427], - [1728756000, 13643907767.66, 14903686702.72, 8183052244.73, 2478.5085], - [1728777600, 13684965650.04, 14918744980.27, 8175083772.69, 2476.3105], - [1728799200, 13628318378.86, 14864141443.55, 8141600458.7, 2465.5098], - [1728820800, 13614314832.66, 14808842661.52, 8124397606.39, 2462.736], - [1728842400, 13579954580.97, 14710820749.11, 8090682796.86, 2445.1328], - [1728864000, 13829234183.53, 14849911944.53, 8148869484.35, 2467.7925], - [1728885600, 14004408200.93, 15206416135.99, 8269536339.64, 2529.2527], - [1728907200, 14033277259.84, 15304451823.56, 8296490080.84, 2539.4517], - [1728928800, 14207287727.94, 15681487420.25, 8400270427.24, 2631.7126], - [1728950400, 14274296190.56, 15750937243.39, 8415911387.3, 2625.893], - [1728972000, 14127853680.68, 15593838551.28, 8356411055.92, 2594.3372], - [1728993600, 13924892899.65, 15557077617.47, 8324396882.55, 2590.1865], - [1729015200, 14006028781.24, 15570011070.52, 8338150056.36, 2590.4836], - [1729036800, 14015343997.39, 15601125157.87, 8356558139.41, 2600.089], - [1729058400, 14047792173.57, 15675240723.4, 8379319170.5, 2616.56], - [1729080000, 14029665899.67, 15773256455.53, 8404997351.78, 2631.1611], - [1729101600, 13864183328.73, 15701919597.24, 8352450670.63, 2620.2869], - [1729123200, 13877517952.48, 15687524825.03, 8350147873.82, 2611.7002], - [1729144800, 13842060193.89, 15758485421.69, 8347937830.48, 2627.3882], - [1729166400, 13620757198.87, 15599308611.8, 8304198137.42, 2600.8545], - [1729188000, 13574174352.9, 15530165656.94, 8275435535.99, 2588.0361], - [1729209600, 13578140211.93, 15637417380.41, 8303291974.57, 2605.282], - [1729231200, 13745401904.01, 15767697156.13, 8327575771.38, 2626.0825], - [1729252800, 13799766404.6, 15758395820.84, 8307245114.85, 2623.7876], - [1729274400, 13884956371.8, 15969623954.58, 8331341677.23, 2650.39], - [1729296000, 13896776504.28, 15890193486.23, 8326447994.61, 2638.784], - [1729317600, 13944666490.25, 15949886918.59, 8300945494.82, 2644.0955], - [1729339200, 13750249108.56, 15882600704.8, 8203677556.43, 2634.3792], - [1729360800, 13816587457.65, 15911460235.98, 8196434544.09, 2639.9966], - [1729382400, 13867845228.16, 15969250986.06, 8220501043.46, 2649.884], - [1729404000, 13819076698.44, 15895580380.84, 8195023290, 2640.5793], - [1729425600, 13932209844.88, 16006781822.46, 8227217964.6, 2652.1733], - [1729447200, 14205131946.54, 16202545761.86, 8293342761.45, 2700.5435], - [1729468800, 14333872204.65, 16421310869.68, 8367793376.13, 2747.2358], - [1729490400, 14496731623.14, 16481337758.54, 8320219427.96, 2734.4548], - [1729512000, 14300995213.79, 16397478539.74, 8274064383.97, 2708.1453], - [1729533600, 14091466558.24, 16211844951.57, 8240630674.67, 2668.5422], - [1729555200, 14071934707.83, 16196929292.67, 8225906889.04, 2665.8013], - [1729576800, 14166694399.73, 16167300699.65, 8230059776.36, 2650.3704], - [1729598400, 14058547153.36, 16053935900.83, 8191994289.32, 2637.4436], - [1729620000, 13956776854.66, 16052886375.15, 8182368565.4, 2623.069], - [1729641600, 14188599069.07, 16098473349.65, 8165911808.76, 2619.4949], - [1729663200, 14087743989.91, 16050112531.08, 8114275980.75, 2616.9429], - [1729684800, 13919739174.24, 15832137489.85, 8034850777.7, 2578.4756], - [1729706400, 13719908669.58, 15390768737.24, 7890588140.49, 2474.3438], - [1729728000, 13887503772.61, 15640123559.44, 7953159578.28, 2520.1948], - [1729749600, 14036728692.52, 15832510825.41, 8008936395.73, 2557.3833], - [1729771200, 13881590318.64, 15680084503.08, 7963403536.19, 2527.0159], - [1729792800, 13909174864.25, 15669957097.36, 7969115436.84, 2520.8865], - [1729814400, 13976032364.85, 15784653035.87, 7994553728.93, 2536.0872], - [1729836000, 13772811770.3, 15608433568.59, 7867937204.12, 2492.5723], - [1729857600, 13914626681.42, 15872907219.78, 7932245048.07, 2544.3616], - [1729879200, 13622893411.02, 15472091073.26, 7843607902.72, 2458.0056], - [1729900800, 13117871342.29, 15184126738.5, 7670923500.28, 2429.0076], - [1729922400, 13314509072.1, 15396730500.3, 7711792179.32, 2463.8987], - [1729944000, 13313960529.28, 15440685481.31, 7715829031.8, 2473.0496], - [1729965600, 13223176277.33, 15460516089.8, 7698032062.57, 2475.2563], - [1729987200, 13290860176.57, 15471100900.85, 7704398359.37, 2476.5178], - [1730008800, 13380162799.09, 15476100285.57, 7711903283.46, 2477.3728], - [1730030400, 13307256932, 15422649802.53, 7703152940.48, 2466.738], - [1730052000, 13445491806.37, 15564958683.98, 7708074844.43, 2491.597], - [1730073600, 13499956120.1, 15638378775.45, 7800059233.71, 2504.548], - [1730095200, 13310301044.14, 15476441142.36, 7749334602.1, 2483.3093], - [1730116800, 13539194436.81, 15642683616.53, 7760494423.71, 2518.512], - [1730138400, 13337101340.73, 15536771717.88, 7718297991.16, 2508.1716], - [1730160000, 13661417715.38, 15844719421.5, 7801616117.79, 2567.0889], - [1730181600, 13917431376, 16151006990.49, 7930768913.48, 2617.615], - [1730203200, 14026877447.77, 15989019893.36, 7892192221.36, 2621.3145], - [1730224800, 14207384498.67, 16215971894.92, 7974648589.75, 2654.824], - [1730246400, 14130708578.98, 16114685352.98, 7939885276.11, 2634.8196], - [1730268000, 14198767100.71, 16245893588.06, 7989185395.66, 2667.4897], - [1730289600, 14150871673.54, 16188608242.77, 7967315519.38, 2664.247], - [1730311200, 14314723349.67, 16262049559.29, 7981624475.84, 2673.8374], - [1730332800, 14257892244.58, 16228378874.29, 7963803361.93, 2659.292], - [1730354400, 14134675536.17, 16156222980.69, 7938579506.18, 2648.538], - [1730376000, 14006735793.73, 16086268806.48, 7916486590.46, 2637.4705], - [1730397600, 13716100838.27, 15566421670.72, 7753744228.1, 2533.3086], - [1730419200, 13643097393.57, 15529118987.07, 7737502169.43, 2524.1892], - [1730440800, 13642544808.23, 15424728039.69, 7731067398.83, 2508.583], - [1730462400, 13627525114.38, 15491858876.06, 7734722333.06, 2515.5898], - [1730484000, 13571568591.14, 15435681290.31, 7724786836.94, 2505.493], - [1730505600, 13436363934.3, 15455615636.02, 7739035382.82, 2511.9712], - [1730527200, 13421820281.25, 15461125197.1, 7732243634.41, 2511.6636], - [1730548800, 13356619090.66, 15410516412.38, 7719343486.51, 2501.452], - [1730570400, 13114253774.69, 15294254497.51, 7674744847.99, 2481.641], - [1730592000, 13148725614.25, 15343808471.67, 7691201434.35, 2495.211], - [1730613600, 12939699657.92, 15079726280.44, 7607871393.5, 2444.1428], - [1730635200, 12844538785.63, 15110474865.93, 7602555647.91, 2455.5056], - [1730656800, 12786732211.08, 15014392454.97, 7580893712.59, 2447.496], - [1730678400, 12870819200.59, 15092592347.63, 7596096474.08, 2455.0935], - [1730700000, 12829982545.42, 15132933982.9, 7611057226.46, 2469.1675], - [1730721600, 12858861481.33, 15014437255.74, 7625759106.06, 2465.7195], - [1730743200, 12649940332.85, 14756314956.47, 7439052319.96, 2423.2554], - [1730764800, 12613174379.33, 14671996089.14, 7401430085.06, 2403.1309], - [1730786400, 12791724993, 14625845554.46, 7444874656.94, 2426.5466], - [1730808000, 12811657717.14, 14671603525.6, 7464061125, 2437.2532], - [1730829600, 13025495424.09, 14817857161.52, 7502610506.19, 2454.4302], - [1730851200, 13041376489.29, 14738322521.53, 7486483441.16, 2429.8835], - [1730872800, 13661872381.87, 15630944893.67, 7769672699.95, 2596.2], - [1730894400, 13782001986.52, 15783565895.35, 7823472561.17, 2632.2576], - [1730916000, 13869674715.62, 15916875383.5, 7859451889.51, 2662.7754], - [1730937600, 14168521592.17, 16213817377.6, 7965612458.15, 2717.5369], - [1730959200, 14436062299.81, 16742403930.19, 8114888653.54, 2830.3967], - [1730980800, 14194731770.95, 16638150170.69, 8089228688.27, 2803.5923], - [1731002400, 14250801406.12, 16899147395.07, 8146670589.05, 2863.1216], - [1731024000, 14288993562.58, 17072568168.93, 8210550855.16, 2900.4697], - [1731045600, 14224947764.37, 17131350284.53, 8243404625.99, 2921.8801], - [1731067200, 14170905898.92, 17147462607.42, 8249667108.79, 2916.8357], - [1731088800, 14100823490.19, 17111046170.05, 8253816867.59, 2920.2454], - [1731110400, 14237204512.32, 17357339761.06, 8332214539.47, 2969.0496], - [1731114000, 14303149659.88, 17430869478.49, 8353255592.89, 2985.7795] - ] - } - }, - "projects": { - "arbitrum": { - "id": "arbitrum", - "name": "Arbitrum One", - "slug": "arbitrum", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "Nitro" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "WasmVM" - }, - { - "category": "Other", - "name": "Governance" - }, - { - "category": "Other", - "name": "L3HostChain" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 14519913133.67, - "ether": 4387357086.39, - "stablecoin": 4802469953.21, - "associated": 2367575309.09 - }, - "associatedTokens": ["ARB"], - "change7d": 0.0773180163756924 - }, - "stage": "Stage 1", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "warning", - "description": "Fraud proofs allow 14 WHITELISTED actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "7d", - "sentiment": "warning", - "warning": { - "value": "The Security Council can upgrade with no delay.", - "sentiment": "bad" - }, - "description": "Non-emergency upgrades are initiated on L2 and go through a 8d delay. Since there is a 1d delay to force a tx (forcing the inclusion in the following state update), users have only 7d to exit. \n \n If users post a tx after that time, they would only be able to self propose a state root 12d 17h after the last state root was proposed and then wait for the 6d 8h challenge window, while the upgrade would be confirmed just after the 6d 8h challenge window and the 3d L1 timelock." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "base": { - "id": "base", - "name": "Base", - "slug": "base", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Other", - "name": "L3HostChain" - } - ], - "tvs": { - "breakdown": { - "total": 8612500120.84, - "ether": 2758347738.64, - "stablecoin": 3582063074.24, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.089218876103043 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "good", - "description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can be a Proposer and propose new roots to the L1 bridge." - } - ] - }, - "optimism": { - "id": "optimism", - "name": "OP Mainnet", - "slug": "optimism", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Other", - "name": "L3HostChain" - }, - { - "category": "Other", - "name": "Governance" - } - ], - "tvs": { - "breakdown": { - "total": 6196279162.59, - "ether": 1680718678.59, - "stablecoin": 1191671605.42, - "associated": 2002120935.2 - }, - "associatedTokens": ["OP"], - "change7d": 0.0699202061201485 - }, - "stage": "Stage 1", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "good", - "description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no exit window for users to exit in case of unwanted regular upgrades as they are initiated by the Security Council with instant upgrade power and without proper notice." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can be a Proposer and propose new roots to the L1 bridge." - } - ] - }, - "mantle": { - "id": "mantle", - "name": "Mantle", - "slug": "mantle", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "CustomDA" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 1775655355.27, - "ether": 1000829476.79, - "stablecoin": 346033277.24, - "associated": 206593370.7 - }, - "associatedTokens": ["MNT"], - "change7d": 0.153636009521903 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation rely fully on data that is NOT published on chain. Mantle DA contracts are forked from EigenDA with significant modifications, most importantly removal of slashing conditions. DA fraud proof mechanism is not live yet." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "blast": { - "id": "blast", - "name": "Blast", - "slug": "blast", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 1464031435.75, - "ether": 1056445834.33, - "stablecoin": 197270866.46, - "associated": 186283266.53 - }, - "associatedTokens": ["BLAST"], - "change7d": 0.115509463493146 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "scroll": { - "id": "scroll", - "name": "Scroll", - "slug": "scroll", - "type": "layer2", - "category": "ZK Rollup", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - } - ], - "tvs": { - "breakdown": { - "total": 1085270515.25, - "ether": 777698458.3, - "stablecoin": 52022651.78, - "associated": 135038048.13 - }, - "associatedTokens": ["SCR"], - "change7d": 0.0759531710709884 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring." - }, - { - "name": "State Validation", - "value": "ZK proofs (SN)", - "sentiment": "good", - "description": "SNARKs are zero knowledge proofs that ensure state correctness, but require trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "linea": { - "id": "linea", - "name": "Linea", - "slug": "linea", - "type": "layer2", - "category": "ZK Rollup", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Other", - "name": "L3HostChain" - } - ], - "tvs": { - "breakdown": { - "total": 949499632.91, - "ether": 765004713.99, - "stablecoin": 46144671.61, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.149576490782338 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring." - }, - { - "name": "State Validation", - "value": "ZK proofs (SN)", - "sentiment": "good", - "description": "SNARKs are zero knowledge proofs that ensure state correctness, but require trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1. Unlike most ZK rollups, transaction data is posted instead of state diffs." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "zksync2": { - "id": "zksync2", - "name": "ZKsync Era", - "slug": "zksync-era", - "type": "layer2", - "category": "ZK Rollup", - "provider": "ZK Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Stack", - "name": "ZKStack" - }, - { - "category": "Other", - "name": "L3HostChain" - }, - { - "category": "Infra", - "name": "ElasticChain" - } - ], - "tvs": { - "breakdown": { - "total": 917340067.71, - "ether": 308914649.32, - "stablecoin": 62102151.46, - "associated": 507685862.92 - }, - "associatedTokens": ["ZK"], - "change7d": 0.0939873183552358 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Enqueue via L1", - "sentiment": "warning", - "description": "Users can submit transactions to an L1 queue, but can't force them. The sequencer cannot selectively skip transactions but can stop processing the queue entirely. In other words, if the sequencer censors or is down, it is so for everyone." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain (SD)", - "sentiment": "good", - "description": "All of the data (SD = state diffs) needed for proof construction is published onchain." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted standard upgrade because the central operator can censor withdrawal transactions by implementing a TransactionFilterer with no delay. The standard upgrade delay is 4d 21h." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "warning", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen. There is a decentralized Governance system that can attempt changing Proposers with an upgrade." - } - ] - }, - "starknet": { - "id": "starknet", - "name": "Starknet", - "slug": "starknet", - "type": "layer2", - "category": "ZK Rollup", - "provider": "Starknet", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "CairoVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Infra", - "name": "SHARP" - }, - { - "category": "Other", - "name": "Governance" - } - ], - "tvs": { - "breakdown": { - "total": 710326532.1, - "ether": 254598315.88, - "stablecoin": 78045589.92, - "associated": 337840813.07 - }, - "associatedTokens": ["STRK"], - "change7d": 0.130915571108154 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "Onchain (SD)", - "sentiment": "good", - "description": "All of the data (SD = state diffs) needed for proof construction is published onchain." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "mantapacific": { - "id": "mantapacific", - "name": "Manta Pacific", - "slug": "mantapacific", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 555645039.27, - "ether": 182838295.49, - "stablecoin": 27547813.67, - "associated": 276141427.33 - }, - "associatedTokens": ["MANTA"], - "change7d": 0.136510657414638 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "mode": { - "id": "mode", - "name": "Mode Network", - "shortName": "Mode", - "slug": "mode", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 344647264.2, - "ether": 49719116.99, - "stablecoin": 6679047.66, - "associated": 14317558.32 - }, - "associatedTokens": ["MODE"], - "change7d": 0.0989409975685549 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "metis": { - "id": "metis", - "name": "Metis Andromeda", - "shortName": "Metis", - "slug": "metis", - "type": "layer2", - "category": "Optimium", - "provider": "OVM", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "CustomDA" - }, - { - "category": "Fork", - "name": "OVM" - } - ], - "tvs": { - "breakdown": { - "total": 326151746.16, - "ether": 12768832.2, - "stablecoin": 29328309.8, - "associated": 283798367.6 - }, - "associatedTokens": ["Metis"], - "change7d": 0.127963261958407 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Enqueue via L1", - "sentiment": "warning", - "description": "Users can submit transactions to an L1 queue, but can't force them. The sequencer cannot selectively skip transactions but can stop processing the queue entirely. In other words, if the sequencer censors or is down, it is so for everyone." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External (MEMO)", - "sentiment": "bad", - "description": "Transaction data is kept in MEMO decentralized storage." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "fuel": { - "id": "fuel", - "name": "Fuel Ignition", - "slug": "fuel", - "type": "layer2", - "category": "Optimistic Rollup", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "FuelVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - } - ], - "tvs": { - "breakdown": { - "total": 312221249.25, - "ether": 189034104.91, - "stablecoin": 34625689.56, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.158758063821449 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "worldchain": { - "id": "worldchain", - "name": "World Chain", - "slug": "world", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "Identity"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Alchemy" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 220075918.87, - "ether": 5006542.39, - "stablecoin": 9032698.38, - "associated": 203996074.86 - }, - "associatedTokens": ["WLD"], - "change7d": 0.648866305013397 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "real": { - "id": "real", - "name": "Re.al", - "slug": "real", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "RWA"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 189431953.3, - "ether": 2519399.8, - "stablecoin": 7424.34, - "associated": 22292598.52 - }, - "associatedTokens": ["RWA"], - "change7d": 0.333235994666568 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "Fraud proofs only allow 2 WHITELISTED actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "fraxtal": { - "id": "fraxtal", - "name": "Fraxtal", - "slug": "fraxtal", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "CustomDA" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 187895720.91, - "ether": 34838247, - "stablecoin": 77661341.14, - "associated": 44254537.02 - }, - "associatedTokens": ["FXS", "FPIS"], - "change7d": 0.0730025391630083 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation rely fully on data that is NOT published on chain. Fraxtal uses a separate data availability module developed by the Frax Core Team, and data availability attestations are not published on chain." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "zircuit": { - "id": "zircuit", - "name": "Zircuit", - "slug": "zircuit", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 174337451.03, - "ether": 172258887.46, - "stablecoin": 1884006.88, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.184385867907863 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "galxegravity": { - "id": "galxegravity", - "name": "Gravity", - "slug": "galxegravity", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 137851764.81, - "ether": 1724633.49, - "stablecoin": 1760072.07, - "associated": 134367059.25 - }, - "associatedTokens": ["G"], - "change7d": 0.042906591654984 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1000d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 5d 14h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 11d 23h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "lisk": { - "id": "lisk", - "name": "Lisk", - "slug": "lisk", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Other", - "name": "MigratedFromL1" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 136736279.37, - "ether": 1545831.78, - "stablecoin": 247367.27, - "associated": 134778471.42 - }, - "associatedTokens": ["LSK"], - "change7d": 0.0689482145956715 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "taiko": { - "id": "taiko", - "name": "Taiko", - "slug": "taiko", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "Taiko", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": true, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Other", - "name": "BasedSequencing" - } - ], - "tvs": { - "breakdown": { - "total": 121266589.86, - "ether": 24635937.92, - "stablecoin": 12668572.04, - "associated": 82427826.75 - }, - "associatedTokens": ["TAIKO"], - "change7d": 0.192005765023217 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "The system uses a based (or L1-sequenced) rollup sequencing mechanism. Users can propose L2 blocks directly on the Taiko L1 contract. The TaikoAdmin multisig can pause block proposals without delay." - }, - { - "name": "State Validation", - "value": "SGX proofs", - "sentiment": "bad", - "description": "Taiko uses a multi-tier proof system to validate the state. However, current tier proofs include either SGX (secure-enclave) execution verification, or approval by a minimum number of Guardians. State validation through the Zk-proof tier is not yet active. \n Each proof goes through a cooldown window allowing for contestation. Contested blocks require proof from a higher level tier. If no contestation is made, or the block has been proven by the highest tier, the proof is considered valid.\n The system allows for an invalid state to be proven by either a compromised SGX instance or compromised Guardians (the highest tier). This can lead to a state being proven as valid when it is not." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Provers can examine the proposed blocks on the TaikoL1 contract, and generate SGX proofs for them. Currently, any prover providing a valid SGX attestation can register a SGX instance and create proofs for proposed blocks." - } - ] - }, - "bob": { - "id": "bob", - "name": "BOB", - "slug": "bob", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "Bitcoin DApps"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 116691306.39, - "ether": 13503783.95, - "stablecoin": 3350833.27, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0973637660327704 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "immutablex": { - "id": "immutablex", - "name": "Immutable X", - "slug": "immutablex", - "type": "layer2", - "category": "Validium", - "provider": "StarkEx", - "purposes": ["NFT", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "StarkEx" - }, - { - "category": "Infra", - "name": "SHARP" - } - ], - "tvs": { - "breakdown": { - "total": 93659353.37, - "ether": 17602310.27, - "stablecoin": 724926.01, - "associated": 69921463.66 - }, - "associatedTokens": ["IMX"], - "change7d": 0.0658218658810521 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for for more than 7d, users can use the exit hatch to withdraw their funds." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 5/7 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds. NFTs will be minted on L1 to exit." - } - ] - }, - "apex": { - "id": "apex", - "name": "ApeX", - "slug": "apex", - "type": "layer2", - "category": "Validium", - "provider": "StarkEx", - "purposes": ["Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "StarkEx" - }, - { - "category": "Infra", - "name": "SHARP" - } - ], - "tvs": { - "breakdown": { - "total": 79877798.36, - "ether": 0, - "stablecoin": 79877798.36, - "associated": 0 - }, - "associatedTokens": ["APEX"], - "change7d": 0.00525909245244316 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a trade or a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for 7d, users can use the exit hatch to withdraw their funds. Users are required to find a counterparty for the trade by out of system means." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 3/5 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds. Positions will be closed using the average price from the last batch state update." - } - ] - }, - "zklinknova": { - "id": "zklinknova", - "name": "zkLink Nova", - "slug": "zklinknova", - "type": "layer3", - "category": "Validium", - "provider": "zkLink Nexus", - "purposes": ["Universal", "Interoperability"], - "isArchived": false, - "hostChain": "Linea", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Linea" - } - ], - "tvs": { - "breakdown": { - "total": 69966371.85, - "ether": 28367222.4, - "stablecoin": 953767.02, - "associated": 22181034.2 - }, - "associatedTokens": ["ZKL"], - "change7d": -0.0308046828380348 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring." - }, - { - "name": "State Validation", - "value": "ZK proofs", - "sentiment": "good", - "description": "Zero knowledge cryptography is used to ensure state correctness. Proofs are first verified on Linea and finally on Ethereum." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation rely fully on data that is ultimately NOT published on Ethereum." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "polygonzkevm": { - "id": "polygonzkevm", - "name": "Polygon zkEVM", - "slug": "polygonzkevm", - "type": "layer2", - "category": "ZK Rollup", - "provider": "Polygon", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "PolygonCDK" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "Infra", - "name": "AggLayer" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 68526117.51, - "ether": 17993896.25, - "stablecoin": 5856976.29, - "associated": 42624874.8 - }, - "associatedTokens": ["POL", "MATIC"], - "change7d": 0.126307660946599 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring. Although the functionality exists in the code, it is currently disabled." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1. Unlike most ZK rollups transactions are posted instead of state diffs." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "warning": { - "value": "The Security Council can remove the delay on upgrades.", - "sentiment": "bad" - }, - "description": "Even though there is a 10d Timelock for upgrades, forced transactions are disabled. Even if they were to be enabled, user withdrawals can be censored up to 15d." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "If the Proposer fails, users can leverage the source available prover to submit proofs to the L1 bridge. There is a 5d delay for proving and a 5d delay for finalizing state proven in this way. These delays can only be lowered except during the emergency state." - } - ] - }, - "rss3": { - "id": "rss3", - "name": "RSS3 Value Sublayer", - "shortName": "RSS3 VSL", - "slug": "rss3", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "AI", "Information"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "NearDA" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 64173669.52, - "ether": 2866.64, - "stablecoin": 144812.67, - "associated": 64025990.21 - }, - "associatedTokens": ["RSS3"], - "change7d": 0.0440296843574286 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation rely fully on data that is NOT published on chain." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "cronoszkevm": { - "id": "cronoszkevm", - "name": "Cronos zkEVM", - "slug": "cronoszkevm", - "type": "layer2", - "category": "Validium", - "provider": "ZK Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "CustomDA" - }, - { - "category": "Stack", - "name": "ZKStack" - }, - { - "category": "Infra", - "name": "ElasticChain" - } - ], - "tvs": { - "breakdown": { - "total": 58625520.92, - "ether": 12940092.08, - "stablecoin": 5714221.45, - "associated": 15429120.66 - }, - "associatedTokens": ["zkCRO"], - "change7d": 0.319012461370929 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Enqueue via L1", - "sentiment": "warning", - "description": "Users can submit transactions to an L1 queue, but can't force them. The sequencer cannot selectively skip transactions but can stop processing the queue entirely. In other words, if the sequencer censors or is down, it is so for everyone." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation rely fully on data that is NOT published onchain." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted standard upgrade because the central operator can censor withdrawal transactions by implementing a TransactionFilterer with no delay. The standard upgrade delay is 4d 21h." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "warning", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen. There is a decentralized Governance system that can attempt changing Proposers with an upgrade." - } - ] - }, - "zksync": { - "id": "zksync", - "name": "ZKsync Lite", - "slug": "zksync-lite", - "type": "layer2", - "category": "ZK Rollup", - "provider": "ZKsync Lite", - "purposes": ["Payments", "Exchange", "NFT"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "EthereumCalldata" - } - ], - "tvs": { - "breakdown": { - "total": 56413482.52, - "ether": 45450022.15, - "stablecoin": 9946459.21, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.14804580827824 - }, - "stage": "Stage 1", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for for more than 14d, users can use the exit hatch to withdraw their funds." - }, - { - "name": "State Validation", - "value": "ZK proofs (SN)", - "sentiment": "good", - "description": "SNARKs are zero knowledge proofs that ensure state correctness, but require trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "7d", - "sentiment": "warning", - "warning": { - "value": "The Security Council can upgrade with no delay.", - "sentiment": "bad" - }, - "description": "Users have 7d to exit funds in case of an unwanted upgrade. There is a 21d delay before an upgrade is applied, and withdrawals can take up to 14d to be processed." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a zero knowledge proof of funds." - } - ] - }, - "degate3": { - "id": "degate3", - "name": "DeGate V1", - "slug": "degate3", - "type": "layer2", - "category": "ZK Rollup", - "provider": "Loopring", - "purposes": ["Exchange", "NFT"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "Fork", - "name": "LoopringFork" - } - ], - "tvs": { - "breakdown": { - "total": 52278697.77, - "ether": 1915110.08, - "stablecoin": 23386060.13, - "associated": 24835003.76 - }, - "associatedTokens": ["DG"], - "change7d": 0.0297117256993806 - }, - "stage": "Stage 2", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1 with a 0.01 ETH fee. If the sequencer is down for more than 15d, users can use the exit hatch to withdraw their funds. The sequencer can censor individual deposits, but in such case after 15d users can get their funds back." - }, - { - "name": "State Validation", - "value": "ZK proofs (SN)", - "sentiment": "good", - "description": "SNARKs are zero knowledge proofs that ensure state correctness, but require trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "30d", - "sentiment": "good", - "description": "Users have 30d to exit funds in case of an unwanted regular upgrade. There is a 45d delay before a regular upgrade is applied, and withdrawals can take up to 15d to be processed." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds." - } - ] - }, - "aevo": { - "id": "aevo", - "name": "Aevo", - "slug": "aevo", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 51753680.28, - "ether": 10188636.1, - "stablecoin": 40925920.42, - "associated": 0 - }, - "associatedTokens": ["AEVO"], - "change7d": 0.0388037272728785 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "loopring": { - "id": "loopring", - "name": "Loopring", - "slug": "loopring", - "type": "layer2", - "category": "ZK Rollup", - "provider": "Loopring", - "purposes": ["NFT", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "EthereumCalldata" - } - ], - "tvs": { - "breakdown": { - "total": 49655027.89, - "ether": 22434322.19, - "stablecoin": 4143569.12, - "associated": 17833076.49 - }, - "associatedTokens": ["LRC"], - "change7d": 0.152076774282583 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1 with a 0.02 ETH fee. If the sequencer is down for more than 15d, users can use the exit hatch to withdraw their funds. The sequencer can censor individual deposits, but in such case after 15d users can get their funds back." - }, - { - "name": "State Validation", - "value": "ZK proofs (SN)", - "sentiment": "good", - "description": "SNARKs are zero knowledge proofs that ensure state correctness, but require trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds." - } - ] - }, - "lyra": { - "id": "lyra", - "name": "Derive", - "slug": "derive", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 49507158.23, - "ether": 16889885.65, - "stablecoin": 13143190.79, - "associated": 0 - }, - "associatedTokens": ["LYRA"], - "change7d": 0.0194042535747454 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "dydx": { - "id": "dydx", - "name": "dYdX v3", - "slug": "dydx", - "type": "layer2", - "category": "ZK Rollup", - "provider": "StarkEx", - "purposes": ["Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "Stack", - "name": "StarkEx" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "Other", - "name": "Governance" - } - ], - "tvs": { - "breakdown": { - "total": 43166829.84, - "ether": 0, - "stablecoin": 43166829.84, - "associated": 0 - }, - "associatedTokens": ["DYDX"], - "change7d": -0.197678222284933 - }, - "stage": "Stage 1", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a trade or a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for 14d, users can use the exit hatch to withdraw their funds. Users are required to find a counterparty for the trade by out of system means." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "9d", - "sentiment": "warning", - "description": "There is a 9d exit window (or 2d if shortened by the Priority Controller)." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds. Positions will be closed using the average price from the last batch state update." - } - ] - }, - "nova": { - "id": "nova", - "name": "Arbitrum Nova", - "slug": "nova", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "Nitro" - }, - { - "category": "VM", - "name": "WasmVM" - }, - { - "category": "Other", - "name": "Governance" - }, - { - "category": "Other", - "name": "L3HostChain" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 42252636.93, - "ether": 41282992.87, - "stablecoin": 757525.55, - "associated": 137088.11 - }, - "associatedTokens": ["ARB"], - "change7d": 0.181607712725109 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "warning", - "description": "Fraud proofs allow 13 WHITELISTED actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "warning", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 5/6 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "2d", - "sentiment": "bad", - "warning": { - "value": "The Security Council can upgrade with no delay.", - "sentiment": "bad" - }, - "description": "Non-emergency upgrades are initiated on L2 and go through a 3d delay. Since there is a 1d delay to force a tx (forcing the inclusion in the following state update), users have only 2d to exit. \n \n If users post a tx after that time, they would only be able to self propose a state root 12d 17h after the last state root was proposed and then wait for the 6d 8h challenge window, while the upgrade would be confirmed just after the 6d 8h challenge window and the 3d L1 timelock." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "kinto": { - "id": "kinto", - "name": "Kinto", - "slug": "kinto", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "Arbitrum", - "purposes": ["Universal", "RWA"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 39999828.32, - "ether": 27088916.2, - "stablecoin": 11195958.26, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.116694796352584 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "warning", - "description": "Fraud proofs allow 5 WHITELISTED actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "xlayer": { - "id": "xlayer", - "name": "X Layer", - "slug": "xlayer", - "type": "layer2", - "category": "Validium", - "provider": "Polygon", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Infra", - "name": "AggLayer" - }, - { - "category": "Stack", - "name": "PolygonCDK" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 29748921.51, - "ether": 11556721.19, - "stablecoin": 6714961.52, - "associated": 7585767.08 - }, - "associatedTokens": ["OKB"], - "change7d": 0.054826351006249 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring. Although the functionality exists in the code, it is currently disabled." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 2/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "warning": { - "value": "The Security Council can remove the delay on upgrades.", - "sentiment": "bad" - }, - "description": "Even though there is a 10d Timelock for upgrades, forced transactions are disabled. Even if they were to be enabled, user withdrawals can be censored up to 15d." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "If the Proposer fails, users can leverage the source available prover to submit proofs to the L1 bridge. There is a 5d delay for proving and a 5d delay for finalizing state proven in this way. These delays can only be lowered except during the emergency state." - } - ] - }, - "karak": { - "id": "karak", - "name": "Karak", - "slug": "karak", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 29708868.67, - "ether": 24636329.46, - "stablecoin": 5072539.21, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.130841457092655 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "reya": { - "id": "reya", - "name": "Reya", - "slug": "reya", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 28116918.2, - "ether": 384280.19, - "stablecoin": 27732638.01, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0120905632803772 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "sanko": { - "id": "sanko", - "name": "Sanko", - "slug": "sanko", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Gaming", "Social"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 26478275.82, - "ether": 134830.61, - "stablecoin": 164891.89, - "associated": 25445806.84 - }, - "associatedTokens": ["DMT"], - "change7d": 0.403519605464031 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "Fraud proofs only allow 3 WHITELISTED actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 2/3 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 25d 10h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "cyber": { - "id": "cyber", - "name": "Cyber", - "slug": "cyber", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Social"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "CustomDA" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "RaaS", - "name": "AltLayer" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 24735455, - "ether": 1547203.07, - "stablecoin": 16557.48, - "associated": 23114679.3 - }, - "associatedTokens": ["CYBER"], - "change7d": 0.071924973076988 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation rely on data that is NOT published onchain. Cyber uses a custom data availability system without attestations, but allowing data challenges." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "zora": { - "id": "zora", - "name": "Zora", - "slug": "zora", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "NFT"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 24484494.96, - "ether": 24196533.6, - "stablecoin": 287961.36, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.227443278573365 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "sorare": { - "id": "sorare", - "name": "Sorare", - "slug": "sorare", - "type": "layer2", - "category": "Validium", - "provider": "StarkEx", - "purposes": ["NFT", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "StarkEx" - }, - { - "category": "Infra", - "name": "SHARP" - } - ], - "tvs": { - "breakdown": { - "total": 20899022.43, - "ether": 20899022.43, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.203376639210819 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for for more than 7d, users can use the exit hatch to withdraw their funds." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 2/4 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds. NFTs will be minted on L1 to exit." - } - ] - }, - "kroma": { - "id": "kroma", - "name": "Kroma", - "slug": "kroma", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "Infra", - "name": "Superchain" - } - ], - "tvs": { - "breakdown": { - "total": 19107377.14, - "ether": 5810355.5, - "stablecoin": 645832.11, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0553655572348464 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT, ZK)", - "sentiment": "bad", - "description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. ZK proofs are used to adjudicate the correctness of the last step. The challenge protocol can be subject to delay attacks and can fail under certain conditions. The current system doesn't use posted L2 txs batches on L1 as inputs to prove a fault, meaning that DA is not enforced." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can be a Proposer and propose new roots to the L1 bridge." - } - ] - }, - "orderly": { - "id": "orderly", - "name": "Orderly Network", - "shortName": "Orderly", - "slug": "orderly", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 18170986.93, - "ether": 629742.57, - "stablecoin": 17541244.36, - "associated": 0 - }, - "associatedTokens": [], - "change7d": -0.0326205153974277 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "sxnetwork": { - "id": "sxnetwork", - "name": "SX Network", - "slug": "sxnetwork", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Betting"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 18089436.85, - "ether": 0, - "stablecoin": 0, - "associated": 18089436.85 - }, - "associatedTokens": ["SX"], - "change7d": 0.369323332768177 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 4d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "Fraud proofs only allow 2 WHITELISTED actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "zkfair": { - "id": "zkfair", - "name": "ZKFair", - "slug": "zkfair", - "type": "layer2", - "category": "Validium", - "provider": "Polygon", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "PolygonCDK" - } - ], - "tvs": { - "breakdown": { - "total": 16104367.07, - "ether": 1458252.13, - "stablecoin": 7634176.19, - "associated": 6912540.91 - }, - "associatedTokens": ["ZKF"], - "change7d": 0.000822836103314683 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring. Although the functionality exists in the code, it is currently disabled." - }, - { - "name": "State Validation", - "value": "ZK proofs (SN)", - "sentiment": "good", - "description": "SNARKs are zero knowledge proofs that ensure state correctness, but require trusted setup." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 3/5 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "warning": { - "value": "The ZkFair Owner can upgrade with no delay.", - "sentiment": "bad" - }, - "description": "Even though there is a 1d Timelock for upgrades, forced transactions are disabled. Even if they were to be enabled, user withdrawals can be censored up to 15d." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "If the Proposer fails, users can leverage the source available prover to submit proofs to the L1 bridge. There is a 5d delay for proving and a 5d delay for finalizing state proven in this way. These delays can only be lowered except during the emergency state." - } - ] - }, - "paradex": { - "id": "paradex", - "name": "Paradex", - "slug": "paradex", - "type": "layer2", - "category": "ZK Rollup", - "provider": "Starknet", - "purposes": ["Universal", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "CairoVM" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "Fork", - "name": "StarknetFork" - }, - { - "category": "Infra", - "name": "SHARP" - } - ], - "tvs": { - "breakdown": { - "total": 13897955.03, - "ether": 0, - "stablecoin": 13897955.03, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.00218541088320001 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "Onchain (SD)", - "sentiment": "good", - "description": "All of the data (SD = state diffs) needed for proof construction is published onchain." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "thebinaryholdings": { - "id": "thebinaryholdings", - "name": "The Binary Holdings", - "shortName": "Binary", - "slug": "thebinaryholdings", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 13758922.67, - "ether": 0, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.31478608861962 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "silicon": { - "id": "silicon", - "name": "Silicon", - "slug": "silicon", - "type": "layer2", - "category": "Validium", - "provider": "Polygon", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "PolygonCDK" - }, - { - "category": "Infra", - "name": "AggLayer" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 13201491.75, - "ether": 1619201.13, - "stablecoin": 7206378.44, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.039085095985163 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring. Although the functionality exists in the code, it is currently disabled." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 2/3 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "warning": { - "value": "The Security Council can remove the delay on upgrades.", - "sentiment": "bad" - }, - "description": "Even though there is a 10d Timelock for upgrades, forced transactions are disabled. Even if they were to be enabled, user withdrawals can be censored up to 15d." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "If the Proposer fails, users can leverage the source available prover to submit proofs to the L1 bridge. There is a 5d delay for proving and a 5d delay for finalizing state proven in this way. These delays can only be lowered except during the emergency state." - } - ] - }, - "bobanetwork": { - "id": "bobanetwork", - "name": "Boba Network", - "shortName": "Boba", - "slug": "bobanetwork", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 12577575.33, - "ether": 5237949.65, - "stablecoin": 1776192.08, - "associated": 4589644.46 - }, - "associatedTokens": ["BOBA"], - "change7d": 0.0929612214701909 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "deversifi": { - "id": "deversifi", - "name": "rhino.fi", - "slug": "rhinofi", - "type": "layer2", - "category": "Validium", - "provider": "StarkEx", - "purposes": ["Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "StarkEx" - }, - { - "category": "Infra", - "name": "SHARP" - } - ], - "tvs": { - "breakdown": { - "total": 11873190.92, - "ether": 5498677.81, - "stablecoin": 4252326.88, - "associated": 0 - }, - "associatedTokens": ["DVF"], - "change7d": 0.0419237423124115 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for for more than 7d, users can use the exit hatch to withdraw their funds." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 4/7 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable. Users can be explicitly censored from withdrawing (Blocklist on L1)." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds." - } - ] - }, - "winr": { - "id": "winr", - "name": "WINR", - "slug": "winr", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 7275493.91, - "ether": 412051.47, - "stablecoin": 2051745.9, - "associated": 4787659.44 - }, - "associatedTokens": ["WINR"], - "change7d": 0.160963349188553 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 1h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 19d 3h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "brine": { - "id": "brine", - "name": "tanX", - "slug": "tanx", - "type": "layer2", - "category": "Validium", - "provider": "StarkEx", - "purposes": ["Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "StarkEx" - }, - { - "category": "Infra", - "name": "SHARP" - } - ], - "tvs": { - "breakdown": { - "total": 6326832.99, - "ether": 190488.45, - "stablecoin": 5936545.38, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 3.96725138262346 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for for more than 7d, users can use the exit hatch to withdraw their funds." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 2/4 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds." - } - ] - }, - "morph": { - "id": "morph", - "name": "Morph", - "slug": "morph", - "type": "layer2", - "category": "Optimistic Rollup", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": true, - "badges": [], - "tvs": { - "breakdown": { - "total": 5359541.9, - "ether": 2742640.8, - "stablecoin": 2096820.41, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 1.82814812957365 - }, - "stage": "UnderReview", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "degen": { - "id": "degen", - "name": "Degen Chain", - "slug": "degen", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Social"], - "isArchived": false, - "hostChain": "Base", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Base" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 3943546.63, - "ether": 0, - "stablecoin": 0, - "associated": 3943546.63 - }, - "associatedTokens": ["DEGEN"], - "change7d": -0.0369610374110584 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1000d 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 5d 14h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 6d 15h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "shape": { - "id": "shape", - "name": "Shape", - "slug": "shape", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Alchemy" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 3836315.09, - "ether": 3836315.09, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0796164999344473 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "astarzkevm": { - "id": "astarzkevm", - "name": "Astar zkEVM", - "slug": "astarzkevm", - "type": "layer2", - "category": "Validium", - "provider": "Polygon", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Stack", - "name": "PolygonCDK" - }, - { - "category": "Infra", - "name": "AggLayer" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 3716293.75, - "ether": 2035537.14, - "stablecoin": 1676918.14, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0701604665166837 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring. Although the functionality exists in the code, it is currently disabled." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 3/5 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "warning": { - "value": "The Security Council can remove the delay on upgrades.", - "sentiment": "bad" - }, - "description": "Even though there is a 10d Timelock for upgrades, forced transactions are disabled. Even if they were to be enabled, user withdrawals can be censored up to 15d." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "If the Proposer fails, users can leverage the source available prover to submit proofs to the L1 bridge. There is a 5d delay for proving and a 5d delay for finalizing state proven in this way. These delays can only be lowered except during the emergency state." - } - ] - }, - "xai": { - "id": "xai", - "name": "Xai", - "slug": "xai", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 2682737.32, - "ether": 215598.46, - "stablecoin": 130247.06, - "associated": 2336835.36 - }, - "associatedTokens": ["XAI"], - "change7d": 0.172507890170786 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 5/7 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 25d 10h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "mint": { - "id": "mint", - "name": "Mint", - "slug": "mint", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "NFT"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 2474608.79, - "ether": 1823743.75, - "stablecoin": 340795.63, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.113352480744416 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "polynomial": { - "id": "polynomial", - "name": "Polynomial", - "slug": "polynomial", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 2359746.22, - "ether": 55973.27, - "stablecoin": 2170728.42, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.08117353978076 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "redstone": { - "id": "redstone", - "name": "Redstone", - "slug": "redstone", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "CustomDA" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 2072912, - "ether": 2046926.19, - "stablecoin": 25749.9, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.18667240361929 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation rely on data that is NOT published onchain. Redstone uses a custom data availability provider without attestations, relying though on DA challenges." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "zkspace": { - "id": "zkspace", - "name": "ZKSpace", - "slug": "zkspace", - "type": "layer2", - "category": "ZK Rollup", - "provider": "ZKsync Lite", - "purposes": ["NFT", "Exchange", "Payments"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "Fork", - "name": "ZKsyncLiteFork" - } - ], - "tvs": { - "breakdown": { - "total": 1935240.99, - "ether": 134024.79, - "stablecoin": 23011.72, - "associated": 1707170.46 - }, - "associatedTokens": ["ZKS"], - "change7d": -0.0139578514429549 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for for more than 3d, users can use the exit hatch to withdraw their funds." - }, - { - "name": "State Validation", - "value": "ZK proofs (SN)", - "sentiment": "good", - "description": "SNARKs are zero knowledge proofs that ensure state correctness, but require trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "5d", - "sentiment": "bad", - "description": "Users have 5d to exit funds in case of an unwanted regular upgrade. There is a 8d delay before a regular upgrade is applied, and withdrawals can take up to 3d to be processed." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a zero knowledge proof of funds." - } - ] - }, - "ancient": { - "id": "ancient", - "name": "Ancient8", - "slug": "ancient8", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 1510795.21, - "ether": 624177.06, - "stablecoin": 0, - "associated": 886618.15 - }, - "associatedTokens": ["A8"], - "change7d": 0.100651648600796 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "hychain": { - "id": "hychain", - "name": "HYCHAIN", - "slug": "hychain", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 1488688.94, - "ether": 0, - "stablecoin": 0, - "associated": 1488688.94 - }, - "associatedTokens": ["TOPIA"], - "change7d": 0.374977337920098 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "Fraud proofs only allow 2 WHITELISTED actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "xchain": { - "id": "xchain", - "name": "XCHAIN", - "slug": "xchain", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 1194423.32, - "ether": 28089.82, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": -0.000614588273841865 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 5d 14h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 11d 23h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "termstructure": { - "id": "termstructure", - "name": "Term Structure", - "slug": "termstructure", - "type": "layer2", - "category": "ZK Rollup", - "provider": "ZKsync Lite", - "purposes": ["Payments", "Exchange", "Lending"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "Fork", - "name": "ZKsyncLiteFork" - } - ], - "tvs": { - "breakdown": { - "total": 1151246.5, - "ether": 232267.11, - "stablecoin": 588043.05, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0617048699750415 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for for more than 14d, users can use the exit hatch to withdraw their funds." - }, - { - "name": "State Validation", - "value": "ZK proofs (SN)", - "sentiment": "good", - "description": "SNARKs are zero knowledge proofs that ensure state correctness, but require trusted setup." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a zero knowledge proof of funds." - } - ] - }, - "alienx": { - "id": "alienx", - "name": "AlienX", - "slug": "alienx", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Gaming", "AI", "NFT"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 1059826.93, - "ether": 1024524.05, - "stablecoin": 21837.56, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.182202016057215 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "fluence": { - "id": "fluence", - "name": "Fluence", - "slug": "fluence", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 878846.76, - "ether": 0, - "stablecoin": 2034.38, - "associated": 876812.38 - }, - "associatedTokens": ["FLT"], - "change7d": -0.0442062518831686 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 40d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "popapex": { - "id": "popapex", - "name": "Proof of Play Apex", - "shortName": "PoP Apex", - "slug": "popapex", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 838083.3, - "ether": 838083.3, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.19048371904013 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1001d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 5d 14h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 24d 16h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "dbk": { - "id": "dbk", - "name": "DeBank Chain", - "slug": "dbk", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 802894.82, - "ether": 802894.82, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.181637050442997 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "rari": { - "id": "rari", - "name": "RARI Chain", - "slug": "rari", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "NFT"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 731356.58, - "ether": 637547.3, - "stablecoin": 93684.72, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.513099368987276 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 25d 10h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "swan": { - "id": "swan", - "name": "Swan Chain", - "slug": "swan", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "AI", "Storage"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 710064.73, - "ether": 710064.73, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.189566233725809 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "publicgoodsnetwork": { - "id": "publicgoodsnetwork", - "name": "Public Goods Network", - "shortName": "PGN", - "slug": "publicgoodsnetwork", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 664698.4, - "ether": 582092.55, - "stablecoin": 82605.85, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.159333476702434 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "optopia": { - "id": "optopia", - "name": "Optopia", - "slug": "optopia", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "AI"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 650784.65, - "ether": 324752.69, - "stablecoin": 58821.64, - "associated": 267210.32 - }, - "associatedTokens": ["OPAI"], - "change7d": 0.126418538918653 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "alephzero": { - "id": "alephzero", - "name": "Aleph Zero EVM", - "slug": "aleph-zero", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Privacy"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 372801.69, - "ether": 0, - "stablecoin": 0, - "associated": 372801.69 - }, - "associatedTokens": ["AZERO"], - "change7d": 0.0414324536760904 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 4d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "Fraud proofs only allow 2 WHITELISTED actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "superlumio": { - "id": "superlumio", - "name": "SuperLumio", - "slug": "superlumio", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 255793.38, - "ether": 249607.66, - "stablecoin": 5366.71, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.174674105604649 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "ebichain": { - "id": "ebichain", - "name": "Ebi Chain", - "slug": "ebichain", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": true, - "badges": [ - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Conduit" - } - ], - "tvs": { - "breakdown": { - "total": 238658.39, - "ether": 238658.39, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.186449576646522 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "honeypot": { - "id": "honeypot", - "name": "Honeypot (Cartesi)", - "shortName": "Honeypot", - "slug": "cartesi-honeypot", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "Cartesi Rollups", - "purposes": ["Bug bounty"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "CartesiVM" - }, - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "Stack", - "name": "Cartesi" - } - ], - "tvs": { - "breakdown": { - "total": 230490.19, - "ether": 0, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0660027137283037 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is no delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "∞", - "sentiment": "good", - "description": "Users can exit funds at any time because contracts are not upgradeable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "metal": { - "id": "metal", - "name": "Metal", - "slug": "metal", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 187656.73, - "ether": 187544.95, - "stablecoin": 111.78, - "associated": 0 - }, - "associatedTokens": ["MTL"], - "change7d": 0.192628491975515 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "popboss": { - "id": "popboss", - "name": "Proof of Play Boss", - "shortName": "PoP Boss", - "slug": "popboss", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 172103.01, - "ether": 172103.01, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.239890476575737 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 5d 14h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 24d 16h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "myria": { - "id": "myria", - "name": "Myria", - "slug": "myria", - "type": "layer2", - "category": "Validium", - "provider": "StarkEx", - "purposes": ["NFT", "Exchange", "Gaming"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "StarkEx" - }, - { - "category": "Infra", - "name": "SHARP" - } - ], - "tvs": { - "breakdown": { - "total": 165657.93, - "ether": 165657.93, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": ["MYRIA"], - "change7d": 0.186764849055967 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Force via L1", - "sentiment": "good", - "description": "Users can force the sequencer to include a withdrawal transaction by submitting a request through L1. If the sequencer censors or is down for for more than 7d, users can use the exit hatch to withdraw their funds." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST)", - "sentiment": "good", - "description": "STARKs are zero knowledge proofs that ensure state correctness." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 2/5 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Use escape hatch", - "sentiment": "good", - "description": "Users are able to trustlessly exit by submitting a Merkle proof of funds. NFTs will be minted on L1 to exit." - } - ] - }, - "ham": { - "id": "ham", - "name": "Ham", - "slug": "ham", - "type": "layer3", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Social"], - "isArchived": false, - "hostChain": "Base", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "L3ParentChain", - "name": "Base" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 158456.43, - "ether": 158347.83, - "stablecoin": 81.44, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.191572043492833 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "cheese": { - "id": "cheese", - "name": "CheeseChain", - "slug": "cheese", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": true, - "badges": [ - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - }, - { - "category": "RaaS", - "name": "Caldera" - } - ], - "tvs": { - "breakdown": { - "total": 115431.53, - "ether": 0, - "stablecoin": 0, - "associated": 115431.53 - }, - "associatedTokens": ["CHEESE"], - "change7d": -0.187586603260365 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "parallel": { - "id": "parallel", - "name": "Parallel", - "slug": "parallel", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 78548.03, - "ether": 78548.03, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.186404445827988 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d challenge period." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 8h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "edgeless": { - "id": "edgeless", - "name": "Edgeless", - "slug": "edgeless", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "CustomDA" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 61505.01, - "ether": 61505.01, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.187286185245571 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "everclear": { - "id": "everclear", - "name": "Everclear Hub", - "slug": "everclear", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Interoperability"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 59513.86, - "ether": 59513.86, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": ["NEXT"], - "change7d": 0.186449476698276 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 4d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "river": { - "id": "river", - "name": "River", - "slug": "river", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 59061.73, - "ether": 59061.73, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.18644952022118 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "hypr": { - "id": "hypr", - "name": "Hypr", - "slug": "hypr", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 58268.16, - "ether": 58268.16, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.186449733829403 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "oevnetwork": { - "id": "oevnetwork", - "name": "OEV Network", - "slug": "oev", - "type": "layer2", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Oracles"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 55514.85, - "ether": 55514.85, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.192865222088619 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 12d 17h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "molten": { - "id": "molten", - "name": "Molten Network", - "shortName": "Molten", - "slug": "molten", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 49359.4, - "ether": 21.18, - "stablecoin": 35317.94, - "associated": 14020.28 - }, - "associatedTokens": ["MOLTEN"], - "change7d": 0.0350861998642376 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 25d 10h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "wirex": { - "id": "wirex", - "name": "Pay Chain", - "slug": "wirex", - "type": "layer2", - "category": "Validium", - "provider": "Polygon", - "purposes": ["Universal", "Payments"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Gateway" - }, - { - "category": "Stack", - "name": "PolygonCDK" - }, - { - "category": "Infra", - "name": "AggLayer" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 40374.61, - "ether": 1654.05, - "stablecoin": 38720.56, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.026423902039953 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring. Although the functionality exists in the code, it is currently disabled." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "warning": { - "value": "The Security Council can remove the delay on upgrades.", - "sentiment": "bad" - }, - "description": "Even though there is a 10d Timelock for upgrades, forced transactions are disabled. Even if they were to be enabled, user withdrawals can be censored up to 15d." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "If the Proposer fails, users can leverage the source available prover to submit proofs to the L1 bridge. There is a 5d delay for proving and a 5d delay for finalizing state proven in this way. These delays can only be lowered except during the emergency state." - } - ] - }, - "xterio": { - "id": "xterio", - "name": "Xterio Chain", - "slug": "xterio", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "CustomDA" - }, - { - "category": "RaaS", - "name": "AltLayer" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 22983.01, - "ether": 22983.01, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.186450118835965 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation rely on data that is NOT published onchain. Xterio uses a custom data availability provider without attestations, relying though on DA challenges." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "syndicateframe": { - "id": "syndicateframe", - "name": "Syndicate Frame Chain", - "shortName": "Frame Chain", - "slug": "syndicateframe", - "type": "layer3", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "Social"], - "isArchived": false, - "hostChain": "Base", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "L3ParentChain", - "name": "Base" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 18786.69, - "ether": 18786.69, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.186449358926589 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "deri": { - "id": "deri", - "name": "Deri", - "slug": "deri", - "type": "layer3", - "category": "Optimistic Rollup", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 17037.6, - "ether": 17037.6, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.186450002263208 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 1d challenge period." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 20d 2h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "lambda": { - "id": "lambda", - "name": "Lambda Chain", - "slug": "lambda", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "Storage"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 14647.21, - "ether": 14637.21, - "stablecoin": 10, - "associated": 0 - }, - "associatedTokens": ["LAMB"], - "change7d": 0.186299958613328 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "ethernity": { - "id": "ethernity", - "name": "Ethernity", - "slug": "ethernity", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal", "AI"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Infra", - "name": "Superchain" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "DA", - "name": "EthereumBlobs" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 10776.49, - "ether": 10680.13, - "stablecoin": 23.64, - "associated": 33.13 - }, - "associatedTokens": ["ERN"], - "change7d": 0.18546333382102 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "hook": { - "id": "hook", - "name": "Hook", - "slug": "hook", - "type": "layer3", - "category": "Optimistic Rollup", - "provider": "Arbitrum", - "purposes": ["Universal", "NFT", "Exchange"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": true, - "badges": [], - "tvs": { - "breakdown": { - "total": 7489.72, - "ether": 7028.35, - "stablecoin": 461.37, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.173051080531636 - }, - "stage": "UnderReview", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "l3x": { - "id": "l3x", - "name": "L3X", - "slug": "l3x", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 5710.42, - "ether": 5708.4, - "stablecoin": 2.02, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.182335427286543 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 1d challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 20d 2h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "funki": { - "id": "funki", - "name": "Funki", - "slug": "funki", - "type": "layer2", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": true, - "badges": [], - "tvs": { - "breakdown": { - "total": 4315.41, - "ether": 3612.79, - "stablecoin": 6, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.154346779370854 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "stack": { - "id": "stack", - "name": "Stack", - "slug": "stack", - "type": "layer3", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Universal", "Social"], - "isArchived": false, - "hostChain": "Base", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "L3ParentChain", - "name": "Base" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 3271.86, - "ether": 3271.86, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.184761118473939 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 1d delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "External", - "sentiment": "bad", - "description": "Proof construction and state derivation fully rely on data that is posted on Celestia. Sequencer tx roots are not checked against the Blobstream bridge data roots onchain, but L2 nodes can verify data availability by running a Celestia light client." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "race": { - "id": "race", - "name": "Race Network", - "slug": "race", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["RWA"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": true, - "badges": [ - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "Infra", - "name": "Superchain" - } - ], - "tvs": { - "breakdown": { - "total": 3071.48, - "ether": 0, - "stablecoin": 3067.67, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.498063697995415 - }, - "stage": "UnderReview", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "clique": { - "id": "clique", - "name": "Clique", - "slug": "clique", - "type": "layer3", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["AI", "Gaming"], - "isArchived": false, - "hostChain": "Base", - "isUpcoming": false, - "isUnderReview": true, - "badges": [ - { - "category": "L3ParentChain", - "name": "Base" - }, - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - }, - { - "category": "RaaS", - "name": "Conduit" - } - ], - "tvs": { - "breakdown": { - "total": 1926.77, - "ether": 1926.77, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.191990992495809 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "kontos": { - "id": "kontos", - "name": "Kontos", - "slug": "kontos", - "type": "layer2", - "category": "ZK Rollup", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": true, - "badges": [], - "tvs": { - "breakdown": { - "total": 1553.1, - "ether": 1385.3, - "stablecoin": 154.2, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0866158259287764 - }, - "stage": "UnderReview", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "donatuz": { - "id": "donatuz", - "name": "Donatuz", - "slug": "donatuz", - "type": "layer3", - "category": "Optimium", - "provider": "OP Stack", - "purposes": ["Social"], - "isArchived": false, - "hostChain": "Base", - "isUpcoming": false, - "isUnderReview": true, - "badges": [ - { - "category": "L3ParentChain", - "name": "Base" - }, - { - "category": "DA", - "name": "EigenDA" - }, - { - "category": "Stack", - "name": "OPStack" - }, - { - "category": "VM", - "name": "EVM" - }, - { - "category": "RaaS", - "name": "Conduit" - }, - { - "category": "Infra", - "name": "Superchain" - } - ], - "tvs": { - "breakdown": { - "total": 1490.81, - "ether": 1490.81, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.186449985276913 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "nal": { - "id": "nal", - "name": "Nal", - "slug": "nal", - "type": "layer2", - "category": "Optimistic Rollup", - "provider": "OP Stack", - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": true, - "badges": [], - "tvs": { - "breakdown": { - "total": 1012.94, - "ether": 0, - "stablecoin": 1012.94, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.000651993519579452 - }, - "stage": "UnderReview", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "fuelv1": { - "id": "fuelv1", - "name": "Fuel v1", - "slug": "fuelv1", - "type": "layer2", - "category": "Optimistic Rollup", - "purposes": ["Payments"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "DA", - "name": "EthereumCalldata" - } - ], - "tvs": { - "breakdown": { - "total": 768.03, - "ether": 750.02, - "stablecoin": 18.01, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.181293835363603 - }, - "stage": "Stage 2", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1." - }, - { - "name": "State Validation", - "value": "Fraud proofs (1R)", - "sentiment": "good", - "description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Single round proofs (1R) only require a single transaction to resolve." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "∞", - "sentiment": "good", - "description": "Users can exit funds at any time because contracts are not upgradeable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can be a Proposer and propose new roots to the L1 bridge." - } - ] - }, - "pmon": { - "id": "pmon", - "name": "PMON Chain", - "slug": "pmon", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Gaming", "NFT"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": true, - "badges": [ - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "DA", - "name": "Celestia" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - }, - { - "category": "RaaS", - "name": "AltLayer" - } - ], - "tvs": { - "breakdown": { - "total": 598.57, - "ether": 0, - "stablecoin": 0, - "associated": 598.57 - }, - "associatedTokens": ["PMON"], - "change7d": 0.12148464579469 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "bugbuster": { - "id": "bugbuster", - "name": "Bug Buster", - "slug": "bugbuster", - "type": "layer3", - "category": "Optimistic Rollup", - "provider": "Cartesi Rollups", - "purposes": ["Bug bounty"], - "isArchived": false, - "hostChain": "OP Mainnet", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "Stack", - "name": "Cartesi" - }, - { - "category": "VM", - "name": "AppChain" - }, - { - "category": "VM", - "name": "CartesiVM" - }, - { - "category": "DA", - "name": "EthereumCalldata" - }, - { - "category": "L3ParentChain", - "name": "Optimism" - } - ], - "tvs": { - "breakdown": { - "total": 520.03, - "ether": 0, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.0660066006600659 - }, - "stage": "Stage 0", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "None", - "sentiment": "bad", - "description": "Currently the system permits invalid state roots. More details in project overview." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on the base chain, which ultimately gets published on Ethereum." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Cannot withdraw", - "sentiment": "bad", - "description": "Only the whitelisted proposers can publish state roots on L1, so in the event of failure the withdrawals are frozen." - } - ] - }, - "gpt": { - "id": "gpt", - "name": "GPT Protocol", - "slug": "gpt", - "type": "layer2", - "category": "Validium", - "provider": "Polygon", - "purposes": ["Universal", "AI"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "RaaS", - "name": "Gateway" - }, - { - "category": "Stack", - "name": "PolygonCDK" - }, - { - "category": "Infra", - "name": "AggLayer" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 247.28, - "ether": 14.96, - "stablecoin": 0, - "associated": 232.32 - }, - "associatedTokens": ["GPT"], - "change7d": 1.87936655798789 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring. Although the functionality exists in the code, it is currently disabled." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "warning": { - "value": "The Security Council can remove the delay on upgrades.", - "sentiment": "bad" - }, - "description": "Even though there is a 10d Timelock for upgrades, forced transactions are disabled. Even if they were to be enabled, user withdrawals can be censored up to 15d." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "If the Proposer fails, users can leverage the source available prover to submit proofs to the L1 bridge. There is a 5d delay for proving and a 5d delay for finalizing state proven in this way. These delays can only be lowered except during the emergency state." - } - ] - }, - "witness": { - "id": "witness", - "name": "Witness Chain", - "slug": "witness", - "type": "layer2", - "category": "Validium", - "provider": "Polygon", - "purposes": ["Universal", "IoT", "Oracles"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "PolygonCDK" - }, - { - "category": "Infra", - "name": "AggLayer" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 29.85, - "ether": 29.85, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0.186406995230525 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "No mechanism", - "sentiment": "bad", - "description": "There is no mechanism to have transactions be included if the sequencer is down or censoring. Although the functionality exists in the code, it is currently disabled." - }, - { - "name": "State Validation", - "value": "ZK proofs (ST, SN)", - "sentiment": "good", - "description": "STARKs and SNARKs are zero knowledge proofs that ensure state correctness. STARKs proofs are wrapped in SNARKs proofs for efficiency. SNARKs require a trusted setup." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "warning": { - "value": "The Security Council can remove the delay on upgrades.", - "sentiment": "bad" - }, - "description": "Even though there is a 10d Timelock for upgrades, forced transactions are disabled. Even if they were to be enabled, user withdrawals can be censored up to 15d." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "If the Proposer fails, users can leverage the source available prover to submit proofs to the L1 bridge. There is a 5d delay for proving and a 5d delay for finalizing state proven in this way. These delays can only be lowered except during the emergency state." - } - ] - }, - "apechain": { - "id": "apechain", - "name": "ApeChain", - "slug": "apechain", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Arbitrum" - }, - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "associatedTokens": [] - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 4d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 5/7 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 25d 10h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "dodochain": { - "id": "dodochain", - "name": "DODOchain", - "slug": "dodochain", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Interoperability"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": true, - "badges": [], - "tvs": { - "associatedTokens": [] - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "inevm": { - "id": "inevm", - "name": "inEVM", - "slug": "inevm", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Interoperability"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "RaaS", - "name": "Caldera" - }, - { - "category": "DA", - "name": "DAC" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 0, - "ether": 0, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 6d 8h challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/1 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 25d 10h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "muster": { - "id": "muster", - "name": "Muster", - "slug": "muster", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Gaming"], - "isArchived": false, - "hostChain": "Arbitrum One", - "isUpcoming": false, - "isUnderReview": true, - "badges": [], - "tvs": { - "associatedTokens": [] - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "playblock": { - "id": "playblock", - "name": "PlayBlock", - "slug": "playblock", - "type": "layer3", - "category": "Optimium", - "provider": "Arbitrum", - "purposes": ["Universal", "Gaming"], - "isArchived": false, - "hostChain": "Arbitrum Nova", - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "category": "DA", - "name": "DAC" - }, - { - "category": "L3ParentChain", - "name": "Nova" - }, - { - "category": "RaaS", - "name": "Gelato" - }, - { - "category": "Stack", - "name": "Orbit" - }, - { - "category": "VM", - "name": "EVM" - } - ], - "tvs": { - "breakdown": { - "total": 0, - "ether": 0, - "stablecoin": 0, - "associated": 0 - }, - "associatedTokens": [], - "change7d": 0 - }, - "stage": "NotApplicable", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There is a 2d delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "bad", - "description": "No actor outside of the single Proposer can submit fraud proofs. Interactive proofs (INT) require multiple transactions over time to resolve. The challenge protocol can be subject to delay attacks. There is a 30m challenge period." - }, - { - "name": "Data Availability", - "value": "External (DAC)", - "sentiment": "bad", - "description": "Proof construction relies fully on data that is NOT published onchain. There exists a Data Availability Committee (DAC) with a threshold of 1/2 that is tasked with protecting and supplying the data." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no window for users to exit in case of an unwanted regular upgrade since contracts are instantly upgradable." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can become a Proposer after 19d 2h of inactivity from the currently whitelisted Proposers." - } - ] - }, - "teva": { - "id": "teva", - "name": "Teva Chain", - "slug": "teva", - "type": "layer3", - "category": "ZK Rollup", - "provider": "ZK Stack", - "purposes": ["Gaming"], - "isArchived": false, - "hostChain": "ZKsync Era", - "isUpcoming": false, - "isUnderReview": true, - "badges": [], - "tvs": { - "associatedTokens": [] - }, - "stage": "UnderReview", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "State Validation", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Data Availability", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Exit Window", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - }, - { - "name": "Proposer Failure", - "value": "Under Review", - "sentiment": "UnderReview", - "description": "This risk is currently under review." - } - ] - }, - "ink": { - "id": "ink", - "name": "Ink", - "slug": "ink", - "type": "layer2", - "hostChain": "Ethereum", - "category": "Optimistic Rollup", - "providers": ["OP Stack"], - "purposes": ["Universal"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "id": "EVM", - "type": "VM", - "name": "EVM", - "description": "This project uses the Ethereum Virtual Machine to run its smart contracts and supports the Solidity programming language", - "action": { - "type": "scalingFilter", - "id": "vm", - "value": "EVM" - } - }, - { - "id": "EthereumBlobs", - "type": "DA", - "name": "Ethereum with blobs", - "description": "This project is posting its data to Ethereum as blobs", - "action": { - "type": "publicDaHighlight", - "slug": "ethereum" - } - }, - { - "id": "OPStack", - "type": "Stack", - "name": "Built on OP Stack", - "description": "The project is built on the OP Stack", - "action": { - "type": "scalingFilter", - "id": "stack", - "value": "OP Stack" - } - }, - { - "id": "Superchain", - "type": "Infra", - "name": "Part of the Superchain", - "description": "The project is part of the Superchain, meaning it's included in the Superchain registry or uses the Superchain config", - "action": { - "type": "scalingFilter", - "id": "infrastructure", - "value": "Superchain" - } - }, - { - "id": "Gelato", - "type": "RaaS", - "name": "Gelato", - "description": "This project was deployed via the rollup-as-a-service provider Gelato", - "action": { - "type": "scalingFilter", - "id": "raas", - "value": "Gelato" - } - } - ], - "stage": "Stage 1", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There can be up to a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "good", - "description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no exit window for users to exit in case of unwanted regular upgrades as they are initiated by the Security Council with instant upgrade power and without proper notice." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can be a Proposer and propose new roots to the L1 bridge." - } - ], - "tvs": { - "breakdown": { - "total": 102760330, - "native": 0, - "canonical": 28028614, - "external": 74731710, - "ether": 28028612, - "stablecoin": 69044360, - "btc": 5687351, - "other": 0.7, - "associated": 0 - }, - "change7d": 0.00299159143196492, - "associatedTokens": [] - } - }, - "unichain": { - "id": "unichain", - "name": "Unichain", - "slug": "unichain", - "type": "layer2", - "hostChain": "Ethereum", - "category": "Optimistic Rollup", - "providers": ["OP Stack"], - "purposes": ["Universal", "Exchange"], - "isArchived": false, - "isUpcoming": false, - "isUnderReview": false, - "badges": [ - { - "id": "EVM", - "type": "VM", - "name": "EVM", - "description": "This project uses the Ethereum Virtual Machine to run its smart contracts and supports the Solidity programming language", - "action": { - "type": "scalingFilter", - "id": "vm", - "value": "EVM" - } - }, - { - "id": "EthereumBlobs", - "type": "DA", - "name": "Ethereum with blobs", - "description": "This project is posting its data to Ethereum as blobs", - "action": { - "type": "publicDaHighlight", - "slug": "ethereum" - } - }, - { - "id": "OPStack", - "type": "Stack", - "name": "Built on OP Stack", - "description": "The project is built on the OP Stack", - "action": { - "type": "scalingFilter", - "id": "stack", - "value": "OP Stack" - } - }, - { - "id": "Superchain", - "type": "Infra", - "name": "Part of the Superchain", - "description": "The project is part of the Superchain, meaning it's included in the Superchain registry or uses the Superchain config", - "action": { - "type": "scalingFilter", - "id": "infrastructure", - "value": "Superchain" - } - } - ], - "stage": "Stage 1", - "risks": [ - { - "name": "Sequencer Failure", - "value": "Self sequence", - "sentiment": "good", - "description": "In the event of a sequencer failure, users can force transactions to be included in the project's chain by sending them to L1. There can be up to a 12h delay on this operation." - }, - { - "name": "State Validation", - "value": "Fraud proofs (INT)", - "sentiment": "good", - "description": "Fraud proofs allow actors watching the chain to prove that the state is incorrect. Interactive proofs (INT) require multiple transactions over time to resolve." - }, - { - "name": "Data Availability", - "value": "Onchain", - "sentiment": "good", - "description": "All of the data needed for proof construction is published on Ethereum L1." - }, - { - "name": "Exit Window", - "value": "None", - "sentiment": "bad", - "description": "There is no exit window for users to exit in case of unwanted regular upgrades as they are initiated by the Security Council with instant upgrade power and without proper notice." - }, - { - "name": "Proposer Failure", - "value": "Self propose", - "sentiment": "good", - "description": "Anyone can be a Proposer and propose new roots to the L1 bridge." - } - ], - "tvs": { - "breakdown": { - "total": 777191100, - "native": 0, - "canonical": 419098200, - "external": 358092930, - "ether": 499260000, - "stablecoin": 171902140, - "btc": 95350096, - "other": 10678896, - "associated": 4971530 - }, - "change7d": 0.00821442117542293, - "associatedTokens": [ - { - "symbol": "UNI", - "icon": "https://assets.coingecko.com/coins/images/12504/large/uni.jpg?1696512319" - } - ] - } - } - } -} diff --git a/src/data/mocks/rssData.json b/src/data/mocks/rssData.json deleted file mode 100644 index db3821f07a0..00000000000 --- a/src/data/mocks/rssData.json +++ /dev/null @@ -1,66 +0,0 @@ -[ - [ - { - "pubDate": "Sat, 28 Sep 2024 00:00:00 +0000", - "title": "Making Ethereum alignment legible", - "link": "https://vitalik.ca/general/2024/09/28/alignment.html", - "imgSrc": "http://vitalik.ca/images/icon.png", - "source": "Vitalik Buterin's website", - "sourceUrl": "https://vitalik.ca/", - "sourceFeedUrl": "https://vitalik.eth.limo/feed.xml" - } - ], - [ - { - "pubDate": "Fri, 13 Sep 2024 00:00:00 GMT", - "title": "4844 Data Challenge: Insights and Winners", - "link": "https://blog.ethereum.org/en/2024/09/13/4844-data-challenge", - "imgSrc": "https://storage.googleapis.com/ethereum-hackmd/upload_84404ba6ed463992c8eaee78610b3264.jpeg", - "source": "Ethereum Foundation Blog", - "sourceUrl": "https://blog.ethereum.org", - "sourceFeedUrl": "https://blog.ethereum.org/en/feed.xml" - }, - { - "pubDate": "Tue, 31 Dec 2013 18:00:37 GMT", - "title": "Bootstrapping A Decentralized Autonomous Corporation: Part I", - "link": "https://blog.ethereum.org/en/2013/12/31/bootstrapping-a-decentralized-autonomous-corporation-part-i", - "imgSrc": "https://blog.ethereum.org/images/posts/blackhole.jpg", - "source": "Ethereum Foundation Blog", - "sourceUrl": "https://blog.ethereum.org", - "sourceFeedUrl": "https://blog.ethereum.org/en/feed.xml" - } - ], - [ - { - "pubDate": "Thu, 22 Aug 2024 00:00:00 +0000", - "title": "Xatu Consensus Layer P2P tables now available", - "link": "https://ethpandaops.io/posts/xatu-consensus-layer-p2p/", - "imgSrc": "https://ethpandaops.io/posts/xatu-consensus-layer-p2p/featured.png", - "source": "Posts 🤓 on ethPandaOps", - "sourceUrl": "https://ethpandaops.io/posts/", - "sourceFeedUrl": "https://ethpandaops.io/posts/index.xml" - } - ], - [ - { - "pubDate": "Tue, 02 Jul 2024 00:00:00 GMT", - "title": "Staking Survey 2024", - "link": "https://paragraph.xyz/@ethstaker/staking-survey-2024", - "imgSrc": "https://storage.googleapis.com/papyrus_images/9a642b5e66cd993febd6e331cfa62de9.jpg", - "source": "ethstaker", - "sourceUrl": "https://paragraph.xyz/@ethstaker", - "sourceFeedUrl": "https://paragraph.xyz/api/blogs/rss/@ethstaker" - } - ], - [ - { - "pubDate": "Thu, 27 Dec 2024 12:00:00 GMT", - "title": "Solidity Developer Survey 2024 is Live!", - "link": "https://soliditylang.org/blog/2024/12/27/solidity-developer-survey-2024-announcement/", - "imgSrc": "/images/solidity-banner.png", - "source": "Solidity", - "sourceUrl": "https://soliditylang.org/blog", - "sourceFeedUrl": "https://soliditylang.org/feed.xml" - } - ] -] diff --git a/src/data/mocks/stakingStatsData.json b/src/data/mocks/stakingStatsData.json deleted file mode 100644 index 08669cbdd27..00000000000 --- a/src/data/mocks/stakingStatsData.json +++ /dev/null @@ -1 +0,0 @@ -{"totalEthStaked":34437177,"validatorscount":1077340,"apr":0.0333070787461441} \ No newline at end of file diff --git a/src/data/mocks/totalEthStaked.json b/src/data/mocks/totalEthStaked.json deleted file mode 100644 index 6e8e4037e76..00000000000 --- a/src/data/mocks/totalEthStaked.json +++ /dev/null @@ -1 +0,0 @@ -{ "value": 35000000, "timestamp": 1759687080325 } diff --git a/src/data/mocks/totalValueLocked.json b/src/data/mocks/totalValueLocked.json deleted file mode 100644 index 0691e30c7ae..00000000000 --- a/src/data/mocks/totalValueLocked.json +++ /dev/null @@ -1 +0,0 @@ -{"value":103172102624.0864,"timestamp":1727788459237} \ No newline at end of file diff --git a/src/data/mocks/translatathonTranslators.json b/src/data/mocks/translatathonTranslators.json deleted file mode 100644 index 0a84813a3c1..00000000000 --- a/src/data/mocks/translatathonTranslators.json +++ /dev/null @@ -1,602 +0,0 @@ -[ - { - "username": "0Xma3s", - "fullName": "Maiss Ayman (0Xma3s)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17263842/medium/37baa5d5c74a53a085043c3948da8fea.png", - "totalCosts": 55867 - }, - { - "username": "sipbikardi", - "fullName": "Sepehr Hashemi (sipbikardi)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15967353/medium/bdbc4e456ff62160eead47d69c036137.jpg", - "totalCosts": 53604 - }, - { - "username": "boluwatife_4523", - "fullName": "Boluwatife (boluwatife_4523)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15968043/medium/0c96258737feca19b689dafc51425f44.jpeg", - "totalCosts": 50187 - }, - { - "username": "MGETH", - "fullName": "MGETH", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15194310/medium/7729d9dbda8c9420c26f689b4a2b2918.jpg", - "totalCosts": 45914 - }, - { - "username": "mahdigachloo33", - "fullName": "Mahdi Gachloo (mahdigachloo33)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15947697/medium/6d060369501296118d0d9155a941096a.jpeg", - "totalCosts": 45254 - }, - { - "username": "jagadeeshftw", - "fullName": "Jagadeesh (jagadeeshftw)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16517557/medium/bae88dc68957ebfb38b2b05ade8889c7.jpeg", - "totalCosts": 45071 - }, - { - "username": "Ucadriotad", - "fullName": "Ucadriotad", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16554867/medium/a5d320d036ecc8461ff1595c6d0a952b_default.png", - "totalCosts": 37181 - }, - { - "username": "Joe-Chen", - "fullName": "Joe Chen (Joe-Chen)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16372068/medium/bf1ede23ed85a8ae5b1d9088a8fba1a9.png", - "totalCosts": 36483 - }, - { - "username": "Osaa7coded", - "fullName": "Osaa7coded", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16516145/medium/9a5dc25c4c447ecb0d6897898a40ca91_default.png", - "totalCosts": 33852 - }, - { - "username": "ukkaxah", - "fullName": "Ukkasha Farqaleet (ukkaxah)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17280400/medium/6075e2008c41a4a20878b9b07806b824.png", - "totalCosts": 31980 - }, - { - "username": "fuji.anggara10", - "fullName": "Fuji Ar (fuji.anggara10)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15934037/medium/e913f10d6d3550452e0b7c072e15aa40.jpeg", - "totalCosts": 28125 - }, - { - "username": "raffinjeanolivier", - "fullName": "Raffin Jean Olivier (raffinjeanolivier)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17288480/medium/3eaaaebcd9b0eb54cb841e6eb167d683.png", - "totalCosts": 26380 - }, - { - "username": "gagaspras14", - "fullName": "Gagas Prasetyo (gagaspras14)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16495919/medium/7648aa43801939274a5d0f3547ef0d08.jpg", - "totalCosts": 24924 - }, - { - "username": "0xmo", - "fullName": "Learn 0xmo (0xmo)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17260558/medium/f976396eed74ec77cfcc86ae2880dd5a.png", - "totalCosts": 24738 - }, - { - "username": "theminhhung", - "fullName": "Lê Hưng (theminhhung)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17281822/medium/ab943e9e77880a13ff7638638fb34f52.png", - "totalCosts": 23536 - }, - { - "username": "jorgesumle", - "fullName": "Jorge Maldonado Ventura (jorgesumle)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13423451/medium/b5918f74cd4d2d9d07d861e233a57527.png", - "totalCosts": 20709 - }, - { - "username": "macros.frost", - "fullName": "javad dadgar (macros.frost)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17269084/medium/a014b4239ae0870430b6d02cbe12fdb8.jpeg", - "totalCosts": 18764 - }, - { - "username": "Cesssa_Will", - "fullName": "Cesssa_Will", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17258280/medium/bfb70342fcca77bd3b325fe87326d8b3_default.png", - "totalCosts": 17904 - }, - { - "username": "DOladoyin", - "fullName": "DOladoyin", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16511185/medium/90309f62dfe28e8d5a9d8cc54bebb3cb_default.png", - "totalCosts": 16647 - }, - { - "username": "Jokowdd", - "fullName": "Jokowdd", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15662523/medium/a1bde18af96dc28c3fd1c1dd610e8896.JPG", - "totalCosts": 15609 - }, - { - "username": "mr_giorgos", - "fullName": "George Kitsoukakis (mr_giorgos)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14568334/medium/245b5c69aab62ffabb575daf603b70b8.jpg", - "totalCosts": 13737 - }, - { - "username": "RahayuRafika_12", - "fullName": "Rahayu Rafikahwulan Sari (RahayuRafika_12)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14861756/medium/68ce2b760b107d1cf2a5a1508aa8ee96.jpeg", - "totalCosts": 13462 - }, - { - "username": "iamgorgasiagian", - "fullName": "Gorga Siagian (11S18045) (iamgorgasiagian)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15711553/medium/78d86636558fbd59511b5c714ae72f78.jpeg", - "totalCosts": 13262 - }, - { - "username": "Carla78", - "fullName": "Carla (Carla78)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/13754187/medium/37de2106b564cdd5431a9c1f7e091087.png", - "totalCosts": 12039 - }, - { - "username": "emmanuelogheneovo", - "fullName": "emmanuelogheneovo", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16516321/medium/979b1f587938bd67386057cef8941dd6_default.png", - "totalCosts": 11457 - }, - { - "username": "Yasashi92", - "fullName": "Afeez Olamilekan (Yasashi92)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17250218/medium/b443e32685aa52230f84b29d34836df1.png", - "totalCosts": 11312 - }, - { - "username": "shoque_eth", - "fullName": "Shoque.eth (shoque_eth)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17259978/medium/4d83e2f1b874692d89c2dccb6ea8da0e.jpg", - "totalCosts": 10833 - }, - { - "username": "socopower", - "fullName": "Mr K. (socopower)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15946267/medium/094f1891b25266289c4aa5df7b08cfb7.jpg", - "totalCosts": 10521 - }, - { - "username": "wosek_", - "fullName": "wosek_", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15894449/medium/a1d92e3a822252a09f842a8a5451c403.jpg", - "totalCosts": 10363 - }, - { - "username": "elera0940", - "fullName": "elera0940", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17288478/medium/184cf97bd0426c3652c4cd9844217470_default.png", - "totalCosts": 9638 - }, - { - "username": "roifnaufal21", - "fullName": "roifnaufal21", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15927303/medium/e39f725004e850246a765bb86dddf780_default.png", - "totalCosts": 8930 - }, - { - "username": "henderson.mateus1", - "fullName": "Henderson Mateus (henderson.mateus1)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16496053/medium/a93e79f1bf3dfb040e800fdb6d0348cc.png", - "totalCosts": 8446 - }, - { - "username": "1nonlygem", - "fullName": "Arun (1nonlygem)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17286152/medium/c7959c93b5500d67561dd2df561ad95e.png", - "totalCosts": 7859 - }, - { - "username": "0xknife", - "fullName": "0xknife", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17283076/medium/aa9b7eb9cba78ca82d54e27d2671e884.png", - "totalCosts": 7074 - }, - { - "username": "Satglow", - "fullName": "Satglow", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15965461/medium/d0c82c3b7d4885069b13e4b4dc3f2963_default.png", - "totalCosts": 6933 - }, - { - "username": "hmsc", - "fullName": "Sunny Cheng (hmsc)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15532451/medium/1558c22671c8674e0f77412238047eb8_default.png", - "totalCosts": 6734 - }, - { - "username": "Anmar_Fa", - "fullName": "Anmar_Fa", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17263160/medium/ee9ad2a26c30e5502571b75276af8b5e.jpg", - "totalCosts": 6501 - }, - { - "username": "Nolongerbehemoth", - "fullName": "Nelson Ayo (Nolongerbehemoth)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17273600/medium/9415c7285b1e0fe4a4fd9aa669590010.png", - "totalCosts": 6482 - }, - { - "username": "thenfh", - "fullName": "Hanif Olayiwola (thenfh)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15966727/medium/a36da5d1f868c25a8c83eff5e67e068c.png", - "totalCosts": 6459 - }, - { - "username": "bella_rwa", - "fullName": "Bella Ciao (bella_rwa)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14990003/medium/780077e1893684cdb69d13788c71a816.jpeg", - "totalCosts": 6154 - }, - { - "username": "agustine", - "fullName": "agustine", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17237076/medium/0e939d0878330d8c04caba2d22ad7099.jpeg", - "totalCosts": 5900 - }, - { - "username": "ReDzin", - "fullName": "Renan D (ReDzin)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15526425/medium/56d8238479925123c68df83807810a25.jpg", - "totalCosts": 5835 - }, - { - "username": "kambalengununudaniel", - "fullName": "Danielk Knd (kambalengununudaniel)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16516821/medium/eb163ecd9e04f820e355e641292045b3.png", - "totalCosts": 5776 - }, - { - "username": "Glorypascal", - "fullName": "Glory Pascal (Glorypascal)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16517761/medium/61154ec5577b4fd2ebd1cdc2ce83f956.png", - "totalCosts": 5648 - }, - { - "username": "cryptoraketeros", - "fullName": "cryptocoinpurse.eth (cryptoraketeros)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15724471/medium/bfc780664ca8f2f9b582d54230d7f992.jpg", - "totalCosts": 5525 - }, - { - "username": "gieffe", - "fullName": "gieffe", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14979771/medium/11e3e734f50301de7849bededbf88190_default.png", - "totalCosts": 5522 - }, - { - "username": "Utami21.", - "fullName": "Utami21.", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17278190/medium/7cc6d42647c31e3a6850bc4e2f22708b_default.png", - "totalCosts": 5296 - }, - { - "username": "Ummey_ib", - "fullName": "Ummey_ib", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17285808/medium/655e2a84ce63a9f196be033d1ee1213a_default.png", - "totalCosts": 5256 - }, - { - "username": "0xmike7", - "fullName": "0xmike7", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14897770/medium/48581e20c04cdfde4e05e0b73f80e7c5_default.png", - "totalCosts": 5029 - }, - { - "username": "0xTrong90", - "fullName": "0xTrong90", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17286156/medium/598fb8f3f2660e6dd0e7638e13f478f6_default.png", - "totalCosts": 5010 - }, - { - "username": "Dreythegreat", - "fullName": "DREY (Dreythegreat)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17260094/medium/3f0d23338979e6ae752af733f0cceb18.jpeg", - "totalCosts": 4958 - }, - { - "username": "Tristan-He", - "fullName": "Tristan-He", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17286090/medium/39f8c4830c906e7df84d632d7fa8a2a0.jpeg", - "totalCosts": 4764 - }, - { - "username": "Dking2244", - "fullName": "Soyemi David Olasubomi (Dking2244)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16495007/medium/86ddc64f886e904c035fcbfe4e719592_default.png", - "totalCosts": 4749 - }, - { - "username": "IAmLickz", - "fullName": "Felix Elenwo (IAmLickz)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17289418/medium/44de153065f4477538f99c009c42cb14.jpeg", - "totalCosts": 4650 - }, - { - "username": "bajomaburton", - "fullName": "bajoma burton (bajomaburton)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17265964/medium/b10c1d8fff9f6a2b29d200cde9fe3404.jpeg", - "totalCosts": 4558 - }, - { - "username": "hyperalchemy", - "fullName": "Ceci (hyperalchemy)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15946127/medium/fb8809671278895b42cf50c752fd7bf2.png", - "totalCosts": 4486 - }, - { - "username": "Xrion", - "fullName": "XRion (Xrion)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15867623/medium/9c8af96a127663e1edf812a6cfdfd48d.jpg", - "totalCosts": 4451 - }, - { - "username": "lamdanghoang", - "fullName": "Đặng Hoàng Lâm (lamdanghoang)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17277386/medium/06c425c3eaba554a5c7631d7873b9f53.jpeg", - "totalCosts": 4423 - }, - { - "username": "scarlet188888", - "fullName": "scarlet188888", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17263702/medium/cb7a3d31ea20665e5204d0386acd1daa.jpg", - "totalCosts": 4321 - }, - { - "username": "kenez", - "fullName": "Emmanuel Ifediora (kenez)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17278202/medium/9097a816e3b5631ed32034c5fa1acfeb_default.png", - "totalCosts": 4240 - }, - { - "username": "DataSage", - "fullName": "Ismail ibrahim suleiman (DataSage)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17278848/medium/5e4d25472afb110e519671e278bfb966.jpeg", - "totalCosts": 4226 - }, - { - "username": "Snazzy1000000", - "fullName": "Snazzy1000000", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16495721/medium/6e08e10e9aec79e0cd7647d8dae24ca7_default.png", - "totalCosts": 4204 - }, - { - "username": "Arthur_Owl", - "fullName": "Arthur_Owl", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16518245/medium/c42764091f41f1a1c2087845211665c9.jpg", - "totalCosts": 4162 - }, - { - "username": "Soniclabs", - "fullName": "Soniclabs", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17258582/medium/11bc96ee681645c41bc89f15465193a3_default.png", - "totalCosts": 4154 - }, - { - "username": "BruceWithApostrophe", - "fullName": "Boutruce Success Walton (BruceWithApostrophe)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17289374/medium/a1e3dcde47bf5c07cc2e4d416624fd42_default.png", - "totalCosts": 3944 - }, - { - "username": "SamJay", - "fullName": "SamJay", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17251112/medium/512868d0f8a99fa974176ff6adf2502d_default.png", - "totalCosts": 3900 - }, - { - "username": "natsumegu", - "fullName": "Natsumegu (natsumegu)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15158762/medium/4f48b79bc8be6936d8490726acec96f5.png", - "totalCosts": 3769 - }, - { - "username": "immaculata2", - "fullName": "Immaculata Emmanuel (immaculata2)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17285708/medium/88e8a10b6478b8ed42650da3c836e419.jpg", - "totalCosts": 3757 - }, - { - "username": "sophiesworld.", - "fullName": "sophiesworld.", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15955419/medium/ef389c3dcda0b2ac5fcef223c439baae_default.png", - "totalCosts": 3709 - }, - { - "username": "bulela", - "fullName": "Bulela Gomoshe (bulela)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17262414/medium/3454b67fb76cb27503fba6859baa9e87.png", - "totalCosts": 3656 - }, - { - "username": "0xTianah", - "fullName": "Anuoluwapo Shorinola (0xTianah)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17285810/medium/9ab027b06dbeea85c7d09480868189d3.jpeg", - "totalCosts": 3487 - }, - { - "username": "KwakuAAnalyst", - "fullName": "Kwaku Amoakohene (KwakuAAnalyst)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16521083/medium/16094126513f67ca5af4bfcea067b78c.png", - "totalCosts": 3438 - }, - { - "username": "d_wordifyer", - "fullName": "Jeremiah Bulus (d_wordifyer)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17278208/medium/99a49ec875a3afe774e626bbdc949dc2.jpeg", - "totalCosts": 3390 - }, - { - "username": "pecky7777", - "fullName": "PECULIAR ADEKOYA (pecky7777)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17260590/medium/98e39095ff6e56f4b4add225c83792f9.png", - "totalCosts": 3341 - }, - { - "username": "Cashman001", - "fullName": "Daniel Onyedikachukwu (Cashman001)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17278162/medium/0aab4bc4c386b36b6cf7d20bbd0fe191.jpeg", - "totalCosts": 3316 - }, - { - "username": "StefanMarinkov", - "fullName": "Stefan Marinkov (StefanMarinkov)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/14857356/medium/ab07bb925437106784288608ef0a4089.png", - "totalCosts": 3298 - }, - { - "username": "QueenTojia", - "fullName": "TOJIA (QueenTojia)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16519345/medium/b11daaadb9e2abd47543d43d922ebc4a_default.png", - "totalCosts": 3277 - }, - { - "username": "Akins16", - "fullName": "Akins16", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17281674/medium/37eadd0a4510ab8e619d75960a22c2e6_default.png", - "totalCosts": 3234 - }, - { - "username": "tulipunity", - "fullName": "Gift Nkara (tulipunity)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17260528/medium/11165514b39ea0268ed94587d49eb93d.png", - "totalCosts": 3213 - }, - { - "username": "michaelchinemelu24", - "fullName": "michael chinemelu (michaelchinemelu24)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17280498/medium/69c4ca84c2b780480ee61c12754fc70f.jpeg", - "totalCosts": 3136 - }, - { - "username": "dicethedev", - "fullName": "Blessing Samuel (dicethedev)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17262542/medium/2697c27e5fcf051aeb807486aa1590b0.jpeg", - "totalCosts": 3070 - }, - { - "username": "nathanielnanle", - "fullName": "nathaniel nanle (nathanielnanle)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17260892/medium/ec4541dd1f43fcfe8c8da0c378335b44.png", - "totalCosts": 3058 - }, - { - "username": "radivojevic.iv", - "fullName": "Ivana Radivojevic (radivojevic.iv)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17269850/medium/9c02421ff723546d54aa9cc02748320e.png", - "totalCosts": 3054 - }, - { - "username": "balajessey1943", - "fullName": "Bala Jessey (balajessey1943)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17285254/medium/edef57bb051739cefc03a45a2901c95d.png", - "totalCosts": 3033 - }, - { - "username": "shanthi", - "fullName": "Shanthi (shanthi)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17289026/medium/781c86cecd5cd79811666f91e22225ef.jpeg", - "totalCosts": 2995 - }, - { - "username": "Amarachukwu_Precious", - "fullName": "Amarachukwu_Precious", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/16494153/medium/b8237274ae5981315f21c5708ba3fb22_default.png", - "totalCosts": 2893 - }, - { - "username": "Nazir01", - "fullName": "Nazir Muhammad Ladan (Nazir01)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17284106/medium/2c116bbdab720a5783a09617d34a36c2.png", - "totalCosts": 2822 - }, - { - "username": "ratnannn", - "fullName": "ratnannn", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17286472/medium/cb1bf8b0e3fc86c14e3f5acd7b5c066e_default.png", - "totalCosts": 2799 - }, - { - "username": "Blavkon", - "fullName": "Blavkon", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17258634/medium/94f2d16d2e4b1aa2229dbc06766d98ea_default.png", - "totalCosts": 2776 - }, - { - "username": "zicotee", - "fullName": "Ziko Isaac (zicotee)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17260138/medium/7853791faa2f7a7bb2197436dae24a30.png", - "totalCosts": 2700 - }, - { - "username": "Aisha_sulaiman", - "fullName": "Aisha_sulaiman", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17288828/medium/b9f37fb89bcaa2631991205a2b101b8c_default.png", - "totalCosts": 2668 - }, - { - "username": "jemyke16", - "fullName": "Jemyke Kinder (jemyke16)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17248670/medium/c2449090d5d7416d3cce92398ffbcb5f.jpeg", - "totalCosts": 2668 - }, - { - "username": "thangp97", - "fullName": "Thắng (thangp97)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17279482/medium/9541837548d94c199db38962ecdad316.jpeg", - "totalCosts": 2661 - }, - { - "username": "dovbyshbgd", - "fullName": "Bogdan Dovbysh (dovbyshbgd)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/15763855/medium/5b59dc54e26664f82eab09a76961eaf7.png", - "totalCosts": 2641 - }, - { - "username": "ayomprecious", - "fullName": "precious ayomitola (ayomprecious)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17260556/medium/e22aaf55b39ab90d9ed888d2f90f3cb3.png", - "totalCosts": 2615 - }, - { - "username": "ayanfezy", - "fullName": "habeeb yahyah (ayanfezy)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17250038/medium/4c0b59aaac5215445e9d4995c84a4aef.png", - "totalCosts": 2513 - }, - { - "username": "neemibhatti", - "fullName": "Bhatti Studio (neemibhatti)", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17266830/medium/af6eda6c6e1249a95278ce127b2ba933.jpeg", - "totalCosts": 2489 - }, - { - "username": "shiminanai", - "fullName": "shiminanai", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17258512/medium/b5da994ea6b317c8538e39e9ffe45484_default.png", - "totalCosts": 2472 - }, - { - "username": "EthCongo", - "fullName": "EthCongo", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17258554/medium/7f1cf250a12a45e6968ad853592b6e87.png", - "totalCosts": 2448 - }, - { - "username": "Ololadian01", - "fullName": "Ololadian01", - "avatarUrl": "https://crowdin-static.cf-downloads.crowdin.com/avatar/17290610/medium/a0ce54a9e1ce2634c5a9e1fbb16285a5_default.png", - "totalCosts": 2311 - } -] \ No newline at end of file diff --git a/src/lib/api/calendarEvents.ts b/src/lib/api/calendarEvents.ts deleted file mode 100644 index 6caade5be02..00000000000 --- a/src/lib/api/calendarEvents.ts +++ /dev/null @@ -1,47 +0,0 @@ -import type { - CommunityEventsReturnType, - ReqCommunityEvent, -} from "@/lib/interfaces" - -export async function fetchCommunityEvents(): Promise { - const apiKey = process.env.GOOGLE_API_KEY - const calendarId = process.env.GOOGLE_CALENDAR_ID - - const futureEventsReq = await fetch( - `https://content.googleapis.com/calendar/v3/calendars/${calendarId}/events?key=${apiKey}&timeMin=${new Date().toISOString()}&maxResults=3&singleEvents=true&orderby=starttime` - ) - const futureEvents = await futureEventsReq.json() - const futureEventsReqData: ReqCommunityEvent[] = futureEvents.items - - const pastEventsReq = await fetch( - `https://content.googleapis.com/calendar/v3/calendars/${calendarId}/events?key=${apiKey}&timeMax=${new Date().toISOString()}&orderby=starttime` - ) - const pastEvents = await pastEventsReq.json() - const pastEventsReqData: ReqCommunityEvent[] = pastEvents.items - - const pastEventData = (pastEventsReqData ?? []) - .filter((event) => event.start) - .slice(-4) - .map((event) => { - return { - date: event.start.dateTime, - title: event.summary, - calendarLink: event.htmlLink, - } - }) - const upcomingEventData = (futureEventsReqData ?? []) - .filter((event) => event.start) - .reverse() - .map((event) => { - return { - date: event.start.dateTime, - title: event.summary, - calendarLink: event.htmlLink, - } - }) - - return { - pastEventData, - upcomingEventData, - } -} diff --git a/src/lib/api/fetchApps.ts b/src/lib/api/fetchApps.ts deleted file mode 100644 index e49f898e61e..00000000000 --- a/src/lib/api/fetchApps.ts +++ /dev/null @@ -1,181 +0,0 @@ -import { AppCategoryEnum, AppData } from "@/lib/types" - -export async function fetchApps(): Promise> { - const googleApiKey = process.env.GOOGLE_API_KEY - const sheetId = process.env.GOOGLE_SHEET_ID_DAPPS - - if (!sheetId) { - throw new Error("Google Sheets ID not set") - } - - if (!googleApiKey) { - throw new Error("Google API key not set") - } - - try { - // First, let's get the spreadsheet metadata to see what sheets exist - const metadataUrl = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}?key=${googleApiKey}` - - const metadataResponse = await fetch(metadataUrl) - - if (!metadataResponse.ok) { - const errorText = await metadataResponse.text() - console.error("Metadata fetch error:", { - status: metadataResponse.status, - statusText: metadataResponse.statusText, - error: errorText, - }) - throw new Error( - `Metadata fetch failed: ${metadataResponse.status} ${metadataResponse.statusText}` - ) - } - - const metadata = await metadataResponse.json() - const sheetNames = - metadata.sheets?.map( - (sheet: { properties: { title: string } }) => sheet.properties.title - ) || [] - - // Filter out sheets that are not valid AppCategoryEnum values - const appCategorySheetNames = sheetNames.filter((name: string) => - Object.values(AppCategoryEnum).includes(name as AppCategoryEnum) - ) - - const appsOfTheWeek = await fetch( - `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/App%20of%20the%20day!A2:C?majorDimension=ROWS&key=${googleApiKey}` - ) - - if (!appsOfTheWeek.ok) { - console.error( - `Failed to fetch from sheet Apps of the day:`, - appsOfTheWeek.status, - appsOfTheWeek.statusText - ) - } - - const appsOfTheWeekData = await appsOfTheWeek.json() - - const result: Record = {} - - // Fetch and process data from each sheet - for (const sheetName of appCategorySheetNames) { - const dataUrl = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${sheetName}!A:Z?majorDimension=ROWS&key=${googleApiKey}` - const dataResponse = await fetch(dataUrl) - - if (!dataResponse.ok) { - console.error( - `Failed to fetch from sheet ${sheetName}:`, - dataResponse.status, - dataResponse.statusText - ) - result[sheetName] = [] - continue - } - - const data = await dataResponse.json() - const rows = data.values || [] - - if (rows.length === 0) { - result[sheetName] = [] - continue - } - - // Process data rows (skip header) - const dataRows = rows.slice(1).filter((row: string[]) => { - // Filter out completely empty rows or rows without a name - return row.length > 0 && row[0]?.trim() !== "" - }) - - const apps: AppData[] = dataRows - .map((row: string[]) => { - // Map row data to app object - const appData = { - name: row[0] || "", - url: row[1] || "", - description: row[2] || "", - image: row[3] || "", // Use the SVG data directly from the Logo Image column - category: getCategoryFromSheetName(sheetName), - subCategory: parseCommaSeparated(row[5] || ""), - networks: parseCommaSeparated(row[6] || ""), - screenshots: parseCommaSeparated(row[7] || ""), - bannerImage: row[8] || "", - platforms: parseCommaSeparated(row[9] || ""), - twitter: row[10] || "", - github: row[11] || "", - discord: row[12] || "", - kpiUrl: row[13] || "", - sortingWeight: parseInt(row[14] || "0") || 0, - discover: row[15]?.toLowerCase() === "true", - highlight: row[16]?.toLowerCase() === "true", - languages: parseCommaSeparated(row[17] || ""), - parentCompany: row[18] || "", - parentCompanyURL: row[19] || "", - openSource: row[20]?.toLowerCase() === "true", - contractAddress: row[21] || "", - dateOfLaunch: row[22] || "", - lastUpdated: row[23] || "", - ready: row[24]?.toLowerCase(), - devconnect: row[25]?.toLowerCase(), - ...parseAppOfTheWeekDate(row[0], appsOfTheWeekData), - } - - return appData as unknown as AppData - }) - .filter((app: AppData) => app.name && app.url) // Filter out apps without name or URL - .filter((app: AppData) => app.ready === "true") - - result[sheetName] = apps - } - - return result - } catch (error) { - console.error("Error fetching from Google Sheets:", error) - return {} - } -} - -// Helper function to map sheet names to AppCategoryEnum -function getCategoryFromSheetName(sheetName: string): AppCategoryEnum { - switch (sheetName) { - case "DeFi": - return AppCategoryEnum.DEFI - case "Collectibles": - return AppCategoryEnum.COLLECTIBLE - case "Social": - return AppCategoryEnum.SOCIAL - case "Gaming": - return AppCategoryEnum.GAMING - case "Bridge": - return AppCategoryEnum.BRIDGE - case "Productivity": - return AppCategoryEnum.PRODUCTIVITY - case "Privacy": - return AppCategoryEnum.PRIVACY - case "DAO": - return AppCategoryEnum.GOVERNANCE_DAO - default: - return AppCategoryEnum.DEFI // Default fallback - } -} - -// Helper function to parse comma-separated strings into arrays -function parseCommaSeparated(value: string): string[] { - if (!value || value.trim() === "") return [] - return value - .split(",") - .map((item) => item.trim()) - .filter(Boolean) -} - -const parseAppOfTheWeekDate = ( - appName: string, - appsOfTheWeekData: { values: Array<[string, string, string]> } -): { appOfTheWeekStartDate: Date | null; appOfTheWeekEndDate: Date | null } => { - const appOfTheWeek = appsOfTheWeekData.values.find( - (app: [string, string, string]) => app[0] === appName - ) - return { - appOfTheWeekStartDate: appOfTheWeek ? new Date(appOfTheWeek[1]) : null, - appOfTheWeekEndDate: appOfTheWeek ? new Date(appOfTheWeek[2]) : null, - } -} diff --git a/src/lib/api/fetchBeaconchainEpoch.ts b/src/lib/api/fetchBeaconchainEpoch.ts deleted file mode 100644 index fb908d211ed..00000000000 --- a/src/lib/api/fetchBeaconchainEpoch.ts +++ /dev/null @@ -1,62 +0,0 @@ -import type { BeaconchainEpochData, EpochResponse } from "@/lib/types" - -import { MAX_RETRIES } from "../constants" -import { - delayWithJitter, - fetchWithTimeoutAndRevalidation, - shouldStatusRetry, - sleep, -} from "../utils/data/utils" - -export const fetchBeaconchainEpoch = - async (): Promise => { - const base = "https://beaconcha.in" - const endpoint = "api/v1/epoch/latest" - const { href } = new URL(endpoint, base) - - const defaultErrorMessage = `Failed to fetch Beaconcha.in ${endpoint}` - const defaultError: BeaconchainEpochData = { - totalEthStaked: { error: defaultErrorMessage }, - validatorscount: { error: defaultErrorMessage }, - } - - for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) { - try { - const response = await fetchWithTimeoutAndRevalidation(href) - if (!response.ok) { - const status = response.status - const shouldRetry = attempt < MAX_RETRIES && shouldStatusRetry(status) - if (shouldRetry) { - await sleep(delayWithJitter()) - continue - } - console.warn("Beaconcha.in fetch non-OK", { status, url: href }) - const error = `Beaconcha.in responded with status ${status}` - return { totalEthStaked: { error }, validatorscount: { error } } - } - const json: EpochResponse = await response.json() - const { validatorscount, eligibleether } = json.data - const totalEthStaked = Math.floor(eligibleether * 1e-9) // `eligibleether` value returned in `gwei` - const timestamp = Date.now() - return { - totalEthStaked: { value: totalEthStaked, timestamp }, - validatorscount: { value: validatorscount, timestamp }, - } - } catch (err: unknown) { - const isLastAttempt = attempt >= MAX_RETRIES - if (isLastAttempt) { - console.error("Beaconcha.in fetch failed", { - name: err instanceof Error ? err.name : undefined, - message: err instanceof Error ? err.message : String(err), - url: href, - }) - return defaultError - } - await sleep(delayWithJitter()) - } - } - - return defaultError - } - -export default fetchBeaconchainEpoch diff --git a/src/lib/api/fetchBeaconchainEthstore.ts b/src/lib/api/fetchBeaconchainEthstore.ts deleted file mode 100644 index 3efd90e66ce..00000000000 --- a/src/lib/api/fetchBeaconchainEthstore.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { EthStoreResponse, MetricReturnData } from "@/lib/types" - -import { MAX_RETRIES } from "../constants" -import { - delayWithJitter, - fetchWithTimeoutAndRevalidation, - shouldStatusRetry, - sleep, -} from "../utils/data/utils" - -export const fetchBeaconchainEthstore = async (): Promise => { - const base = "https://beaconcha.in" - const endpoint = "api/v1/ethstore/latest" - const { href } = new URL(endpoint, base) - - for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) { - try { - const response = await fetchWithTimeoutAndRevalidation(href) - if (!response.ok) { - const status = response.status - const shouldRetry = attempt < MAX_RETRIES && shouldStatusRetry(status) - if (shouldRetry) { - await sleep(delayWithJitter()) - continue - } - console.warn("Beaconcha.in fetch non-OK", { status, url: href }) - return { error: `Beaconcha.in responded with status ${status}` } - } - - const json: EthStoreResponse = await response.json() - const apr = json.data.apr - return { value: apr, timestamp: Date.now() } - } catch (err: unknown) { - const isLastAttempt = attempt >= MAX_RETRIES - if (isLastAttempt) { - console.error("Beaconcha.in fetch failed", { - name: err instanceof Error ? err.name : undefined, - message: err instanceof Error ? err.message : String(err), - url: href, - }) - return { error: `Failed to fetch Beaconcha.in ${endpoint}` } - } - await sleep(delayWithJitter()) - } - } - - return { error: "Failed to fetch Beaconcha.in ethstore" } -} - -export default fetchBeaconchainEthstore diff --git a/src/lib/api/fetchBlobscanStats.ts b/src/lib/api/fetchBlobscanStats.ts deleted file mode 100644 index 1886534e7b7..00000000000 --- a/src/lib/api/fetchBlobscanStats.ts +++ /dev/null @@ -1,38 +0,0 @@ -import type { ValueOrError } from "../types" - -type BlobscanOverallStats = { - avgBlobAsCalldataFee: number - avgBlobFee: number - avgBlobGasPrice: number - avgMaxBlobGasFee: number - totalBlobGasUsed: string - totalBlobAsCalldataGasUsed: string - totalBlobFee: string - totalBlobAsCalldataFee: string - totalBlobs: number - totalBlobSize: string - totalBlocks: number - totalTransactions: number - totalUniqueBlobs: number - totalUniqueReceivers: number - totalUniqueSenders: number - updatedAt: string -} - -/** - * Fetch the overall stats from Blobscan - * - * @see https://api.blobscan.com/#/stats/stats-getOverallStats - * - */ -export const fetchBlobscanStats = async (): Promise< - ValueOrError -> => { - const response = await fetch("https://api.blobscan.com/stats/overall") - - if (!response.ok) return { error: "Response for fetchBlobscanStats not okay" } - - const [json]: [BlobscanOverallStats] = await response.json() - - return { value: json, timestamp: Date.now() } -} diff --git a/src/lib/api/fetchCommunityPicks.ts b/src/lib/api/fetchCommunityPicks.ts deleted file mode 100644 index 6b34719ba44..00000000000 --- a/src/lib/api/fetchCommunityPicks.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { CommunityPick } from "@/lib/types" - -export async function fetchCommunityPicks() { - const googleApiKey = process.env.GOOGLE_API_KEY - const sheetId = process.env.GOOGLE_SHEET_ID_DAPPS - - if (!sheetId) { - throw new Error("Google Sheets ID not set") - } - - if (!googleApiKey) { - throw new Error("Google API key not set") - } - const response = await fetch( - `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/community_picks!A:Z?majorDimension=ROWS&key=${googleApiKey}` - ) - - if (!response.ok) { - throw new Error("Failed to fetch community picks") - } - - const data = await response.json() - const rows = data.values || [] - - // Process data rows (skip header) - const dataRows = rows.slice(1).filter((row: string[]) => { - // Filter out completely empty rows or rows without a name - return row.length > 0 && row[0]?.trim() !== "" - }) - - const communityPicks: CommunityPick[] = dataRows.map((row: string[]) => ({ - name: row[0], - twitterURL: row[1], - twitterHandle: row[2], - app1Name: row[3] || null, - app2Name: row[4] || null, - app3Name: row[5] || null, - })) - - return communityPicks -} diff --git a/src/lib/api/fetchEthPrice.ts b/src/lib/api/fetchEthPrice.ts deleted file mode 100644 index 96fd381fbd0..00000000000 --- a/src/lib/api/fetchEthPrice.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { MetricReturnData } from "../types" - -export const fetchEthPrice = async (): Promise => { - const data: { ethereum: { usd: number } } = await fetch( - "https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd" - ).then((res) => res.json()) - const { - ethereum: { usd }, - } = data - if (!usd) throw new Error("Unable to fetch ETH price from CoinGecko") - return { value: usd, timestamp: Date.now() } -} diff --git a/src/lib/api/fetchEthereumMarketcap.ts b/src/lib/api/fetchEthereumMarketcap.ts deleted file mode 100644 index ca702f30228..00000000000 --- a/src/lib/api/fetchEthereumMarketcap.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { MetricReturnData } from "../types" - -export const fetchEthereumMarketcap = async (): Promise => { - const data: { ethereum: { usd_market_cap: number } } = await fetch( - "https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd&include_market_cap=true" - ).then((res) => res.json()) - const { - ethereum: { usd_market_cap }, - } = data - if (!usd_market_cap) - throw new Error("Unable to fetch ETH price from CoinGecko") - return { value: usd_market_cap, timestamp: Date.now() } -} diff --git a/src/lib/api/fetchEthereumStablecoinsMcap.ts b/src/lib/api/fetchEthereumStablecoinsMcap.ts deleted file mode 100644 index 2366397444f..00000000000 --- a/src/lib/api/fetchEthereumStablecoinsMcap.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { MetricReturnData } from "../types" - -export type LlamaStablecoinchainsResponseItem = { - gecko_id: string | null - totalCirculatingUSD: Record - tokenSymbol: string | null - name: string -} - -export async function fetchEthereumStablecoinsMcap(): Promise { - const url = "https://stablecoins.llama.fi/stablecoinchains" - - try { - const response = await fetch(url) - if (!response.ok) { - console.log(response.status, response.statusText) - throw new Error("Failed to fetch llama.fi stablecoin mcap data") - } - const data: LlamaStablecoinchainsResponseItem[] = await response.json() - - const ethereumData = data.find(({ gecko_id }) => gecko_id === "ethereum") - if (!ethereumData) throw new Error("Ethereum stablecoin data not found") - - const value = Object.values(ethereumData.totalCirculatingUSD).reduce( - (acc, value) => acc + value, - 0 - ) - - return { value } - } catch (error) { - // Will not currently break build; passes back error key - console.error(error) - return { - error: - "Something went wrong with requesting the Ethereum stablecoins data.", - } - } -} diff --git a/src/lib/api/fetchGFIs.ts b/src/lib/api/fetchGFIs.ts deleted file mode 100644 index 61887717771..00000000000 --- a/src/lib/api/fetchGFIs.ts +++ /dev/null @@ -1,35 +0,0 @@ -import type { GHIssue } from "../types" - -const owner = "ethereum" -const repo = "ethereum-org-website" -const label = "good first issue" - -export const fetchGFIs = async () => { - const url = new URL(`https://api.github.com/repos/${owner}/${repo}/issues`) - url.searchParams.append("labels", label) - url.searchParams.append("state", "open") - url.searchParams.append("sort", "created") - url.searchParams.append("direction", "desc") - url.searchParams.append("assignee", "none") - url.searchParams.append("per_page", "10") - - try { - const response = await fetch(url, { - headers: { - Authorization: `token ${process.env.GITHUB_TOKEN_READ_ONLY}`, - Accept: "application/vnd.github.v3+json", - }, - }) - - if (!response.ok) { - throw new Error( - `GitHub API responded with ${response.status}: ${response.statusText}` - ) - } - - return (await response.json()) as GHIssue[] - } catch (error) { - console.error(error) - return [] - } -} diff --git a/src/lib/api/fetchGitHistory.ts b/src/lib/api/fetchGitHistory.ts deleted file mode 100644 index ce63e96c836..00000000000 --- a/src/lib/api/fetchGitHistory.ts +++ /dev/null @@ -1,83 +0,0 @@ -import type { Commit, CommitHistory } from "@/lib/types" - -import { - CONTENT_DIR, - GITHUB_COMMITS_URL, - OLD_CONTENT_DIR, -} from "@/lib/constants" - -async function fetchWithRateLimit(filepath: string): Promise { - const url = new URL(GITHUB_COMMITS_URL) - url.searchParams.set("path", filepath) - url.searchParams.set("sha", "master") - - const gitHubToken = process.env.GITHUB_TOKEN_READ_ONLY - - // If no token available, return empty array - if (!gitHubToken) return [] - - /* eslint-disable no-constant-condition -- - * eslint does not like while(true) - **/ - while (true) { - const response = await fetch(url.href, { - headers: { Authorization: `token ${gitHubToken}` }, - }) - - if ( - response.status === 403 && - response.headers.get("X-RateLimit-Remaining") === "0" - ) { - const resetTime = response.headers.get("X-RateLimit-Reset") as string - const waitTime = +resetTime - Math.floor(Date.now() / 1000) - console.log(`Rate limit exceeded, waiting for ${waitTime} seconds`) - await new Promise((resolve) => setTimeout(resolve, waitTime * 1000)) - continue - } - - if (!response.ok) throw new Error(response.statusText) - const json = await response.json() - if (!Array.isArray(json)) { - console.warn("Unexpected response from GitHub API", json) - return [] - } - return json - } -} - -// Fetch commit history and save it to a JSON file -export const fetchAndCacheGitHubContributors = async ( - filepath: string, - cache: CommitHistory -) => { - // First, check cache for existing commit history for English version (despite locale) - if (cache[filepath]) return cache[filepath] - - // Fetch and save commit history for file - const history = (await fetchWithRateLimit(filepath)) || [] - - const legacyHistory = - (await fetchWithRateLimit( - filepath.replace(CONTENT_DIR, OLD_CONTENT_DIR) - )) || [] - - // Transform commitHistory - const contributors = [...history, ...legacyHistory] - .filter(({ author }) => !!author) - .map((contribution) => { - const { login, avatar_url, html_url } = contribution.author - const { date } = contribution.commit.author - return { login, avatar_url, html_url, date } - }) - - // Remove duplicates from same login - const uniqueContributors = contributors.filter( - (contributor, index, self) => - index === self.findIndex((t) => t.login === contributor.login) - ) - - // Amend to cache - cache[filepath] = uniqueContributors - - return uniqueContributors -} diff --git a/src/lib/api/fetchGrowThePie.ts b/src/lib/api/fetchGrowThePie.ts deleted file mode 100644 index 8acc8c4d15c..00000000000 --- a/src/lib/api/fetchGrowThePie.ts +++ /dev/null @@ -1,89 +0,0 @@ -import type { GrowThePieData } from "@/lib/types" - -import { layer2Data } from "@/data/networks/networks" - -type DataItem = { - metric_key: string - origin_key: string - date: string - value: number -} - -const TXCOSTS_MEDIAN_USD = "txcosts_median_usd" -const TXCOUNT = "txcount" -const ACTIVE_ADDRESSES = "aa_last7d" - -export const fetchGrowThePie = async (): Promise => { - const url = "https://api.growthepie.com/v1/fundamentals_7d.json" - - const response = await fetch(url) - if (!response.ok) { - console.log(response.status, response.statusText) - throw new Error("Failed to fetch growthepie data") - } - const data: DataItem[] = await response.json() - - // Filter data to only include the metrics we need - const filteredData = data.filter((item) => - [TXCOSTS_MEDIAN_USD, TXCOUNT, ACTIVE_ADDRESSES].includes(item.metric_key) - ) - - const mostRecentDate = filteredData.reduce((latest, item) => { - const itemDate = new Date(item.date) - return itemDate > new Date(latest) ? item.date : latest - }, filteredData[0].date) - - const activeAddresses = filteredData - .filter((item) => item.date === mostRecentDate) - .filter((item) => item.metric_key === ACTIVE_ADDRESSES) - .reduce((acc, item) => { - return { - ...acc, - [item.origin_key]: item.value, - } - }, {}) - - const mostRecentData = filteredData.filter( - (item) => - item.date === mostRecentDate && - [TXCOSTS_MEDIAN_USD, TXCOUNT].includes(item.metric_key) - ) - - let totalTxCount = 0 - let weightedSum = 0 - - mostRecentData - .filter((item) => - layer2Data.some((l2) => l2.growthepieID === item.origin_key) - ) - .forEach((item) => { - if (item.metric_key !== TXCOSTS_MEDIAN_USD) return - - const txCountItem = mostRecentData.find( - (txItem) => - txItem.metric_key === TXCOUNT && txItem.origin_key === item.origin_key - ) - if (!txCountItem) return - - totalTxCount += txCountItem.value - weightedSum += item.value * txCountItem.value - }) - - // The weighted average of txcosts_median_usd, by txcount on each network (origin_key) - const weightedAverage = totalTxCount ? weightedSum / totalTxCount : 0 - - // Last updated timestamp - const timestamp = Date.now() - - return { - txCount: { value: totalTxCount, timestamp }, - txCostsMedianUsd: { value: weightedAverage, timestamp }, - dailyTxCosts: mostRecentData - .filter((item) => item.metric_key === TXCOSTS_MEDIAN_USD) - .reduce((acc, item) => { - acc[item.origin_key] = item.value - return acc - }, {}), - activeAddresses: activeAddresses, - } -} diff --git a/src/lib/api/fetchGrowThePieBlockspace.ts b/src/lib/api/fetchGrowThePieBlockspace.ts deleted file mode 100644 index 4b72ed1aa9b..00000000000 --- a/src/lib/api/fetchGrowThePieBlockspace.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { layer2Data } from "@/data/networks/networks" - -export const fetchGrowThePieBlockspace = async () => { - const blockspaceData = {} - for (const network of layer2Data) { - const response = await fetch( - `https://api.growthepie.com/v1/chains/blockspace/${network.growthepieID}.json` - ) - if (!response.ok) { - continue - } - const data = await response.json() - - blockspaceData[network.growthepieID] = { - nft: data.overview["30d"].nft.data[4], - defi: data.overview["30d"].defi.data[4], - social: data.overview["30d"].social.data?.[4] || 0, - token_transfers: data.overview["30d"].token_transfers.data[4], - unlabeled: data.overview["30d"].unlabeled.data[4], - } - } - - return blockspaceData -} diff --git a/src/lib/api/fetchGrowThePieMaster.ts b/src/lib/api/fetchGrowThePieMaster.ts deleted file mode 100644 index 090cb3b0026..00000000000 --- a/src/lib/api/fetchGrowThePieMaster.ts +++ /dev/null @@ -1,28 +0,0 @@ -// Add interface for the chain data structure -interface Chain { - url_key: string - launch_date: string -} - -export const fetchGrowThePieMaster = async () => { - const response = await fetch("https://api.growthepie.com/v1/master.json") - if (!response.ok) { - throw new Error( - `growthepie Master API responded with ${response.status}: ${response.statusText}` - ) - } - - const data = (await response.json()) as { chains: Record } - - const launchDates = Object.values(data.chains).reduce>( - (acc, curr: Chain) => { - return { - ...acc, - [curr.url_key]: curr.launch_date, - } - }, - {} - ) - - return { launchDates: launchDates } -} diff --git a/src/lib/api/fetchL2beat.ts b/src/lib/api/fetchL2beat.ts deleted file mode 100644 index 374c5e6b3da..00000000000 --- a/src/lib/api/fetchL2beat.ts +++ /dev/null @@ -1,9 +0,0 @@ -export const fetchL2beat = async () => { - const response = await fetch("https://l2beat.com/api/scaling/summary") - if (!response.ok) { - throw new Error( - `L2BEAT API responded with ${response.status}: ${response.statusText}` - ) - } - return await response.json() -} diff --git a/src/lib/api/fetchPosts.ts b/src/lib/api/fetchPosts.ts deleted file mode 100644 index 827379ee217..00000000000 --- a/src/lib/api/fetchPosts.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { HTMLResult, RSSItem } from "../types" - -import { fetchXml } from "./fetchRSS" - -export const fetchAttestantPosts = async () => { - const BASE_URL = "https://www.attestant.io/posts/" - const allItems: RSSItem[] = [] - - try { - const htmlData = (await fetchXml(BASE_URL)) as HTMLResult - - // Extract div containing list of posts from deeply nested HTML structure - const postsContainer = - htmlData.html.body[0].div[0].div[1].div[0].div[0].div[0].div - - const sortedPosts = postsContainer - .map(({ a }) => { - const [ - { - $: { href }, - h4: [{ _: title }], - div: [{ _: content }, { _: pubDate }], - }, - ] = a - const { href: link } = new URL(href, BASE_URL) - return { - title, - link, - content, - source: "Attestant", - sourceUrl: BASE_URL, - sourceFeedUrl: BASE_URL, - imgSrc: "/images/attestant-logo.svg", - pubDate, - } - }) - .sort( - (a: RSSItem, b: RSSItem) => - new Date(b.pubDate).getTime() - new Date(a.pubDate).getTime() - ) - allItems.push(...sortedPosts) - } catch (error) { - console.error( - "Error fetching Attestant posts:", - error instanceof Error ? error.message : error - ) - } - - return allItems -} diff --git a/src/lib/api/fetchRSS.ts b/src/lib/api/fetchRSS.ts deleted file mode 100644 index 0f5a6124e78..00000000000 --- a/src/lib/api/fetchRSS.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { parseString } from "xml2js" - -import { RSS_DISPLAY_COUNT } from "../constants" -import type { AtomElement, AtomResult, RSSItem, RSSResult } from "../types" -import { isValidDate } from "../utils/date" - -/** - * Fetches RSS feed from the specified XML URL(s). - * @param xmlUrl - The URL(s) of the XML feed to fetch. - * @returns An array sources, each containing an array of RSS items - */ -export const fetchRSS = async (xmlUrl: string | string[]) => { - const urls = Array.isArray(xmlUrl) ? xmlUrl : [xmlUrl] - const allItems: RSSItem[][] = [] - for (const url of urls) { - try { - const response = (await fetchXml(url)) as RSSResult | AtomResult - - if ("rss" in response) { - const [mainChannel] = response.rss.channel - const [source] = mainChannel.title - const [sourceUrl] = mainChannel.link - const channelImage = mainChannel.image - ? mainChannel.image[0].url[0] - : "" - - const parsedRssItems = mainChannel.item - // Filter out items with invalid dates - .filter((item) => { - if (!item.pubDate) return false - const [pubDate] = item.pubDate - return isValidDate(pubDate) - }) - // Sort by pubDate (most recent is first in array - .sort((a, b) => { - const dateA = new Date(a.pubDate[0]) - const dateB = new Date(b.pubDate[0]) - return dateB.getTime() - dateA.getTime() - }) - // Map to RSSItem object - .map((item) => { - const getImgSrc = () => { - if (item["content:encoded"]) - return item["content:encoded"][0].match( - /https?:\/\/[^"]*?\.(jpe?g|png|webp)/g - )?.[0] - if (item.enclosure) return item.enclosure[0].$.url - if (item["media:content"]) return item["media:content"][0].$.url - return channelImage - } - return { - pubDate: item.pubDate[0], - title: item.title[0], - link: item.link[0], - imgSrc: getImgSrc(), - source, - sourceUrl, - sourceFeedUrl: url, - } - }) - - allItems.push(parsedRssItems) - } else if ("feed" in response) { - const [source] = response.feed.title - const [sourceUrl] = response.feed.id - const feedImage = response.feed.icon?.[0] - - const parsedAtomItems = response.feed.entry - // Filter out items with invalid dates - .filter((entry) => { - if (!entry.updated) return false - const [published] = entry.updated - return isValidDate(published) - }) - // Sort by published (most recent is first in array - .sort((a, b) => { - const dateA = new Date(a.updated[0]) - const dateB = new Date(b.updated[0]) - return dateB.getTime() - dateA.getTime() - }) - // Map to RSSItem object - .map((entry) => { - const getString = (el?: AtomElement[]): string => { - if (!el) return "" - const [firstEl] = el - if (typeof firstEl === "string") return firstEl - return firstEl._ || "" - } - const getHref = (): string => { - if (!entry.link) { - console.warn(`No link found for RSS url: ${url}`) - return "" - } - const link = entry.link[0] - if (typeof link === "string") return link - return link.$.href || "" - } - const getImgSrc = (): string => { - const imgRegEx = /https?:\/\/[^"]*?\.(jpe?g|png|webp)/g - const contentMatch = getString(entry.content).match(imgRegEx) - if (contentMatch) return contentMatch[0] - const summaryMatch = getString(entry.summary).match(imgRegEx) - if (summaryMatch) return summaryMatch[0] - return feedImage || "" - } - return { - pubDate: entry.updated[0], - title: getString(entry.title), - link: getHref(), - imgSrc: getImgSrc(), - source, - sourceUrl, - sourceFeedUrl: url, - } - }) - - allItems.push(parsedAtomItems) - } else { - throw new Error( - `Error parsing XML, invalid RSSResult or AtomResult type: ${url}` - ) - } - } catch (error) { - console.error(error instanceof Error ? error.message : error) - // Do not break build for single fetch failure - continue - } - } - - // Only break build if insufficient number of items fetched - if (allItems.length < RSS_DISPLAY_COUNT) - throw new Error("Insufficient number of RSS items fetched") - - return allItems -} - -/** - * Fetches XML data from the specified URL. - * Parses XML to JSON with parseString (xml2js package) - * @param url - The URL to fetch the XML data from. - * @returns A promise that resolves to the parsed XML data as a JSON object. - */ -export const fetchXml = async (url: string) => { - try { - const response = await fetch(url, { - headers: { Cookie: "", DNT: "1" }, // Empty cookie header and do-not-track - credentials: "omit", // Don't send or receive cookies - }) - const xml = await response.text() - return await new Promise>((resolve, reject) => { - parseString(xml, (err, result) => { - err ? reject(err) : resolve(result) - }) - }) - } catch (error) { - throw new Error(`Error fetching or parsing XML: ${url}`) - } -} diff --git a/src/lib/api/fetchTotalEthStaked.ts b/src/lib/api/fetchTotalEthStaked.ts deleted file mode 100644 index 19eb7893ce4..00000000000 --- a/src/lib/api/fetchTotalEthStaked.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { EthStakedResponse, MetricReturnData } from "@/lib/types" - -import { DUNE_API_URL } from "../constants" - -const DUNE_API_KEY = process.env.DUNE_API_KEY - -export const fetchTotalEthStaked = async (): Promise => { - if (!DUNE_API_KEY) { - console.error("Dune API key not found") - return { error: "Dune API key not found" } - } - - const url = new URL("api/v1/query/3915587/results", DUNE_API_URL) - - const response = await fetch(url, { - headers: { "X-Dune-API-Key": DUNE_API_KEY }, - }) - if (!response.ok) { - console.log(response.status, response.statusText) - throw new Error("Failed to fetch eth staked data") - } - - const json: EthStakedResponse = await response.json() - const { - result: { rows = [] }, - } = json - // Today's value at start of array - const value = rows[0].cum_deposited_eth - - // current value (number, unformatted) - return { value, timestamp: Date.now() } -} diff --git a/src/lib/api/fetchTotalValueLocked.ts b/src/lib/api/fetchTotalValueLocked.ts deleted file mode 100644 index 86cb4b6fd4f..00000000000 --- a/src/lib/api/fetchTotalValueLocked.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { DefiLlamaTVLResponse, MetricReturnData } from "@/lib/types" - -export const fetchTotalValueLocked = async (): Promise => { - const response = await fetch(`https://api.llama.fi/charts/Ethereum`) - if (!response.ok) { - console.log(response.status, response.statusText) - throw new Error("Failed to fetch Defi Llama TVL data") - } - - const json: DefiLlamaTVLResponse = await response.json() - // Today's value at end of array - const value = json[json.length - 1].totalLiquidityUSD - - // current value (number, unformatted) - return { value, timestamp: Date.now() } -} diff --git a/src/lib/api/ghRepoData.ts b/src/lib/api/ghRepoData.ts deleted file mode 100644 index 614928a0ed4..00000000000 --- a/src/lib/api/ghRepoData.ts +++ /dev/null @@ -1,140 +0,0 @@ -import { Framework } from "@/lib/interfaces" - -import EthDiamondBlackImage from "@/public/images/assets/eth-diamond-black.png" -import FoundryImage from "@/public/images/dev-tools/foundry.png" -import HardhatImage from "@/public/images/dev-tools/hardhat.png" -import KurtosisImage from "@/public/images/dev-tools/kurtosis.png" -import ScaffoldEthImage from "@/public/images/dev-tools/scaffoldeth.png" - -export const frameworksList: Array = [ - { - id: "Kurtosis Ethereum Package", - url: "https://github.com/kurtosis-tech/ethereum-package", - githubUrl: "https://github.com/kurtosis-tech/ethereum-package", - background: "#000000", - name: "Kurtosis Ethereum Package", - description: - "page-developers-local-environment:page-local-environment-kurtosis-desc", - alt: "page-developers-local-environment:page-local-environment-kurtosis-logo-alt", - image: KurtosisImage, - }, - { - id: "hardhat", - url: "https://hardhat.org/", - githubUrl: "https://github.com/nomiclabs/hardhat", - background: "#faf8fb", - name: "Hardhat", - description: - "page-developers-local-environment:page-local-environment-hardhat-desc", - alt: "page-developers-local-environment:page-local-environment-hardhat-logo-alt", - image: HardhatImage, - }, - { - id: "brownie", - url: "https://github.com/eth-brownie/brownie", - githubUrl: "https://github.com/eth-brownie/brownie", - background: "#ffffff", - name: "Brownie", - description: - "page-developers-local-environment:page-local-environment-brownie-desc", - alt: "page-developers-local-environment:page-local-environment-brownie-logo-alt", - image: EthDiamondBlackImage, - }, - { - id: "createethapp", - url: "https://github.com/PaulRBerg/create-eth-app", - githubUrl: "https://github.com/PaulRBerg/create-eth-app", - background: "#ffffff", - name: "Create Eth App", - description: - "page-developers-local-environment:page-local-environment-eth-app-desc", - alt: "page-developers-local-environment:page-local-environment-eth-app-logo-alt", - image: EthDiamondBlackImage, - }, - { - id: "scaffoldeth", - url: "https://scaffoldeth.io/", - githubUrl: "https://github.com/scaffold-eth/scaffold-eth-2", - background: "#ffffff", - name: "Scaffold-ETH-2", - description: - "page-developers-local-environment:page-local-environment-scaffold-eth-desc", - alt: "page-local-environment-scaffold-eth-logo-alt", - image: ScaffoldEthImage, - }, - { - id: "soliditytemplate", - url: "https://github.com/paulrberg/solidity-template", - githubUrl: "https://github.com/paulrberg/solidity-template", - background: "#ffffff", - name: "Solidity template", - description: - "page-developers-local-environment:page-local-environment-solidity-template-desc", - alt: "page-developers-local-environment:page-local-environment-solidity-template-logo-alt", - image: EthDiamondBlackImage, - }, - { - id: "foundry", - url: "https://getfoundry.sh/", - githubUrl: "https://github.com/foundry-rs/foundry", - background: "#ffffff", - name: "Foundry", - description: - "page-developers-local-environment:page-local-environment-foundry-desc", - alt: "page-developers-local-environment:page-local-environment-foundry-logo-alt", - image: FoundryImage, - }, -] - -export const ghRepoData = async (githubUrl: string) => { - const split = githubUrl.split("/") - const repoOwner = split[split.length - 2] - const repoName = split[split.length - 1] - const repoReq = await fetch( - `https://api.github.com/repos/${repoOwner}/${repoName}`, - { - headers: { - Authorization: `Bearer ${process.env.GITHUB_TOKEN_READ_ONLY}`, - }, - } - ) - if (!repoReq.ok) { - console.log(repoReq.status, repoReq.statusText) - throw new Error("Failed to fetch Github repo data") - } - - const repoData = await repoReq.json() - - const languageReq = await fetch( - `https://api.github.com/repos/${repoOwner}/${repoName}/languages`, - { - headers: { - Authorization: `Bearer ${process.env.GITHUB_TOKEN_READ_ONLY}`, - }, - } - ) - if (!languageReq.ok) { - console.log(languageReq.status, languageReq.statusText) - throw new Error("Failed to fetch Github repo language data") - } - const languageData = await languageReq.json() - - return { - starCount: repoData.stargazers_count, - languages: Object.keys(languageData), - } -} - -export const getLocalEnvironmentFrameworkData = async () => { - const frameworksListData = await Promise.all( - frameworksList.map(async (framework) => { - const repoData = await ghRepoData(framework.githubUrl) - return { - ...framework, - starCount: repoData.starCount, - languages: repoData.languages.slice(0, 2), - } - }) - ) - return frameworksListData -} diff --git a/src/lib/api/stablecoinsData.ts b/src/lib/api/stablecoinsData.ts deleted file mode 100644 index a3c94d5634c..00000000000 --- a/src/lib/api/stablecoinsData.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { COINGECKO_API_BASE_URL, COINGECKO_API_URL_PARAMS } from "../constants" - -export async function fetchEthereumStablecoinsData() { - const url = `${COINGECKO_API_BASE_URL}stablecoins${COINGECKO_API_URL_PARAMS}` - - try { - const res = await fetch(url) - - if (!res.ok) { - console.log(res.status, res.statusText) - throw new Error("Failed to fetch Ethereum stablecoins data") - } - - return await res.json() - } catch (error) { - // In production mode, throw an error to stop the build in case this fetch fails - console.error(error) - throw new Error( - "Something went wrong with requesting the Ethereum stablecoins data." - ) - } -} diff --git a/src/lib/utils/data/cacheAsyncFn.ts b/src/lib/utils/data/cacheAsyncFn.ts deleted file mode 100644 index 1bd5d362d70..00000000000 --- a/src/lib/utils/data/cacheAsyncFn.ts +++ /dev/null @@ -1,54 +0,0 @@ -/** - * Caches the result of an asynchronous function in memory to avoid multiple calls. - * This helps prevent hitting external API rate limits by storing the result in memory. - * - * @param key A unique identifier for the cached function result - * @param fn The asynchronous function to be cached - * @param options Optional parameters to configure cache behavior - * @param options.cacheTimeout The duration in milliseconds for which the cache remains valid - * @returns A new function that returns the cached result or executes the original function if the cache is expired - * - * @example - * const cachedFetch = cacheAsyncFn('uniqueKey', fetchSomething, { cacheTimeout: 60000 }); - * - * await cachedFetch(); // Fetches and caches the data - * await cachedFetch(); // Returns the cached data - */ - -// In-memory cache object -const memoryCache: Record = {} - -export function cacheAsyncFn( - key: string, - fn: () => Promise, - options?: { cacheTimeout?: number } -) { - return async (): Promise => { - const now = Date.now() - const cachedItem = memoryCache[key] - - // Check if cache exists and is not expired - if (cachedItem) { - const cacheAge = now - cachedItem.timestamp - const isCacheExpired = - options?.cacheTimeout && cacheAge > options.cacheTimeout - - if (!isCacheExpired) { - const quietKeys: string[] = ["gfissues"] - !quietKeys.includes(key) && console.log("Cache hit", key) - return cachedItem.value as T - } - console.log("Cache expired", key) - } - - // Fetch fresh data - console.log("Running function", key) - const value = await fn() - - // Store in memory cache - memoryCache[key] = { value: value, timestamp: now } - console.log("Function result cached", key) - - return value as T - } -} diff --git a/src/lib/utils/data/dataLoader.ts b/src/lib/utils/data/dataLoader.ts deleted file mode 100644 index 10101394a58..00000000000 --- a/src/lib/utils/data/dataLoader.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { cacheAsyncFn } from "./cacheAsyncFn" -import { loadMockData } from "./loadMockData" - -const USE_MOCK_DATA = process.env.USE_MOCK_DATA === "true" -if (USE_MOCK_DATA) console.warn("Using mock data") - -type DataLoaderFunction = () => Promise - -/** - * Creates a function that loads data from multiple asynchronous functions and caches the results. - * - * @param loaders An array of tuples, each containing a unique identifier and the asynchronous function to be cached - * @param cacheTimeout Optional cache timeout in milliseconds - * @returns A function that, when called, executes the loaders and returns a promise with the results - * - * @example - * const loadData = dataLoader([ - * ['ethPrice', fetchEthPrice], - * ['totalEthStaked', fetchTotalEthStaked], - * ['totalValueLocked', fetchTotalValueLocked], - * ]); - * - * const [ethPrice, totalEthStaked, totalValueLocked] = await loadData(); - */ - -export function dataLoader( - loaders: { - [K in keyof T]: [string, DataLoaderFunction] - }, - cacheTimeout?: number -): () => Promise { - const cachedLoaders = loaders.map(([key, loader]) => { - const cachedLoader = cacheAsyncFn(key, loader, { - cacheTimeout, - }) - return async () => { - try { - if (USE_MOCK_DATA) return await loadMockData(key) - - return await cachedLoader() - } catch (error) { - console.error(`Error in dataLoader for key "${key}":`, error) - throw error - } - } - }) - - return async () => { - const results = await Promise.all(cachedLoaders.map((loader) => loader())) - return results as T - } -} diff --git a/src/lib/utils/data/loadMockData.ts b/src/lib/utils/data/loadMockData.ts deleted file mode 100644 index 0c1f29ef2e6..00000000000 --- a/src/lib/utils/data/loadMockData.ts +++ /dev/null @@ -1,15 +0,0 @@ -import fs from "fs/promises" -import path from "path" - -const MOCK_DATA_DIR = path.resolve("src/data/mocks") - -export async function loadMockData(key: string): Promise { - try { - const mockFilePath = path.join(MOCK_DATA_DIR, `${key}.json`) - const mockDataRaw = await fs.readFile(mockFilePath, "utf-8") - return JSON.parse(mockDataRaw) as T - } catch (error) { - console.error(`Error loading mock data for key "${key}":`, error) - throw error - } -} diff --git a/src/lib/utils/data/utils.ts b/src/lib/utils/data/utils.ts deleted file mode 100644 index cec5521bf69..00000000000 --- a/src/lib/utils/data/utils.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { - BASE_TIME_UNIT, - RETRY_DELAY_BASE_MS, - TIMEOUT_MS, -} from "@/lib/constants" - -/** - * Returns a delay time in milliseconds by adding a random jitter to the base delay. - * - * @param ms - The base delay in milliseconds. Defaults to `RETRY_DELAY_BASE_MS`. - * @param jitterMs - The maximum jitter in milliseconds to add to the base delay. Defaults to `RETRY_DELAY_BASE_MS`. - * @returns The total delay in milliseconds, including a random jitter. - */ -export const delayWithJitter = ( - ms: number = RETRY_DELAY_BASE_MS, - jitterMs: number = RETRY_DELAY_BASE_MS -) => ms + Math.floor(Math.random() * jitterMs) - -/** - * Delays execution for a specified number of milliseconds. - * - * @param ms - The number of milliseconds to sleep. - * @returns A promise that resolves after the specified delay. - */ -export const sleep = (ms: number) => new Promise((res) => setTimeout(res, ms)) - -/** - * Determines whether a request should be retried based on the HTTP status code. - * - * Retries are recommended for: - * - 429 (Too Many Requests) - * - 5xx server errors (status codes between 500 and 599, inclusive) - * - * @param status - The HTTP status code to evaluate. - * @returns `true` if the request should be retried, otherwise `false`. - */ -export const shouldStatusRetry = (status: number) => - status === 429 || (status >= 500 && status <= 599) - -/** - * Fetches a resource with a specified timeout and optional revalidation. - * - * Initiates a fetch request to the provided URL or Request object, aborting the request if it exceeds the given delay. - * Optionally sets the `next.revalidate` property for caching behavior. - * - * @param href - The resource to fetch. Can be a string URL, a URL object, or a Request object. - * @param delay - The timeout in milliseconds before aborting the request. Defaults to `TIMEOUT_MS`. - * @param revalidate - The revalidation time in seconds or `false` to disable revalidation. Defaults to `BASE_TIME_UNIT`. - * @returns A promise that resolves to the fetch response. - */ -export const fetchWithTimeoutAndRevalidation = async ( - href: string | URL | globalThis.Request, - delay: number = TIMEOUT_MS, - revalidate: number | false = BASE_TIME_UNIT -) => { - const controller = new AbortController() - const timeout = setTimeout(() => controller.abort(), delay) - try { - return await fetch(href, { - signal: controller.signal, - next: { revalidate }, - }) - } finally { - clearTimeout(timeout) - } -} From 3a1acfb8d1b5b7901830f94f1d98c08f0bf14fc0 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Tue, 9 Dec 2025 21:12:14 -0700 Subject: [PATCH 4/4] fix breaking build --- .../developers/local-environment/page.tsx | 2 +- app/[locale]/resources/utils.tsx | 21 +++- src/data-layer/api/fetchPosts.ts | 2 +- src/data-layer/api/fetchRSS.ts | 2 +- src/lib/data/frameworks.ts | 92 ++++++++++++++ src/lib/utils/contributors.ts | 3 +- src/lib/utils/gitContributors.ts | 114 ++++++++++++++++++ 7 files changed, 229 insertions(+), 7 deletions(-) create mode 100644 src/lib/data/frameworks.ts create mode 100644 src/lib/utils/gitContributors.ts diff --git a/app/[locale]/developers/local-environment/page.tsx b/app/[locale]/developers/local-environment/page.tsx index 433a24ee6e2..04f6cb7dd1f 100644 --- a/app/[locale]/developers/local-environment/page.tsx +++ b/app/[locale]/developers/local-environment/page.tsx @@ -22,7 +22,7 @@ import { BASE_TIME_UNIT } from "@/lib/constants" import LocalEnvironmentPage from "./_components/local-environment" import LocalEnvironmentJsonLD from "./page-jsonld" -import { frameworksList } from "@/lib/api/ghRepoData" +import { frameworksList } from "@/lib/data/frameworks" // In seconds - GitHub repo data doesn't change frequently, so use 24 hours const REVALIDATE_TIME = BASE_TIME_UNIT * 24 diff --git a/app/[locale]/resources/utils.tsx b/app/[locale]/resources/utils.tsx index 33236d7a471..0f8df663aaf 100644 --- a/app/[locale]/resources/utils.tsx +++ b/app/[locale]/resources/utils.tsx @@ -1,6 +1,7 @@ import dynamic from "next/dynamic" import { getLocale, getTranslations } from "next-intl/server" +import type { MetricReturnData } from "@/lib/types" import { Lang } from "@/lib/types" import BigNumber from "@/components/BigNumber" @@ -14,9 +15,15 @@ import { Spinner } from "@/components/ui/spinner" import { formatSmallUSD } from "@/lib/utils/numbers" import { getLocaleForNumberFormat } from "@/lib/utils/translations" +import { FETCH_ETH_PRICE_TASK_ID } from "@/data-layer/api/fetchEthPrice" +import { getCachedData } from "@/data-layer/storage/cachedGetter" + +import { BASE_TIME_UNIT } from "@/lib/constants" + import type { DashboardBox, DashboardSection } from "./types" -import { fetchEthPrice } from "@/lib/api/fetchEthPrice" +// In seconds - ETH price changes frequently, so use 1 hour +const REVALIDATE_TIME = BASE_TIME_UNIT * 1 import IconBeaconchain from "@/public/images/resources/beaconcha-in.png" import IconBlobsGuru from "@/public/images/resources/blobsguru.png" import IconBlocknative from "@/public/images/resources/blocknative.png" @@ -88,7 +95,17 @@ export const getResources = async ({ const t = await getTranslations({ locale, namespace: "page-resources" }) const localeForNumberFormat = getLocaleForNumberFormat(locale as Lang) - const ethPrice = await fetchEthPrice() + // Fetch ETH price from data layer with Next.js caching + const ethPriceResult = await getCachedData( + FETCH_ETH_PRICE_TASK_ID, + REVALIDATE_TIME + ) + + // Handle missing data gracefully + const ethPrice: MetricReturnData = ethPriceResult || { + value: 0, + timestamp: Date.now(), + } const avgBlobFeeUsd = "error" in ethPrice diff --git a/src/data-layer/api/fetchPosts.ts b/src/data-layer/api/fetchPosts.ts index 02eb8752a5c..f4e6fc137ed 100644 --- a/src/data-layer/api/fetchPosts.ts +++ b/src/data-layer/api/fetchPosts.ts @@ -1,6 +1,6 @@ import type { HTMLResult, RSSItem } from "@/lib/types" -import { fetchXml } from "@/lib/api/fetchRSS" +import { fetchXml } from "./fetchRSS" export const FETCH_POSTS_TASK_ID = "fetch-posts" diff --git a/src/data-layer/api/fetchRSS.ts b/src/data-layer/api/fetchRSS.ts index 7b9ca38a521..782d1d4760c 100644 --- a/src/data-layer/api/fetchRSS.ts +++ b/src/data-layer/api/fetchRSS.ts @@ -12,7 +12,7 @@ export const FETCH_RSS_TASK_ID = "fetch-rss" * Fetches XML data from the specified URL. * Parses XML to JSON with parseString (xml2js package) */ -async function fetchXml(url: string): Promise> { +export async function fetchXml(url: string): Promise> { const response = await fetch(url, { headers: { Cookie: "", DNT: "1" }, // Empty cookie header and do-not-track credentials: "omit", // Don't send or receive cookies diff --git a/src/lib/data/frameworks.ts b/src/lib/data/frameworks.ts new file mode 100644 index 00000000000..561d446d2ed --- /dev/null +++ b/src/lib/data/frameworks.ts @@ -0,0 +1,92 @@ +import type { Framework } from "@/lib/interfaces" + +import EthDiamondBlackImage from "@/public/images/assets/eth-diamond-black.png" +import FoundryImage from "@/public/images/dev-tools/foundry.png" +import HardhatImage from "@/public/images/dev-tools/hardhat.png" +import KurtosisImage from "@/public/images/dev-tools/kurtosis.png" +import ScaffoldEthImage from "@/public/images/dev-tools/scaffoldeth.png" + +/** + * Static list of local environment frameworks. + * This data is combined with dynamic GitHub repo data (starCount, languages) + * from the data layer to create the full framework information. + */ +export const frameworksList: Array = [ + { + id: "Kurtosis Ethereum Package", + url: "https://github.com/kurtosis-tech/ethereum-package", + githubUrl: "https://github.com/kurtosis-tech/ethereum-package", + background: "#000000", + name: "Kurtosis Ethereum Package", + description: + "page-developers-local-environment:page-local-environment-kurtosis-desc", + alt: "page-developers-local-environment:page-local-environment-kurtosis-logo-alt", + image: KurtosisImage, + }, + { + id: "hardhat", + url: "https://hardhat.org/", + githubUrl: "https://github.com/nomiclabs/hardhat", + background: "#faf8fb", + name: "Hardhat", + description: + "page-developers-local-environment:page-local-environment-hardhat-desc", + alt: "page-developers-local-environment:page-local-environment-hardhat-logo-alt", + image: HardhatImage, + }, + { + id: "brownie", + url: "https://github.com/eth-brownie/brownie", + githubUrl: "https://github.com/eth-brownie/brownie", + background: "#ffffff", + name: "Brownie", + description: + "page-developers-local-environment:page-local-environment-brownie-desc", + alt: "page-developers-local-environment:page-local-environment-brownie-logo-alt", + image: EthDiamondBlackImage, + }, + { + id: "createethapp", + url: "https://github.com/PaulRBerg/create-eth-app", + githubUrl: "https://github.com/PaulRBerg/create-eth-app", + background: "#ffffff", + name: "Create Eth App", + description: + "page-developers-local-environment:page-local-environment-eth-app-desc", + alt: "page-developers-local-environment:page-local-environment-eth-app-logo-alt", + image: EthDiamondBlackImage, + }, + { + id: "scaffoldeth", + url: "https://scaffoldeth.io/", + githubUrl: "https://github.com/scaffold-eth/scaffold-eth-2", + background: "#ffffff", + name: "Scaffold-ETH-2", + description: + "page-developers-local-environment:page-local-environment-scaffold-eth-desc", + alt: "page-local-environment-scaffold-eth-logo-alt", + image: ScaffoldEthImage, + }, + { + id: "soliditytemplate", + url: "https://github.com/paulrberg/solidity-template", + githubUrl: "https://github.com/paulrberg/solidity-template", + background: "#ffffff", + name: "Solidity template", + description: + "page-developers-local-environment:page-local-environment-solidity-template-desc", + alt: "page-developers-local-environment:page-local-environment-solidity-template-logo-alt", + image: EthDiamondBlackImage, + }, + { + id: "foundry", + url: "https://getfoundry.sh/", + githubUrl: "https://github.com/foundry-rs/foundry", + background: "#ffffff", + name: "Foundry", + description: + "page-developers-local-environment:page-local-environment-foundry-desc", + alt: "page-developers-local-environment:page-local-environment-foundry-logo-alt", + image: FoundryImage, + }, +] diff --git a/src/lib/utils/contributors.ts b/src/lib/utils/contributors.ts index ba2ddd66fe8..611544854a0 100644 --- a/src/lib/utils/contributors.ts +++ b/src/lib/utils/contributors.ts @@ -9,10 +9,9 @@ import { getCrowdinContributors, } from "./crowdin" import { getAppPageLastCommitDate, getMarkdownLastCommitDate } from "./gh" +import { fetchAndCacheGitHubContributors } from "./gitContributors" import { getLocaleTimestamp } from "./time" -import { fetchAndCacheGitHubContributors } from "@/lib/api/fetchGitHistory" - export const getMarkdownFileContributorInfo = async ( slug: string, locale: string, diff --git a/src/lib/utils/gitContributors.ts b/src/lib/utils/gitContributors.ts new file mode 100644 index 00000000000..898144714ae --- /dev/null +++ b/src/lib/utils/gitContributors.ts @@ -0,0 +1,114 @@ +import type { CommitHistory, FileContributor } from "@/lib/types" + +const owner = "ethereum" +const repo = "ethereum-org-website" + +/** + * Fetches GitHub contributors for a specific file path and caches the result. + * This is a utility function used by the contributors system to get file-specific + * contributor information from GitHub's API. + * + * @param filePath - The path to the file (e.g., "/content/developers/index.md") + * @param cache - A cache object to store results and avoid duplicate API calls + * @returns An array of FileContributor objects sorted by date (most recent first) + */ +export async function fetchAndCacheGitHubContributors( + filePath: string, + cache: CommitHistory +): Promise { + // Check cache first + if (cache[filePath]) { + return cache[filePath] + } + + const githubToken = process.env.GITHUB_TOKEN_READ_ONLY + + if (!githubToken) { + console.warn( + "GitHub token not set (GITHUB_TOKEN_READ_ONLY), skipping contributor fetch" + ) + return [] + } + + try { + // GitHub API endpoint for file commits + const url = new URL(`https://api.github.com/repos/${owner}/${repo}/commits`) + url.searchParams.set("path", filePath) + url.searchParams.set("per_page", "100") + + const response = await fetch(url.href, { + headers: { + Authorization: `token ${githubToken}`, + Accept: "application/vnd.github.v3+json", + }, + }) + + if ( + response.status === 403 && + response.headers.get("X-RateLimit-Remaining") === "0" + ) { + const resetTime = response.headers.get("X-RateLimit-Reset") + const waitTime = resetTime + ? +resetTime - Math.floor(Date.now() / 1000) + : 60 + console.warn( + `GitHub API rate limit exceeded for ${filePath}. Reset in ${waitTime} seconds.` + ) + return [] + } + + if (!response.ok) { + const status = response.status + console.warn(`GitHub API fetch failed for ${filePath}`, { + status, + url: url.toString(), + }) + return [] + } + + const commits = (await response.json()) as Array<{ + sha: string + commit: { + author: { date: string; name: string; email: string } + message: string + } + author: { + login: string + avatar_url: string + html_url: string + } | null + }> + + if (!Array.isArray(commits)) { + console.warn("Unexpected response from GitHub API", commits) + return [] + } + + // Transform commits to FileContributor format + const contributors: FileContributor[] = commits + .map((commit) => ({ + login: commit.author?.login || commit.commit.author.name || "unknown", + avatar_url: commit.author?.avatar_url || "", + html_url: + commit.author?.html_url || + `https://github.com/${commit.author?.login || commit.commit.author.name}`, + date: commit.commit.author.date, + })) + .filter((contributor) => contributor.login !== "unknown") + // Remove duplicates by login + .filter( + (contributor, index, self) => + index === self.findIndex((c) => c.login === contributor.login) + ) + // Sort by date (most recent first) + .sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()) + + // Cache the result + cache[filePath] = contributors + + return contributors + } catch (error) { + console.error(`Error fetching GitHub contributors for ${filePath}:`, error) + return [] + } +}