Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
83 commits
Select commit Hold shift + click to select a range
3d917b8
setup netlify blobs data layer
corwintines Dec 4, 2025
ae3c059
Enhance data layer by adding new fetch functions for community picks,…
corwintines Dec 4, 2025
255911f
More apis
corwintines Dec 5, 2025
5a5e859
more api
corwintines Dec 5, 2025
b72be11
mocks and docs
corwintines Dec 5, 2025
668f798
Merge branch 'dev' into datalayer
corwintines Dec 10, 2025
b971851
architecture change requests
corwintines Dec 10, 2025
c3920bd
change requests and fix errors
corwintines Dec 11, 2025
3c13281
Merge branch 'dev' into datalayer
corwintines Dec 11, 2025
45fe42e
implement data layer onto /layer-2 and /layer-2/networks pages
corwintines Dec 11, 2025
1b7385e
Merge branch 'dev' into datalayer
corwintines Dec 15, 2025
7daf595
setup tests
corwintines Dec 16, 2025
b9a8fba
Merge branch 'datalayer' into datalayer-layer2
corwintines Dec 16, 2025
141abb4
fix async to work in builds
corwintines Dec 16, 2025
dcb84c6
Merge branch 'datalayer' into datalayer-layer2
corwintines Dec 16, 2025
168b06f
Merge branch 'dev' into datalayer
corwintines Dec 17, 2025
eeeb8ca
cleanup
corwintines Dec 17, 2025
3b77e93
Merge branch 'datalayer' into datalayer-layer2
corwintines Dec 17, 2025
e432e86
Fix translated URL paths in multiple languages
minimalsm Dec 17, 2025
39a19cd
Merge branch 'dev' into datalayer
corwintines Dec 18, 2025
0bb9856
Updated EL bounty hunters
fredrik0x Dec 18, 2025
9aec6da
trim mock data files to reduce size
pettinarip Dec 18, 2025
668d6b4
Merge pull request #16801 from ethereum/datalayer
pettinarip Dec 18, 2025
e0ca202
Merge branch 'dev' into datalayer-layer2
pettinarip Dec 18, 2025
caf94b7
chore(deps-dev): bump storybook from 8.6.14 to 8.6.15
dependabot[bot] Dec 18, 2025
b539862
lint fix
pettinarip Dec 19, 2025
1cdf745
Merge pull request #16858 from ethereum/datalayer-layer2
pettinarip Dec 19, 2025
5b80789
Add ETHPrague 2026 event listing
Dec 20, 2025
2063932
docs: remove broken Maecenas link from RWA page
madisoncarter1234 Dec 21, 2025
2870558
Merge pull request #16981 from ethereum/master
wackerow Dec 22, 2025
4ebd1d5
Merge pull request #16982 from ethereum/staging
wackerow Dec 22, 2025
e2eb1b7
fix: dedupe data-layer calls during build with react cache
pettinarip Dec 23, 2025
43226c1
fix: restore e2e visual snapshots for all browser/device projects
pettinarip Dec 23, 2025
fc9dfbc
Use right link for Gasper
jorgesumle Dec 24, 2025
238562b
fix: ETHPrague image
wackerow Dec 24, 2025
2604383
Merge pull request #16974 from minimalsm/add-ethprague-2026
wackerow Dec 24, 2025
df980f9
Merge pull request #16980 from madisoncarter1234/fix/remove-maecenas-…
wackerow Dec 24, 2025
a74e218
docs: update README.md [skip ci]
allcontributors[bot] Dec 24, 2025
156ce93
docs: update .all-contributorsrc [skip ci]
allcontributors[bot] Dec 24, 2025
dec081f
Merge pull request #16993 from ethereum/all-contributors/add-madisonc…
wackerow Dec 24, 2025
aa82b69
Update Crowdin translation progress
actions-user Dec 26, 2025
57de390
Merge pull request #16951 from ethereum/fredrik0x-patch-1
wackerow Dec 26, 2025
df4ee7e
Merge pull request #16957 from ethereum/dependabot/npm_and_yarn/story…
wackerow Dec 26, 2025
788e5f4
Merge pull request #17001 from ethereum/automated-update-20251226162853
wackerow Dec 26, 2025
3195e9e
Merge pull request #16986 from ethereum/fix/dedupe-data-layer-cache
wackerow Dec 27, 2025
4194ca9
Merge pull request #16989 from jorgesumle/dev
wackerow Dec 30, 2025
2c06fde
Requested changes
Jan 1, 2026
7d98d9e
Changes requested
Jan 1, 2026
62ba274
chore(deps): bump qs from 6.14.0 to 6.14.1
dependabot[bot] Jan 1, 2026
20816e4
Retitle
Jan 1, 2026
4171324
Grammarly
Jan 1, 2026
f270509
Apply suggestions from code review
qbzzt Jan 2, 2026
314efc5
patch: formatting
wackerow Jan 3, 2026
f30992e
patch: spelling, capitalization
wackerow Jan 3, 2026
9cdbbe4
patch: trailing slashes
wackerow Jan 3, 2026
c67d6df
Merge pull request #17008 from ethereum/dependabot/npm_and_yarn/qs-6.…
wackerow Jan 3, 2026
8793b0e
Update Crowdin contributors
actions-user Jan 4, 2026
6206809
Update community events
actions-user Jan 4, 2026
e556f22
Apply suggestions from code review
qbzzt Jan 4, 2026
978fe8e
Merge pull request #17012 from ethereum/automated-update-20260104003402
wackerow Jan 5, 2026
04e5c0a
Merge pull request #17007 from qbzzt/x402-251229
wackerow Jan 5, 2026
5f0448b
chore: rm obsolete .well-known
pauljickling Jan 5, 2026
4b83fe3
update: community events 2026
wackerow Jan 5, 2026
3673868
Merge pull request #17016 from pauljickling/dev
wackerow Jan 6, 2026
0b67516
patch: ethereum-forks link
wackerow Jan 6, 2026
3f4a6db
Merge pull request #16938 from ethereum/fix/translated-url-paths
wackerow Jan 6, 2026
885f8ee
Merge pull request #17011 from ethereum/automated-update-20260104001711
wackerow Jan 6, 2026
c3484e4
Add Ethereal news to community blogs
minimalsm Jan 7, 2026
f82b0f2
Merge pull request #17017 from ethereum/2026-events
wackerow Jan 7, 2026
e45e98b
Merge pull request #16987 from ethereum/fix/restore-e2e-visual-snapshots
wackerow Jan 7, 2026
ea01f2c
Replace EF job board links with new Ashby link
claude[bot] Jan 7, 2026
62df616
Update additional translation files for EF job board links
claude[bot] Jan 7, 2026
07f769d
Remove outdated Ethereum.org UX stats link
Jan 7, 2026
f667f84
Merge pull request #17026 from ethereum/fix/remove-outdated-ux-stats-…
wackerow Jan 7, 2026
fd2b155
Merge pull request #17021 from ethereum/add-ethereal-news-resource
wackerow Jan 7, 2026
34eeb17
Merge pull request #17024 from ethereum/claude/issue-17023-20260107-1648
wackerow Jan 7, 2026
2964261
chore(deps): bump preact from 10.26.8 to 10.28.2
dependabot[bot] Jan 7, 2026
8e48b2e
Merge pull request #17027 from ethereum/dependabot/npm_and_yarn/preac…
wackerow Jan 7, 2026
96bff33
10.20.1
wackerow Jan 8, 2026
890c835
Use Netlify's auto-provided SITE_ID instead of custom env var
pettinarip Jan 8, 2026
2e2bd8d
Fix Netlify functions mock storage path
pettinarip Jan 8, 2026
d9fece2
Merge pull request #17035 from ethereum/fix/netlify-mock-storage-path
pettinarip Jan 8, 2026
aba2985
Merge pull request #17033 from ethereum/fix/use-netlify-site-id-env
pettinarip Jan 8, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions .all-contributorsrc
Original file line number Diff line number Diff line change
Expand Up @@ -13961,6 +13961,15 @@
"contributions": [
"bug"
]
},
{
"login": "madisoncarter1234",
"name": "Madison carter",
"avatar_url": "https://avatars.githubusercontent.com/u/184700418?v=4",
"profile": "https://github.com/madisoncarter1234",
"contributions": [
"content"
]
}
],
"contributorsPerLine": 7,
Expand Down
12 changes: 6 additions & 6 deletions .github/workflows/playwright.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: E2E tests
name: Playwright Tests
on:
workflow_dispatch: # Can be dispatched manually
jobs:
Expand Down Expand Up @@ -31,16 +31,16 @@ jobs:
- name: Install Playwright with all browsers
run: npx playwright install --with-deps

- name: Run E2E Tests on Netlify URL
run: pnpm test:e2e
- name: Run All Tests (Unit + E2E)
run: pnpm test
env:
PLAYWRIGHT_TEST_BASE_URL: ${{ steps.netlify_deploy.outputs.url }}

- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: ./tests/e2e/__results__
path: ./tests/__results__
retention-days: 7

chromatic:
Expand All @@ -64,7 +64,7 @@ jobs:
uses: actions/download-artifact@v6
with:
name: playwright-report
path: ./tests/e2e/__results__
path: ./tests/__results__

- name: Run Chromatic
uses: chromaui/action@latest
Expand All @@ -74,4 +74,4 @@ jobs:
exitZeroOnChanges: true
storybookBaseDir: .
env:
CHROMATIC_ARCHIVE_LOCATION: ./tests/e2e/__results__
CHROMATIC_ARCHIVE_LOCATION: ./tests/__results__
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

# testing
/coverage
tests/__results__/
tests/__report__/

# next.js
/.next/
Expand Down Expand Up @@ -65,3 +67,6 @@ src/data/crowdin/bucketsAwaitingReviewReport.csv
build-storybook.log
build-archive.log
storybook-static

# Trigger
.trigger
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2160,6 +2160,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
</tr>
<tr>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Sshadow84"><img src="https://avatars.githubusercontent.com/u/96975661?v=4?s=100" width="100px;" alt="shadow"/><br /><sub><b>shadow</b></sub></a><br /><a href="https://github.com/ethereum/ethereum-org-website/issues?q=author%3ASshadow84" title="Bug reports">🐛</a></td>
<td align="center" valign="top" width="14.28%"><a href="https://github.com/madisoncarter1234"><img src="https://avatars.githubusercontent.com/u/184700418?v=4?s=100" width="100px;" alt="Madison carter"/><br /><sub><b>Madison carter</b></sub></a><br /><a href="#content-madisoncarter1234" title="Content">🖋</a></td>
</tr>
</tbody>
</table>
Expand Down
51 changes: 28 additions & 23 deletions app/[locale]/layer-2/networks/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,51 +10,56 @@ import type { CommitHistory, Lang, PageParams } 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 { ethereumNetworkData, layer2Data } from "@/data/networks/networks"
import { walletsData } from "@/data/wallets/wallet-data"

import { BASE_TIME_UNIT } from "@/lib/constants"

import Layer2Networks from "./_components/networks"
import Layer2NetworksPageJsonLD from "./page-jsonld"

import { fetchEthereumMarketcap } from "@/lib/api/fetchEthereumMarketcap"
import { fetchGrowThePie } from "@/lib/api/fetchGrowThePie"
import { fetchGrowThePieBlockspace } from "@/lib/api/fetchGrowThePieBlockspace"
import { fetchGrowThePieMaster } from "@/lib/api/fetchGrowThePieMaster"
import { fetchL2beat } from "@/lib/api/fetchL2beat"

// In seconds
const REVALIDATE_TIME = BASE_TIME_UNIT * 1

const loadData = dataLoader(
[
["ethereumMarketcapData", fetchEthereumMarketcap],
["growThePieData", fetchGrowThePie],
["growThePieBlockspaceData", fetchGrowThePieBlockspace],
["growThePieMasterData", fetchGrowThePieMaster],
["l2beatData", fetchL2beat],
],
REVALIDATE_TIME * 1000
)
import {
getEthereumMarketcapData,
getGrowThePieBlockspaceData,
getGrowThePieData,
getGrowThePieMasterData,
getL2beatData,
} from "@/lib/data"

const Page = async ({ params }: { params: PageParams }) => {
const { locale } = params

setRequestLocale(locale)

// Fetch data using the new data-layer functions (already cached)
const [
ethereumMarketcapData,
growThePieData,
growThePieBlockspaceData,
growThePieMasterData,
l2beatData,
] = await loadData()
] = await Promise.all([
getEthereumMarketcapData(),
getGrowThePieData(),
getGrowThePieBlockspaceData(),
getGrowThePieMasterData(),
getL2beatData(),
])

// Handle null cases - throw error if required data is missing
if (!l2beatData) {
throw new Error("Failed to fetch L2beat data")
}

if (!growThePieData) {
throw new Error("Failed to fetch GrowThePie data")
}

if (!ethereumMarketcapData) {
throw new Error("Failed to fetch Ethereum marketcap data")
}

const layer2DataCompiled = layer2Data
.map((network) => {
Expand Down
32 changes: 15 additions & 17 deletions app/[locale]/layer-2/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,39 +10,37 @@ import type { CommitHistory, Lang, PageParams } 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 { BASE_TIME_UNIT } from "@/lib/constants"

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
)
import { getGrowThePieData, getL2beatData } from "@/lib/data"

const Page = async ({ params }: { params: PageParams }) => {
const { locale } = params

setRequestLocale(locale)

const [growThePieData, l2beatData] = await loadData()
// Fetch data using the new data-layer functions (already cached)
const [growThePieData, l2beatData] = await Promise.all([
getGrowThePieData(),
getL2beatData(),
])

// Handle null cases - throw error if required data is missing
if (!l2beatData) {
throw new Error("Failed to fetch L2beat data")
}

if (!growThePieData) {
throw new Error("Failed to fetch GrowThePie data")
}

const getRandomL2s = () => {
let randomL2s = layer2Data.filter(
Expand Down
2 changes: 1 addition & 1 deletion netlify.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,4 @@
path = "en/developers/tutorials/creating-a-wagmi-ui-for-your-contract/"

[functions]
included_files = ["i18n.config.json", "src/intl/**/*", "src/data/mocks/**/*"]
included_files = ["i18n.config.json", "src/intl/**/*", "src/data/mocks/**/*", "src/data-layer/mocks/**/*"]
18 changes: 12 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ethereum-org-website",
"version": "10.20.0",
"version": "10.20.1",
"license": "MIT",
"private": true,
"scripts": {
Expand All @@ -23,16 +23,20 @@
"crowdin-needs-review": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/crowdin/reports/generateReviewReport.ts",
"update-tutorials": "ts-node -O '{ \"module\": \"commonjs\" }' src/scripts/update-tutorials-list.ts",
"prepare": "husky",
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"test:e2e:debug": "playwright test --debug",
"test:e2e:report": "playwright show-report tests/e2e/__report__"
"test": "pnpm test:unit && pnpm test:e2e",
"test:unit": "USE_MOCK_DATA=true playwright test --project=unit",
"test:e2e": "playwright test --project=e2e --project=e2e-webkit --project=e2e-mobile-chrome --project=e2e-mobile-safari",
"test:e2e:ui": "playwright test --project=e2e --ui",
"test:e2e:debug": "playwright test --project=e2e --debug",
"test:e2e:report": "playwright show-report tests/__report__",
"trigger:dev": "dotenv -e .env -- npx trigger.dev@latest dev"
},
"dependencies": {
"@aws-sdk/client-ses": "^3.859.0",
"@crowdin/crowdin-api-client": "^1.25.0",
"@docsearch/react": "^3.5.2",
"@hookform/resolvers": "^3.8.0",
"@netlify/blobs": "^10.4.1",
"@next/bundle-analyzer": "^14.2.5",
"@radix-ui/react-accordion": "^1.2.0",
"@radix-ui/react-avatar": "^1.1.2",
Expand Down Expand Up @@ -60,6 +64,7 @@
"@tanstack/react-query": "^5.66.7",
"@tanstack/react-table": "^8.19.3",
"@tanstack/react-virtual": "^3.13.12",
"@trigger.dev/sdk": "4.3.0",
"@types/canvas-confetti": "^1.9.0",
"@types/three": "^0.177.0",
"@wagmi/core": "^2.17.3",
Expand Down Expand Up @@ -136,6 +141,7 @@
"chromatic": "12.0.0",
"decompress": "^4.2.1",
"dotenv": "^16.5.0",
"dotenv-cli": "^11.0.0",
"eslint": "^8.57.1",
"eslint-config-next": "^14.2.2",
"eslint-config-prettier": "^9",
Expand All @@ -155,7 +161,7 @@
"raw-loader": "^4.0.2",
"rehype-slug": "^6.0.0",
"remark-heading-id": "^1.0.1",
"storybook": "8.6.14",
"storybook": "8.6.15",
"storybook-next-intl": "^1.2.5",
"tailwindcss": "^3.4.4",
"ts-node": "^10.9.1",
Expand Down
33 changes: 24 additions & 9 deletions playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ import { defineConfig, devices } from "@playwright/test"
dotenv.config({ path: path.resolve(__dirname, ".env.local") })

export default defineConfig<ChromaticConfig>({
testDir: "./tests/e2e",
outputDir: "./tests/e2e/__results__",
testDir: "./tests",
outputDir: "./tests/__results__",
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : 3,
reporter: [
["html", { outputFolder: "./tests/e2e/__report__", open: "never" }],
["html", { outputFolder: "./tests/__report__", open: "never" }],
["line"],
process.env.CI ? ["github"] : ["list"],
],
Expand All @@ -38,24 +38,39 @@ export default defineConfig<ChromaticConfig>({
expect: {
timeout: 10000,
},

projects: [
/* Test against desktop browsers */
// ─────────────────────────────────────────────────────────────────────────
// E2E tests - Visual regression + functional tests across browsers/devices
// ─────────────────────────────────────────────────────────────────────────
{
name: "chromium",
name: "e2e",
testDir: "./tests/e2e",
use: { ...devices["Desktop Chrome"] },
},
{
name: "webkit",
name: "e2e-webkit",
testDir: "./tests/e2e",
use: { ...devices["Desktop Safari"] },
},
/* Test against mobile viewports. */
{
name: "Mobile Chrome",
name: "e2e-mobile-chrome",
testDir: "./tests/e2e",
use: { ...devices["Pixel 5"] },
},
{
name: "Mobile Safari",
name: "e2e-mobile-safari",
testDir: "./tests/e2e",
use: { ...devices["iPhone 12"] },
},

// ─────────────────────────────────────────────────────────────────────────
// Unit tests
// ─────────────────────────────────────────────────────────────────────────
{
name: "unit",
testDir: "./tests/unit",
use: {},
},
],
})
Loading
Loading