diff --git a/.claude/skills/data-layer/SKILL.md b/.claude/skills/data-layer/SKILL.md new file mode 100644 index 00000000000..5feb0bc4826 --- /dev/null +++ b/.claude/skills/data-layer/SKILL.md @@ -0,0 +1,80 @@ +--- +name: data-layer +description: This skill provides patterns for working with the data-layer module. Use when creating/editing files in src/data-layer/, src/lib/data/, or adding new data sources. +--- + +# Data Layer + +## Architecture + +``` +src/data-layer/ # Isolated, framework-agnostic module +├── api/ # Fetch functions (one per data source) +├── index.ts # Getter functions (pure passthrough) +└── registry.ts # Task registry (hourly/daily) + +src/lib/data/ # Next.js caching adapter +└── index.ts # Cached wrappers via createCachedGetter() +``` + +## Rules + +### 1. Getters must be pure passthrough + +In `src/data-layer/index.ts`, getter functions must only call `getData(TASK_ID)` with no transformations: + +```typescript +// Correct +export async function getEventsData(): Promise { + return getData(FETCH_EVENTS_TASK_ID) +} + +// Wrong - no transformations in getters +export async function getEventsData(): Promise { + const data = await getData(FETCH_EVENTS_TASK_ID) + return data?.map((e) => ({ ...e, computed: derive(e) })) ?? null +} +``` + +All transformations belong in the fetch task (`src/data-layer/api/`), not in the getter. + +### 2. Expose via lib/data for caching + +When a data function needs caching/revalidation, add a cached wrapper in `src/lib/data/index.ts`: + +```typescript +export const getEventsData = createCachedGetter( + dataLayer.getEventsData, + ["events-data"], + CACHE_REVALIDATE_DAY // or CACHE_REVALIDATE_HOUR +) +``` + +## Adding a New Data Source + +1. Create fetch function in `src/data-layer/api/fetchNewData.ts`: + ```typescript + export const FETCH_NEW_DATA_TASK_ID = "fetch-new-data" + + export async function fetchNewData(): Promise { + // Fetch and transform data here + } + ``` + +2. Add getter in `src/data-layer/index.ts`: + ```typescript + export async function getNewData(): Promise { + return getData(FETCH_NEW_DATA_TASK_ID) + } + ``` + +3. Register in `src/data-layer/registry.ts` (hourlyTasks or dailyTasks) + +4. Add cached wrapper in `src/lib/data/index.ts`: + ```typescript + export const getNewData = createCachedGetter( + dataLayer.getNewData, + ["new-data"], + CACHE_REVALIDATE_HOUR + ) + ``` diff --git a/app/[locale]/community/events/conferences/page.tsx b/app/[locale]/community/events/conferences/page.tsx index 89bbaaa28fd..87ac4b9da9f 100644 --- a/app/[locale]/community/events/conferences/page.tsx +++ b/app/[locale]/community/events/conferences/page.tsx @@ -16,12 +16,12 @@ import { getLocaleYear } from "@/lib/utils/date" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" -import { getEventsData } from "@/data-layer" - import ContinentTabs from "../_components/ContinentTabs" import EventCard from "../_components/EventCard" import OrganizerCTA from "../_components/OrganizerCTA" +import { getEventsData } from "@/lib/data" + const Page = async ({ params }: { params: PageParams }) => { const { locale } = params diff --git a/app/[locale]/community/events/meetups/page.tsx b/app/[locale]/community/events/meetups/page.tsx index 21bc81ef113..e59059ee918 100644 --- a/app/[locale]/community/events/meetups/page.tsx +++ b/app/[locale]/community/events/meetups/page.tsx @@ -12,13 +12,13 @@ import { getLocaleYear } from "@/lib/utils/date" import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" -import { getEventsData } from "@/data-layer" - import OrganizerCTA from "../_components/OrganizerCTA" import { getMeetupGroups } from "../utils" import FilterMeetups from "./_components/FilterMeetups" +import { getEventsData } from "@/lib/data" + const Page = async ({ params }: { params: PageParams }) => { const { locale } = params diff --git a/app/[locale]/community/events/page.tsx b/app/[locale]/community/events/page.tsx index bb59ab3b0c8..8941a4bd461 100644 --- a/app/[locale]/community/events/page.tsx +++ b/app/[locale]/community/events/page.tsx @@ -35,7 +35,6 @@ import { getMetadata } from "@/lib/utils/metadata" import { getRequiredNamespacesForPage } from "@/lib/utils/translations" import communityHubs from "@/data/community-hubs" -import { getEventsData } from "@/data-layer" import ContinentTabs from "./_components/ContinentTabs" import EventCard from "./_components/EventCard" @@ -44,6 +43,7 @@ import { SECTION_IDS } from "./constants" import EventsJsonLD from "./page-jsonld" import { getMeetupGroups, mapEventTranslations } from "./utils" +import { getEventsData } from "@/lib/data" import ethereumEverywhereLogo from "@/public/images/community/ethereum-everywhere-logo.png" import geodeLabsLogo from "@/public/images/community/geode-labs-logo.png" import heroImage from "@/public/images/enterprise-eth.png" diff --git a/app/[locale]/community/events/search/page.tsx b/app/[locale]/community/events/search/page.tsx index 1df56951bf4..02d703fd788 100644 --- a/app/[locale]/community/events/search/page.tsx +++ b/app/[locale]/community/events/search/page.tsx @@ -11,12 +11,12 @@ import { Section } from "@/components/ui/section" import { getMetadata } from "@/lib/utils/metadata" -import { getEventsData } from "@/data-layer" - import EventCard from "../_components/EventCard" import OrganizerCTA from "../_components/OrganizerCTA" import { mapEventTranslations, sanitize } from "../utils" +import { getEventsData } from "@/lib/data" + const Page = async ({ params, searchParams, diff --git a/app/[locale]/developers/utils.tsx b/app/[locale]/developers/utils.tsx index 93010b35845..5ee41075f58 100644 --- a/app/[locale]/developers/utils.tsx +++ b/app/[locale]/developers/utils.tsx @@ -2,10 +2,9 @@ import { getLocale, getTranslations } from "next-intl/server" import type { EventItem } from "@/lib/types" -import { getEventsData } from "@/data-layer" - import type { DevelopersPath, VideoCourse } from "./types" +import { getEventsData } from "@/lib/data" import cyfrinBasicBanner from "@/public/images/developers/cyfrin-basic-banner.webp" import cyfrinFoundryAdvancedBanner from "@/public/images/developers/cyfrin-foundry-advanced-banner.webp" import cyfrinFoundryFundamentalsBanner from "@/public/images/developers/cyfrin-foundry-fundamentals-banner.webp" diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 992ffe7e2ae..6f09b998d8e 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -67,17 +67,6 @@ import { getMetadata } from "@/lib/utils/metadata" import { formatPriceUSD } from "@/lib/utils/numbers" import { polishRSSList } from "@/lib/utils/rss" -import { - getAppsData, - getAttestantPosts, - getBeaconchainEpochData, - getEthPrice, - getEventsData, - getGrowThePieData, - getRSSData, - getTotalValueLockedData, -} from "@/data-layer" - import { BLOGS_WITHOUT_FEED, DEFAULT_LOCALE, @@ -91,6 +80,16 @@ import IndexPageJsonLD from "./page-jsonld" import { getActivity } from "./utils" import { routing } from "@/i18n/routing" +import { + getAppsData, + getAttestantPosts, + getBeaconchainEpochData, + getEthPrice, + getEventsData, + getGrowThePieData, + getRSSData, + getTotalValueLockedData, +} from "@/lib/data" import EventFallback from "@/public/images/events/event-placeholder.png" const BentoCardSwiper = dynamic( diff --git a/src/data-layer/docs.md b/src/data-layer/docs.md index 66334f35322..fa04f063f3b 100644 --- a/src/data-layer/docs.md +++ b/src/data-layer/docs.md @@ -27,6 +27,40 @@ src/lib/data/ └── index.ts # Next.js adapter - adds caching layer ``` +## Key Rules + +### 1. Data-layer getters must be pure passthrough + +```typescript +// ✅ Correct +export async function getEventsData(): Promise { + return getData(FETCH_EVENTS_TASK_ID) +} + +// ❌ Wrong - no transformations in getters +export async function getEventsData(): Promise { + const data = await getData(FETCH_EVENTS_TASK_ID) + return data?.map((e) => ({ ...e, computed: derive(e) })) ?? null +} +``` + +Put all transformations in the fetch task (`/api`), not in the getter. + +### 2. Expose via `@/lib/data` for caching + +If a data function needs caching/revalidation, expose it through `@/lib/data`: + +```typescript +// src/lib/data/index.ts +export const getEventsData = createCachedGetter( + dataLayer.getEventsData, + ["events-data"], + CACHE_REVALIDATE_DAY +) +``` + +Direct `@/data-layer` imports work but have no caching. + ## Components ### 1. Public API (`src/data-layer/index.ts`) diff --git a/src/data-layer/index.ts b/src/data-layer/index.ts index f629858bcff..f8a1efb3445 100644 --- a/src/data-layer/index.ts +++ b/src/data-layer/index.ts @@ -25,7 +25,6 @@ import { FETCH_COMMUNITY_PICKS_TASK_ID } from "./api/fetchCommunityPicks" import { FETCH_ETHEREUM_MARKETCAP_TASK_ID } from "./api/fetchEthereumMarketcap" import { FETCH_ETHEREUM_STABLECOINS_MCAP_TASK_ID } from "./api/fetchEthereumStablecoinsMcap" import { FETCH_ETH_PRICE_TASK_ID } from "./api/fetchEthPrice" -import { getEventTypes } from "./api/fetchEvents" import { FETCH_EVENTS_TASK_ID } from "./api/fetchEvents" import { FETCH_GFIS_TASK_ID } from "./api/fetchGFIs" import { FETCH_GIT_HISTORY_TASK_ID } from "./api/fetchGitHistory" @@ -225,12 +224,5 @@ export async function getTotalValueLockedData(): Promise { - const data = await getData(FETCH_EVENTS_TASK_ID) - if (!data) return null - - // Ensure eventTypes is present (backward compatibility with cached data) - return data.map((event) => ({ - ...event, - eventTypes: event.eventTypes ?? getEventTypes(event.tags), - })) + return getData(FETCH_EVENTS_TASK_ID) } diff --git a/src/data-layer/mocks/fetch-events.json b/src/data-layer/mocks/fetch-events.json index 6b6d69c39f4..1a6dec66a1a 100644 --- a/src/data-layer/mocks/fetch-events.json +++ b/src/data-layer/mocks/fetch-events.json @@ -112,708 +112,5 @@ "isOnline": false, "continent": "south-america", "eventTypes": ["popup", "regional"] - }, - { - "title": "ETHMumbai", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHMumbai.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHMumbai.png", - "startTime": "2026-03-12T00:00:00+00:00", - "endTime": "2026-03-15T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://www.ethmumbai.in", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/ethmumbai", - "twitter": "https://x.com/ethmumbai", - "farcaster": null, - "id": "ethmumbai", - "isOnline": false, - "continent": "asia", - "eventTypes": ["conference", "hackathon", "regional"] - }, - { - "title": "ETHCC", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHCC.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHCC.png", - "startTime": "2026-03-30T00:00:00+00:00", - "endTime": "2026-04-02T00:00:00+00:00", - "location": "Cannes, France", - "link": "https://ethcc.io", - "tags": ["Conference", "Regional Grassroots"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/ethccweek", - "twitter": "http://x.com/EthCC", - "farcaster": null, - "id": "ethcc", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "regional"] - }, - { - "title": "ETH Seoul", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETH%20Seoul.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETH%20Seoul.png", - "startTime": "2026-04-01T00:00:00+00:00", - "endTime": null, - "location": "Seoul, Korea", - "link": "https://www.ethseoul.org/", - "tags": ["Conference", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/eth_seoul_", - "farcaster": null, - "id": "eth-seoul", - "isOnline": false, - "continent": "asia", - "eventTypes": ["conference", "regional"] - }, - { - "title": "Pragma Cannes", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Pragma%20Cannes.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Pragma%20Cannes.png", - "startTime": "2026-04-02T00:00:00+00:00", - "endTime": "2026-04-02T00:00:00+00:00", - "location": "Cannes, France", - "link": "https://ethglobal.com/events/pragma-cannes2026", - "tags": ["Conference", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "pragma-cannes", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference"] - }, - { - "title": "ETHGlobal Cannes", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Cannes.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Cannes.png", - "startTime": "2026-04-03T00:00:00+00:00", - "endTime": "2026-04-05T00:00:00+00:00", - "location": "Cannes, France", - "link": "https://ethglobal.com/events/cannes2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": true, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-cannes", - "isOnline": false, - "continent": "europe", - "eventTypes": ["hackathon"] - }, - { - "title": "ZuKas", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ZuKas.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ZuKas.png", - "startTime": "2026-04-10T00:00:00+00:00", - "endTime": "2026-05-10T00:00:00+00:00", - "location": "Kaş, Turkey", - "link": "https://www.zukas.city/", - "tags": ["Popup Village/City", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/zuzalukas", - "twitter": "https://x.com/zuzalukas", - "farcaster": null, - "id": "zukas", - "isOnline": false, - "continent": "europe", - "eventTypes": ["popup", "regional"] - }, - { - "title": "Ethereum Zurich", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Ethereum%20Zurich.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Ethereum%20Zurich.png", - "startTime": "2026-04-10T00:00:00+00:00", - "endTime": "2026-04-12T00:00:00+00:00", - "location": "Zürich, Switzerland", - "link": "https://ethereumzuri.ch/", - "tags": ["Conference", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/ethereumzurich", - "twitter": "https://x.com/EthereumZurich", - "farcaster": null, - "id": "ethereum-zurich", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "regional"] - }, - { - "title": "ZuAfrique", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ZuAfrique.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ZuAfrique.png", - "startTime": "2026-04-12T00:00:00+00:00", - "endTime": "2026-05-03T00:00:00+00:00", - "location": "Kilifi, Kenya", - "link": "https://zuafrique.com/", - "tags": ["Popup Village/City", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/zuafrique", - "farcaster": null, - "id": "zuafrique", - "isOnline": false, - "continent": "africa", - "eventTypes": ["popup", "regional"] - }, - { - "title": "Paris Blockchain Week", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Paris%20Blockchain%20Week.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Paris%20Blockchain%20Week.png", - "startTime": "2026-04-15T00:00:00+00:00", - "endTime": "2026-04-16T00:00:00+00:00", - "location": "Paris, France", - "link": "https://www.parisblockchainweek.com/", - "tags": ["Conference", "General Blockchain Week"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/pbwsummit", - "twitter": "https://x.com/ParisBlockWeek", - "farcaster": null, - "id": "paris-blockchain-week", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference"] - }, - { - "title": "muHangZhou", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/muHangZhou.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/muHangZhou.png", - "startTime": "2026-04-26T00:00:00+00:00", - "endTime": "2026-05-23T00:00:00+00:00", - "location": "Hangzhou, China", - "link": "https://the-mu.xyz/", - "tags": ["Popup Village/City", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/themu_xyz", - "farcaster": null, - "id": "muhangzhou", - "isOnline": false, - "continent": "asia", - "eventTypes": ["popup", "regional"] - }, - { - "title": "Token 2049 Dubai", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Token%202049%20Dubai.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Token%202049%20Dubai.png", - "startTime": "2026-04-29T00:00:00+00:00", - "endTime": "2026-04-30T00:00:00+00:00", - "location": "Dubai, UAE", - "link": "https://www.token2049.com/dubai", - "tags": ["Conference", "Institutional"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/token2049official", - "twitter": "https://x.com/token2049", - "farcaster": null, - "id": "token-2049-dubai", - "isOnline": false, - "continent": "middle-east", - "eventTypes": ["conference"] - }, - { - "title": "Farcon Rome", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Farcon%20Rome.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Farcon%20Rome.png", - "startTime": "2026-05-04T00:00:00+00:00", - "endTime": "2026-05-05T00:00:00+00:00", - "location": "Rome, Italy", - "link": "https://www.farcon.eu/", - "tags": ["Conference", "Regional Grassroots", "Open Source"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/+_1nMdtdgomxkMGM9", - "twitter": "https://x.com/farcaster_xyz", - "farcaster": "https://farcaster.xyz/~/channel/farcon-rome", - "id": "farcon-rome", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "regional"] - }, - { - "title": "Consensus Miami", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Consensus%20Miami.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Consensus%20Miami.png", - "startTime": "2026-05-05T00:00:00+00:00", - "endTime": "2026-05-07T00:00:00+00:00", - "location": "Miami, USA", - "link": "https://consensus.coindesk.com/", - "tags": ["Conference", "Institutional"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/consensus2026", - "farcaster": null, - "id": "consensus-miami", - "isOnline": false, - "continent": "north-america", - "eventTypes": ["conference"] - }, - { - "title": "ETHPrague", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHPrague.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHPrague.png", - "startTime": "2026-05-08T00:00:00+00:00", - "endTime": "2026-05-10T00:00:00+00:00", - "location": "Prague, Czechia", - "link": "https://ethprague.com", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/ethprague", - "twitter": "https://x.com/EthPrague", - "farcaster": "https://farcaster.xyz/ethprague", - "id": "ethprague", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "hackathon", "regional"] - }, - { - "title": "ETHCluj", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHCluj.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHCluj.png", - "startTime": "2026-05-13T00:00:00+00:00", - "endTime": "2026-05-14T00:00:00+00:00", - "location": "Cluj-Napoca, Romania", - "link": "https://www.ethcluj.org/", - "tags": ["Conference", "Regional Grassroots"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/ethcluj", - "twitter": "https://x.com/ETHCluj", - "farcaster": null, - "id": "ethcluj", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "regional"] - }, - { - "title": "ETHMilan", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHMilan.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHMilan.png", - "startTime": "2026-05-21T00:00:00+00:00", - "endTime": "2026-05-22T00:00:00+00:00", - "location": "Milan, Italy", - "link": "https://www.ethmilan.xyz", - "tags": ["Conference", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/ethmilan", - "twitter": "https://x.com/eth_milano", - "farcaster": null, - "id": "ethmilan", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "regional"] - }, - { - "title": "Edge Esmeralda", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Edge%20Esmeralda.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Edge%20Esmeralda.png", - "startTime": "2026-05-30T00:00:00+00:00", - "endTime": "2026-06-27T00:00:00+00:00", - "location": "Healdsburg, USA", - "link": "https://www.edgeesmeralda.com/", - "tags": ["Popup Village/City", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/+nu0R4MFH6cY3YTM5", - "twitter": "https://x.com/JoinEdgeCity", - "farcaster": "https://farcaster.xyz/edgecity", - "id": "edge-esmeralda", - "isOnline": false, - "continent": "north-america", - "eventTypes": ["popup", "regional"] - }, - { - "title": "ETHKyiv", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHKyiv.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHKyiv.png", - "startTime": "2026-06-01T00:00:00+00:00", - "endTime": null, - "location": "Kyiv, Ukraine", - "link": "https://ethkyiv.com/", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": "https://discord.com/invite/76nzhMdBVt", - "telegram": "https://t.me/ethkyiv_ua", - "twitter": "https://x.com/ethkyiv_ua", - "farcaster": null, - "id": "ethkyiv", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "hackathon", "regional"] - }, - { - "title": "ETHConf", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHConf.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHConf.png", - "startTime": "2026-06-08T00:00:00+00:00", - "endTime": "2026-06-10T00:00:00+00:00", - "location": "New York City, USA", - "link": "https://ethconf.com", - "tags": ["Conference", "ETHGlobal"], - "highlight": true, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethereumconf", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethconf", - "isOnline": false, - "continent": "north-america", - "eventTypes": ["conference"] - }, - { - "title": "ctrl/shift 2026", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ctrl%20shift%202026.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ctrl%20shift%202026.png", - "startTime": "2026-06-08T00:00:00+00:00", - "endTime": "2026-06-14T00:00:00+00:00", - "location": "Naples, Italy", - "link": "https://www.ctrlshift.events/", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/napuleth", - "twitter": "https://x.com/NapulETH", - "farcaster": null, - "id": "ctrl-shift-2026", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "hackathon", "regional"] - }, - { - "title": "ETHGlobal New York", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20New%20York.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20New%20York.png", - "startTime": "2026-06-12T00:00:00+00:00", - "endTime": "2026-06-14T00:00:00+00:00", - "location": "New York City, USA", - "link": "https://ethglobal.com/events/newyork2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-new-york", - "isOnline": false, - "continent": "north-america", - "eventTypes": ["hackathon"] - }, - { - "title": "Common S3nse", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Common%20S3nse.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Common%20S3nse.png", - "startTime": "2026-06-12T00:00:00+00:00", - "endTime": "2026-06-13T00:00:00+00:00", - "location": "Amsterdam, The Netherlands", - "link": "https://commons3nse.cryptocanal.org/", - "tags": ["Conference", "Hackathon", "Privacy and Cryptography"], - "highlight": false, - "discord": "https://discord.com/invite/XJVjpCqQBz", - "telegram": "https://t.me/CryptoCanalCommunity", - "twitter": "https://x.com/CryptoCanal ", - "farcaster": null, - "id": "common-s3nse", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "hackathon"] - }, - { - "title": "DappCon Berlin", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/DappCon.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/DappCon.png", - "startTime": "2026-06-16T00:00:00+00:00", - "endTime": "2026-06-17T00:00:00+00:00", - "location": "Berlin, Germany", - "link": "https://dappcon.io", - "tags": ["Conference", "dApp"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/+ZYUWnz0kxWo4NTMy", - "twitter": "https://x.com/dappconberlin", - "farcaster": "https://farcaster.xyz/~/channel/dappconberlin", - "id": "dappcon-berlin", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference"] - }, - { - "title": "Pragma Lisbon", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Pragma%20Lisbon.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Pragma%20Lisbon.png", - "startTime": "2026-07-23T00:00:00+00:00", - "endTime": "2026-07-23T00:00:00+00:00", - "location": "Lisbon, Portugal", - "link": "https://ethglobal.com/events/pragma-lisbon2026", - "tags": ["Conference", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "pragma-lisbon", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference"] - }, - { - "title": "ETHGlobal Lisbon", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Lisbon.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Lisbon.png", - "startTime": "2026-07-24T00:00:00+00:00", - "endTime": "2026-07-26T00:00:00+00:00", - "location": "Lisbon, Portugal", - "link": "https://ethglobal.com/events/lisbon2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-lisbon", - "isOnline": false, - "continent": "europe", - "eventTypes": ["hackathon"] - }, - { - "title": "The Science of Blockchain Conference", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/The%20Science%20of%20Blockchain%20Conference.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/The%20Science%20of%20Blockchain%20Conference.png", - "startTime": "2026-07-27T00:00:00+00:00", - "endTime": "2026-07-29T00:00:00+00:00", - "location": "Stanford, USA", - "link": "https://www.sbc-conference.com/2026/", - "tags": ["Conference", "Academia"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": null, - "farcaster": null, - "id": "the-science-of-blockchain-conference", - "isOnline": false, - "continent": "north-america", - "eventTypes": ["conference"] - }, - { - "title": "Web3Lagos Conference", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Web3Lagos%20Conference.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Web3Lagos%20Conference.png", - "startTime": "2026-08-27T00:00:00+00:00", - "endTime": "2026-08-29T00:00:00+00:00", - "location": "Lagos, Nigeria", - "link": "https://event.web3bridge.com/", - "tags": ["Hackathon", "Conference", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/Web3LagosCon", - "farcaster": null, - "id": "web3lagos-conference", - "isOnline": false, - "continent": "africa", - "eventTypes": ["conference", "hackathon", "regional"] - }, - { - "title": "ETHSafari", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHSafari.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHSafari.png", - "startTime": "2026-09-01T00:00:00+00:00", - "endTime": "2026-09-06T00:00:00+00:00", - "location": "Kenya", - "link": "https://ethsafari.xyz/", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": "https://discord.com/invite/CkMF5Ff83f", - "telegram": "https://t.me/ethsafari", - "twitter": "https://x.com/ETHSafari", - "farcaster": null, - "id": "ethsafari", - "isOnline": false, - "continent": "africa", - "eventTypes": ["conference", "hackathon", "regional"] - }, - { - "title": "ETHBratislava", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHBratislava.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHBratislava.png", - "startTime": "2026-09-11T00:00:00+00:00", - "endTime": null, - "location": "Bratislava, Slovakia", - "link": "http://www.ethbratislava.com/", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": "https://www.instagram.com/ethbratislava", - "telegram": "https://t.me/ETHBratislava", - "twitter": "https://x.com/eth_bratislava", - "farcaster": "https://www.linkedin.com/company/ethba/", - "id": "ethbratislava", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference", "hackathon", "regional"] - }, - { - "title": "European Blockchain Convention", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/European%20Blockchain%20Convention.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/European%20Blockchain%20Convention.png", - "startTime": "2026-09-16T00:00:00+00:00", - "endTime": "2026-09-17T00:00:00+00:00", - "location": "Barcelona, Spain", - "link": "https://eblockchainconvention.com/european-blockchain-convention-12/", - "tags": ["Conference", "Institutional"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/EuropeanBlockchainConvention/1", - "twitter": "https://x.com/EBlockchainCon", - "farcaster": null, - "id": "european-blockchain-convention", - "isOnline": false, - "continent": "europe", - "eventTypes": ["conference"] - }, - { - "title": "Pragma Tokyo", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Pragma%20Tokyo.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Pragma%20Tokyo.png", - "startTime": "2026-09-24T00:00:00+00:00", - "endTime": "2026-09-24T00:00:00+00:00", - "location": "Tokyo, Japan", - "link": "https://ethglobal.com/events/pragma-tokyo2026", - "tags": ["Conference", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "pragma-tokyo", - "isOnline": false, - "continent": "asia", - "eventTypes": ["conference"] - }, - { - "title": "ETHGlobal Tokyo", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Tokyo.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Tokyo.png", - "startTime": "2026-09-25T00:00:00+00:00", - "endTime": "2026-09-27T00:00:00+00:00", - "location": "Tokyo, Japan", - "link": "https://ethglobal.com/events/tokyo2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-tokyo", - "isOnline": false, - "continent": "asia", - "eventTypes": ["hackathon"] - }, - { - "title": "ETH Brasil", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Ethereum%20Brasil.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Ethereum%20Brasil.png", - "startTime": "2026-10-28T00:00:00+00:00", - "endTime": "2026-10-29T00:00:00+00:00", - "location": "São Paulo, Brazil", - "link": "https://linktr.ee/ethereum.br", - "tags": ["Conference", "Regional Grassroots"], - "highlight": false, - "discord": "https://discord.com/invite/zb3FpTEH9p", - "telegram": "https://t.me/Ethereum_Brasil", - "twitter": "https://x.com/ethereum_brasil", - "farcaster": null, - "id": "eth-brasil", - "isOnline": false, - "continent": "south-america", - "eventTypes": ["conference", "regional"] - }, - { - "title": "Ethereum Cypherpunk Congress #3", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Ethereum%20Cypherpunk%20Congress%203.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Ethereum%20Cypherpunk%20Congress%203.png", - "startTime": "2026-11-02T00:00:00+00:00", - "endTime": "2026-11-02T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://luma.com/spsnos9t?lm_api_id=evt-yG8wi8Jjw5ec6de&lm_medium=blast&lm_source=event", - "tags": ["Conference", "Privacy and Cryptography"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/web3privacy", - "farcaster": null, - "id": "ethereum-cypherpunk-congress-3", - "isOnline": false, - "continent": "asia", - "eventTypes": ["conference"] - }, - { - "title": "Devcon India", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Devcon%20India.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Devcon%20India.png", - "startTime": "2026-11-03T00:00:00+00:00", - "endTime": "2026-11-06T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://devcon.org/en/", - "tags": ["Conference", "Hackathon", "General Blockchain Week"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/+p4p9VHCChsNjNjhh", - "twitter": "https://x.com/EFDevcon", - "farcaster": null, - "id": "devcon-india", - "isOnline": false, - "continent": "asia", - "eventTypes": ["conference", "hackathon"] - }, - { - "title": "Pragma Mumbai", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Pragma%20Mumbai.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Pragma%20Mumbai.png", - "startTime": "2026-11-05T00:00:00+00:00", - "endTime": "2026-11-05T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://ethglobal.com/events/pragma-mumbai", - "tags": ["Conference", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "pragma-mumbai", - "isOnline": false, - "continent": "asia", - "eventTypes": ["conference"] - }, - { - "title": "ETHGlobal Mumbai", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Mumbai.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Mumbai.png", - "startTime": "2026-11-06T00:00:00+00:00", - "endTime": "2026-11-08T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://ethglobal.com/events/mumbai", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": true, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-mumbai", - "isOnline": false, - "continent": "asia", - "eventTypes": ["hackathon"] } ] diff --git a/src/data/mocks/events.json b/src/data/mocks/events.json deleted file mode 100644 index 3d2a9fdb7ea..00000000000 --- a/src/data/mocks/events.json +++ /dev/null @@ -1,819 +0,0 @@ -[ - { - "title": "HackMoney 2026", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/HackMoney%202026.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/HackMoney%202026.png", - "startTime": "2026-01-30T00:00:00+00:00", - "endTime": "2026-02-11T00:00:00+00:00", - "location": "Online", - "link": "https://ethglobal.com/events/hackmoney2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "hackmoney-2026", - "eventType": "hackathon", - "isOnline": true, - "continent": null - }, - { - "title": "ETHChiangmai Future Summit 2026", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHChiangmai%20Future%20Summit%202026.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHChiangmai%20Future%20Summit%202026.png", - "startTime": "2026-02-03T00:00:00+00:00", - "endTime": "2026-02-03T00:00:00+00:00", - "location": "Chiang Mai, Thailand", - "link": "https://luma.com/udsshvgj", - "tags": ["Conference", "Privacy and Cryptography"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/ETHChiangmai", - "twitter": "https://x.com/ethchiangmai", - "farcaster": null, - "id": "ethchiangmai-future-summit-2026", - "eventType": "conference", - "isOnline": false, - "continent": "asia" - }, - { - "title": "Consensus Hong Kong", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Consensus%20Hong%20Kong.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Consensus%20Hong%20Kong.png", - "startTime": "2026-02-10T00:00:00+00:00", - "endTime": "2026-02-12T00:00:00+00:00", - "location": "Hong Kong SAR", - "link": "https://consensus-hongkong.coindesk.com/", - "tags": ["Conference", "Institutional"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/consensusbycoindesk", - "twitter": "https://x.com/consensus_hk", - "farcaster": null, - "id": "consensus-hong-kong", - "eventType": "conference", - "isOnline": false, - "continent": "asia" - }, - { - "title": "ETHDenver", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHDenver.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHDenver.png", - "startTime": "2026-02-17T00:00:00+00:00", - "endTime": "2026-02-21T00:00:00+00:00", - "location": "Denver, USA", - "link": "https://ethdenver.com", - "tags": ["Conference", "Regional Grassroots"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/Ethdenver", - "twitter": "https://x.com/ethereumdenver", - "farcaster": null, - "id": "ethdenver", - "eventType": "conference", - "isOnline": false, - "continent": "north-america" - }, - { - "title": "ETHGlobal Happy Hour Denver", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Happy%20Hour%20Denver.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Happy%20Hour%20Denver.png", - "startTime": "2026-02-19T00:00:00+00:00", - "endTime": "2026-02-19T00:00:00+00:00", - "location": "Denver, USA", - "link": "https://luma.com/ethglobal-happy-hour-denver-2026", - "tags": ["Meetup", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-happy-hour-denver", - "eventType": "meetup", - "isOnline": false, - "continent": "north-america" - }, - { - "title": "Aleph March '26", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Aleph%20March%20'26.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Aleph%20March%20'26.png", - "startTime": "2026-03-09T00:00:00+00:00", - "endTime": "2026-03-27T00:00:00+00:00", - "location": "Buenos Aires, Argentina", - "link": "https://aleph.crecimiento.build", - "tags": ["Popup Village/City", "Regional Grassroots", "AI"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/+sXWv0kpT7qo4ZTdk", - "twitter": "https://x.com/crecimientoar", - "farcaster": null, - "id": "aleph-march-26", - "eventType": "conference", - "isOnline": false, - "continent": "south-america" - }, - { - "title": "ETHMumbai", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHMumbai.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHMumbai.png", - "startTime": "2026-03-12T00:00:00+00:00", - "endTime": "2026-03-15T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://www.ethmumbai.in", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/ethmumbai", - "twitter": "https://x.com/ethmumbai", - "farcaster": null, - "id": "ethmumbai", - "eventType": "hackathon", - "isOnline": false, - "continent": "asia" - }, - { - "title": "ETHCC", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHCC.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHCC.png", - "startTime": "2026-03-30T00:00:00+00:00", - "endTime": "2026-04-02T00:00:00+00:00", - "location": "Cannes, France", - "link": "https://ethcc.io", - "tags": ["Conference", "Regional Grassroots"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/ethccweek", - "twitter": "http://x.com/EthCC", - "farcaster": null, - "id": "ethcc", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ETH Seoul", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETH%20Seoul.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETH%20Seoul.png", - "startTime": "2026-04-01T00:00:00+00:00", - "endTime": null, - "location": "Seoul, Korea", - "link": "https://www.ethseoul.org/", - "tags": ["Conference", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/eth_seoul_", - "farcaster": null, - "id": "eth-seoul", - "eventType": "conference", - "isOnline": false, - "continent": "asia" - }, - { - "title": "Pragma Cannes", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Pragma%20Cannes.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Pragma%20Cannes.png", - "startTime": "2026-04-02T00:00:00+00:00", - "endTime": "2026-04-02T00:00:00+00:00", - "location": "Cannes, France", - "link": "https://ethglobal.com/events/pragma-cannes2026", - "tags": ["Conference", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "pragma-cannes", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ETHGlobal Cannes", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Cannes.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Cannes.png", - "startTime": "2026-04-03T00:00:00+00:00", - "endTime": "2026-04-05T00:00:00+00:00", - "location": "Cannes, France", - "link": "https://ethglobal.com/events/cannes2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": true, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-cannes", - "eventType": "hackathon", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ZuKas", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ZuKas.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ZuKas.png", - "startTime": "2026-04-10T00:00:00+00:00", - "endTime": "2026-05-10T00:00:00+00:00", - "location": "Kaş, Turkey", - "link": "https://www.zukas.city/", - "tags": ["Popup Village/City", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/zuzalukas", - "twitter": "https://x.com/zuzalukas", - "farcaster": null, - "id": "zukas", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "Ethereum Zurich", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Ethereum%20Zurich.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Ethereum%20Zurich.png", - "startTime": "2026-04-10T00:00:00+00:00", - "endTime": "2026-04-12T00:00:00+00:00", - "location": "Zürich, Switzerland", - "link": "https://ethereumzuri.ch/", - "tags": ["Conference", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/ethereumzurich", - "twitter": "https://x.com/EthereumZurich", - "farcaster": null, - "id": "ethereum-zurich", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ZuAfrique", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ZuAfrique.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ZuAfrique.png", - "startTime": "2026-04-12T00:00:00+00:00", - "endTime": "2026-05-03T00:00:00+00:00", - "location": "Kilifi, Kenya", - "link": "https://zuafrique.com/", - "tags": ["Popup Village/City", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/zuafrique", - "farcaster": null, - "id": "zuafrique", - "eventType": "conference", - "isOnline": false, - "continent": "africa" - }, - { - "title": "Paris Blockchain Week", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Paris%20Blockchain%20Week.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Paris%20Blockchain%20Week.png", - "startTime": "2026-04-15T00:00:00+00:00", - "endTime": "2026-04-16T00:00:00+00:00", - "location": "Paris, France", - "link": "https://www.parisblockchainweek.com/", - "tags": ["Conference", "General Blockchain Week"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/pbwsummit", - "twitter": "https://x.com/ParisBlockWeek", - "farcaster": null, - "id": "paris-blockchain-week", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "muHangZhou", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/muHangZhou.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/muHangZhou.png", - "startTime": "2026-04-26T00:00:00+00:00", - "endTime": "2026-05-23T00:00:00+00:00", - "location": "Hangzhou, China", - "link": "https://the-mu.xyz/", - "tags": ["Popup Village/City", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/themu_xyz", - "farcaster": null, - "id": "muhangzhou", - "eventType": "conference", - "isOnline": false, - "continent": "asia" - }, - { - "title": "Token 2049 Dubai", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Token%202049%20Dubai.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Token%202049%20Dubai.png", - "startTime": "2026-04-29T00:00:00+00:00", - "endTime": "2026-04-30T00:00:00+00:00", - "location": "Dubai, UAE", - "link": "https://www.token2049.com/dubai", - "tags": ["Conference", "Institutional"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/token2049official", - "twitter": "https://x.com/token2049", - "farcaster": null, - "id": "token-2049-dubai", - "eventType": "conference", - "isOnline": false, - "continent": "middle-east" - }, - { - "title": "Farcon Rome", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Farcon%20Rome.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Farcon%20Rome.png", - "startTime": "2026-05-04T00:00:00+00:00", - "endTime": "2026-05-05T00:00:00+00:00", - "location": "Rome, Italy", - "link": "https://www.farcon.eu/", - "tags": ["Conference", "Regional Grassroots", "Open Source"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/+_1nMdtdgomxkMGM9", - "twitter": "https://x.com/farcaster_xyz", - "farcaster": "https://farcaster.xyz/~/channel/farcon-rome", - "id": "farcon-rome", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "Consensus Miami", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Consensus%20Miami.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Consensus%20Miami.png", - "startTime": "2026-05-05T00:00:00+00:00", - "endTime": "2026-05-07T00:00:00+00:00", - "location": "Miami, USA", - "link": "https://consensus.coindesk.com/", - "tags": ["Conference", "Institutional"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/consensus2026", - "farcaster": null, - "id": "consensus-miami", - "eventType": "conference", - "isOnline": false, - "continent": "north-america" - }, - { - "title": "ETHPrague", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHPrague.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHPrague.png", - "startTime": "2026-05-08T00:00:00+00:00", - "endTime": "2026-05-10T00:00:00+00:00", - "location": "Prague, Czechia", - "link": "https://ethprague.com", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/ethprague", - "twitter": "https://x.com/EthPrague", - "farcaster": "https://farcaster.xyz/ethprague", - "id": "ethprague", - "eventType": "hackathon", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ETHCluj", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHCluj.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHCluj.png", - "startTime": "2026-05-13T00:00:00+00:00", - "endTime": "2026-05-14T00:00:00+00:00", - "location": "Cluj-Napoca, Romania", - "link": "https://www.ethcluj.org/", - "tags": ["Conference", "Regional Grassroots"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/ethcluj", - "twitter": "https://x.com/ETHCluj", - "farcaster": null, - "id": "ethcluj", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ETHMilan", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHMilan.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHMilan.png", - "startTime": "2026-05-21T00:00:00+00:00", - "endTime": "2026-05-22T00:00:00+00:00", - "location": "Milan, Italy", - "link": "https://www.ethmilan.xyz", - "tags": ["Conference", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/ethmilan", - "twitter": "https://x.com/eth_milano", - "farcaster": null, - "id": "ethmilan", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "Edge Esmeralda", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Edge%20Esmeralda.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Edge%20Esmeralda.png", - "startTime": "2026-05-30T00:00:00+00:00", - "endTime": "2026-06-27T00:00:00+00:00", - "location": "Healdsburg, USA", - "link": "https://www.edgeesmeralda.com/", - "tags": ["Popup Village/City", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/+nu0R4MFH6cY3YTM5", - "twitter": "https://x.com/JoinEdgeCity", - "farcaster": "https://farcaster.xyz/edgecity", - "id": "edge-esmeralda", - "eventType": "conference", - "isOnline": false, - "continent": "north-america" - }, - { - "title": "ETHKyiv", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHKyiv.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHKyiv.png", - "startTime": "2026-06-01T00:00:00+00:00", - "endTime": null, - "location": "Kyiv, Ukraine", - "link": "https://ethkyiv.com/", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": "https://discord.com/invite/76nzhMdBVt", - "telegram": "https://t.me/ethkyiv_ua", - "twitter": "https://x.com/ethkyiv_ua", - "farcaster": null, - "id": "ethkyiv", - "eventType": "hackathon", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ETHConf", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHConf.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHConf.png", - "startTime": "2026-06-08T00:00:00+00:00", - "endTime": "2026-06-10T00:00:00+00:00", - "location": "New York City, USA", - "link": "https://ethconf.com", - "tags": ["Conference", "ETHGlobal"], - "highlight": true, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethereumconf", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethconf", - "eventType": "conference", - "isOnline": false, - "continent": "north-america" - }, - { - "title": "ctrl/shift 2026", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ctrl%20shift%202026.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ctrl%20shift%202026.png", - "startTime": "2026-06-08T00:00:00+00:00", - "endTime": "2026-06-14T00:00:00+00:00", - "location": "Naples, Italy", - "link": "https://www.ctrlshift.events/", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/napuleth", - "twitter": "https://x.com/NapulETH", - "farcaster": null, - "id": "ctrl-shift-2026", - "eventType": "hackathon", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ETHGlobal New York", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20New%20York.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20New%20York.png", - "startTime": "2026-06-12T00:00:00+00:00", - "endTime": "2026-06-14T00:00:00+00:00", - "location": "New York City, USA", - "link": "https://ethglobal.com/events/newyork2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-new-york", - "eventType": "hackathon", - "isOnline": false, - "continent": "north-america" - }, - { - "title": "Common S3nse", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Common%20S3nse.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Common%20S3nse.png", - "startTime": "2026-06-12T00:00:00+00:00", - "endTime": "2026-06-13T00:00:00+00:00", - "location": "Amsterdam, The Netherlands", - "link": "https://commons3nse.cryptocanal.org/", - "tags": ["Conference", "Hackathon", "Privacy and Cryptography"], - "highlight": false, - "discord": "https://discord.com/invite/XJVjpCqQBz", - "telegram": "https://t.me/CryptoCanalCommunity", - "twitter": "https://x.com/CryptoCanal ", - "farcaster": null, - "id": "common-s3nse", - "eventType": "hackathon", - "isOnline": false, - "continent": "europe" - }, - { - "title": "DappCon Berlin", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/DappCon.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/DappCon.png", - "startTime": "2026-06-16T00:00:00+00:00", - "endTime": "2026-06-17T00:00:00+00:00", - "location": "Berlin, Germany", - "link": "https://dappcon.io", - "tags": ["Conference", "dApp"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/+ZYUWnz0kxWo4NTMy", - "twitter": "https://x.com/dappconberlin", - "farcaster": "https://farcaster.xyz/~/channel/dappconberlin", - "id": "dappcon-berlin", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "Pragma Lisbon", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Pragma%20Lisbon.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Pragma%20Lisbon.png", - "startTime": "2026-07-23T00:00:00+00:00", - "endTime": "2026-07-23T00:00:00+00:00", - "location": "Lisbon, Portugal", - "link": "https://ethglobal.com/events/pragma-lisbon2026", - "tags": ["Conference", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "pragma-lisbon", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "ETHGlobal Lisbon", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Lisbon.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Lisbon.png", - "startTime": "2026-07-24T00:00:00+00:00", - "endTime": "2026-07-26T00:00:00+00:00", - "location": "Lisbon, Portugal", - "link": "https://ethglobal.com/events/lisbon2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-lisbon", - "eventType": "hackathon", - "isOnline": false, - "continent": "europe" - }, - { - "title": "The Science of Blockchain Conference", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/The%20Science%20of%20Blockchain%20Conference.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/The%20Science%20of%20Blockchain%20Conference.png", - "startTime": "2026-07-27T00:00:00+00:00", - "endTime": "2026-07-29T00:00:00+00:00", - "location": "Stanford, USA", - "link": "https://www.sbc-conference.com/2026/", - "tags": ["Conference", "Academia"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": null, - "farcaster": null, - "id": "the-science-of-blockchain-conference", - "eventType": "conference", - "isOnline": false, - "continent": "north-america" - }, - { - "title": "Web3Lagos Conference", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Web3Lagos%20Conference.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Web3Lagos%20Conference.png", - "startTime": "2026-08-27T00:00:00+00:00", - "endTime": "2026-08-29T00:00:00+00:00", - "location": "Lagos, Nigeria", - "link": "https://event.web3bridge.com/", - "tags": ["Hackathon", "Conference", "Regional Grassroots"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/Web3LagosCon", - "farcaster": null, - "id": "web3lagos-conference", - "eventType": "hackathon", - "isOnline": false, - "continent": "africa" - }, - { - "title": "ETHSafari", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHSafari.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHSafari.png", - "startTime": "2026-09-01T00:00:00+00:00", - "endTime": "2026-09-06T00:00:00+00:00", - "location": "Kenya", - "link": "https://ethsafari.xyz/", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": "https://discord.com/invite/CkMF5Ff83f", - "telegram": "https://t.me/ethsafari", - "twitter": "https://x.com/ETHSafari", - "farcaster": null, - "id": "ethsafari", - "eventType": "hackathon", - "isOnline": false, - "continent": "africa" - }, - { - "title": "ETHBratislava", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHBratislava.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHBratislava.png", - "startTime": "2026-09-11T00:00:00+00:00", - "endTime": null, - "location": "Bratislava, Slovakia", - "link": "http://www.ethbratislava.com/", - "tags": ["Conference", "Hackathon", "Regional Grassroots"], - "highlight": false, - "discord": "https://www.instagram.com/ethbratislava", - "telegram": "https://t.me/ETHBratislava", - "twitter": "https://x.com/eth_bratislava", - "farcaster": "https://www.linkedin.com/company/ethba/", - "id": "ethbratislava", - "eventType": "hackathon", - "isOnline": false, - "continent": "europe" - }, - { - "title": "European Blockchain Convention", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/European%20Blockchain%20Convention.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/European%20Blockchain%20Convention.png", - "startTime": "2026-09-16T00:00:00+00:00", - "endTime": "2026-09-17T00:00:00+00:00", - "location": "Barcelona, Spain", - "link": "https://eblockchainconvention.com/european-blockchain-convention-12/", - "tags": ["Conference", "Institutional"], - "highlight": false, - "discord": null, - "telegram": "https://t.me/EuropeanBlockchainConvention/1", - "twitter": "https://x.com/EBlockchainCon", - "farcaster": null, - "id": "european-blockchain-convention", - "eventType": "conference", - "isOnline": false, - "continent": "europe" - }, - { - "title": "Pragma Tokyo", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Pragma%20Tokyo.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Pragma%20Tokyo.png", - "startTime": "2026-09-24T00:00:00+00:00", - "endTime": "2026-09-24T00:00:00+00:00", - "location": "Tokyo, Japan", - "link": "https://ethglobal.com/events/pragma-tokyo2026", - "tags": ["Conference", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "pragma-tokyo", - "eventType": "conference", - "isOnline": false, - "continent": "asia" - }, - { - "title": "ETHGlobal Tokyo", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Tokyo.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Tokyo.png", - "startTime": "2026-09-25T00:00:00+00:00", - "endTime": "2026-09-27T00:00:00+00:00", - "location": "Tokyo, Japan", - "link": "https://ethglobal.com/events/tokyo2026", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-tokyo", - "eventType": "hackathon", - "isOnline": false, - "continent": "asia" - }, - { - "title": "ETH Brasil", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Ethereum%20Brasil.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Ethereum%20Brasil.png", - "startTime": "2026-10-28T00:00:00+00:00", - "endTime": "2026-10-29T00:00:00+00:00", - "location": "São Paulo, Brazil", - "link": "https://linktr.ee/ethereum.br", - "tags": ["Conference", "Regional Grassroots"], - "highlight": false, - "discord": "https://discord.com/invite/zb3FpTEH9p", - "telegram": "https://t.me/Ethereum_Brasil", - "twitter": "https://x.com/ethereum_brasil", - "farcaster": null, - "id": "eth-brasil", - "eventType": "conference", - "isOnline": false, - "continent": "south-america" - }, - { - "title": "Ethereum Cypherpunk Congress #3", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Ethereum%20Cypherpunk%20Congress%203.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Ethereum%20Cypherpunk%20Congress%203.png", - "startTime": "2026-11-02T00:00:00+00:00", - "endTime": "2026-11-02T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://luma.com/spsnos9t?lm_api_id=evt-yG8wi8Jjw5ec6de&lm_medium=blast&lm_source=event", - "tags": ["Conference", "Privacy and Cryptography"], - "highlight": false, - "discord": null, - "telegram": null, - "twitter": "https://x.com/web3privacy", - "farcaster": null, - "id": "ethereum-cypherpunk-congress-3", - "eventType": "conference", - "isOnline": false, - "continent": "asia" - }, - { - "title": "Devcon India", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Devcon%20India.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Devcon%20India.png", - "startTime": "2026-11-03T00:00:00+00:00", - "endTime": "2026-11-06T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://devcon.org/en/", - "tags": ["Conference", "Hackathon", "General Blockchain Week"], - "highlight": true, - "discord": null, - "telegram": "https://t.me/+p4p9VHCChsNjNjhh", - "twitter": "https://x.com/EFDevcon", - "farcaster": null, - "id": "devcon-india", - "eventType": "hackathon", - "isOnline": false, - "continent": "asia" - }, - { - "title": "Pragma Mumbai", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/Pragma%20Mumbai.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/Pragma%20Mumbai.png", - "startTime": "2026-11-05T00:00:00+00:00", - "endTime": "2026-11-05T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://ethglobal.com/events/pragma-mumbai", - "tags": ["Conference", "ETHGlobal"], - "highlight": false, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "pragma-mumbai", - "eventType": "conference", - "isOnline": false, - "continent": "asia" - }, - { - "title": "ETHGlobal Mumbai", - "logoImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/events/ETHGlobal%20Mumbai.png", - "bannerImage": "https://pvvrtckedmrkyzfxubkk.supabase.co/storage/v1/object/public/banners/ETHGlobal%20Mumbai.png", - "startTime": "2026-11-06T00:00:00+00:00", - "endTime": "2026-11-08T00:00:00+00:00", - "location": "Mumbai, India", - "link": "https://ethglobal.com/events/mumbai", - "tags": ["Hackathon", "ETHGlobal"], - "highlight": true, - "discord": "https://ethglobal.com/discord", - "telegram": null, - "twitter": "https://x.com/ethglobal", - "farcaster": "https://farcaster.xyz/ethglobal", - "id": "ethglobal-mumbai", - "eventType": "hackathon", - "isOnline": false, - "continent": "asia" - } -] diff --git a/src/lib/data/index.ts b/src/lib/data/index.ts index ac2c6f5d8ca..ac77febeec2 100644 --- a/src/lib/data/index.ts +++ b/src/lib/data/index.ts @@ -142,3 +142,9 @@ export const getTotalValueLockedData = createCachedGetter( ["total-value-locked-data"], CACHE_REVALIDATE_HOUR ) + +export const getEventsData = createCachedGetter( + dataLayer.getEventsData, + ["events-data"], + CACHE_REVALIDATE_DAY +)