From 20fe666933cf800c660ce7d167f91516c40298a8 Mon Sep 17 00:00:00 2001 From: Fredrik Date: Tue, 9 Dec 2025 10:20:28 +0100 Subject: [PATCH 001/227] adding fudong wu to exec bounty hunters --- src/data/execution-bounty-hunters.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/data/execution-bounty-hunters.json b/src/data/execution-bounty-hunters.json index cf345ee02d1..cc4f5d6ba84 100644 --- a/src/data/execution-bounty-hunters.json +++ b/src/data/execution-bounty-hunters.json @@ -283,7 +283,12 @@ "username": "Mart1i1n", "name": "Mingfei Zhang", "score": 1000 - }, + }, + { + "username": "1033309821", + "name": "Fudong Wu", + "score": 1000 + }, { "username": "n0thingness", "name": "Daniel Briskin", From 5bad90a49de8b26d9bb59214b662e499432ce3d8 Mon Sep 17 00:00:00 2001 From: Fredrik Date: Tue, 9 Dec 2025 10:22:44 +0100 Subject: [PATCH 002/227] Update grandchildrice Removed duplicate entry for 'grandchildrice' and adjusted scores accordingly. --- src/data/execution-bounty-hunters.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data/execution-bounty-hunters.json b/src/data/execution-bounty-hunters.json index cc4f5d6ba84..2555ec23f26 100644 --- a/src/data/execution-bounty-hunters.json +++ b/src/data/execution-bounty-hunters.json @@ -134,6 +134,11 @@ "name": "Alex Beregszaszi", "score": 3500 }, + { + "username": "grandchildrice", + "name": "grandchildrice (Nyx Foundation)", + "score": 3500 + }, { "username": "SergioDemianLerner", "name": "Sergio Demian Lerner", @@ -149,11 +154,6 @@ "name": "OP Labs", "score": 2500 }, - { - "username": "grandchildrice", - "name": "grandchildrice (Nyx Foundation)", - "score": 2500 - }, { "username": "yaronvel", "name": "Yaron Velner", From 902f50fdad3937f1b4af90af7f064075f6bf9a8b Mon Sep 17 00:00:00 2001 From: Dmitry Gusakov Date: Tue, 9 Dec 2025 12:42:55 +0100 Subject: [PATCH 003/227] feat: Add Lido CSM Node Operators guide [Fixes #16826] --- src/components/Staking/StakingGuides.tsx | 5 +++++ src/intl/ca/page-staking.json | 1 + src/intl/cs/page-staking.json | 1 + src/intl/de/page-staking.json | 1 + src/intl/el/page-staking.json | 1 + src/intl/en/page-staking.json | 1 + src/intl/es/page-staking.json | 1 + src/intl/fr/page-staking.json | 1 + src/intl/ga/page-staking.json | 1 + src/intl/hu/page-staking.json | 1 + src/intl/id/page-staking.json | 1 + src/intl/it/page-staking.json | 1 + src/intl/kk/page-staking.json | 1 + src/intl/nl/page-staking.json | 1 + src/intl/pt-br/page-staking.json | 1 + src/intl/ru/page-staking.json | 1 + src/intl/uk/page-staking.json | 1 + src/intl/uz/page-staking.json | 1 + src/intl/zh-tw/page-staking.json | 1 + src/intl/zh/page-staking.json | 1 + 20 files changed, 24 insertions(+) diff --git a/src/components/Staking/StakingGuides.tsx b/src/components/Staking/StakingGuides.tsx index c624021fa1a..3ebe5b48ba7 100644 --- a/src/components/Staking/StakingGuides.tsx +++ b/src/components/Staking/StakingGuides.tsx @@ -26,6 +26,11 @@ const StakingGuides = () => { link: "https://docs.stakewise.io/docs/guides/staking#solo-staking-with-stakewise", description: t("page-staking-guide-description-mac-linux-windows"), }, + { + title: t("page-staking-guide-title-lido-csm"), + link: "https://docs.lido.fi/run-on-lido/csm/", + description: t("page-staking-guide-description-linux"), + }, ] return diff --git a/src/intl/ca/page-staking.json b/src/intl/ca/page-staking.json index d88bf86491b..c944f032bec 100644 --- a/src/intl/ca/page-staking.json +++ b/src/intl/ca/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Operadors de nodes de Rocket Pool", "page-staking-guide-title-stakewise": "Operadors de Nodes StakeWise", + "page-staking-guide-title-lido-csm":"Operadors de Nodes de Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/cs/page-staking.json b/src/intl/cs/page-staking.json index 5f45ba67d13..6c5fd82231e 100644 --- a/src/intl/cs/page-staking.json +++ b/src/intl/cs/page-staking.json @@ -48,6 +48,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Operátoři uzlů Rocket Pool", "page-staking-guide-title-stakewise": "Operátoři uzlů StakeWise", + "page-staking-guide-title-lido-csm":"Operátoři uzlů Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/de/page-staking.json b/src/intl/de/page-staking.json index a13d75dd7ad..cc428972df9 100644 --- a/src/intl/de/page-staking.json +++ b/src/intl/de/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Rocket Pool – Node-Betreiber", "page-staking-guide-title-stakewise": "StakeWise-Knotenbetreiber", + "page-staking-guide-title-lido-csm":"Lido CSM – Node-Betreiber", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/el/page-staking.json b/src/intl/el/page-staking.json index 065e0b4bdaf..4d1a3ec2afd 100644 --- a/src/intl/el/page-staking.json +++ b/src/intl/el/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Χειριστές κόμβου Rocket Pool", "page-staking-guide-title-stakewise": "Διαχειριστές κόμβου StakeWise", + "page-staking-guide-title-lido-csm":"Χειριστές κόμβου Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/en/page-staking.json b/src/intl/en/page-staking.json index cbce73d7993..b1c2e35cc3b 100644 --- a/src/intl/en/page-staking.json +++ b/src/intl/en/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Rocket Pool Node Operators", "page-staking-guide-title-stakewise": "StakeWise Node Operators", + "page-staking-guide-title-lido-csm":"Lido CSM Node Operators", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/es/page-staking.json b/src/intl/es/page-staking.json index e857f464a3a..654527cd6a4 100644 --- a/src/intl/es/page-staking.json +++ b/src/intl/es/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Operadores del nodo Rocket Pool", "page-staking-guide-title-stakewise": "Operadores de nodos StakeWise", + "page-staking-guide-title-lido-csm":"Operadores de nodos Lido CSM", "page-staking-guide-description-linux": "Linux (interfaz de línea de comandos o CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (ILC)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/fr/page-staking.json b/src/intl/fr/page-staking.json index 65160a3bdbd..f129763a9ce 100644 --- a/src/intl/fr/page-staking.json +++ b/src/intl/fr/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Opérateurs de nœud Rocket Pool", "page-staking-guide-title-stakewise": "Opérateurs de nœuds StakeWise", + "page-staking-guide-title-lido-csm":"Opérateurs de nœuds Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/ga/page-staking.json b/src/intl/ga/page-staking.json index 5a5836f16af..1be10823095 100644 --- a/src/intl/ga/page-staking.json +++ b/src/intl/ga/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Oibreoirí Nóid Rocket Pool", "page-staking-guide-title-stakewise": "Oibreoirí Nód StakeWise", + "page-staking-guide-title-lido-csm":"Oibreoirí Nóid Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/hu/page-staking.json b/src/intl/hu/page-staking.json index 04dd048c044..da762fb3cff 100644 --- a/src/intl/hu/page-staking.json +++ b/src/intl/hu/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Rocket Pool csomópont-operátorok", "page-staking-guide-title-stakewise": "StakeWise csomópont-operátorok", + "page-staking-guide-title-lido-csm":"Lido CSM csomópont-operátorok", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/id/page-staking.json b/src/intl/id/page-staking.json index 4d04b5dd1ad..65f1ce61609 100644 --- a/src/intl/id/page-staking.json +++ b/src/intl/id/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Operator Simpul Kolam Roket", "page-staking-guide-title-stakewise": "Operator Node StakeWise", + "page-staking-guide-title-lido-csm":"Operator Node Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/it/page-staking.json b/src/intl/it/page-staking.json index 5f4020ef677..32a0dcd53d7 100644 --- a/src/intl/it/page-staking.json +++ b/src/intl/it/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Operatori del nodo Rocket Pool", "page-staking-guide-title-stakewise": "Operatori di nodi StakeWise", + "page-staking-guide-title-lido-csm":"Operatori di nodi Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/kk/page-staking.json b/src/intl/kk/page-staking.json index 250ff510885..b06b41a45b3 100644 --- a/src/intl/kk/page-staking.json +++ b/src/intl/kk/page-staking.json @@ -47,6 +47,7 @@ "page-staking-guide-title-somer-esat": "Сомер Эсат", "page-staking-guide-title-rocket-pool": "Rocket Pool торабының операторлары", "page-staking-guide-title-stakewise": "StakeWise торабының операторлары", + "page-staking-guide-title-lido-csm":"Lido CSM торабының операторлары", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/nl/page-staking.json b/src/intl/nl/page-staking.json index 1c73ac33f9f..392b73100da 100644 --- a/src/intl/nl/page-staking.json +++ b/src/intl/nl/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Rocket Pool Node-Operators", "page-staking-guide-title-stakewise": "StakeWise-nodebeheerders", + "page-staking-guide-title-lido-csm":"Lido CSM Node-Operators", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/pt-br/page-staking.json b/src/intl/pt-br/page-staking.json index 91985468b20..a294b1797dd 100644 --- a/src/intl/pt-br/page-staking.json +++ b/src/intl/pt-br/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Operadores de nó Rocket Pool", "page-staking-guide-title-stakewise": "Operadores de nós da StakeWise", + "page-staking-guide-title-lido-csm":"Operadores de nós da Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/ru/page-staking.json b/src/intl/ru/page-staking.json index 8d5006db6f3..68f8054683e 100644 --- a/src/intl/ru/page-staking.json +++ b/src/intl/ru/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Сомер Эсат", "page-staking-guide-title-rocket-pool": "Операторы узлов пула Rocket Pool", "page-staking-guide-title-stakewise": "Операторы узлов StakeWise", + "page-staking-guide-title-lido-csm":"Операторы узлов Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/uk/page-staking.json b/src/intl/uk/page-staking.json index f72bf274ba8..d05173e7f06 100644 --- a/src/intl/uk/page-staking.json +++ b/src/intl/uk/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Оператори вузлів Rocket Pool", "page-staking-guide-title-stakewise": "Оператори вузлів StakeWise", + "page-staking-guide-title-lido-csm":"Оператори вузлів Lido CSM", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, macOS (CLI)", diff --git a/src/intl/uz/page-staking.json b/src/intl/uz/page-staking.json index f23b1b189c8..b3ef3cb030f 100644 --- a/src/intl/uz/page-staking.json +++ b/src/intl/uz/page-staking.json @@ -47,6 +47,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Raketa havzasi tugun operatorlari", "page-staking-guide-title-stakewise": "StakeWise tugun operatorlari", + "page-staking-guide-title-lido-csm":"Lido CSM tugun operatorlari", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux, macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux, Windows, MacOS (CLI)", diff --git a/src/intl/zh-tw/page-staking.json b/src/intl/zh-tw/page-staking.json index 67026d3d9d4..716deb342c7 100644 --- a/src/intl/zh-tw/page-staking.json +++ b/src/intl/zh-tw/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Rocket Pool 節點營運商", "page-staking-guide-title-stakewise": "StakeWise 節點營運商", + "page-staking-guide-title-lido-csm":"Lido CSM 節點營運商", "page-staking-guide-description-linux": "Linux(命令列介面)", "page-staking-guide-description-mac-linux": "Linux,macOS(命令列介面)", "page-staking-guide-description-mac-linux-windows": "Linux、Windows、MacOS(命令列介面)", diff --git a/src/intl/zh/page-staking.json b/src/intl/zh/page-staking.json index 04cf9b4f462..96e3892980d 100644 --- a/src/intl/zh/page-staking.json +++ b/src/intl/zh/page-staking.json @@ -49,6 +49,7 @@ "page-staking-guide-title-somer-esat": "Somer Esat", "page-staking-guide-title-rocket-pool": "Rocket Pool 节点运营商", "page-staking-guide-title-stakewise": "StakeWise 节点运营商", + "page-staking-guide-title-lido-csm":"Lido CSM 节点运营商", "page-staking-guide-description-linux": "Linux (CLI)", "page-staking-guide-description-mac-linux": "Linux、macOS (CLI)", "page-staking-guide-description-mac-linux-windows": "Linux、Windows、MacOS(命令行界面)", From 5b299cfa1ec4eee515b0665ac2fa044bb6f91193 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:08:12 +0100 Subject: [PATCH 004/227] fix dead link --- public/content/translations/ar/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ar/defi/index.md b/public/content/translations/ar/defi/index.md index 56b352f5259..1bedf4fcd37 100644 --- a/public/content/translations/ar/defi/index.md +++ b/public/content/translations/ar/defi/index.md @@ -171,7 +171,7 @@ summaryPoint3: استنادًا إلى التكنولوجيا مفتوحة ال لكن لتتمكن من تنفيذ المثال المذكور أعلاه في عالم التمويل التقليدي، ستحتاج إلى مبلغ هائل من المال. ولا يتاح هذا النوع من إستراتيجيات كسب الأموال إلا لمن لديهم ثروات قائمة. القروض السريعة مثال على مستقبل لا يكون فيه وجود المال شرطًا مسبقًا ضروريًا لكسب المال. - + المزيد عن القروض السريعة From 5ca65578a2600957f727c5fd626f361b902040ae Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:09:07 +0100 Subject: [PATCH 005/227] fixed broken link --- public/content/translations/fa/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/fa/defi/index.md b/public/content/translations/fa/defi/index.md index 196882cda62..aae25d4e08f 100644 --- a/public/content/translations/fa/defi/index.md +++ b/public/content/translations/fa/defi/index.md @@ -172,7 +172,7 @@ DeFi یک واژه‌ی کلی برای محصولات و خدمات مالی د برای این که بتوانید مثال پیش‌گفته را در نظام مالی سنتی دنیا انجام دهید، به مقدار بسیار زیادی پول نیاز دارید. این راهبردهای پول‌سازی تنها در دسترس افرادی هستند که سرمایه‌ی بسیار زیادی دارند. وام‌های لحظه‌ای نمونه‌ای از آینده‌ای هستند که داشتن پول از ملزومات پول درآوردن نخواهد بود. - + اطلاعات بیشتر درباره‌ی وام‌های لحظه‌ای From 5fb6cd66f65910383dc8dc495ddf4fe2bd81a071 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:09:45 +0100 Subject: [PATCH 006/227] fixed broken link --- public/content/translations/kn/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/kn/defi/index.md b/public/content/translations/kn/defi/index.md index 969b47dfa52..fcf03bc324a 100644 --- a/public/content/translations/kn/defi/index.md +++ b/public/content/translations/kn/defi/index.md @@ -171,7 +171,7 @@ Dai ಅಥವಾ USDCಯಂತಹ ನಾಣ್ಯಗಳು ಡಾಲರ್ನ ಸಾಂಪ್ರದಾಯಿಕ ಹಣಕಾಸು ಜಗತ್ತಿನಲ್ಲಿ ಮೇಲಿನ ಉದಾಹರಣೆಯನ್ನು ಮಾಡಲು, ನಿಮಗೆ ಅಪಾರ ಪ್ರಮಾಣದ ಹಣ ಬೇಕಾಗುತ್ತದೆ. ಈ ಹಣ ಮಾಡುವ ತಂತ್ರಗಳು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಸಂಪತ್ತನ್ನು ಹೊಂದಿರುವವರಿಗೆ ಮಾತ್ರ ಪ್ರವೇಶಿಸುತ್ತವೆ. ಫ್ಲ್ಯಾಶ್ ಸಾಲಗಳು ಭವಿಷ್ಯದ ಉದಾಹರಣೆಯಾಗಿದ್ದು, ಅಲ್ಲಿ ಹಣವನ್ನು ಹೊಂದಿರುವುದು ಹಣ ಸಂಪಾದಿಸಲು ಪೂರ್ವಾಪೇಕ್ಷಿತವಲ್ಲ. -[ಫ್ಲ್ಯಾಶ್ ಲೋನ್‍ಗಳ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು](https://aave.com/docs/concepts/flash-loans/) +[ಫ್ಲ್ಯಾಶ್ ಲೋನ್‍ಗಳ ಬಗ್ಗೆ ಇನ್ನಷ್ಟು](https://aave.com/docs/aave-v3/guides/flash-loans) From 4327e33da864260c5e9bcbb3203488f247423ea2 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:12:01 +0100 Subject: [PATCH 007/227] fixed broken link --- public/content/translations/sk/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/sk/defi/index.md b/public/content/translations/sk/defi/index.md index ce14c88e40d..69309b566b9 100644 --- a/public/content/translations/sk/defi/index.md +++ b/public/content/translations/sk/defi/index.md @@ -171,7 +171,7 @@ Pokiaľ by zásoby burzy B náhle poklesli a užívateľ nebol schopný kúpiť Aby ste mohli vykonať vyššie uvedený príklad v tradičnom finančnom systéme, potrebovali by ste obrovské množstvo peňazí. Tieto stratégie zarábania peňazí sú prístupné iba tým, ktorí sú už bohatí. Bleskové úvery sú príkladom budúcnosti, keď mať peniaze nie je nutne podmienkou pre ich zarábanie. - + Viac o bleskových úveroch From 4accb7ddfcafd2874a39414825c93ab3b8fc88b3 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:12:32 +0100 Subject: [PATCH 008/227] fix dead link --- public/content/translations/uz/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/uz/defi/index.md b/public/content/translations/uz/defi/index.md index cef789b23bf..56fede5b8ae 100644 --- a/public/content/translations/uz/defi/index.md +++ b/public/content/translations/uz/defi/index.md @@ -171,7 +171,7 @@ Agar birja B taklifi to‘satdan tushib ketsa va foydalanuvchi dastlabki kreditn An’anaviy moliya olamida yuqoridagi misolni amalga oshirish uchun sizga juda katta miqdordagi pul kerak bo‘ladi. Ushbu pul topish strategiyalari faqat mavjud boylikka ega bo‘lganlar uchun mavjud. Flesh kreditlar pulga ega bo‘lish pul topish uchun shart bo‘lmagan kelajakka misol bo‘la oladi. - + Flesh kreditlar haqida batafsil From ef18716bbc2133f25722f19d1f0b0c502a2f0949 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:12:59 +0100 Subject: [PATCH 009/227] fix dead link --- public/content/translations/id/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/id/defi/index.md b/public/content/translations/id/defi/index.md index 4c98bb9b246..c210293c32c 100644 --- a/public/content/translations/id/defi/index.md +++ b/public/content/translations/id/defi/index.md @@ -172,7 +172,7 @@ Jika pasokan bursa B menurun secara tiba-tiba dan pengguna tidak dapat membeli d Agar dapat melakukan contoh di atas dalam dunia keuangan tradisional, Anda akan membutuhkan jumlah yang sangat besar. Strategi penghasil uang ini hanya dapat dijangkau oleh mereka yang memiliki kekayaan. Pinjaman flash adalah sebuah contoh dari masa depan di mana kepemilikan sejumlah uang tidak harus merupakan prasyarat untuk menghasilkan uang. - + Lebih lanjut tentang pinjaman flash From cce8ccac4a76969d26725f34d53cc098cd5b5a37 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:13:42 +0100 Subject: [PATCH 010/227] fix dead link --- public/content/translations/es/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/es/defi/index.md b/public/content/translations/es/defi/index.md index 86f547a0a88..f8c69daf74d 100644 --- a/public/content/translations/es/defi/index.md +++ b/public/content/translations/es/defi/index.md @@ -172,7 +172,7 @@ Si la oferta de B cayera repentinamente y el usuario no pudiera comprar la canti Para hacer lo que describimos en el ejemplo de arriba pero en el mundo real necesitaría mucho dinero. Estas estrategias para hacer dinero solo son accesibles para aquellos que ya tienen dinero. Los préstamos flash son un ejemplo de un futuro en el que tener dinero no es necesariamente un requisito previo para ganar dinero. - + Más información sobre los préstamos flash From 5b93eefa510e6e16c529fcdeae596eefead6ee9b Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:14:11 +0100 Subject: [PATCH 011/227] fixed dead link --- public/content/translations/pl/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pl/defi/index.md b/public/content/translations/pl/defi/index.md index 9c577ac8cb4..fc26671868d 100644 --- a/public/content/translations/pl/defi/index.md +++ b/public/content/translations/pl/defi/index.md @@ -171,7 +171,7 @@ Gdyby podaż na giełdzie B nagle spadła i użytkownik nie byłby w stanie kupi Aby móc dokonać transakcji z powyższego przykładu to w tradycyjnym świecie finansowym, potrzebna jest ogromna kwota pieniędzy. Takie strategie finansowe są dostępne tylko dla posiadaczy ogromnego majątku. Pożyczki błyskawiczne pokazują, że w przyszłości takie strategie będą dostępne nie tylko dla najbogatszych uczestników rynku. - + Więcej o pożyczkach błyskawicznych From 238ee8594f52d9fa836794b25e582d6709226511 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:14:45 +0100 Subject: [PATCH 012/227] fix broken link --- public/content/translations/ro/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ro/defi/index.md b/public/content/translations/ro/defi/index.md index 55fd4f496eb..cb3684d1bff 100644 --- a/public/content/translations/ro/defi/index.md +++ b/public/content/translations/ro/defi/index.md @@ -171,7 +171,7 @@ Dacă oferta schimbului B ar scădea brusc și utilizatorul nu ar fi putut cump Pentru a putea realiza cele din exemplul de mai sus în lumea financiară tradițională, ați avea nevoie de o sumă enormă de bani. Aceste strategii producătoare de bani sunt accesibile doar celor care au deja o avere. Împrumuturile flash sunt un exemplu al unui viitor în care nu este o condiție prealabilă să aveți bani pentru a produce bani. -[Mai multe despre împrumuturile flash](https://aave.com/docs/concepts/flash-loans/) +[Mai multe despre împrumuturile flash](https://aave.com/docs/aave-v3/guides/flash-loans) From 54205c44aef449b820eb2ad32d6b0eeabb5937f0 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:15:27 +0100 Subject: [PATCH 013/227] fixed broken link --- public/content/translations/tl/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/tl/defi/index.md b/public/content/translations/tl/defi/index.md index 5db45061495..122f20517e5 100644 --- a/public/content/translations/tl/defi/index.md +++ b/public/content/translations/tl/defi/index.md @@ -171,7 +171,7 @@ Kung biglang bumaba ang supply ng exchange B at kulang ang binili ng user para s Para magawa ang halimbawa sa itaas sa tradisyonal na mundo ng pinansyal, kakailanganin mo ng napakalaking halaga ng pera. Ang mga may pera lang ang makakagamit ng mga pamamaraang ito ng pagkakapera. Ang mga flash loan ay halimbawa ng hinaharap kung saan hindi kailangang magkaroon ng pera para kumita ng pera. - + Iba pang detalye tungkol sa mga flash loan From 1d39264c514f3907f8be9780bdf4236096b65c83 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:17:02 +0100 Subject: [PATCH 014/227] fix broken link --- public/content/translations/de/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/de/defi/index.md b/public/content/translations/de/defi/index.md index 6308c6b85d0..794915bd28c 100644 --- a/public/content/translations/de/defi/index.md +++ b/public/content/translations/de/defi/index.md @@ -171,7 +171,7 @@ Gäbe es an Handelsplatz B kurzfristig zu wenig Angebot von Assets, wodurch Sie Um das obige Beispiel in der etablierten Finanzwelt umzusetzen, benötigten Sie sehr viel Geld. Diese Strategien des Geldverdienens sind jenen mit großem bestehenden Vermögen vorbehalten. Flash Loans sind ein Beispiel einer Zukunft, in der der Besitz von Geld nicht die Voraussetzung dafür ist, Geld zu verdienen. - + Mehr zu Flash Loans From ec3192cc7f521f5b98ab1e5c65798ce465a8d2bd Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:18:06 +0100 Subject: [PATCH 015/227] fixed dead link --- public/content/translations/hu/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/hu/defi/index.md b/public/content/translations/hu/defi/index.md index fe01dbe036f..1002c0d7757 100644 --- a/public/content/translations/hu/defi/index.md +++ b/public/content/translations/hu/defi/index.md @@ -171,7 +171,7 @@ Ha a B tőzsdén lévő kínálat hirtelen lezuhan, és a felhasználó nem tudo Ha a hagyományos pénzügyi világban szeretne ugyanilyen ügyletet végrehajtani, akkor hatalmas pénzösszegre van szüksége. Ezek a pénzkereső stratégiák csak azoknak elérhetők, akik már most is vagyonosak. A villámkölcsön egy olyan jövőt fest elénk, melyben a pénzcsinálásnak nem előfeltétele az, hogy az ember vagyonos legyen. - + Bővebben a villámkölcsönökről From 7b3a697eef3432000fc883978cc3c36f51b07bf0 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:18:34 +0100 Subject: [PATCH 016/227] fixed dead link --- public/content/translations/yo/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/yo/defi/index.md b/public/content/translations/yo/defi/index.md index b6c721dfb90..8bac389e8ad 100644 --- a/public/content/translations/yo/defi/index.md +++ b/public/content/translations/yo/defi/index.md @@ -171,7 +171,7 @@ Tí ipese pẹpẹ ìṣòwò B bá ṣubú lójijì, tí ó sì ṣeé ṣe ki Láti lè ṣe àpẹẹrẹ tó wà lókè nínú ayé ìṣúná ibile, wa nílò iye owó tó pọ̀ gan-an. Àwọn ilana riri owó yìí jẹ́ wiwọlé sí fun àwọn tó ní òrò tó wà tẹ́lẹ̀. Àwọn owó yíyá ojú ẹsẹ̀ jẹ apẹẹrẹ ti ọjọ iwaju nibiti nini owo kii ṣe pataki ṣaaju fun riri owo. - + Díẹ̀ síi lori àwọn owó yíyá ojú ẹsẹ̀ From 89d0eee7df7a163e312b3071fa491e119c2ef058 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:21:15 +0100 Subject: [PATCH 017/227] fixed dead link --- public/content/translations/uk/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/uk/defi/index.md b/public/content/translations/uk/defi/index.md index 53abe180e13..5d4fea7317d 100644 --- a/public/content/translations/uk/defi/index.md +++ b/public/content/translations/uk/defi/index.md @@ -171,7 +171,7 @@ Ethereum можна використовувати для потокового Щоб виконати наведений процес у світі традиційних фінансів, вам знадобиться величезна сума грошей. Подібні стратегії заробітку доступні лише заможним людям. Миттєві позики — це приклад того, як у майбутньому наявність коштів не буде обов’язковою умовою для заробітку. - + Докладніше про миттєві позики From 31ea361a839e609a0a9cc1301c8a034521cb217b Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:23:00 +0100 Subject: [PATCH 018/227] fix broken link --- public/content/translations/bn/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/bn/defi/index.md b/public/content/translations/bn/defi/index.md index 49c439e33a0..1efe048a601 100644 --- a/public/content/translations/bn/defi/index.md +++ b/public/content/translations/bn/defi/index.md @@ -171,7 +171,7 @@ Dai বা USDC-এর মতো কয়েনগুলির একটি ম প্রথাগত আর্থিক জগতে উপরের উদাহরণটি করতে সক্ষম হতে, আপনার প্রচুর পরিমাণ অর্থের প্রয়োজন হবে। এই অর্থ উপার্জন কৌশল শুধুমাত্র যাদের বিদ্যমান সম্পদ আছে তাদের অ্যাক্সেসযোগ্য। ফ্ল্যাশ লোন হল একটি ভবিষ্যতের উদাহরণ যেখানে অর্থ উপার্জনের জন্য অর্থ থাকা অপরিহার্য নয়। -[ফ্ল্যাশ লোন সম্পর্কে আরো](https://aave.com/docs/concepts/flash-loans/) +[ফ্ল্যাশ লোন সম্পর্কে আরো](https://aave.com/docs/aave-v3/guides/flash-loans) From 012923b6947b33cd59ddef56deed32323569c293 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:23:49 +0100 Subject: [PATCH 019/227] fix dead link --- public/content/translations/zh-tw/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/zh-tw/defi/index.md b/public/content/translations/zh-tw/defi/index.md index 4b33d807c74..18d7a3da28f 100644 --- a/public/content/translations/zh-tw/defi/index.md +++ b/public/content/translations/zh-tw/defi/index.md @@ -172,7 +172,7 @@ Dai、USDC 等穩定幣的價值和美元的差距通常維持在幾美分之內 要在傳統金融體系內完成以上操作,你需要鉅額資金。 這種財產創造策略只有已經擁有財富的人才能操作。 閃電貸的例子告訴我們,未來「有錢」不見得是「賺錢」的先決條件。 - + 深入了解閃電貸 From 1d063464e217ac8b796827d6cec02bf766f44057 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:24:22 +0100 Subject: [PATCH 020/227] fixed dead link --- public/content/translations/pt-br/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pt-br/defi/index.md b/public/content/translations/pt-br/defi/index.md index 868b0a60a1a..78293634eff 100644 --- a/public/content/translations/pt-br/defi/index.md +++ b/public/content/translations/pt-br/defi/index.md @@ -171,7 +171,7 @@ Se o estoque da exchange B cair de repente e o usuário não conseguir comprar o Para ser capaz de fazer o exemplo acima no mundo financeiro tradicional, você precisaria de uma quantidade enorme de dinheiro. Estas estratégias de fazer dinheiro só são acessíveis aos que já possuem economias. Os empréstimos rápidos são um exemplo do futuro em que possuir dinheiro não é necessariamente uma condição prévia para se fazer dinheiro. - + Mais sobre empréstimos rápidos From 1ec0bf7706db8d575c53d584efb8dc9dff90071b Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:25:06 +0100 Subject: [PATCH 021/227] fixed dead link --- public/content/translations/ha/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ha/defi/index.md b/public/content/translations/ha/defi/index.md index f39491e40cd..0549b6481f7 100644 --- a/public/content/translations/ha/defi/index.md +++ b/public/content/translations/ha/defi/index.md @@ -171,7 +171,7 @@ Idan musanya B darajar sa ya sauka haka kawai kuma mai asusun ya kasa siyan isas Don iya yin misalin da ke sama a cibiyar hada-hadar kuɗinmu na asali na duniya, kuna buƙatar kuɗaɗe masu yawa. Waɗannan tsalon yin kuɗi ana samun su ne kawai idan akwai wani kuɗi. Rance kamar walkiya misalai ne na zamanin da inda ba lallai sai ana da kuɗi za a sami kuɗi ba. - + Ƙari akan rancen flash From 311a0b16bf71535fb76416d26c88cd5312ec6eb4 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:25:54 +0100 Subject: [PATCH 022/227] fixed dead link --- public/content/translations/sl/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/sl/defi/index.md b/public/content/translations/sl/defi/index.md index 96004b94201..48543474c1c 100644 --- a/public/content/translations/sl/defi/index.md +++ b/public/content/translations/sl/defi/index.md @@ -161,7 +161,7 @@ Tako se v eni transakciji zgodi sledeče: Da bi zgoraj opisano transakcijo lahko izvedli v svetu tradicionalnih financ, bi potrebovali ogromno količino denarja. Takšne strategije za ustvarjanje denarja so dostopne le tistim z obstoječim bogastvom. Flash posojila so primer prihodnosti, kjer imeti denar, ni nujno predpogoj za ustvarjanje denarja. -[Več o flash posojilih](https://aave.com/docs/concepts/flash-loans/) +[Več o flash posojilih](https://aave.com/docs/aave-v3/guides/flash-loans) From 85a29c7e894dad8438bdb1b0d2d5f68df2571dea Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:26:21 +0100 Subject: [PATCH 023/227] fix broken link --- public/content/translations/pt/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pt/defi/index.md b/public/content/translations/pt/defi/index.md index 5b1b42334a3..851b7d9cf5b 100644 --- a/public/content/translations/pt/defi/index.md +++ b/public/content/translations/pt/defi/index.md @@ -171,7 +171,7 @@ Se a oferta do exchange B caísse subitamente e o utilizador não conseguisse co Para poder aplicar o exemplo anterior no mundo financeiro tradicional, seria necessária uma enorme quantidade de dinheiro. Estas estratégias para ganhar dinheiro só são acessíveis a quem já tem património. Os empréstimos instantâneos são um exemplo de um futuro em que ter dinheiro não é necessariamente um pré-requisito para ganhar dinheiro. -[Mais informações sobre empréstimos instantâneos](https://aave.com/docs/concepts/flash-loans/) +[Mais informações sobre empréstimos instantâneos](https://aave.com/docs/aave-v3/guides/flash-loans) From 4819f67e7bfd3808a0bf7e12beda0fe597e4ea30 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:26:51 +0100 Subject: [PATCH 024/227] fixed dead link --- public/content/translations/tr/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/tr/defi/index.md b/public/content/translations/tr/defi/index.md index 759aedebe0b..fb0fe6c0e04 100644 --- a/public/content/translations/tr/defi/index.md +++ b/public/content/translations/tr/defi/index.md @@ -171,7 +171,7 @@ B borsasının arzı aniden düşerse ve kullanıcı orijinal krediyi karşılay Yukarıdaki örneği geleneksel finans dünyasında yapabilmek için çok büyük miktarda paraya ihtiyacınız var. Bu para kazanma stratejilerine yalnızca önceden bir servete sahip olanlar erişebilir. Hızlı krediler, paraya sahip olmanın para kazanmak için mutlaka bir ön koşul olmadığı bir geleceğe bir örnektir. - + Hızlı krediler hakkında daha fazla bilgi From 79e7b68b0c5131d8b1c60260364efb25596c7684 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:30:20 +0100 Subject: [PATCH 025/227] fixed dead link --- public/content/translations/ru/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ru/defi/index.md b/public/content/translations/ru/defi/index.md index 64579bfeae4..e3fc8f94c33 100644 --- a/public/content/translations/ru/defi/index.md +++ b/public/content/translations/ru/defi/index.md @@ -171,7 +171,7 @@ Ethereum построен на этом. Как и в Bitcoin, правила н Чтобы выполнить приведенный выше пример в мире традиционных финансов, вам потребуется огромная сумма денег. Эти стратегии зарабатывания денег доступны только тем, у кого уже имеется большое благосостояние. Срочные займы являются примером будущего, в котором наличие денег не является обязательным условием для зарабатывания денег. - + Подробнее о срочных займах From 3ee7c6c9fd92b196d1f2fa35722eabd9e48f2bae Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:30:45 +0100 Subject: [PATCH 026/227] fix broken link --- public/content/translations/ca/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ca/defi/index.md b/public/content/translations/ca/defi/index.md index 9baf786684c..8b9545552d2 100644 --- a/public/content/translations/ca/defi/index.md +++ b/public/content/translations/ca/defi/index.md @@ -171,7 +171,7 @@ Si la disponibilitat del mercat B cau de sobte i l'usuari no pot comprar prou ac Per a poder dur a terme l'exemple anterior en les finances tradicionals, necessitaríeu una quantitat enorme de diners. Aquest tipus d'estratègies de negoci només estan disponibles per aquells que disposin d'una gran riquesa. Els préstecs ràpids són un exemple d'un futur on tenir diners no és necessàriament un prerequisit per a guanyar diners. -[Més sobre préstecs ràpids](https://aave.com/docs/concepts/flash-loans/) +[Més sobre préstecs ràpids](https://aave.com/docs/aave-v3/guides/flash-loans) From 2fe901c83b4afcb04f40cd7787be58feb8686af6 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:31:50 +0100 Subject: [PATCH 027/227] fix dead link --- public/content/translations/sr/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/sr/defi/index.md b/public/content/translations/sr/defi/index.md index 6c9879a06f5..75774d0075f 100644 --- a/public/content/translations/sr/defi/index.md +++ b/public/content/translations/sr/defi/index.md @@ -171,7 +171,7 @@ Ako bi potražnja menjačnice B naglo opala i korisnik ne može da kupi dovoljno Da biste mogli da izvedete gornji primer u tradicionalnom finansijskom svetu, bila bi vam potrebna ogromna količina novca. Ovakve strategije za pravljenje novca dostupne su samo onima koji već imaju bogatstvo. Brzi zajmovi su primer budućnosti u kojima posedovanje novca nije nužno uslov za zaradu novca. - + Više informacija o brzim zajmovima From 072e400a375b7b18a9ced11f9da3fa1c2ac3a3fa Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:32:16 +0100 Subject: [PATCH 028/227] fix dead link --- public/content/translations/vi/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/vi/defi/index.md b/public/content/translations/vi/defi/index.md index 46609c55010..aebbbbd3039 100644 --- a/public/content/translations/vi/defi/index.md +++ b/public/content/translations/vi/defi/index.md @@ -171,7 +171,7 @@ Nếu nguồn cung của sàn giao dịch B sụt giảm bất ngờ và ngườ Để có thể thực hiện ví dụ trên trong thế giới tài chính truyền thống, bạn sẽ cần một lượng tiền khổng lồ. Những chiến lược kiếm tiền kiểu này chỉ những người sở hữu sẵn tài sản mới có thể tiếp cận được. Các khoản vay nóng là ví dụ về một tương lai nơi mà việc có tiền không nhất thiết phải là một điều kiện tiên quyết cho việc kiếm tiền. - + Đọc thêm về các khoản vay nóng From 53ea9c412a931624351384b4284342aefce83977 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:33:12 +0100 Subject: [PATCH 029/227] fixed dead link --- public/content/translations/it/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/it/defi/index.md b/public/content/translations/it/defi/index.md index 6c9122e5518..9d2ae0086cd 100644 --- a/public/content/translations/it/defi/index.md +++ b/public/content/translations/it/defi/index.md @@ -172,7 +172,7 @@ Se l'offerta sulla piattaforma di scambio B cala improvvisamente, e l'utente non Per applicare l'esempio precedente nel mondo finanziario tradizionale, necessiteresti di un ingente importo di denaro. Queste strategie di guadagno sono accessibili soltanto a persone già ricche. I prestiti istantanei sono l'esempio ddi un futuro in cui possedere denaro non è necessariamente un prerequisito per guadagnare. - + Di più sui prestiti istantanei From ec4786b8a86f84faddc0ec7121db2b608ea38a83 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:33:38 +0100 Subject: [PATCH 030/227] fixed dead link --- public/content/translations/mr/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/mr/defi/index.md b/public/content/translations/mr/defi/index.md index c89e8cef142..7aa55254a30 100644 --- a/public/content/translations/mr/defi/index.md +++ b/public/content/translations/mr/defi/index.md @@ -171,7 +171,7 @@ Dai किंवा USDC सारख्या नाण्यांचे म पारंपारिक वित्त जगात वरील उदाहरण करण्यास सक्षम होण्यासाठी, तुम्हाला खूप मोठ्या रकमेची आवश्यकता असेल. पैसे कमावण्याच्या या रणनीती केवळ विद्यमान संपत्ती असलेल्यांनाच उपलब्ध आहेत. फ्लॅश लोन हे भविष्याचे एक उदाहरण आहे जिथे पैसे कमावण्‍यासाठी पैसे असणे ही एक पूर्व शर्त नाही. -[फ्लॅश कर्जावर अधिक](https://aave.com/docs/concepts/flash-loans/) +[फ्लॅश कर्जावर अधिक](https://aave.com/docs/aave-v3/guides/flash-loans) From 116ca87e136314870eb004fb91135b9cfa7c90ec Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:34:06 +0100 Subject: [PATCH 031/227] fix broken link --- public/content/translations/ko/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ko/defi/index.md b/public/content/translations/ko/defi/index.md index fc531f54032..eff3d768d69 100644 --- a/public/content/translations/ko/defi/index.md +++ b/public/content/translations/ko/defi/index.md @@ -171,7 +171,7 @@ summaryPoint3: 누구나 프로그래밍할 수 있는 오픈 소스 기술을 전형적인 금융 세계에서 위의 예시를 가능하게 하려면 엄청난 돈이 필요합니다. 이러한 돈벌이 전략은 기존의 부를 가진 사람들만이 접근할 수 있습니다. 플래시 론은 돈을 버는 것의 전제 조건이 돈을 소유하는 것이 아니라는 미래의 예시입니다. - + 플래시 론에 대해 더 보기 From fcab09078d0800401770ee25647a705804d73eab Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:34:35 +0100 Subject: [PATCH 032/227] fixed broken link --- public/content/translations/az/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/az/defi/index.md b/public/content/translations/az/defi/index.md index 815be25df11..9b60ab794f3 100644 --- a/public/content/translations/az/defi/index.md +++ b/public/content/translations/az/defi/index.md @@ -171,7 +171,7 @@ Beləliklə, bir əməliyyatda aşağıdakılar baş verir: Ənənəvi maliyyə dünyasında yuxarıdakı əməliyyatı yerinə yetirmək üçün sizə böyük miqdarda pul lazımdır. Bu pul qazanma strategiyaları yalnız mövcud sərvəti olanlar üçün əlçatandır. Flaş kreditləri, pula sahib olmağın mütləq pul qazanmaq üçün ilkin şərt olmadığı bir gələcəyin nümunəsidir. -[Flaş kreditləri haqqında daha çox](https://aave.com/docs/concepts/flash-loans/) +[Flaş kreditləri haqqında daha çox](https://aave.com/docs/aave-v3/guides/flash-loans) From e5bc9653002153021a6c522ade829882d14cf0a3 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:36:01 +0100 Subject: [PATCH 033/227] fix dead link --- public/content/translations/te/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/te/defi/index.md b/public/content/translations/te/defi/index.md index ca18d1ed606..88a86b57474 100644 --- a/public/content/translations/te/defi/index.md +++ b/public/content/translations/te/defi/index.md @@ -172,7 +172,7 @@ DeFi యొక్క సామర్థ్యాన్ని చూడటాన సాంప్రదాయ ఫైనాన్స్ ప్రపంచంలో పై ఉదాహరణను చేయడానికి, మీకు అపారమైన డబ్బు అవసరం. ఈ డబ్బు సంపాదించే వ్యూహాలు ప్రస్తుత సంపద ఉన్నవారికి మాత్రమే అందుబాటులో ఉంటాయి. ఫ్లాష్ లోన్‌లు భవిష్యత్తుకు ఉదాహరణగా చెప్పవచ్చు, ఇక్కడ డబ్బు సంపాదించడానికి తప్పనిసరిగా డబ్బు అవసరం లేదు. - + ఫ్లాష్ లోన్‌లపై మరిన్ని From 97ea5bc3a77574216bf739ae0cd883e144c24556 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:36:30 +0100 Subject: [PATCH 034/227] fixed broken link --- public/content/translations/ja/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ja/defi/index.md b/public/content/translations/ja/defi/index.md index 24fc738123f..fb74ec963bb 100644 --- a/public/content/translations/ja/defi/index.md +++ b/public/content/translations/ja/defi/index.md @@ -171,7 +171,7 @@ ETHを売却(課税対象)することなく、必要な資金を借り入れる 従来の金融の世界で上記の例を実行するには、莫大な資金が必要になります。 これらのお金儲けの戦略は、既存の富を持っている人にしかアクセスできません。 フラッシュローンは、お金を持っていることが必ずしもお金を稼ぐための前提条件ではないという未来の一例です。 - + フラッシュローンの詳細 From 004eeae3610b90199c71cb36f63601c0fb8573c1 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:37:01 +0100 Subject: [PATCH 035/227] fix broken link --- public/content/translations/cs/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/cs/defi/index.md b/public/content/translations/cs/defi/index.md index 11b28f0c8a3..790d2b6abb9 100644 --- a/public/content/translations/cs/defi/index.md +++ b/public/content/translations/cs/defi/index.md @@ -171,7 +171,7 @@ Pokud zásoby burzy B náhle poklesly a uživatel nebyl schopen koupit dostatek Abyste mohli provést výše uvedený příklad v tradičním finančním systému, potřebovali byste obrovské množství peněz. Tyto strategie vydělávání peněz jsou přístupné pouze těm, kteří jsou již bohatí. Bleskové úvěry jsou příkladem budoucnosti, kdy mít peníze není nutně podmínkou pro jejich vydělávání. - + Více o bleskových úvěrech From 095d28cbb42374f459747df183d7ae8503410473 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:38:20 +0100 Subject: [PATCH 036/227] fix dead link --- public/content/translations/nl/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/nl/defi/index.md b/public/content/translations/nl/defi/index.md index 5ca1b94e586..6cf18e1b4ed 100644 --- a/public/content/translations/nl/defi/index.md +++ b/public/content/translations/nl/defi/index.md @@ -171,7 +171,7 @@ Als het aanbod van exchange B plotseling afnam en de gebruiker niet genoeg kon k Om het bovenstaande voorbeeld in de traditionele financiële wereld te kunnen doen, zou u een enorme hoeveelheid geld nodig hebben. Deze strategieën voor het verdienen van geld zijn alleen toegankelijk voor mensen met bestaande rijkdom. Flash-leningen zijn een voorbeeld van een toekomst waarin het hebben van geld niet noodzakelijkerwijs een voorwaarde is voor het verdienen van geld. - + Meer over flash-leningen From 9e5e81d60b93a7236bc8ddbf6ffc18a98fe66de0 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:38:47 +0100 Subject: [PATCH 037/227] fix broken link --- public/content/translations/hi/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/hi/defi/index.md b/public/content/translations/hi/defi/index.md index 27a914c2beb..75c9ef8e65f 100644 --- a/public/content/translations/hi/defi/index.md +++ b/public/content/translations/hi/defi/index.md @@ -171,7 +171,7 @@ DeFi की क्षमता को देखने का एक सबसे उपरोक्त उदाहरण को पारंपरिक वित्त दुनिया में करने के लिए, आपको बड़ी मात्रा में धन की आवश्यकता होती है। ये पैसे कमाने की रणनीतियाँ केवल उन्हीं तक पहुँचती हैं जिनके पास पहले से ही धन है। फ्लैश ऋण एक ऐसे भविष्य का उदाहरण है जहाँ पैसे कमाने के लिए पैसे होना आवश्यक नहीं है। - + फ़्लैश ऋण पर अधिक जानकारी From 2a03d371b5bec3f82eee3e87680fa3a63ef87b67 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:39:21 +0100 Subject: [PATCH 038/227] fixed dead link --- public/content/translations/fr/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/fr/defi/index.md b/public/content/translations/fr/defi/index.md index 5da24736a9e..829b566a078 100644 --- a/public/content/translations/fr/defi/index.md +++ b/public/content/translations/fr/defi/index.md @@ -172,7 +172,7 @@ Si l'échange B chutait soudainement et que l'utilisateur n'était pas en mesure Pour pouvoir faire ce qui précède dans le monde de la finance traditionnelle, vous auriez besoin d'une somme d'argent énorme. Ces stratégies pour gagner de l'argent ne sont accessibles qu'à ceux qui possèdent déjà une certaine richesse. Les prêts Flash sont un exemple d'avenir où avoir de l'argent n'est pas nécessairement une condition préalable pour gagner de l'argent. - + Plus d'infos sur les prêts Flash From 825886b60d291496916e23ba197b8a7350eda77e Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:39:55 +0100 Subject: [PATCH 039/227] fix broken link --- public/content/translations/ms/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ms/defi/index.md b/public/content/translations/ms/defi/index.md index 210eb826dab..7b25caa8ada 100644 --- a/public/content/translations/ms/defi/index.md +++ b/public/content/translations/ms/defi/index.md @@ -171,7 +171,7 @@ Jika bekalan bursa B merosot secara tiba-tiba dan pengguna tidak dapat membeli c Untuk dapat melakukan contoh di atas dalam dunia kewangan tradisional, anda memerlukan sejumlah besar wang. Strategi menjana wang ini hanya boleh diakses oleh mereka yang mempunyai kekayaan sedia ada. Pinjaman kilat adalah contoh masa depan di mana mempunyai wang tidak semestinya prasyarat untuk membuat wang. - + Lebih lanjut mengenai pinjaman kilat From 6820f976a0bb78a350ab6f22720a98b84625bc60 Mon Sep 17 00:00:00 2001 From: Rebustron Date: Wed, 10 Dec 2025 11:40:57 +0100 Subject: [PATCH 040/227] fixed broken link --- public/content/translations/be/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/be/defi/index.md b/public/content/translations/be/defi/index.md index b3eb6d17ea3..815fe647c4d 100644 --- a/public/content/translations/be/defi/index.md +++ b/public/content/translations/be/defi/index.md @@ -171,7 +171,7 @@ Ethereum пабудаваны на гэтым. Як і ў выпадку Біт Каб зрабіць здзейсніць вышэйшы прыклад у свеце традыцыйных фінансаў, вам спатрэбіцца вялікая колькасць грошай. Гэтыя стратэгіі, накіраваныя на тое, каб зарабіць грошы, даступныя толькі тым, у каго ўжо накоплена вялікае багацце. Вокамгненныя пазыкі з'яўляюцца прыкладам будучыні, у якой наяўнасць грошай не з'яўляецца абавязковай умовай для таго, каб зарабіць іх. - + Дакладней пра вокамгненныя пазыкі From 5248dead3e8690a9461ad753bc15a36dbfb85d9b Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:08:28 +0000 Subject: [PATCH 041/227] Update homepage copy --- src/intl/en/page-index.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index 6a39822795c..8c7c08bd3b2 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -6,20 +6,20 @@ "page-index-activity-action-primary": "Enterprise Ethereum", "page-index-bento-header": "A new way to use the internet", "page-index-bento-assets-action": "More on NFTs", - "page-index-bento-assets-content": "Art, certificates or even real estate can be tokenized. Anything can be a tradable token. Ownership is public and verifiable.", + "page-index-bento-assets-content": "From art to real estate to stocks, any asset can be tokenized on Ethereum to prove and verify ownership digitally. Buy, sell, trade, and create assets and collectibles—anytime, anywhere.", "page-index-bento-assets-title": "The internet of assets", "page-index-bento-dapps-action": "Browse apps", - "page-index-bento-dapps-content": "Ethereum apps work without selling your data. Protect your privacy.", - "page-index-bento-dapps-title": "Innovative apps", + "page-index-bento-dapps-content": "Apps built on Ethereum work without selling your data. From social media to gaming to work, use the same account for every innovative app while maintaining privacy and access.", + "page-index-bento-dapps-title": "Apps that respect your privacy", "page-index-bento-defi-action": "Explore DeFi", - "page-index-bento-defi-content": "Billions can't open bank accounts or freely use their money. Ethereum's financial system is always open and unbiased.", - "page-index-bento-defi-title": "A fairer financial system", - "page-index-bento-networks-action": "Explore benefits", - "page-index-bento-networks-content": "Ethereum is the hub for blockchain innovation. The best projects are built on Ethereum.", + "page-index-bento-defi-content": "Borrow, lend, earn interest, and more, without a bank account. Ethereum's decentralized financial system is open 24/7 to anyone with an internet connection.", + "page-index-bento-defi-title": "A financial system open to all", + "page-index-bento-networks-action": "Discover Layer 2s", + "page-index-bento-networks-content": "Hundreds of Layer 2 networks are built on Ethereum. Enjoy low fees and near-instant transactions while benefiting from Ethereum's proven security.", "page-index-bento-networks-title": "The network of networks", "page-index-bento-stablecoins-action": "Discover stablecoins", - "page-index-bento-stablecoins-content": "Stablecoins are currencies that maintain stable value. Their price matches the U.S. dollar or other steady assets.", - "page-index-bento-stablecoins-title": "Crypto without volatility", + "page-index-bento-stablecoins-content": "Stablecoins are currencies that maintain a stable price, matched to steady assets like the U.S. dollar. Access global payments instantly or store value in digital dollars on Ethereum.", + "page-index-bento-stablecoins-title": "Digital cash for everyday use", "page-index-builders-action-primary": "Builder's Portal", "page-index-builders-action-secondary": "Documentation", "page-index-builders-description": "Ethereum is home to Web3's largest and most vibrant developer ecosystem. Use JavaScript and Python, or learn a smart contract language like Solidity or Vyper to write your own app.", From d45bb4fa8f93c94b9d21deda2c9ea061152b59b2 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:12:00 +0000 Subject: [PATCH 042/227] Update "Learn - Understand" section copy --- src/intl/en/page-index.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index 8c7c08bd3b2..ff11662160c 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -63,7 +63,7 @@ "page-index-join-action-twitter-description": "To keep up with our updates and important news.", "page-index-join-description": "This website is open source with hundreds of community contributors. You can propose edits to any of the content on this site.", "page-index-join-header": "Join ethereum.org", - "page-index-learn-description": "Crypto can feel overwhelming. Don't worry, these materials are designed to help you understand Ethereum in just a few minutes.", + "page-index-learn-description": "Ethereum is a decentralized blockchain network and software development platform, powered by the cryptocurrency ether (ETH). These resources are your gateway to confidently navigate, understand, and use Ethereum.", "page-index-learn-tag": "Learn", "page-index-learn-header": "Understand Ethereum", "page-index-meta-description": "Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.", @@ -75,9 +75,9 @@ "page-index-network-stats-total-value-held": "Total value held on Ethereum", "page-index-popular-topics-ethereum": "What is Ethereum?", "page-index-popular-topics-header": "Popular topics", - "page-index-popular-topics-action": "Other topics", + "page-index-popular-topics-action": "More guides in Ethereum Learn Hub", "page-index-popular-topics-roadmap": "Ethereum roadmap", - "page-index-popular-topics-start": "How to start, step by step", + "page-index-popular-topics-start": "Step-by-step Ethereum guides", "page-index-popular-topics-wallets": "What are crypto wallets?", "page-index-popular-topics-whitepaper": "Ethereum Whitepaper", "page-index-posts-action": "Read more on these websites", From fb9256cd5d6f4d5f9f4deb638b5861a8837244ba Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:16:23 +0000 Subject: [PATCH 043/227] Add description to data section --- app/[locale]/page.tsx | 5 ++++- src/intl/en/page-index.json | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index ec1513556dd..be2a636cff0 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -551,9 +551,12 @@ const Page = async ({ params }: { params: PageParams }) => { {t("page-index-activity-tag")} {t("page-index-activity-header")}
-

+

{t("page-index-activity-description")}

+

+ {t("page-index-activity-subtitle")} +

diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index ff11662160c..65b5192117e 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -1,5 +1,6 @@ { - "page-index-activity-description": "Activity from all Ethereum networks", + "page-index-activity-description": "Ethereum is the leading platform for issuing, managing, and settling digital assets. From tokenized money and financial instruments to real-world assets and emerging markets, Ethereum provides a secure, neutral foundation for the digital economy.", + "page-index-activity-subtitle": "Activity on Ethereum Mainnet and Layer-2 networks", "page-index-activity-tag": "Activity", "page-index-activity-header": "The strongest ecosystem", "page-index-activity-action": "More ecosystem resources", From 10f0a0efe2fb95ebec7475fda9f1b0256f1c5892 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:18:43 +0000 Subject: [PATCH 044/227] Update Enterprise link + redirect --- app/[locale]/page.tsx | 4 ++-- netlify.toml | 24 ++++++++++++++++++++++++ src/intl/en/page-index.json | 2 +- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index be2a636cff0..e17a7ef1afe 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -562,11 +562,11 @@ const Page = async ({ params }: { params: PageParams }) => {
{t("page-index-activity-action-primary")} diff --git a/netlify.toml b/netlify.toml index 66367090c2d..819f3684d68 100644 --- a/netlify.toml +++ b/netlify.toml @@ -38,5 +38,29 @@ [[plugins.inputs.audits]] path = "en/developers/tutorials/creating-a-wagmi-ui-for-your-contract/" +[[redirects]] + from = "/:locale/enterprise/" + to = "https://institutions.ethereum.org/" + status = 301 + force = true + +[[redirects]] + from = "/:locale/enterprise" + to = "https://institutions.ethereum.org/" + status = 301 + force = true + +[[redirects]] + from = "/enterprise/" + to = "https://institutions.ethereum.org/" + status = 301 + force = true + +[[redirects]] + from = "/enterprise" + to = "https://institutions.ethereum.org/" + status = 301 + force = true + [functions] included_files = ["i18n.config.json", "src/intl/**/*", "src/data/mocks/**/*"] diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index 65b5192117e..2794b62f191 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -4,7 +4,7 @@ "page-index-activity-tag": "Activity", "page-index-activity-header": "The strongest ecosystem", "page-index-activity-action": "More ecosystem resources", - "page-index-activity-action-primary": "Enterprise Ethereum", + "page-index-activity-action-primary": "Ethereum for Institutions", "page-index-bento-header": "A new way to use the internet", "page-index-bento-assets-action": "More on NFTs", "page-index-bento-assets-content": "From art to real estate to stocks, any asset can be tokenized on Ethereum to prove and verify ownership digitally. Buy, sell, trade, and create assets and collectibles—anytime, anywhere.", From f3e5ff5eb9c504747d1f66c550f2976dddec5dde Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:43:12 +0000 Subject: [PATCH 045/227] Added "What is Ethereum" section and removed "Ethereum.org community" section --- app/[locale]/page.tsx | 202 ++++++++++++------------------------ src/intl/en/page-index.json | 11 +- 2 files changed, 79 insertions(+), 134 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index e17a7ef1afe..cb321e6df3d 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -14,6 +14,7 @@ import { CodeExample } from "@/lib/interfaces" import ActivityStats from "@/components/ActivityStats" import FusakaBanner from "@/components/Banners/FusakaBanner" import { ChevronNext } from "@/components/Chevron" +import EthPriceCard from "@/components/EthPriceCard" import HomeHero from "@/components/Hero/HomeHero" import BentoCard from "@/components/Homepage/BentoCard" import CodeExamples from "@/components/Homepage/CodeExamples" @@ -22,8 +23,6 @@ import { getBentoBoxItems } from "@/components/Homepage/utils" import ValuesMarqueeFallback from "@/components/Homepage/ValuesMarquee/Fallback" import BlockHeap from "@/components/icons/block-heap.svg" import BuildAppsIcon from "@/components/icons/build-apps.svg" -import Calendar from "@/components/icons/calendar.svg" -import CalendarAdd from "@/components/icons/calendar-add.svg" import Discord from "@/components/icons/discord.svg" import EthGlyphIcon from "@/components/icons/eth-glyph.svg" import EthTokenIcon from "@/components/icons/eth-token.svg" @@ -58,7 +57,6 @@ import { SectionTag, } from "@/components/ui/section" import { Skeleton, SkeletonCardGrid } from "@/components/ui/skeleton" -import WindowBox from "@/components/WindowBox" import { parseAppsOfTheWeek } from "@/lib/utils/apps" import { cn } from "@/lib/utils/cn" @@ -75,7 +73,6 @@ import { BASE_TIME_UNIT, BLOG_FEEDS, BLOGS_WITHOUT_FEED, - CALENDAR_DISPLAY_COUNT, DEFAULT_LOCALE, GITHUB_REPO_URL, LOCALES_CODES, @@ -170,7 +167,6 @@ const Page = async ({ params }: { params: PageParams }) => { { totalEthStaked }, totalValueLocked, growThePieData, - communityEvents, attestantPosts, xmlBlogs, appsData, @@ -415,14 +411,6 @@ const Page = async ({ params }: { params: PageParams }) => { } const metrics = await getActivity(metricResults, locale) - const calendar = communityEvents.upcomingEventData - .sort((a, b) => { - const dateA = isValidDate(a.date) ? new Date(a.date).getTime() : -Infinity - const dateB = isValidDate(b.date) ? new Date(b.date).getTime() : -Infinity - return dateA - dateB - }) - .slice(0, CALENDAR_DISPLAY_COUNT) - // RSS feed items const polishedRssItems = polishRSSList([attestantPosts, ...xmlBlogs], locale) const rssItems = polishedRssItems.slice(0, RSS_DISPLAY_COUNT) @@ -479,6 +467,61 @@ const Page = async ({ params }: { params: PageParams }) => { )}
+ {/* What is Ethereum */} +
+
+

+ {t("page-index-what-is-ethereum-title")} +

+
+

{t("page-index-what-is-ethereum-description-1")}

+

{t("page-index-what-is-ethereum-description-2")}

+
+
+ + {t("page-index-what-is-ethereum-action")} + +
+
+
+ + {/* What is Ether (ETH) */} +
+
+

+ {t("page-index-what-is-ether-title")} +

+
+ +
+
+

{t("page-index-what-is-ether-description-1")}

+

{t("page-index-what-is-ether-description-2")}

+
+
+ + {t("page-index-what-is-ether-action")} + +
+
+
+ {/* Use Cases - A new way to use the internet */}
{
- {/* Ethereum.org community - Built by the community */} -
- - - - - - {t("page-index-community-tag")} - {t("page-index-community-header")} -
-

{t("page-index-community-description-1")}

-

{t("page-index-community-description-2")}

-

{t("page-index-community-description-3")}

-
-
- - {t("page-index-community-action")} - -
- - - - - - -
-
-
- - {calendar.length > 0 ? ( - calendar.map(({ date, title, calendarLink }) => { - const customEventOptions = { - eventCategory, - eventAction: "Community Events Widget", - eventName: "upcoming", - } - return ( -
-
- - {title} - -

- {new Intl.DateTimeFormat(locale, { - month: "long", - day: "2-digit", - year: "numeric", - hour: "numeric", - minute: "numeric", - }).format(new Date(date))} -

-
- - {t("page-index-calendar-add")} - -
- ) - }) - ) : ( -
- {t("page-index-calendar-fallback")} -
- )} -
-
-
-
- {/* Recent posts */}

@@ -997,6 +920,19 @@ const Page = async ({ params }: { params: PageParams }) => { ) )}

+
+ + {t("page-index-join-action-hub")} + +
diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index 2794b62f191..a6d597ac1d1 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -62,9 +62,18 @@ "page-index-join-action-discord-description": "To ask questions, coordinate contribution and join community calls.", "page-index-join-action-github-description": "Contribute to code, design, articles, etc.", "page-index-join-action-twitter-description": "To keep up with our updates and important news.", - "page-index-join-description": "This website is open source with hundreds of community contributors. You can propose edits to any of the content on this site.", + "page-index-join-description": "The ethereum.org website is built and maintained by thousands of translators, coders, designers, copywriters, and community members. You can propose edits to any of the content on this open source site.", "page-index-join-header": "Join ethereum.org", + "page-index-join-action-hub": "ethereum.org contributor hub", "page-index-learn-description": "Ethereum is a decentralized blockchain network and software development platform, powered by the cryptocurrency ether (ETH). These resources are your gateway to confidently navigate, understand, and use Ethereum.", + "page-index-what-is-ethereum-title": "What is Ethereum?", + "page-index-what-is-ethereum-description-1": "Ethereum is a decentralized, open source blockchain network and software development platform, powered by the cryptocurrency ether (ETH). Ethereum is the secure, global foundation for a new generation of unstoppable applications.", + "page-index-what-is-ethereum-description-2": "The Ethereum network is open to everyone: no permission is required. It has no owner, and is built and maintained by thousands of people, organizations, and users around the world.", + "page-index-what-is-ethereum-action": "Learn about Ethereum", + "page-index-what-is-ether-title": "What is ether (ETH)?", + "page-index-what-is-ether-description-1": "Ether (ETH) is the native cryptocurrency that powers the Ethereum network, used to pay transaction fees and secure the blockchain through staking.", + "page-index-what-is-ether-description-2": "Beyond its technical role, ETH is open, programmable digital money. It is used for global payments, as collateral for loans, and as a store of value that doesn't rely on any central entity.", + "page-index-what-is-ether-action": "Learn about ETH", "page-index-learn-tag": "Learn", "page-index-learn-header": "Understand Ethereum", "page-index-meta-description": "Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.", From c15cfb4ca45cef4e1e83de005445f89190c3d5ef Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 18:55:14 +0000 Subject: [PATCH 046/227] Remove unused imports for community events --- app/[locale]/page.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index cb321e6df3d..f2868766b04 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -84,7 +84,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" @@ -143,7 +142,6 @@ const loadData = dataLoader( ["beaconchainEpoch", fetchBeaconchainEpoch], ["totalValueLocked", fetchTotalValueLocked], ["growThePieData", fetchGrowThePie], - ["communityEvents", fetchCommunityEvents], ["attestantPosts", fetchAttestantPosts], ["rssData", fetchXmlBlogFeeds], ["appsData", fetchApps], From 1e1cfd8598b329297c33a9552091255ff3baf5e6 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 22:21:30 +0000 Subject: [PATCH 047/227] Update navigation (remove SVGs) --- src/components/Nav/Menu/SubMenu.tsx | 10 +--- src/components/Nav/useNavigation.ts | 80 +---------------------------- 2 files changed, 3 insertions(+), 87 deletions(-) diff --git a/src/components/Nav/Menu/SubMenu.tsx b/src/components/Nav/Menu/SubMenu.tsx index 72e4c543da1..eeaaacb9425 100644 --- a/src/components/Nav/Menu/SubMenu.tsx +++ b/src/components/Nav/Menu/SubMenu.tsx @@ -59,7 +59,7 @@ const SubMenu = ({ lvl, items, activeSection, onClose }: LvlContentProps) => { {items.map((item) => { - const { label, icon: Icon, ...action } = item + const { label, ...action } = item const subItems = action.items || [] const isLink = "href" in action const isActivePage = isLink && cleanPath(asPath) === action.href @@ -86,10 +86,6 @@ const SubMenu = ({ lvl, items, activeSection, onClose }: LvlContentProps) => { asChild > - {lvl === 1 && Icon ? ( - - ) : null} - @@ -98,10 +94,6 @@ const SubMenu = ({ lvl, items, activeSection, onClose }: LvlContentProps) => { <> diff --git a/src/components/Nav/useNavigation.ts b/src/components/Nav/useNavigation.ts index 40aff11cad8..ec8294f27ea 100644 --- a/src/components/Nav/useNavigation.ts +++ b/src/components/Nav/useNavigation.ts @@ -1,23 +1,4 @@ -import BookIcon from "@/components/icons/book.svg" -import BuildingsIcon from "@/components/icons/buildings.svg" -import CodeSquareIcon from "@/components/icons/code-square.svg" -import CompassIcon from "@/components/icons/compass.svg" -import EthereumIcon from "@/components/icons/ethereum-icon.svg" -import FlagIcon from "@/components/icons/flag.svg" -import Flask from "@/components/icons/flask.svg" -import JournalCodeIcon from "@/components/icons/journal-code.svg" -import LayersIcon from "@/components/icons/layers.svg" -import LightbulbIcon from "@/components/icons/lightbulb.svg" -import MegaphoneIcon from "@/components/icons/megaphone.svg" -import MortarboardIcon from "@/components/icons/mortarboard.svg" -import PinAngleIcon from "@/components/icons/pin-angle.svg" -import SafeIcon from "@/components/icons/safe.svg" -import SignpostIcon from "@/components/icons/signpost.svg" -import SlidersHorizontalCircles from "@/components/icons/sliders-horizontal-circles.svg" -import UiChecksGridIcon from "@/components/icons/ui-checks-grid.svg" -import UsersFourLight from "@/components/icons/users-four-light.svg" - -import type { NavItem, NavSections } from "./types" +import type { NavSections } from "./types" import useTranslation from "@/hooks/useTranslation" import { buildNavigation } from "@/lib/nav/buildNavigation" @@ -27,62 +8,5 @@ export const useNavigation = () => { const linkSections: NavSections = buildNavigation(t) - const iconById: Record = { - "learn/overview": CompassIcon, - "learn/basics": UiChecksGridIcon, - "learn/advanced": SlidersHorizontalCircles, - "learn/quizzes": MortarboardIcon, - "use/get-started": PinAngleIcon, - "use/use-cases": LightbulbIcon, - "use/stake": SafeIcon, - "use/networks": LayersIcon, - "build/home": CodeSquareIcon, - "build/get-started": FlagIcon, - "build/docs": JournalCodeIcon, - "build/business": BuildingsIcon, - "participate/community-hub": UsersFourLight, - "participate/events": MegaphoneIcon, - "participate/ethereum-org": EthereumIcon, - "research/whitepaper": BookIcon, - "research/roadmap": SignpostIcon, - "research/research": Flask, - } - - const applyIconsToItems = (items: NavItem[]): NavItem[] => - items.map((item) => { - const icon = item.id ? iconById[item.id] : undefined - if ("items" in item && item.items) { - return { - ...item, - ...(icon ? { icon } : {}), - items: applyIconsToItems(item.items), - } - } - return { ...item, ...(icon ? { icon } : {}) } as NavItem - }) - - const linkSectionsWithIcons: NavSections = { - learn: { - ...linkSections.learn, - items: applyIconsToItems(linkSections.learn.items), - }, - use: { - ...linkSections.use, - items: applyIconsToItems(linkSections.use.items), - }, - build: { - ...linkSections.build, - items: applyIconsToItems(linkSections.build.items), - }, - participate: { - ...linkSections.participate, - items: applyIconsToItems(linkSections.participate.items), - }, - research: { - ...linkSections.research, - items: applyIconsToItems(linkSections.research.items), - }, - } - - return { linkSections: linkSectionsWithIcons } + return { linkSections } } From 650d050a35b862c2c78dec290a531305d823b413 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 22:24:53 +0000 Subject: [PATCH 048/227] Update design --- app/[locale]/page.tsx | 44 ++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index f2868766b04..50fcd63fe5b 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -467,15 +467,17 @@ const Page = async ({ params }: { params: PageParams }) => { {/* What is Ethereum */}
-
-

- {t("page-index-what-is-ethereum-title")} -

-
-

{t("page-index-what-is-ethereum-description-1")}

-

{t("page-index-what-is-ethereum-description-2")}

+ +
+ + {t("page-index-what-is-ethereum-title")} + +
+

{t("page-index-what-is-ethereum-description-1")}

+

{t("page-index-what-is-ethereum-description-2")}

+
-
+
{ {t("page-index-what-is-ethereum-action")}
-
+
{/* What is Ether (ETH) */}
-
-

- {t("page-index-what-is-ether-title")} -

-
- -
-
-

{t("page-index-what-is-ether-description-1")}

-

{t("page-index-what-is-ether-description-2")}

+ +
+ + {t("page-index-what-is-ether-title")} + + +
+

{t("page-index-what-is-ether-description-1")}

+

{t("page-index-what-is-ether-description-2")}

+
-
+
{ {t("page-index-what-is-ether-action")}
-
+
{/* Use Cases - A new way to use the internet */} From d2c58662631bfa1a3fa7ac6ce8cda2b8436d2c20 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Wed, 10 Dec 2025 22:34:12 +0000 Subject: [PATCH 049/227] Add Schema.org structured data markup for search engines --- src/components/ActivityStats/index.tsx | 11 ++++++++++- src/components/BigNumber/index.tsx | 10 ++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/components/ActivityStats/index.tsx b/src/components/ActivityStats/index.tsx index 92b94db6702..69c7fdbb1dd 100644 --- a/src/components/ActivityStats/index.tsx +++ b/src/components/ActivityStats/index.tsx @@ -16,7 +16,16 @@ const ActivityStats = async ({ metrics, className }: ActivityStatsProps) => { "xl:ps-8", ] return ( -
+
+ + {metrics.map(({ label, apiProvider, apiUrl, state }, idx) => ( {value ? ( <> -
+
{value}
- {children} + {children} {sourceName && sourceUrl && ( <>   From 4af12fa16eebc556541620989a63c4a4ba7012a7 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Thu, 11 Dec 2025 09:35:39 -0300 Subject: [PATCH 050/227] fix: growthepie endpoint breaking changes --- src/lib/api/fetchGrowThePieBlockspace.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lib/api/fetchGrowThePieBlockspace.ts b/src/lib/api/fetchGrowThePieBlockspace.ts index 4a6797ca1ed..d6ac8906bb4 100644 --- a/src/lib/api/fetchGrowThePieBlockspace.ts +++ b/src/lib/api/fetchGrowThePieBlockspace.ts @@ -13,8 +13,8 @@ export const fetchGrowThePieBlockspace = async () => { const data = await response.json() blockspaceData[network.growthepieID] = { - nft: data.overview["30d"].nft.data[4], - defi: data.overview["30d"].defi.data[4], + nft: data.overview["30d"].collectibles.data[4], + defi: data.overview["30d"].finance.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], From 32cfa101de9105a084c05b401c09c6bfe7dac636 Mon Sep 17 00:00:00 2001 From: Jakub <100724231+konopkja@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:04:52 +0100 Subject: [PATCH 051/227] Update index.md --- public/content/roadmap/fusaka/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/content/roadmap/fusaka/index.md b/public/content/roadmap/fusaka/index.md index fbc6435bbb0..3f4738dea07 100644 --- a/public/content/roadmap/fusaka/index.md +++ b/public/content/roadmap/fusaka/index.md @@ -6,9 +6,9 @@ lang: en # Fusaka {#fusaka} -The Fusaka network upgrade follows [Pectra](/roadmap/pectra/) and brings more new features and improves the experience for every Ethereum user and developer. The name consists of the execution layer upgrade Osaka and the consensus layer version named after the Fulu star. Both parts of Ethereum receive an upgrade that pushes Ethereum scaling, security and user experience to the future. +**Ethereum's highly anticipated Fusaka upgrade went live on December 3, 2025** -This upgrade is planned for Q4 2025. +The Fusaka network upgrade follows [Pectra](/roadmap/pectra/) and brings more new features and improves the experience for every Ethereum user and developer. The name consists of the execution layer upgrade Osaka and the consensus layer version named after the Fulu star. Both parts of Ethereum receive an upgrade that pushes Ethereum scaling, security and user experience to the future. From 48ce4bfc0c85e7323b5851f313e88d4bd6cd1e71 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:24:33 +0000 Subject: [PATCH 052/227] Styling updates --- app/[locale]/page.tsx | 192 ++++++++---------- src/components/EthPriceSimple.tsx | 106 ++++++++++ .../Homepage/HomepageSectionImage.tsx | 8 + src/components/Homepage/utils.ts | 10 +- src/intl/en/page-index.json | 6 +- tailwind.config.ts | 2 +- 6 files changed, 209 insertions(+), 115 deletions(-) create mode 100644 src/components/EthPriceSimple.tsx diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 50fcd63fe5b..622f6964efa 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -14,7 +14,7 @@ import { CodeExample } from "@/lib/interfaces" import ActivityStats from "@/components/ActivityStats" import FusakaBanner from "@/components/Banners/FusakaBanner" import { ChevronNext } from "@/components/Chevron" -import EthPriceCard from "@/components/EthPriceCard" +import EthPriceSimple from "@/components/EthPriceSimple" import HomeHero from "@/components/Hero/HomeHero" import BentoCard from "@/components/Homepage/BentoCard" import CodeExamples from "@/components/Homepage/CodeExamples" @@ -466,18 +466,25 @@ const Page = async ({ params }: { params: PageParams }) => {
{/* What is Ethereum */} -
- -
- - {t("page-index-what-is-ethereum-title")} - -
-

{t("page-index-what-is-ethereum-description-1")}

-

{t("page-index-what-is-ethereum-description-2")}

-
+
+ + + + + + {t("page-index-network-tag")} + + {t("page-index-what-is-ethereum-title")} + +
+

{t("page-index-what-is-ethereum-description-1")}

+

{t("page-index-what-is-ethereum-description-2")}

-
+
{ {t("page-index-what-is-ethereum-action")}
- -
- {/* What is Ether (ETH) */} -
- -
- - {t("page-index-what-is-ether-title")} - - -
-

{t("page-index-what-is-ether-description-1")}

-

{t("page-index-what-is-ether-description-2")}

+ {/* Popular topics */} +
+

+ {t("page-index-popular-topics-header")} +

+
+ {popularTopics + .filter((topic) => topic.href !== "/what-is-ethereum/") + .map(({ label, Svg, href, eventName, className }) => ( + :first-child]:flex-row", + className + )} + customEventOptions={{ + eventCategory, + eventAction: "popular topics", + eventName, + }} + > +

+ {label} +

+
+ ))}
-
- - {t("page-index-what-is-ether-action")} - -
@@ -531,10 +540,7 @@ const Page = async ({ params }: { params: PageParams }) => { )} >
{t("page-index-use-cases-tag")} @@ -561,6 +567,38 @@ const Page = async ({ params }: { params: PageParams }) => { ))}
+ {/* What is ETH */} +
+ + + + + + {t("page-index-token-tag")} + + {t("page-index-what-is-ether-title")} + + +
+

{t("page-index-what-is-ether-description-1")}

+

{t("page-index-what-is-ether-description-2")}

+
+
+ + {t("page-index-what-is-ether-action")} + +
+
+
+ {/* Apps of the week - Discover the best apps on Ethereum */} {/* // TODO: Remove locale restriction after translation */} {locale === DEFAULT_LOCALE && ( @@ -585,7 +623,11 @@ const Page = async ({ params }: { params: PageParams }) => { )} {/* Activity - The strongest ecosystem */} -
+
@@ -632,70 +674,6 @@ const Page = async ({ params }: { params: PageParams }) => {
- {/* Learn - Understand Ethereum */} -
- - - - - - {t("page-index-learn-tag")} - {t("page-index-learn-header")} -
-

{t("page-index-learn-description")}

-
-

- {t("page-index-popular-topics-header")} -

-
- {popularTopics.map( - ({ label, Svg, href, eventName, className }) => ( - :first-child]:flex-row", - className - )} - customEventOptions={{ - eventCategory, - eventAction: "popular topics", - eventName, - }} - > -

- {label} -

-
- ) - )} -
-
- - {t("page-index-popular-topics-action")} - -
-
-
-
-
- {/* Values - The Internet Is Changing */}
diff --git a/src/components/EthPriceSimple.tsx b/src/components/EthPriceSimple.tsx new file mode 100644 index 00000000000..78daecf1f18 --- /dev/null +++ b/src/components/EthPriceSimple.tsx @@ -0,0 +1,106 @@ +"use client" + +import { useEffect, useState } from "react" +import { Info } from "lucide-react" +import { useLocale } from "next-intl" + +import type { LoadingState } from "@/lib/types" + +import Tooltip from "@/components/Tooltip" +import InlineLink from "@/components/ui/Link" + +import { cn } from "@/lib/utils/cn" + +import { useTranslation } from "@/hooks/useTranslation" + +type EthPriceResponse = { + ethereum: { + usd: string + } +} + +type EthPriceState = { + currentPriceUSD: string +} + +const EthPriceSimple = ({ + className, + ...props +}: React.HTMLAttributes) => { + const locale = useLocale() + const { t } = useTranslation() + const [state, setState] = useState>({ + loading: true, + }) + + useEffect(() => { + const fetchData = async () => { + try { + const response = await fetch( + "https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd" + ) + if (!response.ok) throw new Error(response.statusText) + const data: EthPriceResponse = await response.json() + if (data && data.ethereum) { + const currentPriceUSD = data.ethereum.usd + setState({ + loading: false, + data: { currentPriceUSD }, + }) + } + } catch (error: unknown) { + error instanceof Error && console.error(error.message) + setState({ + loading: false, + error, + }) + } + } + fetchData() + }, []) + + const hasError = "error" in state + + const formatPrice = (price: string) => + new Intl.NumberFormat(locale, { + style: "currency", + currency: "USD", + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(+price) + + const getPriceString = (): string => { + if (state.loading) return t("loading") + if (hasError) return t("loading-error-refresh") + return formatPrice(state.data.currentPriceUSD) + } + + const price = getPriceString() + + const tooltipContent = ( +
+ {t("data-provided-by")}{" "} + + coingecko.com + +
+ ) + + return ( +
+
+ {price} +
+
+ {t("eth-current-price")} + + + +
+
+ ) +} + +export default EthPriceSimple diff --git a/src/components/Homepage/HomepageSectionImage.tsx b/src/components/Homepage/HomepageSectionImage.tsx index 875d1cc4a3e..e5a6a945139 100644 --- a/src/components/Homepage/HomepageSectionImage.tsx +++ b/src/components/Homepage/HomepageSectionImage.tsx @@ -21,6 +21,14 @@ const imageMap: Record< desktop: StaticImageData } > = { + "what-is-ethereum": { + mobile: learnHubHero, + desktop: learnHubHeroPortrait, + }, + "what-is-ether": { + mobile: quizzesHubHero, + desktop: quizzesHubHeroPortrait, + }, activity: { mobile: layerTwoHubHero, desktop: layerTwoHubHeroPortrait, diff --git a/src/components/Homepage/utils.ts b/src/components/Homepage/utils.ts index 30ea54550c2..94b1c181c43 100644 --- a/src/components/Homepage/utils.ts +++ b/src/components/Homepage/utils.ts @@ -86,11 +86,11 @@ const stylesByPosition: Record = { cn("lg:col-span-6 lg:row-start-4", flow.lg.down), ], xl: [ - cn("xl:col-span-7 xl:col-start-5 xl:row-start-1", flow.xl.right), - cn("xl:col-span-4 xl:col-start-2 xl:row-start-2", flow.xl.up), - cn("xl:col-span-3 xl:col-start-6 xl:row-start-2", flow.xl.down), - cn("xl:col-span-3 xl:col-start-9 xl:row-span-2 xl:row-start-2", flow.xl.up), - cn("xl:col-span-7 xl:col-start-2 xl:row-start-3", flow.xl.right), + cn("xl:col-span-8 xl:col-start-5 xl:row-start-1", flow.xl.right), + cn("xl:col-span-4 xl:row-start-2", flow.xl.up), + cn("xl:col-span-4 xl:col-start-5 xl:row-start-2", flow.xl.down), + cn("xl:col-span-4 xl:col-start-9 xl:row-span-2 xl:row-start-2", flow.xl.up), + cn("xl:col-span-8 xl:row-start-3", flow.xl.right), ], } diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index a6d597ac1d1..8ad076f70de 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -70,11 +70,13 @@ "page-index-what-is-ethereum-description-1": "Ethereum is a decentralized, open source blockchain network and software development platform, powered by the cryptocurrency ether (ETH). Ethereum is the secure, global foundation for a new generation of unstoppable applications.", "page-index-what-is-ethereum-description-2": "The Ethereum network is open to everyone: no permission is required. It has no owner, and is built and maintained by thousands of people, organizations, and users around the world.", "page-index-what-is-ethereum-action": "Learn about Ethereum", - "page-index-what-is-ether-title": "What is ether (ETH)?", + "page-index-what-is-ether-title": "What is ETH?", "page-index-what-is-ether-description-1": "Ether (ETH) is the native cryptocurrency that powers the Ethereum network, used to pay transaction fees and secure the blockchain through staking.", "page-index-what-is-ether-description-2": "Beyond its technical role, ETH is open, programmable digital money. It is used for global payments, as collateral for loans, and as a store of value that doesn't rely on any central entity.", - "page-index-what-is-ether-action": "Learn about ETH", + "page-index-what-is-ether-action": "Learn more about Ether", "page-index-learn-tag": "Learn", + "page-index-network-tag": "Network", + "page-index-token-tag": "Token", "page-index-learn-header": "Understand Ethereum", "page-index-meta-description": "Ethereum is a global, decentralized platform for money and new kinds of applications. On Ethereum, you can write code that controls money, and build applications accessible anywhere in the world.", "page-index-meta-title": "Ethereum.org: The complete guide to Ethereum", diff --git a/tailwind.config.ts b/tailwind.config.ts index 8e6e4cef472..6dd66724aea 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -329,7 +329,7 @@ const config = { "4xl": "2rem" /* 32px */, }, gridTemplateColumns: { - bento: "2rem repeat(10, 1fr) 2rem", + bento: "repeat(12, 1fr)", }, textUnderlineOffset: { 3: "3px", From 51aba4574fe7983c54b4bbfe732109efa482475a Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 11 Dec 2025 16:30:09 +0000 Subject: [PATCH 053/227] Update headings --- src/intl/en/page-index.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index 8ad076f70de..60f347d4b8d 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -54,7 +54,7 @@ "page-index-developers-code-example-title-3": "An open, permissionless DNS", "page-index-developers-code-examples": "Code examples", "page-index-events-action": "See all events", - "page-index-events-header": "Events", + "page-index-events-header": "Ethereum events", "page-index-events-subtitle": "Ethereum communities host events all around the globe, all year long", "page-index-hero-image-alt": "An illustration of a futuristic city, representing the Ethereum ecosystem.", "page-index-join-action-contribute-description": "Find out all the different ways you can help ethereum.org grow and be better.", @@ -93,7 +93,7 @@ "page-index-popular-topics-wallets": "What are crypto wallets?", "page-index-popular-topics-whitepaper": "Ethereum Whitepaper", "page-index-posts-action": "Read more on these websites", - "page-index-posts-header": "Recent posts", + "page-index-posts-header": "Ethereum news", "page-index-posts-subtitle": "The latest blog posts and updates from the community", "page-index-title": "Welcome to Ethereum", "page-index-use-cases-tag": "Use cases", From fb9216337a2efcf118c75fa8cf9b1cfcba96ec74 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:13:58 +0000 Subject: [PATCH 054/227] Enhance homepage Schema.org structured data for YMYL mitigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add standalone WebSite schema with @id for proper graph linking - Add EducationalOrganization as additionalType to signal educational purpose - Add knowsAbout property listing expertise areas (Ethereum, blockchain, DeFi, etc.) - Add parentOrganization referencing Ethereum Foundation - Use @id references to link WebSite, WebPage, and Organization schemas - Fix foundingDate to 2015 (Ethereum network launch) - Remove deprecated SearchAction (Google sunset sitelinks search box Nov 2024) - Clean up redundant author/reviewedBy properties (publisher suffices) These changes help establish ethereum.org as an authoritative educational resource, which is important for YMYL (Your Money Your Life) content classification by search engines. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- app/[locale]/page-jsonld.tsx | 83 ++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/app/[locale]/page-jsonld.tsx b/app/[locale]/page-jsonld.tsx index 4d40498b033..ebe19a5c823 100644 --- a/app/[locale]/page-jsonld.tsx +++ b/app/[locale]/page-jsonld.tsx @@ -17,7 +17,19 @@ export default async function IndexPageJsonLD({ const url = normalizeUrlForJsonLd(locale, `/`) - // JSON-LD structured data for the homepage + const webSiteJsonLd = { + "@context": "https://schema.org", + "@type": "WebSite", + "@id": "https://ethereum.org/#website", + name: "ethereum.org", + url: "https://ethereum.org", + description: t("page-index-meta-description"), + publisher: { + "@id": "https://ethereum.org/#organization", + }, + inLanguage: locale, + } + const webPageJsonLd = { "@context": "https://schema.org", "@type": "WebPage", @@ -26,17 +38,11 @@ export default async function IndexPageJsonLD({ description: t("page-index-meta-description"), url: url, inLanguage: locale, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], isPartOf: { - "@type": "WebSite", - name: "ethereum.org", - url: "https://ethereum.org", + "@id": "https://ethereum.org/#website", + }, + about: { + "@id": "https://ethereum.org/#organization", }, breadcrumb: { "@type": "BreadcrumbList", @@ -50,39 +56,60 @@ export default async function IndexPageJsonLD({ ], }, publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", + "@id": "https://ethereum.org/#organization", }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, + mainEntity: { + "@id": "https://ethereum.org/#organization", }, } - // JSON-LD for ethereum.org as an organization + const organizationJsonLd = { "@context": "https://schema.org", "@type": "Organization", - "@id": "https://ethereum.org", + additionalType: "https://schema.org/EducationalOrganization", + "@id": "https://ethereum.org/#organization", name: "ethereum.org", + alternateName: "Ethereum.org", url: "https://ethereum.org", - logo: "https://ethereum.org/images/eth-org-logo.png", + logo: { + "@type": "ImageObject", + "@id": "https://ethereum.org/#logo", + url: "https://ethereum.org/images/eth-home-icon.png", + contentUrl: "https://ethereum.org/images/eth-home-icon.png", + caption: "ethereum.org logo", + }, + image: { + "@id": "https://ethereum.org/#logo", + }, description: t("page-index-meta-description"), sameAs: [ "https://github.com/ethereum/ethereum-org-website", "https://discord.gg/ethereum-org", "https://x.com/EthDotOrg", ], - mainEntityOfPage: `https://ethereum.org`, - foundingDate: "2014", + foundingDate: "2015", slogan: "Ethereum is the community-run technology powering the cryptocurrency ether and thousands of decentralized applications", + knowsAbout: [ + "Ethereum", + "Blockchain technology", + "Cryptocurrency", + "Decentralized finance", + "Smart contracts", + "Web3", + "Decentralized applications", + ], + areaServed: "Worldwide", + parentOrganization: { + "@type": "Organization", + name: "Ethereum Foundation", + url: "https://ethereum.foundation", + }, } - return + return ( + + ) } From 7aa95edc9228565e559f08f5484f0b050aaca582 Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Thu, 11 Dec 2025 13:22:35 -0700 Subject: [PATCH 055/227] update mocks --- src/data/mocks/appsData.json | 2197 +++++++++++++++++++++++++++------- src/lib/utils/apps.ts | 29 +- 2 files changed, 1819 insertions(+), 407 deletions(-) diff --git a/src/data/mocks/appsData.json b/src/data/mocks/appsData.json index 7719d2407a3..b47ef69d05e 100644 --- a/src/data/mocks/appsData.json +++ b/src/data/mocks/appsData.json @@ -42,7 +42,9 @@ "dateOfLaunch": "9/18/2018", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "true" + "devconnect": "true", + "appOfTheWeekStartDate": "2025-10-26T06:00:00.000Z", + "appOfTheWeekEndDate": "2025-11-22T07:00:00.000Z" }, { "name": "Sky/Maker - USDS", @@ -83,7 +85,9 @@ "dateOfLaunch": "9/18/2024", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-11-23T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-11-30T07:00:00.000Z" }, { "name": "Ethena - USDE", @@ -127,7 +131,9 @@ "dateOfLaunch": "2/19/2024", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Uniswap", @@ -176,7 +182,9 @@ "dateOfLaunch": "11/2/2018", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-10-26T06:00:00.000Z", + "appOfTheWeekEndDate": "2025-11-22T07:00:00.000Z" }, { "name": "Pendle", @@ -216,7 +224,9 @@ "dateOfLaunch": "6/17/2021", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Spark", @@ -256,7 +266,9 @@ "dateOfLaunch": "5/9/2023", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-12T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-18T07:00:00.000Z" }, { "name": "Morpho", @@ -293,7 +305,9 @@ "dateOfLaunch": "12/20/2022", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": "2025-12-22T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-28T07:00:00.000Z" }, { "name": "Compound", @@ -333,7 +347,9 @@ "dateOfLaunch": "9/27/2018", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Curve", @@ -371,7 +387,9 @@ "dateOfLaunch": "2/20/2020", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-11-23T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-11-30T07:00:00.000Z" }, { "name": "Balancer", @@ -410,7 +428,9 @@ "dateOfLaunch": "3/31/2020", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-08T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-14T07:00:00.000Z" }, { "name": "Usual ", @@ -450,7 +470,9 @@ "dateOfLaunch": "5/23/2024", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Fluid", @@ -489,7 +511,9 @@ "dateOfLaunch": "10/29/2024", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-16T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-22T06:00:00.000Z" }, { "name": "Frax", @@ -527,7 +551,9 @@ "dateOfLaunch": "12/20/2020", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Aerodrome", @@ -563,7 +589,9 @@ "dateOfLaunch": "8/28/2023", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Moonwell", @@ -601,7 +629,9 @@ "dateOfLaunch": "8/9/2023", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Franklin Templeton - BENJI", @@ -639,7 +669,9 @@ "dateOfLaunch": "11/14/2024", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Synthetix", @@ -676,7 +708,9 @@ "dateOfLaunch": "6/26/2018", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-08T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-14T07:00:00.000Z" }, { "name": "ZeroLend", @@ -715,7 +749,9 @@ "dateOfLaunch": "1/1/2023", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-09T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-15T06:00:00.000Z" }, { "name": "SyncSwap", @@ -754,7 +790,9 @@ "dateOfLaunch": "3/4/2023", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Ekubo", @@ -791,7 +829,9 @@ "dateOfLaunch": "8/26/2023", "lastUpdated": "7/7/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-16T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-22T07:00:00.000Z" }, { "name": "Maple", @@ -828,7 +868,9 @@ "dateOfLaunch": "5/12/2021", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-04-20T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-26T06:00:00.000Z" }, { "name": "Centrifuge", @@ -866,7 +908,9 @@ "dateOfLaunch": "5/22/2023", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-05T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-11T07:00:00.000Z" }, { "name": "Goldfinch", @@ -902,7 +946,9 @@ "dateOfLaunch": "1/31/2021", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-19T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-25T07:00:00.000Z" }, { "name": "Superstate", @@ -938,44 +984,102 @@ "dateOfLaunch": "1/3/2024", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-02T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-08T07:00:00.000Z" }, { - "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", + "name": "Tether - USDT", + "url": "https://tether.to/", + "description": "Tether (USDT) is a stablecoin, a cryptocurrency pegged to and backed by fiat currencies like the U.S. dollar.", + "image": "https://i.imgur.com/Pw4Q7Qf.png", "category": "DeFi", "subCategory": [ - "RWA" + "RWA", + "Stablecoin issuance" ], "networks": [ + "Ethereum Mainnet", "Arbitrum One", - "Ethereum Mainnet" + "OP Mainnet", + "Ink" ], "screenshots": [], - "bannerImage": "https://i.imgur.com/6wE3z1t.png", + "bannerImage": "https://i.imgur.com/NsL1fv3.png", "platforms": [ "Browser" ], - "twitter": "https://twitter.com/OndoFinance", - "github": "https://github.com/ondoprotocol", + "twitter": "https://x.com/Tether_to/", + "github": "https://github.com/tetherto", "discord": "", "kpiUrl": "", "sortingWeight": 0, "discover": false, "highlight": false, + "languages": [ + "English", + "Chinese", + "Chinese Traditional", + "Turkish", + "Russian", + "Portuguese", + "Italian", + "French", + "German" + ], + "parentCompany": "Tether Holdings Limited ", + "parentCompanyURL": "https://tether.to/", + "openSource": false, + "contractAddress": "https://etherscan.io/token/0xdac17f958d2ee523a2206206994597c13d831ec7", + "dateOfLaunch": "11/1/2017", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Cicle - USDC", + "url": "https://circle.com/", + "description": "USDC is a digital dollar backed 100% by highly liquid cash and cash-equivalent assets and is redeemable 1:1 for US dollars.", + "image": "https://i.imgur.com/vpadKkU.png", + "category": "DeFi", + "subCategory": [ + "RWA", + "Stablecoin issuance" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One", + "Base", + "OP Mainnet", + "World Chain" + ], + "screenshots": [], + "bannerImage": "https://i.imgur.com/InJtYE5.jpeg", + "platforms": [ + "Browser" + ], + "twitter": "https://x.com/circle", + "github": "https://github.com/circlefin", + "discord": "https://discord.com/invite/buildoncircle", + "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", + "parentCompany": "ircle Internet Group, Inc.", + "parentCompanyURL": "https://www.circle.com", + "openSource": false, + "contractAddress": "https://etherscan.io/address/0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + "dateOfLaunch": "9/1/2018", + "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "PayPal - PYUSD", @@ -1016,7 +1120,9 @@ "dateOfLaunch": "8/7/2023", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Etherisc", @@ -1052,7 +1158,9 @@ "dateOfLaunch": "7/28/2016", "lastUpdated": "7/28/2016", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Polymarket", @@ -1061,7 +1169,10 @@ "image": "https://i.imgur.com/2YlJ2Jq.png", "category": "DeFi", "subCategory": [ - "Prediction" + "Prediction", + "RWA", + "Yield", + "Crowdfunding" ], "networks": [], "screenshots": [], @@ -1088,7 +1199,9 @@ "dateOfLaunch": "6/16/2020", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-29T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-04T07:00:00.000Z" }, { "name": "1inch", @@ -1131,17 +1244,19 @@ "dateOfLaunch": "5/9/2019", "lastUpdated": "7/15/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "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.", + "description": "Liquity V2 is a decentralized borrowing protocol that lets users borrow at fixed rates and mint the stablecoin BOLD", "image": "https://i.imgur.com/mG928HR.png", "category": "DeFi", "subCategory": [ - "RWA", - "Lending and borrowing" + "Lending and borrowing", + "Stablecoin issuance" ], "networks": [ "Ethereum Mainnet", @@ -1170,7 +1285,9 @@ "dateOfLaunch": "4/5/2021", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-22T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-28T07:00:00.000Z" }, { "name": "Cowswap", @@ -1208,7 +1325,9 @@ "dateOfLaunch": "4/28/2021", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": "2026-01-12T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-18T07:00:00.000Z" }, { "name": "PoolTogether", @@ -1247,7 +1366,9 @@ "dateOfLaunch": "6/24/2019", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-22T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-28T07:00:00.000Z" }, { "name": "Yearn", @@ -1286,7 +1407,59 @@ "dateOfLaunch": "7/17/2020", "lastUpdated": "7/15/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-01T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-07T07:00:00.000Z" + }, + { + "name": "ether.fi", + "url": "https://ether.fi/", + "description": "ether.fi is a non-custodial Ethereum restaking platform that lets users earn rewards while maintaining control of their assets. Built on Ethereum’s decentralized infrastructure, it extends staking into a liquid, composable layer integrated across DeFi.", + "image": "https://i.imgur.com/W21OIX5.jpeg", + "category": "DeFi", + "subCategory": [ + "Liquid staking", + "Payments" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One", + "Base", + "OP Mainnet", + "Scroll", + "Mode", + "Linea", + "Taiko Alethia" + ], + "screenshots": [ + "https://i.imgur.com/7WclCdp.png" + ], + "bannerImage": "https://i.imgur.com/MUJlbiI.png", + "platforms": [ + "Browser", + "iOS", + "Android" + ], + "twitter": "https://x.com/ether_fi", + "github": "https://github.com/etherfi-protocol", + "discord": "https://discord.com/invite/etherfi", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "ether.fi", + "parentCompanyURL": "https://ether.fi/", + "openSource": true, + "contractAddress": "https://etherfi.gitbook.io/etherfi/contracts-and-integrations/deployed-contracts", + "dateOfLaunch": "5/3/2023", + "lastUpdated": "10/9/2025", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "True Markets", @@ -1322,7 +1495,9 @@ "dateOfLaunch": "3/11/2025", "lastUpdated": "7/15/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-04-06T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-12T06:00:00.000Z" }, { "name": "Flaunch", @@ -1358,7 +1533,9 @@ "dateOfLaunch": "2/1/2025", "lastUpdated": "7/15/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-04-20T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-26T06:00:00.000Z" }, { "name": "Octant", @@ -1396,7 +1573,9 @@ "dateOfLaunch": "8/8/2023", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": "2026-02-23T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-01T07:00:00.000Z" }, { "name": "SuperFluid", @@ -1438,7 +1617,9 @@ "dateOfLaunch": "", "lastUpdated": "7/7/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-23T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-01T07:00:00.000Z" }, { "name": "Splits.org", @@ -1478,7 +1659,9 @@ "dateOfLaunch": "2/15/2022", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "JuiceboxETH", @@ -1514,7 +1697,9 @@ "dateOfLaunch": "7/15/2021", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-02T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-08T07:00:00.000Z" }, { "name": "zkp2p", @@ -1550,7 +1735,9 @@ "dateOfLaunch": "2/3/2025", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": "2026-04-27T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-05-03T06:00:00.000Z" }, { "name": "Teller", @@ -1588,28 +1775,35 @@ "dateOfLaunch": "1/4/2021", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { - "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", + "name": "Alchemix", + "url": "https://alchemix.fi/", + "description": "Alchemix loans automatically pay themselves off with the yield generated from your deposits of ETH or stablecoins. Unlock the potential of your assets with secure and stress-free borrowing", + "image": "https://i.imgur.com/Hwgx9GR.png", "category": "DeFi", "subCategory": [ - "Infrastructure" + "Lending and borrowing" ], "networks": [ - "Ethereum Mainnet" + "Ethereum Mainnet", + "Arbitrum One", + "OP Mainnet", + "Linea" ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/XhOY5jZ.png", + "screenshots": [ + "https://i.imgur.com/a/ROfmA6H.png" + ], + "bannerImage": "https://i.imgur.com/2UrdPcS.png", "platforms": [ "Browser" ], - "twitter": "https://x.com/eigenlayer", - "github": "https://github.com/Layr-Labs", - "discord": "https://discord.gg/eigenlayer", + "twitter": "https://x.com/AlchemixFi", + "github": "https://github.com/alchemix-finance", + "discord": "https://discord.gg/XpZD7NJD", "kpiUrl": "", "sortingWeight": 0, "discover": false, @@ -1617,120 +1811,126 @@ "languages": [ "English" ], - "parentCompany": "Eigen Labs", - "parentCompanyURL": "https://eigencloud.xyz", + "parentCompany": "Alchemix", + "parentCompanyURL": "https://alchemix.fi/", "openSource": true, - "contractAddress": "https://github.com/Layr-Labs/eigenlayer-contracts", - "dateOfLaunch": "6/14/2023", - "lastUpdated": "7/15/2025", + "contractAddress": "https://github.com/alchemix-finance/deployments", + "dateOfLaunch": "6/27/2022", + "lastUpdated": "9/2/2025", "ready": "true", - "devconnect": "false" - } - ], - "Social": [ + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, { - "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", + "name": "Wildcat", + "url": "https://app.wildcat.finance/", + "description": "Wildcat Finance is a DeFi protocol that enables undercollateralized lending, giving institutions access to flexible credit markets without requiring oversized collateral deposits. Borrowers can create customized lending markets with transparent terms, while lenders earn yield by providing liquidity counterparties they pick themselves.", + "image": "https://i.imgur.com/0WZhOay.jpeg", + "category": "DeFi", "subCategory": [ - "Social network" + "Lending and borrowing" ], "networks": [ - "Base", "Ethereum Mainnet" ], "screenshots": [ - "https://i.imgur.com/6OxNqMF.jpeg" + "https://i.imgur.com/wDcYpqu.png" ], - "bannerImage": "https://i.imgur.com/GBBRB59.png", + "bannerImage": "https://i.imgur.com/wCQmFhO.png", "platforms": [ "Browser", - "iOS", - "Android" + "Android", + "iOS" ], - "twitter": "https://twitter.com/zora", - "github": "https://github.com/ourzora", + "twitter": "https://x.com/WildcatFi", + "github": "https://github.com/wildcat-finance", "discord": "", "kpiUrl": "", "sortingWeight": 0, "discover": false, - "highlight": true, + "highlight": false, "languages": [ "English" ], - "parentCompany": "Zora Labs", - "parentCompanyURL": "https://zora.co", - "openSource": true, - "contractAddress": "0xaD031EeE55f595dF6Dbd61e9ef3B908FaD1B3671", - "dateOfLaunch": "1/1/2021", - "lastUpdated": "7/3/2025", + "parentCompany": "Wildcat Labs", + "parentCompanyURL": "", + "openSource": false, + "contractAddress": "https://docs.wildcat.finance/technical-overview/contract-deployments", + "dateOfLaunch": "1/1/2024", + "lastUpdated": "9/25/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { - "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", + "name": "Contango", + "url": "https://app.contango.xyz/", + "description": "Contango lets you loop anything on-chain. You can create leverage (re)staking positions, arb rates differentials, farm points, or simply go long or short like a perp at low funding.", + "image": "https://i.imgur.com/OLPYww5.png", + "category": "DeFi", "subCategory": [ - "Social network" + "Yield" ], "networks": [ - "Base" + "OP Mainnet", + "Base", + "Ethereum Mainnet", + "Arbitrum One" ], "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" + "https://i.imgur.com/gaWUjM0.png" ], - "bannerImage": "https://i.imgur.com/FDduCHZ.png", + "bannerImage": "https://i.imgur.com/hufoLSM.png", "platforms": [ - "Browser", - "iOS" + "Browser" ], - "twitter": "https://x.com/rodeodotclub", - "github": "", - "discord": "", + "twitter": "https://x.com/Contango_xyz", + "github": "https://github.com/contango-xyz/core-v2", + "discord": "https://discord.gg/x3dync2edA", "kpiUrl": "", "sortingWeight": 0, "discover": false, - "highlight": true, + "highlight": false, "languages": [ "English" ], - "parentCompany": "Rodeo Club", - "parentCompanyURL": "https://rodeo.club", - "openSource": false, - "contractAddress": "", - "dateOfLaunch": "12/24/2024", - "lastUpdated": "7/3/2025", + "parentCompany": "Contango", + "parentCompanyURL": "", + "openSource": true, + "contractAddress": "https://docs.contango.xyz/resources/contracts-and-audits", + "dateOfLaunch": "10/1/2023", + "lastUpdated": "9/25/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { - "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", + "name": "The Gauntlet App", + "url": "https://app.gauntlet.xyz/", + "description": "Access the risk-adjusted yields in DeFi, direct from the quants at Gauntlet. Earn on BTC, ETH, stablecoins, and more across multiple chains and protocols. ", + "image": "https://i.imgur.com/gUE8bIl.png", + "category": "DeFi", "subCategory": [ - "Messaging" + "Yield" ], "networks": [ - "Base" + "Base", + "Unichain", + "Ethereum Mainnet", + "Arbitrum One" ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/YNOquL3.png", + "screenshots": [ + "https://i.imgur.com/FzGyhhB.png" + ], + "bannerImage": "https://i.imgur.com/U2pZent.png", "platforms": [ - "Browser", - "iOS" + "Browser" ], - "twitter": "https://x.com/townsxyz", - "github": "https://github.com/river-build", + "twitter": "https://x.com/gauntlet_xyz", + "github": "https://github.com/aera-finance/aera-contracts-public/tree/main/v3", "discord": "", "kpiUrl": "", "sortingWeight": 0, @@ -1739,74 +1939,82 @@ "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", + "parentCompany": "Gauntlet", + "parentCompanyURL": "www.gauntlet.xyz", + "openSource": false, + "contractAddress": "misc. see app for vault addresses", + "dateOfLaunch": "10/24/2024", + "lastUpdated": "", "ready": "true", - "devconnect": "true" + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { - "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", + "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": "DeFi", "subCategory": [ - "Social network", - "Messaging" + "Payments" ], "networks": [ "Base", - "Ethereum Mainnet" + "Scroll", + "Linea", + "Blast", + "Mode", + "Ethereum Mainnet", + "Arbitrum One", + "OP Mainnet", + "zkSync Mainnet" ], "screenshots": [], - "bannerImage": "https://i.imgur.com/Dpb0JFt.png", + "bannerImage": "https://i.imgur.com/CNIkIB0.png", "platforms": [ - "Browser", - "iOS", - "Android" + "Browser" ], - "twitter": "https://x.com/farcaster_xyz", - "github": "https://github.com/farcasterxyz", - "discord": "", + "twitter": "https://x.com/Sablier", + "github": "https://github.com/sablier-labs", + "discord": "https://discord.gg/bSwRCwWRsT", "kpiUrl": "", "sortingWeight": 0, - "discover": true, + "discover": false, "highlight": true, "languages": [ "English" ], - "parentCompany": "Farcaster Labs", - "parentCompanyURL": "https://farcaster.xyz", + "parentCompany": "Sablier Labs", + "parentCompanyURL": "https://sablier.com", "openSource": true, - "contractAddress": "https://docs.farcaster.xyz/reference/contracts/deployments", - "dateOfLaunch": "2/23/2023", - "lastUpdated": "7/3/2025", + "contractAddress": "https://github.com/sablier-labs", + "dateOfLaunch": "12/13/2019", + "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { - "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", + "name": "R3al Blocks", + "url": "https://r3al.io/en", + "description": "We are a platform that offers access to investment in real-world assets.", + "image": "https://i.imgur.com/3VjkIyg.jpeg", + "category": "DeFi", "subCategory": [ - "Social network" + "RWA" ], "networks": [ "Ethereum Mainnet" ], - "screenshots": [], - "bannerImage": "https://i.imgur.com/9mRCEGT.png", + "screenshots": [ + "https://i.imgur.com/Sbm71uG.png" + ], + "bannerImage": "https://i.imgur.com/55sWskB.jpeg", "platforms": [ - "iOS", - "Android" + "Browser" ], - "twitter": "https://x.com/orb_club", + "twitter": "https://twitter.com/r3al_blocks", "github": "", "discord": "", "kpiUrl": "", @@ -1814,19 +2022,610 @@ "discover": false, "highlight": false, "languages": [ - "English" + "English", + "Spanish" ], - "parentCompany": "Orb Technology Inc.", - "parentCompanyURL": "https://orb.club", + "parentCompany": "Real Blocks", + "parentCompanyURL": "https://r3al.io", "openSource": false, "contractAddress": "", - "dateOfLaunch": "10/18/2024", - "lastUpdated": "7/3/2025", + "dateOfLaunch": "5/7/2025", + "lastUpdated": "10/13/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { - "name": "Shibuya Films", + "name": "Lemon", + "url": "https://lemon.me/", + "description": "Exchange pesos for Bitcoin, USDT, Ethereum, and other cryptocurrencies instantly. Invest in DeFi and order your VISA Lemon Card.", + "image": "https://i.imgur.com/msDGRZU.png", + "category": "DeFi", + "subCategory": [ + "Payments", + "Wallet" + ], + "networks": [ + "Ethereum Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/jEJt1Z4.jpeg", + "https://i.imgur.com/85CL2fg.jpeg", + "https://i.imgur.com/JN3K8pU.jpeg" + ], + "bannerImage": "https://i.imgur.com/6pTl8lx.jpeg", + "platforms": [ + "Android" + ], + "twitter": "https://twitter.com/lemonapp_ar", + "github": "", + "discord": "https://discord.gg/qeDs4KjTMM", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English", + "Spanish", + "Portuguese (Brazilian)" + ], + "parentCompany": "Lemon", + "parentCompanyURL": "https://lemon.me/", + "openSource": false, + "contractAddress": "", + "dateOfLaunch": "1/1/2019", + "lastUpdated": "10/13/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "DeFi Saver", + "url": "https://defisaver.com/", + "description": "DeFi Saver is a non-custodial DeFi management tool offering advanced features and functionalities for managing your positions and crypto assets in various DeFi protocols", + "image": "https://i.imgur.com/KwLrIsX.jpeg", + "category": "DeFi", + "subCategory": [ + "Portfolio manager" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One", + "Base", + "OP Mainnet", + "Linea" + ], + "screenshots": [ + "https://i.imgur.com/bqK4Y1K.jpeg", + "https://i.imgur.com/iWeh70l.jpeg", + "https://i.imgur.com/hAoEu2J.jpeg", + "https://i.imgur.com/Wpo6Tob.jpeg" + ], + "bannerImage": "https://i.imgur.com/OMDI2rD.jpeg", + "platforms": [ + "Browser" + ], + "twitter": "https://twitter.com/defisaver", + "github": "https://github.com/defisaver/defisaver-v3-contracts", + "discord": "https://discord.com/invite/XGDJHhZ", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English", + "Spanish" + ], + "parentCompany": "Decenter", + "parentCompanyURL": "https://www.decenter.com", + "openSource": true, + "contractAddress": "https://docs.defisaver.com/protocol/deployed-contracts", + "dateOfLaunch": "1/1/2019", + "lastUpdated": "10/13/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Ripio", + "url": "https://www.ripio.com/en", + "description": "Ripio is a Latin American cryptocurrency and blockchain company that provides a suite of financial products built around crypto — including wallets, exchanges, and DeFi tools.", + "image": "https://i.imgur.com/TaGDy5i.jpeg", + "category": "DeFi", + "subCategory": [ + "DEX", + "Yield", + "Wallet", + "Portfolio manager" + ], + "networks": [ + "Ethereum Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/utCa3WC.jpeg" + ], + "bannerImage": "https://i.imgur.com/1ebNhg8.jpeg", + "platforms": [ + "Browser", + "iOS", + "Android" + ], + "twitter": "https://x.com/ripioapp", + "github": "", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English", + "Spanish", + "Portuguese" + ], + "parentCompany": "Ripio", + "parentCompanyURL": "https://ripio.com", + "openSource": false, + "contractAddress": "", + "dateOfLaunch": "4/1/2013", + "lastUpdated": "10/14/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Belo", + "url": "https://belo.app/ar/", + "description": "A crypto-fiat platform with wallet, exchange, and yield tools.\n", + "image": "https://i.imgur.com/ukFEnXy.jpeg", + "category": "DeFi", + "subCategory": [ + "DEX", + "Yield", + "Wallet" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One", + "OP Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/KiTXnec.jpeg", + "https://i.imgur.com/OjFUm9a.jpeg", + "https://i.imgur.com/FNZtAP9.jpeg" + ], + "bannerImage": "https://i.imgur.com/0LCGmXX.jpeg", + "platforms": [ + "Browser", + "iOS", + "Android" + ], + "twitter": "https://x.com/belo_app", + "github": "", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "Spanish" + ], + "parentCompany": "Belo", + "parentCompanyURL": "https://bello.app/ar", + "openSource": false, + "contractAddress": "", + "dateOfLaunch": "11/1/2024", + "lastUpdated": "10/14/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Offramp", + "url": "https://www.offramp.xyz/", + "description": "Offramp.xyz is a self-custodial crypto wallet and Visa card platform that lets users convert, spend, and withdraw stablecoins or other digital assets across multiple blockchains in everyday transactions.", + "image": "https://i.imgur.com/4ypvqWb.jpeg", + "category": "DeFi", + "subCategory": [ + "Payments" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One", + "Base", + "OP Mainnet", + "World Chain", + "Mode" + ], + "screenshots": [ + "https://i.imgur.com/1mCntHO.jpeg", + "https://i.imgur.com/6YPXtHj.jpeg", + "https://i.imgur.com/mNTjbjr.jpeg" + ], + "bannerImage": "https://i.imgur.com/nQIS63O.jpeg", + "platforms": [ + "Browser", + "iOS", + "Android" + ], + "twitter": "https://twitter.com/OfframpXYZ", + "github": "", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English", + "Spanish", + "Portuguese" + ], + "parentCompany": "Offramp Labs", + "parentCompanyURL": "https://offramp.xyz", + "openSource": false, + "contractAddress": "", + "dateOfLaunch": "1/1/2022", + "lastUpdated": "10/14/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Daimo Pay", + "url": "https://pay.daimo.com/", + "description": "Daimo Pay routes funds from any currency, chain, or app to the chain and stablecoin you choose.", + "image": "https://i.imgur.com/VM7mZ57.jpeg", + "category": "DeFi", + "subCategory": [ + "Payments" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One", + "Base", + "OP Mainnet", + "Linea", + "World Chain", + "Scroll" + ], + "screenshots": [ + "https://i.imgur.com/VuAkCHt.jpeg", + "https://i.imgur.com/qWaSXh1.jpeg", + "https://i.imgur.com/ZEOM5xd.jpeg" + ], + "bannerImage": "https://i.imgur.com/t6thuqS.jpeg", + "platforms": [ + "Android", + "iOS", + "Browser" + ], + "twitter": "https://x.com/daimopay", + "github": "https://github.com/daimo-eth", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "Daimo, Inc", + "parentCompanyURL": "https://pay.daimo.com", + "openSource": true, + "contractAddress": "", + "dateOfLaunch": "12/9/2024", + "lastUpdated": "10/14/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "KyberSwap", + "url": "kyberswap.com", + "description": "Kyber Network is a multichain DEX Aggregator and liquidity hub that connects liquidity from different sources to enable trades at the best rates. Native to Ethereum since 2017, KyberSwap now operates on many EVM chains and consistently the best aggregator in terms of trading volume.", + "image": "https://i.imgur.com/Bzmt2s7.jpeg", + "category": "DeFi", + "subCategory": [ + "Yield", + "DEX" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One", + "Linea", + "Unichain", + "Mantle", + "OP Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/CBDooVb.png" + ], + "bannerImage": "https://i.ibb.co/qYv2VBsP/kyber-ad.png", + "platforms": [ + "Browser" + ], + "twitter": "https://twitter.com/KyberNetwork", + "github": "https://github.com/kybernetwork", + "discord": "https://discord.gg/kyberswap", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "", + "parentCompanyURL": "", + "openSource": true, + "contractAddress": "https://docs.kyberswap.com/kyberswap-solutions/kyberswap-aggregator/contracts/aggregator-contract-addresses", + "dateOfLaunch": "2/1/2018", + "lastUpdated": "", + "ready": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Superform", + "url": "https://superform.xyz", + "description": "Superform is the first stablecoin neobank. Anyone can save, swap, send, and earn onchain while keeping full control of their assets. Trusted by more than 150,000 users, Superform aggregates over $70B of opportunities across 60+ platforms so you can earn on your assets, easily and instantly.", + "image": "https://i.imgur.com/e4raePQ.png", + "category": "DeFi", + "subCategory": [ + "Yield" + ], + "networks": [ + "Ethereum Mainnet", + "Base", + "OP Mainnet", + "Unichain", + "Linea", + "Arbitrum One" + ], + "screenshots": [ + "https://i.imgur.com/RGgJcMI.png" + ], + "bannerImage": "https://i.imgur.com/hfOPmCA.png", + "platforms": [ + "Browser" + ], + "twitter": "https://x.com/superformxyz", + "github": "https://github.com/superform-xyz", + "discord": "https://discord.gg/superform", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "Superform labs", + "parentCompanyURL": "https://superform.xyz", + "openSource": true, + "contractAddress": "https://docs.superform.xyz/integrate-superform/deployment-addresses", + "dateOfLaunch": "1/24/2024", + "lastUpdated": "10/30/2025", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + } + ], + "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", + "appOfTheWeekStartDate": "2025-12-15T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-21T07:00:00.000Z" + }, + { + "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": "false", + "appOfTheWeekStartDate": "2026-03-02T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-08T07:00:00.000Z" + }, + { + "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": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "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": "Merkle Manufactory", + "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": "true", + "appOfTheWeekStartDate": "2025-12-01T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-07T07:00:00.000Z" + }, + { + "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", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "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", @@ -1859,7 +2658,9 @@ "dateOfLaunch": "2/28/2022", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Hey.xyz", @@ -1895,43 +2696,9 @@ "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" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Paragraph", @@ -1970,7 +2737,9 @@ "dateOfLaunch": "10/1/2021", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Ethereum Follow Protocol", @@ -2010,7 +2779,280 @@ "dateOfLaunch": "9/24/2024", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Kiwi News", + "url": "https://news.kiwistand.com", + "description": "Kiwi News is a decentralized, open-source Hacker News—built on a peer-to-peer protocol so anyone can copy/host the data and run their own feed. Ranking and rewards are community-driven via simple, attack-aware reputation/karma, with GPL-3 code and optional crypto/Stripe integrations for monetization.", + "image": "https://i.imgur.com/fKeLVJM.png", + "category": "Social", + "subCategory": [ + "Social network" + ], + "networks": [ + "OP Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/xl52U6d.png" + ], + "bannerImage": "https://i.imgur.com/mL7qrkZ.png", + "platforms": [ + "Browser", + "iOS" + ], + "twitter": "https://x.com/KiwiNewsHQ", + "github": "https://github.com/attestate/kiwistand", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "", + "parentCompanyURL": "", + "openSource": true, + "contractAddress": "", + "dateOfLaunch": "", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "JokeRace", + "url": "https://jokerace.io/", + "description": "JokeRace is a decentralized governance protocol that enables communities to create, vote on, and reward proposals. Participants cast votes with conviction and can earn rewards for their engagement, aligning incentives around community-driven decision-making.", + "image": "https://i.imgur.com/QRX3hJ3.png", + "category": "Social", + "subCategory": [ + "Social network" + ], + "networks": [ + "Arbitrum One" + ], + "screenshots": [ + "https://i.imgur.com/IYl8iIY.jpeg" + ], + "bannerImage": "https://i.imgur.com/PUmiNV0.png", + "platforms": [ + "Browser" + ], + "twitter": "https://x.com/jokerace_io", + "github": "https://github.com/jk-labs-inc/jokerace", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": true, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "JK Labs", + "parentCompanyURL": "https://jklabs.co", + "openSource": true, + "contractAddress": "", + "dateOfLaunch": "1/1/2023", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Interface", + "url": "https://app.interface.social", + "description": "Interface is a trading-focused social network on Ethereum. Share your takes, discover new markets, follow friends, and copy trade their moves with live notifications.", + "image": "https://i.imgur.com/q7w6Vgx.png", + "category": "Social", + "subCategory": [ + "Social network", + "Identity", + "Publishing" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One", + "Base", + "OP Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/7QyLGvm.jpeg" + ], + "bannerImage": "https://i.imgur.com/dyCSyVe.png", + "platforms": [ + "iOS", + "Browser", + "Android" + ], + "twitter": "https://x.com/interfacedapp", + "github": "", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": true, + "highlight": true, + "languages": [ + "English" + ], + "parentCompany": "Interface Labs", + "parentCompanyURL": "https://www.interface.social", + "openSource": false, + "contractAddress": "https://basescan.org/address/0xb262c9278fbcac384ef59fc49e24d800152e19b1", + "dateOfLaunch": "6/1/2022", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "poidh", + "url": "https://poidh.xyz", + "description": "Poidh is a fully onchain app that lets anyone create, fund, and claim bounties for real-world actions. It makes it simple and fun to incentivize anything, from viral challenges to community-driven initiatives, using crypto.", + "image": "https://i.imgur.com/wa42XYM.png", + "category": "Social", + "subCategory": [ + "Identity", + "Social network" + ], + "networks": [ + "Arbitrum One", + "Base", + "Unichain" + ], + "screenshots": [ + "https://i.imgur.com/3FJyu94.jpeg" + ], + "bannerImage": "https://i.imgur.com/WV5yjVX.png", + "platforms": [ + "Browser", + "iOS", + "Android", + "Desktop" + ], + "twitter": "https://x.com/poidhxyz", + "github": "https://github.com/picsoritdidnthappen/poidh-app", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "poidh, inc", + "parentCompanyURL": "", + "openSource": true, + "contractAddress": "https://paragraph.com/@poidh/poidh-beginner-guide", + "dateOfLaunch": "8/10/2023", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Ethereum Follow Protocol (EFP)", + "url": "https://efp.app/", + "description": "Ethereum Follow Protocol (EFP) is an onchain social graph protocol for Ethereum accounts that complements ENS.", + "image": "https://i.imgur.com/toGgNkt.png", + "category": "Social", + "subCategory": [ + "Social network" + ], + "networks": [ + "Ethereum Mainnet", + "Base", + "OP Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/ghsEgLj.png", + "https://i.imgur.com/qlabIys.png" + ], + "bannerImage": "https://i.imgur.com/3IPo5YI.jpeg", + "platforms": [ + "Browser" + ], + "twitter": "https://x.com/efp", + "github": "https://github.com/ethereumfollowprotocol", + "discord": "https://discord.com/invite/ZUyG3mSXFD", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English", + "Armenian", + "Arabic", + "Amharic", + "Azerbaijani", + "Czech", + "Catalan", + "Bosnian", + "Bengali", + "Bulgarian", + "Belarusian", + "Chinese", + "Chinese Traditional", + "Croatian" + ], + "parentCompany": "Ethereum Identity Foundation", + "parentCompanyURL": "https://ethid.org/", + "openSource": true, + "contractAddress": "https://docs.efp.app/production/deployments/", + "dateOfLaunch": "9/24/2024", + "lastUpdated": "10/14/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "DRIPS", + "url": "https://www.drips.network/", + "description": "Drips is an app built on Ethereum that enables flexibly supporting open-source projects, with built-in dependency splitting.", + "image": "https://i.imgur.com/Zam58pD.jpeg", + "category": "Social", + "subCategory": [ + "Funding" + ], + "networks": [ + "Ethereum Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/9O3deYQ.jpeg", + "https://i.imgur.com/RBlZHDp.jpeg" + ], + "bannerImage": "https://i.imgur.com/9bhvbxW.png", + "platforms": [ + "Browser" + ], + "twitter": "https://x.com/dripsnetwork", + "github": "https://github.com/drips-network", + "discord": "https://discord.gg/BakDKKDpHF", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "Radworks", + "parentCompanyURL": "https://radworks.org/", + "openSource": true, + "contractAddress": "https://docs.drips.network/the-protocol/smart-contract-details", + "dateOfLaunch": "7/23/2023", + "lastUpdated": "10/15/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null } ], "Privacy": [ @@ -2053,7 +3095,9 @@ "dateOfLaunch": "2/24/2024", "lastUpdated": "7/9/2025", "ready": "true", - "devconnect": "true" + "devconnect": "true", + "appOfTheWeekStartDate": "2026-04-27T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-05-03T06:00:00.000Z" }, { "name": "Rarimo", @@ -2073,24 +3117,70 @@ "Browser", "Android" ], - "twitter": "https://x.com/Rarimo_protocol", - "github": "https://github.com/rarimo", - "discord": "", + "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", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Railgun", + "url": "https://railgun.org/", + "description": "RAILGUN is a privacy system built directly onchain. It uses zero-knowledge cryptography to enable private use of smart contracts and DeFi, all without leaving the security of the user’s preferred chain. ", + "image": "https://i.imgur.com/iCZiC1e.png", + "category": "Privacy", + "subCategory": [ + "Shielded" + ], + "networks": [ + "Ethereum Mainnet", + "Arbitrum One" + ], + "screenshots": [ + "https://i.imgur.com/16W2jcw.png" + ], + "bannerImage": "https://i.imgur.com/AyPoVoj.png", + "platforms": [ + "Browser", + "Desktop", + "iOS", + "Android" + ], + "twitter": "https://x.com/railgun_project", + "github": "https://github.com/Railgun-Community", + "discord": "https://discord.gg/jgUQjkYWzh", "kpiUrl": "", "sortingWeight": 0, - "discover": false, - "highlight": false, + "discover": true, + "highlight": true, "languages": [ "English" ], - "parentCompany": "Rarilabs Ltd.", - "parentCompanyURL": "https://rarimo.com/", + "parentCompany": "Railgun DAO", + "parentCompanyURL": "https://railgun.org/", "openSource": true, - "contractAddress": "https://docs.rarimo.com/zk-passport/contracts/#deployments", - "dateOfLaunch": "4/24/2025", + "contractAddress": "", + "dateOfLaunch": "", "lastUpdated": "7/9/2025", "ready": "true", - "devconnect": "true" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Privacy Pools", @@ -2127,7 +3217,9 @@ "dateOfLaunch": "3/31/2025", "lastUpdated": "7/7/2025", "ready": "true", - "devconnect": "true" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Tornado Cash", @@ -2170,7 +3262,52 @@ "dateOfLaunch": "12/17/2019", "lastUpdated": "7/7/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "ZK Pass", + "url": "https://zkpass.org/", + "description": "Verify your real-world private data without revealing your private details.", + "image": "https://i.imgur.com/w3SO8am.jpeg", + "category": "Privacy", + "subCategory": [ + "Identity" + ], + "networks": [ + "Base", + "Scroll", + "Linea", + "Arbitrum One", + "OP Mainnet", + "zkSync Mainnet" + ], + "screenshots": [], + "bannerImage": "https://i.imgur.com/Dhi3PVf.png", + "platforms": [ + "Browser" + ], + "twitter": "https://x.com/zkPass", + "github": "https://github.com/zkPassOfficial", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "", + "parentCompanyURL": "", + "openSource": true, + "contractAddress": "", + "dateOfLaunch": "7/26/2025", + "lastUpdated": "7/9/2025", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "0xbow", @@ -2206,7 +3343,9 @@ "dateOfLaunch": "3/31/2025", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null } ], "Collectibles": [ @@ -2257,7 +3396,9 @@ "dateOfLaunch": "12/20/2017", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-10-26T06:00:00.000Z", + "appOfTheWeekEndDate": "2025-11-22T07:00:00.000Z" }, { "name": "Blur", @@ -2296,7 +3437,9 @@ "dateOfLaunch": "10/19/2022", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-26T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-01T07:00:00.000Z" }, { "name": "Highlight", @@ -2337,7 +3480,9 @@ "dateOfLaunch": "7/26/2023", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-16T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-22T06:00:00.000Z" }, { "name": "Manifold", @@ -2373,7 +3518,9 @@ "dateOfLaunch": "10/1/2021", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-09T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-15T06:00:00.000Z" }, { "name": "Rarible", @@ -2413,7 +3560,9 @@ "dateOfLaunch": "8/17/2020", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-29T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-04T07:00:00.000Z" }, { "name": "Pudgy Penguins", @@ -2451,7 +3600,9 @@ "dateOfLaunch": "7/22/2021", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-09T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-15T07:00:00.000Z" }, { "name": "Bored Ape Yacht Club", @@ -2489,7 +3640,9 @@ "dateOfLaunch": "4/23/2021", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Art Blocks", @@ -2525,7 +3678,9 @@ "dateOfLaunch": "11/27/2020", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Cool Cats", @@ -2562,7 +3717,9 @@ "dateOfLaunch": "6/9/2021", "lastUpdated": "7/4/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-16T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-22T07:00:00.000Z" }, { "name": "Doodles", @@ -2599,7 +3756,9 @@ "dateOfLaunch": "10/16/2021", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-26T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-01T07:00:00.000Z" }, { "name": "Basepaint", @@ -2636,7 +3795,9 @@ "dateOfLaunch": "8/8/2023", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Foundation", @@ -2673,7 +3834,9 @@ "dateOfLaunch": "2/1/2021", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-12T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-18T07:00:00.000Z" }, { "name": "Sandbox", @@ -2718,7 +3881,9 @@ "dateOfLaunch": "11/29/2021", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "SuperRare", @@ -2757,7 +3922,9 @@ "dateOfLaunch": "4/4/2018", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-01T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-07T07:00:00.000Z" }, { "name": "Decentraland", @@ -2804,7 +3971,9 @@ "dateOfLaunch": "2/20/2020", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-19T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-25T07:00:00.000Z" }, { "name": "Magic Eden", @@ -2842,7 +4011,9 @@ "dateOfLaunch": "9/17/2021", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Azuki", @@ -2880,7 +4051,9 @@ "dateOfLaunch": "1/12/2022", "lastUpdated": "7/6/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-29T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-04T07:00:00.000Z" }, { "name": "POAP", @@ -2921,7 +4094,9 @@ "dateOfLaunch": "1/1/2021", "lastUpdated": "7/15/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-23T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-29T06:00:00.000Z" }, { "name": "Courtyard", @@ -2957,48 +4132,12 @@ "dateOfLaunch": "5/8/2022", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null } ], "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/", @@ -3038,7 +4177,9 @@ "dateOfLaunch": "4/4/2021", "lastUpdated": "2025", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Illuvium", @@ -3075,7 +4216,9 @@ "dateOfLaunch": "7/25/2024", "lastUpdated": "", "ready": "true", - "devconnect": "true" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-05T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-11T07:00:00.000Z" }, { "name": "Parallel", @@ -3112,7 +4255,9 @@ "dateOfLaunch": "4/22/2024", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-02T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-08T07:00:00.000Z" } ], "DAO": [ @@ -3153,7 +4298,9 @@ "dateOfLaunch": "1/8/2020", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-08T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-14T07:00:00.000Z" }, { "name": "Tally", @@ -3198,13 +4345,15 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "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", + "image": "https://i.imgur.com/imDZeNh.png", "category": "DAO", "subCategory": [ "Role management", @@ -3221,7 +4370,7 @@ "screenshots": [ "https://i.imgur.com/XKumEus.png" ], - "bannerImage": "https://i.imgur.com/CPBwsLj.png", + "bannerImage": "https://i.imgur.com/dsJavjF.png", "platforms": [ "Browser" ], @@ -3242,7 +4391,9 @@ "dateOfLaunch": "6/27/2024", "lastUpdated": "7/7/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": "2026-01-19T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-25T07:00:00.000Z" }, { "name": "Aragon", @@ -3280,7 +4431,9 @@ "dateOfLaunch": "10/30/2018", "lastUpdated": "7/15/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-01-05T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-01-11T07:00:00.000Z" }, { "name": "DAOhaus", @@ -3322,7 +4475,9 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-09T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-15T07:00:00.000Z" }, { "name": "Event Horizon", @@ -3364,7 +4519,9 @@ "dateOfLaunch": "", "lastUpdated": "7/7/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-16T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-22T07:00:00.000Z" }, { "name": "Splits", @@ -3403,7 +4560,9 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-30T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-05T06:00:00.000Z" }, { "name": "Safe", @@ -3448,7 +4607,9 @@ "dateOfLaunch": "7/7/2022", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2025-12-15T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-12-21T07:00:00.000Z" }, { "name": "Coordinape", @@ -3488,7 +4649,9 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Endaoment", @@ -3526,7 +4689,9 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "ResearchHub", @@ -3563,7 +4728,9 @@ "dateOfLaunch": "2/25/2019", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-16T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-22T06:00:00.000Z" }, { "name": "Prime Intellect", @@ -3599,7 +4766,9 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Agora", @@ -3640,51 +4809,9 @@ "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" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null } ], "Productivity": [ @@ -3725,7 +4852,9 @@ "dateOfLaunch": "5/4/2017", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": "2025-11-23T07:00:00.000Z", + "appOfTheWeekEndDate": "2025-11-30T07:00:00.000Z" }, { "name": "Huddle01", @@ -3766,7 +4895,9 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Livepeer", @@ -3805,10 +4936,12 @@ "dateOfLaunch": "4/30/2018", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { - "name": "ZK / Open Passport", + "name": "ZK 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", @@ -3832,14 +4965,16 @@ "languages": [ "English" ], - "parentCompany": "Self Protocol ", - "parentCompanyURL": "https://self.xyz/", + "parentCompany": "", + "parentCompanyURL": "", "openSource": true, "contractAddress": "", "dateOfLaunch": "", "lastUpdated": "7/21/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "QuarkID", @@ -3877,7 +5012,9 @@ "dateOfLaunch": "1/20/2025", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-02T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-08T07:00:00.000Z" }, { "name": "Rotki", @@ -3920,29 +5057,154 @@ "dateOfLaunch": "10/1/2019", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": "2026-03-23T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-29T06:00:00.000Z" + }, + { + "name": "Zupass", + "url": "https://zupass.org/", + "description": "Zupass is a new application powered by Programmable Cryptography. It's a stepping stone towards building the next internet.", + "image": "https://i.imgur.com/FT9RVoI.png", + "category": "Productivity", + "subCategory": [ + "Identity" + ], + "networks": [ + "Ethereum Mainnet" + ], + "screenshots": [], + "bannerImage": "https://i.imgur.com/1dRS0P5.png", + "platforms": [ + "Browser" + ], + "twitter": "https://x.com/ZupassProject", + "github": "https://github.com/proofcarryingdata/zupass", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "0xPARC Foundation", + "parentCompanyURL": "https://0xparc.org/", + "openSource": true, + "contractAddress": "", + "dateOfLaunch": "3/24/2023", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "OpenCerts", + "url": "https://opencerts.io/", + "description": "OpenCerts, part of Singapore’s Smart Nation initiative, enables issuance and validation of tamper-resistant academic certificates in a convenient and reliable manner.", + "image": "https://i.imgur.com/vErB6yN.png", + "category": "Productivity", + "subCategory": [ + "Certificate", + "Infrastructure", + "Governance" + ], + "networks": [ + "Ethereum Mainnet" + ], + "screenshots": [], + "bannerImage": "https://i.imgur.com/EoELW3n.png", + "platforms": [ + "Browser" + ], + "twitter": "", + "github": "https://github.com/opencerts", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "GovTech Singapore", + "parentCompanyURL": "https://www.tech.gov.sg/", + "openSource": true, + "contractAddress": "", + "dateOfLaunch": "8/27/2018", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Self", + "url": "https://self.xyz/", + "description": "Self empowers everyday companies to identify real users and prevent attacks from fraudsters. Users maintain control of the data they share, and neither Self nor the requesting company can access user's sensitive information without consent.", + "image": "https://i.imgur.com/wvW71IU.png", + "category": "Productivity", + "subCategory": [ + "Privacy", + "Identity", + "Proof-of-personhood" + ], + "networks": [ + "Celo" + ], + "screenshots": [], + "bannerImage": "https://i.imgur.com/PvtzSJ5.png", + "platforms": [ + "Browser", + "iOS", + "Android", + "Browser extension" + ], + "twitter": "https://x.com/selfprotocol/", + "github": "https://github.com/selfxyz/", + "discord": "", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": true, + "languages": [ + "English" + ], + "parentCompany": "Self Labs", + "parentCompanyURL": "https://self.xyz/", + "openSource": true, + "contractAddress": "", + "dateOfLaunch": "2/25/2025", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "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.", + "description": "ddocs.new is a privacy-first alternative to Google docs. dDocs is end-to-end encrypted, open-source, and onchain. By design, not by promise. You can use it both for real-time and async collaboration! Moisturised features include: Markdown and LaTeX support; Darkmode; local LLM plugin; Offline mode; Collaborate with your ENS vs email; Accountless version where all your docs are stored locally. What we stand for: Self-sovereignty, Privacy, Open standards.", "image": "https://i.imgur.com/micDfkJ.png", "category": "Productivity", "subCategory": [ - "DePIN" + "Privacy", + "Communication", + "Storage" ], "networks": [ "Ethereum Mainnet" ], "screenshots": [ - "https://i.imgur.com/XAdzWtj.png" + "https://i.imgur.com/GxVjiCG.png" ], - "bannerImage": "https://i.imgur.com/VqQG462.png", + "bannerImage": "https://i.imgur.com/YI706qW.jpeg", "platforms": [ "Browser" ], "twitter": "https://x.com/fileverse", - "github": "https://x.com/fileverse", + "github": "https://github.com/fileverse/fileverse-cryptography", "discord": "", "kpiUrl": "", "sortingWeight": 0, @@ -3958,29 +5220,33 @@ "dateOfLaunch": "4/7/2024", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "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.", + "description": "dSheets.new is your decentralized spreadsheets made for the global economy & open Internet. It's a no-code tool to read, manipulate, and write onchain data in real-time, using familiar spreadsheet logic & functions. Built on the same Fileverse middleware as ddocs.new: no downloads, no sign-ups, full end-to-end encryption, granular permissions (email/ENS/0x), built on open standards, and with ZK-authentication (vOPRF-ID) for your private online collaboration.", "image": "https://i.imgur.com/micDfkJ.png", "category": "Productivity", "subCategory": [ - "DePIN" + "Privacy", + "Communication", + "Storage" ], "networks": [ "Ethereum Mainnet" ], "screenshots": [ - "https://i.imgur.com/kGl5UXb.png" + "https://i.imgur.com/rFOUKwe.png" ], - "bannerImage": "https://i.imgur.com/VqQG462.png", + "bannerImage": "https://i.imgur.com/wc8Dnwm.jpeg", "platforms": [ "Browser" ], "twitter": "https://x.com/fileverse", - "github": "https://x.com/fileverse", + "github": "https://github.com/fileverse/fileverse-cryptography", "discord": "", "kpiUrl": "", "sortingWeight": 0, @@ -3996,7 +5262,9 @@ "dateOfLaunch": "6/23/2025", "lastUpdated": "7/11/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "EAS", @@ -4037,7 +5305,9 @@ "dateOfLaunch": "2/27/2023", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Unlock", @@ -4086,7 +5356,9 @@ "dateOfLaunch": "3/28/2021", "lastUpdated": "7/15/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Human Passport", @@ -4133,7 +5405,9 @@ "dateOfLaunch": "", "lastUpdated": "6/13/2025", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Sequence", @@ -4173,7 +5447,9 @@ "dateOfLaunch": "1/20/2021", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-30T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-05T06:00:00.000Z" }, { "name": "Eternal AI", @@ -4212,7 +5488,9 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-04-06T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-12T06:00:00.000Z" }, { "name": "Virtuals", @@ -4250,7 +5528,100 @@ "dateOfLaunch": "", "lastUpdated": "", "ready": "true", - "devconnect": "false" + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "Focus Tree", + "url": "https://focustree.app/", + "description": "Focus Tree is an web3 app that helps you manage your screentime better. Grow your garden with friends and collect items on Starknet blockchain.", + "image": "https://i.imgur.com/sjb5oar.png", + "category": "Productivity", + "subCategory": [ + "Memberships", + "Lifestyle" + ], + "networks": [ + "Starknet" + ], + "screenshots": [ + "https://i.imgur.com/qeo89nB.jpeg", + "https://i.imgur.com/Fn0HDe6.jpeg", + "https://i.imgur.com/I77rJjp.jpeg", + "https://i.imgur.com/B9phJpy.jpeg", + "https://i.imgur.com/OTV9EXy.jpeg" + ], + "bannerImage": "https://i.imgur.com/2SCRTsj.png", + "platforms": [ + "iOS", + "Android", + "Browser" + ], + "twitter": "https://x.com/focustree_app", + "github": "", + "discord": "https://discord.com/invite/focustree", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": true, + "languages": [ + "English" + ], + "parentCompany": "Focus tree", + "parentCompanyURL": "https://focustree.app/#", + "openSource": false, + "contractAddress": "", + "dateOfLaunch": "1/1/2022", + "lastUpdated": "", + "ready": "true", + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null + }, + { + "name": "elizaOS", + "url": "https://elizaos.ai/", + "description": "Build, orchestrate, and\ncollaborate with AI agents.", + "image": "https://i.imgur.com/SR0FvBn.png", + "category": "Productivity", + "subCategory": [ + "AI", + "AI Agents" + ], + "networks": [ + "Ethereum Mainnet", + "Base", + "Arbitrum One", + "OP Mainnet" + ], + "screenshots": [ + "https://i.imgur.com/S49fjjj.png" + ], + "bannerImage": "https://i.imgur.com/KZ8zsdQ.png", + "platforms": [ + "Browser" + ], + "twitter": "https://x.com/elizaos", + "github": "https://github.com/elizaos", + "discord": "https://discord.com/invite/tgCCVF9vEa", + "kpiUrl": "", + "sortingWeight": 0, + "discover": false, + "highlight": false, + "languages": [ + "English" + ], + "parentCompany": "elizaOS", + "parentCompanyURL": "https://elizaos.ai/", + "openSource": true, + "contractAddress": "", + "dateOfLaunch": "1/29/2025", + "lastUpdated": "10/9/2025", + "ready": "true", + "devconnect": "true", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null } ], "Bridge": [ @@ -4298,7 +5669,9 @@ "dateOfLaunch": "9/9/2024", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Layerswap", @@ -4343,7 +5716,9 @@ "dateOfLaunch": "6/11/2021", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Hop", @@ -4383,7 +5758,9 @@ "dateOfLaunch": "7/12/2021", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-04-20T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-26T06:00:00.000Z" }, { "name": "Stargate", @@ -4414,7 +5791,7 @@ ], "twitter": "https://twitter.com/StargateFinance", "github": "https://github.com/stargate-protocol", - "discord": "https://stargate.finance/discord", + "discord": "", "kpiUrl": "", "sortingWeight": 0, "discover": true, @@ -4429,7 +5806,9 @@ "dateOfLaunch": "3/18/2022", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Across", @@ -4473,7 +5852,9 @@ "dateOfLaunch": "11/8/2021", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-02-09T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-02-15T07:00:00.000Z" }, { "name": "Meson", @@ -4519,7 +5900,9 @@ "dateOfLaunch": "12/1/2021", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-04-13T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-19T06:00:00.000Z" }, { "name": "deBridge", @@ -4559,7 +5942,9 @@ "dateOfLaunch": "2/17/2022", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Orbiter Finance", @@ -4606,7 +5991,9 @@ "dateOfLaunch": "12/30/2021", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Celer cBridge", @@ -4649,7 +6036,9 @@ "dateOfLaunch": "6/10/2021", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Synapse", @@ -4691,7 +6080,9 @@ "dateOfLaunch": "8/29/2021", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-04-13T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-19T06:00:00.000Z" }, { "name": "Gas.zip", @@ -4736,7 +6127,9 @@ "dateOfLaunch": "8/9/2023", "lastUpdated": "7/3/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-04-13T06:00:00.000Z", + "appOfTheWeekEndDate": "2026-04-19T06:00:00.000Z" }, { "name": "Staking Launchpad", @@ -4788,7 +6181,9 @@ "dateOfLaunch": "12/1/2020", "lastUpdated": "7/7/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": null, + "appOfTheWeekEndDate": null }, { "name": "Bungee", @@ -4834,7 +6229,9 @@ "dateOfLaunch": "10/10/2023", "lastUpdated": "7/14/2025", "ready": "true", - "devconnect": "false" + "devconnect": "false", + "appOfTheWeekStartDate": "2026-03-02T07:00:00.000Z", + "appOfTheWeekEndDate": "2026-03-08T07:00:00.000Z" } ] } \ No newline at end of file diff --git a/src/lib/utils/apps.ts b/src/lib/utils/apps.ts index 8ac15d15253..dacda4b035a 100644 --- a/src/lib/utils/apps.ts +++ b/src/lib/utils/apps.ts @@ -49,13 +49,28 @@ export const parseAppsOfTheWeek = ( const currentDate = new Date() const appsOfTheWeek = Object.values(appsData) .flatMap((categoryApps) => categoryApps) - .filter( - (app) => - app.appOfTheWeekStartDate && - app.appOfTheWeekEndDate && - currentDate >= app.appOfTheWeekStartDate && - currentDate <= app.appOfTheWeekEndDate - ) + .filter((app) => { + // Handle both Date objects and date strings (for mock data) + const startDate = + app.appOfTheWeekStartDate instanceof Date + ? app.appOfTheWeekStartDate + : app.appOfTheWeekStartDate + ? new Date(app.appOfTheWeekStartDate as unknown as string) + : null + const endDate = + app.appOfTheWeekEndDate instanceof Date + ? app.appOfTheWeekEndDate + : app.appOfTheWeekEndDate + ? new Date(app.appOfTheWeekEndDate as unknown as string) + : null + + return ( + startDate && + endDate && + currentDate >= startDate && + currentDate <= endDate + ) + }) .sort(() => Math.random() - 0.5) return appsOfTheWeek } From 06082b2154f3d0110a518063a714e35812786561 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:36:23 +0000 Subject: [PATCH 056/227] Move enterprise redirect from netlify.toml to redirects.config.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per review feedback, netlify.toml is no longer used for redirects. Move the /enterprise -> institutions.ethereum.org redirect to the correct location in redirects.config.js. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- netlify.toml | 24 ------------------------ redirects.config.js | 3 ++- 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/netlify.toml b/netlify.toml index 819f3684d68..66367090c2d 100644 --- a/netlify.toml +++ b/netlify.toml @@ -38,29 +38,5 @@ [[plugins.inputs.audits]] path = "en/developers/tutorials/creating-a-wagmi-ui-for-your-contract/" -[[redirects]] - from = "/:locale/enterprise/" - to = "https://institutions.ethereum.org/" - status = 301 - force = true - -[[redirects]] - from = "/:locale/enterprise" - to = "https://institutions.ethereum.org/" - status = 301 - force = true - -[[redirects]] - from = "/enterprise/" - to = "https://institutions.ethereum.org/" - status = 301 - force = true - -[[redirects]] - from = "/enterprise" - to = "https://institutions.ethereum.org/" - status = 301 - force = true - [functions] included_files = ["i18n.config.json", "src/intl/**/*", "src/data/mocks/**/*"] diff --git a/redirects.config.js b/redirects.config.js index 23300bb091b..8b4aff91e3a 100644 --- a/redirects.config.js +++ b/redirects.config.js @@ -95,7 +95,8 @@ module.exports = [ "/guides/how-to-create-an-ethereum-account/", ], ["/deprecated-software", "/apps/"], - ["/enterprise/private-ethereum", "/enterprise/"], + ["/enterprise", "https://institutions.ethereum.org/"], + ["/enterprise/private-ethereum", "https://institutions.ethereum.org/"], ["/dashboards", "/resources"], ["/tds", "/trillion-dollar-security"], ["/10-years", "/10years"], From ab3905836c28a72458005e73e9eac0e8e7128ab4 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:55:52 +0000 Subject: [PATCH 057/227] Refactor EthPriceSimple to use server-side data fetching Convert EthPriceSimple from client component to server component, accepting ethPrice as a prop instead of fetching client-side. This avoids CoinGecko rate limits and eliminates layout shift. The homepage already fetches ethPrice server-side with hourly revalidation via dataLoader. --- app/[locale]/page.tsx | 2 +- src/components/EthPriceSimple.tsx | 73 +++++++------------------------ 2 files changed, 16 insertions(+), 59 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index 622f6964efa..a6d3dc229bf 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -578,7 +578,7 @@ const Page = async ({ params }: { params: PageParams }) => { {t("page-index-what-is-ether-title")} - +

{t("page-index-what-is-ether-description-1")}

{t("page-index-what-is-ether-description-2")}

diff --git a/src/components/EthPriceSimple.tsx b/src/components/EthPriceSimple.tsx index 78daecf1f18..068681fd0f6 100644 --- a/src/components/EthPriceSimple.tsx +++ b/src/components/EthPriceSimple.tsx @@ -1,81 +1,38 @@ -"use client" - -import { useEffect, useState } from "react" import { Info } from "lucide-react" -import { useLocale } from "next-intl" +import { getLocale, getTranslations } from "next-intl/server" -import type { LoadingState } from "@/lib/types" +import type { MetricReturnData } from "@/lib/types" import Tooltip from "@/components/Tooltip" import InlineLink from "@/components/ui/Link" import { cn } from "@/lib/utils/cn" -import { useTranslation } from "@/hooks/useTranslation" - -type EthPriceResponse = { - ethereum: { - usd: string - } -} - -type EthPriceState = { - currentPriceUSD: string +interface EthPriceSimpleProps extends React.HTMLAttributes { + ethPrice: MetricReturnData } -const EthPriceSimple = ({ +const EthPriceSimple = async ({ + ethPrice, className, ...props -}: React.HTMLAttributes) => { - const locale = useLocale() - const { t } = useTranslation() - const [state, setState] = useState>({ - loading: true, - }) - - useEffect(() => { - const fetchData = async () => { - try { - const response = await fetch( - "https://api.coingecko.com/api/v3/simple/price?ids=ethereum&vs_currencies=usd" - ) - if (!response.ok) throw new Error(response.statusText) - const data: EthPriceResponse = await response.json() - if (data && data.ethereum) { - const currentPriceUSD = data.ethereum.usd - setState({ - loading: false, - data: { currentPriceUSD }, - }) - } - } catch (error: unknown) { - error instanceof Error && console.error(error.message) - setState({ - loading: false, - error, - }) - } - } - fetchData() - }, []) +}: EthPriceSimpleProps) => { + const locale = await getLocale() + const t = await getTranslations() - const hasError = "error" in state + const hasError = "error" in ethPrice - const formatPrice = (price: string) => + const formatPrice = (price: number) => new Intl.NumberFormat(locale, { style: "currency", currency: "USD", minimumFractionDigits: 2, maximumFractionDigits: 2, - }).format(+price) - - const getPriceString = (): string => { - if (state.loading) return t("loading") - if (hasError) return t("loading-error-refresh") - return formatPrice(state.data.currentPriceUSD) - } + }).format(price) - const price = getPriceString() + const price = hasError + ? t("loading-error-refresh") + : formatPrice(ethPrice.value) const tooltipContent = (
From 30db5de7b352d1d24635ed4226458183abf83673 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 11 Dec 2025 20:58:39 +0000 Subject: [PATCH 058/227] Add formatPriceUSD util and use in EthPriceSimple Add centralized price formatting utility for USD values with 2 decimal places. Use it in EthPriceSimple instead of inline formatting logic. --- src/components/EthPriceSimple.tsx | 11 ++--------- src/lib/utils/numbers.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/components/EthPriceSimple.tsx b/src/components/EthPriceSimple.tsx index 068681fd0f6..b995af9a828 100644 --- a/src/components/EthPriceSimple.tsx +++ b/src/components/EthPriceSimple.tsx @@ -7,6 +7,7 @@ import Tooltip from "@/components/Tooltip" import InlineLink from "@/components/ui/Link" import { cn } from "@/lib/utils/cn" +import { formatPriceUSD } from "@/lib/utils/numbers" interface EthPriceSimpleProps extends React.HTMLAttributes { ethPrice: MetricReturnData @@ -22,17 +23,9 @@ const EthPriceSimple = async ({ const hasError = "error" in ethPrice - const formatPrice = (price: number) => - new Intl.NumberFormat(locale, { - style: "currency", - currency: "USD", - minimumFractionDigits: 2, - maximumFractionDigits: 2, - }).format(price) - const price = hasError ? t("loading-error-refresh") - : formatPrice(ethPrice.value) + : formatPriceUSD(ethPrice.value, locale) const tooltipContent = (
diff --git a/src/lib/utils/numbers.ts b/src/lib/utils/numbers.ts index 3c325f99e15..ac48d4f33c5 100644 --- a/src/lib/utils/numbers.ts +++ b/src/lib/utils/numbers.ts @@ -25,3 +25,12 @@ export const formatLargeNumber = (value: number, locale: string): string => { maximumSignificantDigits: 4, }).format(value) } + +export const formatPriceUSD = (value: number, locale: string): string => { + return new Intl.NumberFormat(locale, { + style: "currency", + currency: "USD", + minimumFractionDigits: 2, + maximumFractionDigits: 2, + }).format(value) +} From 71b575f4f1d0c590ca38509af3de199c8d179866 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Thu, 11 Dec 2025 21:56:18 +0000 Subject: [PATCH 059/227] Refactor homepage Schema.org structured data for YMYL mitigation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace multi-schema approach with single WebSite schema optimized for EEAT (Experience, Expertise, Authoritativeness, Trust) signals: - Use WebSite as primary type (educational platform vs business entity) - Set publisher to Ethereum Foundation (avoids self-referential loop) - Add Wikidata sameAs links for Knowledge Graph integration - Ethereum Foundation: Q114736857 - Ethereum network: Q16783523 - Add MIT license URL (open-source signal) - Add EducationalAudience with developer role - Set educationalUse to "instruction" (LRMI vocabulary) - Add maintainer referencing GitHub contributors - Define "about" as Ethereum (SoftwareApplication) with Wikipedia/GitHub links - Add keywords for YMYL disambiguation from financial products This approach establishes ethereum.org as an educational resource published by a recognized non-profit (EF) rather than self-vouching. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- app/[locale]/page-jsonld.tsx | 116 +++++++++++------------------------ 1 file changed, 36 insertions(+), 80 deletions(-) diff --git a/app/[locale]/page-jsonld.tsx b/app/[locale]/page-jsonld.tsx index ebe19a5c823..1801fde995e 100644 --- a/app/[locale]/page-jsonld.tsx +++ b/app/[locale]/page-jsonld.tsx @@ -21,95 +21,51 @@ export default async function IndexPageJsonLD({ "@context": "https://schema.org", "@type": "WebSite", "@id": "https://ethereum.org/#website", + url: url, name: "ethereum.org", - url: "https://ethereum.org", - description: t("page-index-meta-description"), - publisher: { - "@id": "https://ethereum.org/#organization", - }, - inLanguage: locale, - } - - const webPageJsonLd = { - "@context": "https://schema.org", - "@type": "WebPage", - "@id": url, - name: t("page-index-meta-title"), description: t("page-index-meta-description"), - url: url, + educationalUse: "instruction", + keywords: + "Ethereum, Blockchain, Smart Contracts, Web3, Open Source, Protocol, Documentation, Education", inLanguage: locale, - isPartOf: { - "@id": "https://ethereum.org/#website", - }, - about: { - "@id": "https://ethereum.org/#organization", - }, - breadcrumb: { - "@type": "BreadcrumbList", - itemListElement: [ - { - "@type": "ListItem", - position: 1, - name: "Home", - item: url, - }, - ], + license: "https://opensource.org/licenses/MIT", + audience: { + "@type": "EducationalAudience", + educationalRole: "developer", + audienceType: "public", }, publisher: { - "@id": "https://ethereum.org/#organization", - }, - mainEntity: { - "@id": "https://ethereum.org/#organization", - }, - } - - const organizationJsonLd = { - "@context": "https://schema.org", - "@type": "Organization", - additionalType: "https://schema.org/EducationalOrganization", - "@id": "https://ethereum.org/#organization", - name: "ethereum.org", - alternateName: "Ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - "@id": "https://ethereum.org/#logo", - url: "https://ethereum.org/images/eth-home-icon.png", - contentUrl: "https://ethereum.org/images/eth-home-icon.png", - caption: "ethereum.org logo", - }, - image: { - "@id": "https://ethereum.org/#logo", - }, - description: t("page-index-meta-description"), - sameAs: [ - "https://github.com/ethereum/ethereum-org-website", - "https://discord.gg/ethereum-org", - "https://x.com/EthDotOrg", - ], - foundingDate: "2015", - slogan: - "Ethereum is the community-run technology powering the cryptocurrency ether and thousands of decentralized applications", - knowsAbout: [ - "Ethereum", - "Blockchain technology", - "Cryptocurrency", - "Decentralized finance", - "Smart contracts", - "Web3", - "Decentralized applications", - ], - areaServed: "Worldwide", - parentOrganization: { "@type": "Organization", name: "Ethereum Foundation", url: "https://ethereum.foundation", + ownershipFundingInfo: "https://ethereum.foundation/ef", + logo: "https://cdn.jsdelivr.net/gh/ethereum/ethereum-foundation-website@master/src/assets/images/ef-logo.svg", + sameAs: [ + "https://www.wikidata.org/wiki/Q114736857", + "https://github.com/ethereum/ethereum-foundation-website", + "https://x.com/ethereumfndn", + ], + }, + maintainer: { + "@type": "Organization", + name: "Ethereum Community", + url: "https://github.com/ethereum/ethereum-org-website/graphs/contributors", + }, + about: { + "@type": "SoftwareApplication", + name: "Ethereum", + applicationCategory: "Blockchain Protocol", + operatingSystem: "Cross-platform", + description: + "A decentralized, open-source blockchain with smart contract functionality.", + sameAs: [ + "https://www.wikidata.org/wiki/Q16783523", + "https://en.wikipedia.org/wiki/Ethereum", + "https://x.com/ethereum", + "https://github.com/ethereum", + ], }, } - return ( - - ) + return } From f2459f5b287665e0276fef064b6581ed9473828b Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Fri, 12 Dec 2025 13:54:16 -0300 Subject: [PATCH 060/227] patch: markdown syntax --- public/content/staking/withdrawals/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/staking/withdrawals/index.md b/public/content/staking/withdrawals/index.md index d7874f55883..fcae6e6284a 100644 --- a/public/content/staking/withdrawals/index.md +++ b/public/content/staking/withdrawals/index.md @@ -62,7 +62,7 @@ Once an account is flagged as "withdrawable", and withdrawal credentials have be ## When were staking withdrawals enabled? {#when} -Withdrawal functionality was enabled as part of the Shanghai/Capella upgrade which occurred on** April 12, 2023**. +Withdrawal functionality was enabled as part of the Shanghai/Capella upgrade which occurred on **April 12, 2023**. The Shanghai/Capella upgrade enabled previously staked ETH to be reclaimed into regular Ethereum accounts. This closed the loop on staking liquidity, and brought Ethereum one step closer on its journey towards building a sustainable, scalable, secure decentralized ecosystem. From 752faaa66bbc414842f9da2618ea74d2ffb37ba0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 13 Dec 2025 14:20:53 +0000 Subject: [PATCH 061/227] Bump next from 14.2.32 to 14.2.35 Bumps [next](https://github.com/vercel/next.js) from 14.2.32 to 14.2.35. - [Release notes](https://github.com/vercel/next.js/releases) - [Changelog](https://github.com/vercel/next.js/blob/canary/release.js) - [Commits](https://github.com/vercel/next.js/compare/v14.2.32...v14.2.35) --- updated-dependencies: - dependency-name: next dependency-version: 14.2.35 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 128 ++++++++++++++++++++++++------------------------- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index 15582da6b94..a43d2800816 100644 --- a/package.json +++ b/package.json @@ -78,7 +78,7 @@ "humanize-duration": "^3.33.1", "lodash": "^4.17.21", "lucide-react": "^0.516.0", - "next": "^14.2.32", + "next": "^14.2.35", "next-intl": "^3.26.3", "next-mdx-remote": "^5.0.0", "next-themes": "^0.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee0f838a033..b53627e49ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,10 +88,10 @@ importers: version: 2.2.5(@tanstack/react-query@5.80.2(react@18.3.1))(@types/react@18.2.57)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4))(wagmi@2.15.4(@tanstack/query-core@5.80.2)(@tanstack/react-query@5.80.2(react@18.3.1))(@types/react@18.2.57)(bufferutil@4.0.9)(react@18.3.1)(typescript@5.8.3)(utf-8-validate@5.0.10)(viem@2.30.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.22.4))(zod@3.22.4)) '@sentry/nextjs': specifier: ^10.5.0 - version: 10.5.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.99.9(esbuild@0.25.5)) + version: 10.5.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.99.9(esbuild@0.25.5)) '@socialgouv/matomo-next': specifier: ^1.8.0 - version: 1.9.2(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) + version: 1.9.2(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)) '@tanstack/react-query': specifier: ^5.66.7 version: 5.80.2(react@18.3.1) @@ -156,11 +156,11 @@ importers: specifier: ^0.516.0 version: 0.516.0(react@18.3.1) next: - specifier: ^14.2.32 - version: 14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^14.2.35 + version: 14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) next-intl: specifier: ^3.26.3 - version: 3.26.5(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + version: 3.26.5(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) next-mdx-remote: specifier: ^5.0.0 version: 5.0.0(@types/react@18.2.57)(acorn@8.14.1)(react@18.3.1) @@ -269,7 +269,7 @@ importers: version: 8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)) '@storybook/nextjs': specifier: ^8.6.14 - version: 8.6.14(babel-plugin-macros@3.1.0)(esbuild@0.25.5)(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(type-fest@2.19.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(esbuild@0.25.5)) + version: 8.6.14(babel-plugin-macros@3.1.0)(esbuild@0.25.5)(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(type-fest@2.19.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(esbuild@0.25.5)) '@storybook/react': specifier: 8.6.14 version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(typescript@5.8.3) @@ -386,7 +386,7 @@ importers: version: 8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) storybook-next-intl: specifier: ^1.2.5 - version: 1.2.6(next-intl@3.26.5(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)) + version: 1.2.6(next-intl@3.26.5(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)) tailwindcss: specifier: ^3.4.4 version: 3.4.17(ts-node@10.9.2(@types/node@20.17.57)(typescript@5.8.3)) @@ -1881,62 +1881,62 @@ packages: '@next/bundle-analyzer@14.2.29': resolution: {integrity: sha512-5H2FPagh/K4g00MLHK0M70OnRfhN2rpb4Z6+jJZBNJ5VrFP7XkbUHlX4idhPwGNuwLAR2UbWZo4wEl6iPFukHw==} - '@next/env@14.2.32': - resolution: {integrity: sha512-n9mQdigI6iZ/DF6pCTwMKeWgF2e8lg7qgt5M7HXMLtyhZYMnf/u905M18sSpPmHL9MKp9JHo56C6jrD2EvWxng==} + '@next/env@14.2.35': + resolution: {integrity: sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==} '@next/eslint-plugin-next@14.2.29': resolution: {integrity: sha512-qpxSYiPNJTr9RzqjGi5yom8AIC8Kgdtw4oNIXAB/gDYMDctmfMEv452FRUhT06cWPgcmSsbZiEPYhbFiQtCWTg==} - '@next/swc-darwin-arm64@14.2.32': - resolution: {integrity: sha512-osHXveM70zC+ilfuFa/2W6a1XQxJTvEhzEycnjUaVE8kpUS09lDpiDDX2YLdyFCzoUbvbo5r0X1Kp4MllIOShw==} + '@next/swc-darwin-arm64@14.2.33': + resolution: {integrity: sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@14.2.32': - resolution: {integrity: sha512-P9NpCAJuOiaHHpqtrCNncjqtSBi1f6QUdHK/+dNabBIXB2RUFWL19TY1Hkhu74OvyNQEYEzzMJCMQk5agjw1Qg==} + '@next/swc-darwin-x64@14.2.33': + resolution: {integrity: sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@14.2.32': - resolution: {integrity: sha512-v7JaO0oXXt6d+cFjrrKqYnR2ubrD+JYP7nQVRZgeo5uNE5hkCpWnHmXm9vy3g6foMO8SPwL0P3MPw1c+BjbAzA==} + '@next/swc-linux-arm64-gnu@14.2.33': + resolution: {integrity: sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@14.2.32': - resolution: {integrity: sha512-tA6sIKShXtSJBTH88i0DRd6I9n3ZTirmwpwAqH5zdJoQF7/wlJXR8DkPmKwYl5mFWhEKr5IIa3LfpMW9RRwKmQ==} + '@next/swc-linux-arm64-musl@14.2.33': + resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@14.2.32': - resolution: {integrity: sha512-7S1GY4TdnlGVIdeXXKQdDkfDysoIVFMD0lJuVVMeb3eoVjrknQ0JNN7wFlhCvea0hEk0Sd4D1hedVChDKfV2jw==} + '@next/swc-linux-x64-gnu@14.2.33': + resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@14.2.32': - resolution: {integrity: sha512-OHHC81P4tirVa6Awk6eCQ6RBfWl8HpFsZtfEkMpJ5GjPsJ3nhPe6wKAJUZ/piC8sszUkAgv3fLflgzPStIwfWg==} + '@next/swc-linux-x64-musl@14.2.33': + resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@14.2.32': - resolution: {integrity: sha512-rORQjXsAFeX6TLYJrCG5yoIDj+NKq31Rqwn8Wpn/bkPNy5rTHvOXkW8mLFonItS7QC6M+1JIIcLe+vOCTOYpvg==} + '@next/swc-win32-arm64-msvc@14.2.33': + resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-ia32-msvc@14.2.32': - resolution: {integrity: sha512-jHUeDPVHrgFltqoAqDB6g6OStNnFxnc7Aks3p0KE0FbwAvRg6qWKYF5mSTdCTxA3axoSAUwxYdILzXJfUwlHhA==} + '@next/swc-win32-ia32-msvc@14.2.33': + resolution: {integrity: sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] - '@next/swc-win32-x64-msvc@14.2.32': - resolution: {integrity: sha512-2N0lSoU4GjfLSO50wvKpMQgKd4HdI2UHEhQPPPnlgfBJlOgJxkjpkYBqzk08f1gItBB6xF/n+ykso2hgxuydsA==} + '@next/swc-win32-x64-msvc@14.2.33': + resolution: {integrity: sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -4832,8 +4832,8 @@ packages: caniuse-lite@1.0.30001720: resolution: {integrity: sha512-Ec/2yV2nNPwb4DnTANEV99ZWwm3ZWfdlfkQbWSDDt+PsXEVYwlhPH8tdMaPunYTKKmz7AnHi2oNEi1GcmKCD8g==} - caniuse-lite@1.0.30001739: - resolution: {integrity: sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA==} + caniuse-lite@1.0.30001760: + resolution: {integrity: sha512-7AAMPcueWELt1p3mi13HR/LHH0TJLT11cnwDJEs3xA4+CK/PLKeO9Kl1oru24htkyUKtkGCvAx4ohB0Ttry8Dw==} canvas-confetti@1.9.3: resolution: {integrity: sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g==} @@ -7134,8 +7134,8 @@ packages: react: ^16.8 || ^17 || ^18 react-dom: ^16.8 || ^17 || ^18 - next@14.2.32: - resolution: {integrity: sha512-fg5g0GZ7/nFc09X8wLe6pNSU8cLWbLRG3TZzPJ1BJvi2s9m7eF991se67wliM9kR5yLHRkyGKU49MMx58s3LJg==} + next@14.2.35: + resolution: {integrity: sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -11348,37 +11348,37 @@ snapshots: - bufferutil - utf-8-validate - '@next/env@14.2.32': {} + '@next/env@14.2.35': {} '@next/eslint-plugin-next@14.2.29': dependencies: glob: 10.3.10 - '@next/swc-darwin-arm64@14.2.32': + '@next/swc-darwin-arm64@14.2.33': optional: true - '@next/swc-darwin-x64@14.2.32': + '@next/swc-darwin-x64@14.2.33': optional: true - '@next/swc-linux-arm64-gnu@14.2.32': + '@next/swc-linux-arm64-gnu@14.2.33': optional: true - '@next/swc-linux-arm64-musl@14.2.32': + '@next/swc-linux-arm64-musl@14.2.33': optional: true - '@next/swc-linux-x64-gnu@14.2.32': + '@next/swc-linux-x64-gnu@14.2.33': optional: true - '@next/swc-linux-x64-musl@14.2.32': + '@next/swc-linux-x64-musl@14.2.33': optional: true - '@next/swc-win32-arm64-msvc@14.2.32': + '@next/swc-win32-arm64-msvc@14.2.33': optional: true - '@next/swc-win32-ia32-msvc@14.2.32': + '@next/swc-win32-ia32-msvc@14.2.33': optional: true - '@next/swc-win32-x64-msvc@14.2.32': + '@next/swc-win32-x64-msvc@14.2.33': optional: true '@noble/ciphers@1.2.1': {} @@ -12760,7 +12760,7 @@ snapshots: '@sentry/core@10.5.0': {} - '@sentry/nextjs@10.5.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.99.9(esbuild@0.25.5))': + '@sentry/nextjs@10.5.0(@opentelemetry/context-async-hooks@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.0.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.0.1(@opentelemetry/api@1.9.0))(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)(webpack@5.99.9(esbuild@0.25.5))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.36.0 @@ -12773,7 +12773,7 @@ snapshots: '@sentry/vercel-edge': 10.5.0 '@sentry/webpack-plugin': 4.1.0(webpack@5.99.9(esbuild@0.25.5)) chalk: 3.0.0 - next: 14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) resolve: 1.22.8 rollup: 4.46.2 stacktrace-parser: 0.1.11 @@ -13146,9 +13146,9 @@ snapshots: '@smithy/types': 4.3.1 tslib: 2.8.1 - '@socialgouv/matomo-next@1.9.2(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': + '@socialgouv/matomo-next@1.9.2(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))': dependencies: - next: 14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@socket.io/component-emitter@3.1.2': {} @@ -13523,7 +13523,7 @@ snapshots: dependencies: storybook: 8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10) - '@storybook/nextjs@8.6.14(babel-plugin-macros@3.1.0)(esbuild@0.25.5)(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(type-fest@2.19.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(esbuild@0.25.5))': + '@storybook/nextjs@8.6.14(babel-plugin-macros@3.1.0)(esbuild@0.25.5)(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.6.14(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10))(type-fest@2.19.0)(typescript@5.8.3)(webpack-hot-middleware@2.26.1)(webpack@5.99.9(esbuild@0.25.5))': dependencies: '@babel/core': 7.27.4 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.27.4) @@ -13549,7 +13549,7 @@ snapshots: find-up: 5.0.0 image-size: 1.2.1 loader-utils: 3.3.1 - next: 14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) node-polyfill-webpack-plugin: 2.0.1(webpack@5.99.9(esbuild@0.25.5)) pnp-webpack-plugin: 1.7.0(typescript@5.8.3) postcss: 8.5.4 @@ -15550,7 +15550,7 @@ snapshots: caniuse-lite@1.0.30001720: {} - caniuse-lite@1.0.30001739: {} + caniuse-lite@1.0.30001760: {} canvas-confetti@1.9.3: {} @@ -18323,11 +18323,11 @@ snapshots: neo-async@2.6.2: {} - next-intl@3.26.5(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): + next-intl@3.26.5(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1): dependencies: '@formatjs/intl-localematcher': 0.5.10 negotiator: 1.0.0 - next: 14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + next: 14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 use-intl: 3.26.5(react@18.3.1) @@ -18350,27 +18350,27 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@next/env': 14.2.32 + '@next/env': 14.2.35 '@swc/helpers': 0.5.5 busboy: 1.6.0 - caniuse-lite: 1.0.30001739 + caniuse-lite: 1.0.30001760 graceful-fs: 4.2.11 postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) styled-jsx: 5.1.1(@babel/core@7.27.4)(babel-plugin-macros@3.1.0)(react@18.3.1) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.32 - '@next/swc-darwin-x64': 14.2.32 - '@next/swc-linux-arm64-gnu': 14.2.32 - '@next/swc-linux-arm64-musl': 14.2.32 - '@next/swc-linux-x64-gnu': 14.2.32 - '@next/swc-linux-x64-musl': 14.2.32 - '@next/swc-win32-arm64-msvc': 14.2.32 - '@next/swc-win32-ia32-msvc': 14.2.32 - '@next/swc-win32-x64-msvc': 14.2.32 + '@next/swc-darwin-arm64': 14.2.33 + '@next/swc-darwin-x64': 14.2.33 + '@next/swc-linux-arm64-gnu': 14.2.33 + '@next/swc-linux-arm64-musl': 14.2.33 + '@next/swc-linux-x64-gnu': 14.2.33 + '@next/swc-linux-x64-musl': 14.2.33 + '@next/swc-win32-arm64-msvc': 14.2.33 + '@next/swc-win32-ia32-msvc': 14.2.33 + '@next/swc-win32-x64-msvc': 14.2.33 '@opentelemetry/api': 1.9.0 '@playwright/test': 1.53.1 transitivePeerDependencies: @@ -19733,9 +19733,9 @@ snapshots: storybook-i18n@3.1.1: {} - storybook-next-intl@1.2.6(next-intl@3.26.5(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)): + storybook-next-intl@1.2.6(next-intl@3.26.5(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)): dependencies: - next-intl: 3.26.5(next@14.2.32(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + next-intl: 3.26.5(next@14.2.35(@babel/core@7.27.4)(@opentelemetry/api@1.9.0)(@playwright/test@1.53.1)(babel-plugin-macros@3.1.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) storybook-i18n: 3.1.1 storybook@8.5.8(bufferutil@4.0.9)(prettier@3.5.3)(utf-8-validate@5.0.10): From 4d9cd5f421c1386ad100de5601c693ff33bf5397 Mon Sep 17 00:00:00 2001 From: Mikhail Date: Sun, 14 Dec 2025 17:14:09 +0800 Subject: [PATCH 062/227] Add ethfaucet.com links for Sepolia faucets --- public/content/developers/docs/networks/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/content/developers/docs/networks/index.md b/public/content/developers/docs/networks/index.md index 55321a1aad0..439f7fda311 100644 --- a/public/content/developers/docs/networks/index.md +++ b/public/content/developers/docs/networks/index.md @@ -54,6 +54,7 @@ The two public testnets that client developers are currently maintaining are Sep - [Chain Platform Sepolia Faucet](https://faucet.chainplatform.co/faucets/ethereum-sepolia/) - [Chainstack Sepolia Faucet](https://faucet.chainstack.com/sepolia-testnet-faucet) - [Ethereum Ecosystem Faucet](https://www.ethereum-ecosystem.com/faucets/ethereum-sepolia) +- [ethfaucet.com Sepolia Faucet](https://ethfaucet.com/networks/ethereum) - [Google Cloud Web3 Sepolia Faucet](https://cloud.google.com/application/web3/faucet/ethereum/sepolia) - [Grabteeth](https://grabteeth.xyz/) - [Infura Sepolia Faucet](https://www.infura.io/faucet) @@ -132,6 +133,7 @@ A testnet for [Arbitrum](https://arbitrum.io/). - [Alchemy Arbitrum Sepolia Faucet](https://www.alchemy.com/faucets/arbitrum-sepolia) - [Chainlink Arbitrum Sepolia faucet](https://faucets.chain.link/arbitrum-sepolia) +- [ethfaucet.com Arbitrum Sepolia Faucet](https://ethfaucet.com/networks/arbitrum) - [QuickNode Arbitrum Sepolia Faucet](https://faucet.quicknode.com/arbitrum/sepolia) #### Optimistic Sepolia {#optimistic-sepolia} @@ -147,6 +149,7 @@ A testnet for [Optimism](https://www.optimism.io/). - [Alchemy Faucet](https://www.alchemy.com/faucets/optimism-sepolia) - [Chainlink Faucet](https://faucets.chain.link/optimism-sepolia) +- [ethfaucet.com Optimism Sepolia Faucet](https://ethfaucet.com/networks/optimism) - [Testnet Faucet](https://docs.optimism.io/builders/tools/build/faucets) #### Starknet Sepolia {#starknet-sepolia} From cb1333bfbf8709983656e8827054f7d097a2ce26 Mon Sep 17 00:00:00 2001 From: Sshadow84 Date: Sun, 14 Dec 2025 12:54:05 +0300 Subject: [PATCH 063/227] fix: Fix typos in Russian translation for staking page --- src/intl/ru/page-staking.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/intl/ru/page-staking.json b/src/intl/ru/page-staking.json index 68f8054683e..b1bb36283fb 100644 --- a/src/intl/ru/page-staking.json +++ b/src/intl/ru/page-staking.json @@ -116,7 +116,7 @@ "page-staking-considerations-solo-7-description": "Программное обеспечение позволяет пользователям не менее двух клиентов-исполнителей и двух клиентов на слое консенсуса с возможностью переключения между ними.", "page-staking-considerations-solo-7-valid": "Простое переключение между клиентами", "page-staking-considerations-solo-7-warning": "Доступны только мажоритарные клиенты", - "page-staking-considerations-solo-8-title": "Самостоятельній контроль", + "page-staking-considerations-solo-8-title": "Самостоятельный контроль", "page-staking-considerations-solo-8-description": "Пользователь самостоятельно контролирует все учетные данные валидаторов, включая ключи для подписания и вывода средств.", "page-staking-considerations-solo-8-warning": "Сторонний контроль", "page-staking-considerations-solo-9-title": "Экономичность", @@ -152,7 +152,7 @@ "page-staking-how-solo-works-item-4": "Сгенерируйте свои ключи и загрузите их в клиент валидатора.", "page-staking-how-solo-works-item-5": "Отслеживайте и поддерживайте свой узел.", "page-staking-launchpad-widget-start": "Начать стейкинг в {network}", - "page-staking-launchpad-widget-mainnet-label": "Основная сетьu", + "page-staking-launchpad-widget-mainnet-label": "Основная сеть", "page-staking-launchpad-widget-span": "Выберите сеть", "page-staking-launchpad-widget-p1": "Ожидается, что самостоятельные валидаторы будут тестировать свои настройки и оперативные навыки работы в тестовой сети Hoodi, прежде чем рисковать средствами. Помните: важно выбрать миноритарный клиент, так как это повышает безопасность сети и ограничивает ваш риск.", "page-staking-launchpad-widget-p2": "Если это удобнее, можно задать все необходимое из командной строки, используя только панель запуска стейкинга.", @@ -167,7 +167,7 @@ "page-staking-stats-box-metric-3": "Текущий APR", "page-staking-stats-box-metric-1-tooltip": "Сумма ETH на ставке в сети Beacon, не включая балансы свыше 32 ETH", "page-staking-stats-box-metric-2-tooltip": "Количество учетных записей валидаторов, активированных сейчас в сети Beacon", - "page-staking-stats-box-metric-3-tooltip": "Средний годовой финансовій доход на валидатора за последние 24 часа", + "page-staking-stats-box-metric-3-tooltip": "Средний годовой финансовый доход на валидатора за последние 24 часа", "page-staking-section-comparison-subtitle": "Не существует универсального решения для стейкинга, которое подойдет каждому. Здесь мы сравним некоторые из рисков, вознаграждений и требований различных способов, позволяющих вам делать ставки.", "page-staking-section-comparison-rewards-title": "Вознаграждения", "page-staking-section-comparison-solo-rewards-li1": "Максимальные вознаграждения — получайте полное вознаграждение напрямую из протокола.", @@ -210,7 +210,7 @@ "page-staking-faq-5-question": "Когда я смогу вывести свои вложенные ETH?", "page-staking-faq-5-answer-p1": "Это уже возможно! При желании дольщики могут свободно выводить свои вознаграждения и/или основную сумму со своего баланса валидатора.", "page-staking-faq-5-answer-p2": "Участники также заработают вознаграждения в форме комиссий и MEV при предложении блоков, которые становятся доступными немедленно по указанному получателем адресу.", - "page-staking-faq-5-answer-link": "More on staking withdrawals", + "page-staking-faq-5-answer-link": "Подробнее о выводе средств из стейкинга", "page-staking-further-reading-author-vitalik-buterin": "Виталик Бутерин", "page-staking-further-reading-2-link": "Мотивировка замысла обновления Serenity", "page-staking-further-reading-4-link": "Новости Eth2", From f0688370a106d23028a8d757ce6c00b63b42fa7c Mon Sep 17 00:00:00 2001 From: Sshadow84 Date: Sun, 14 Dec 2025 13:00:07 +0300 Subject: [PATCH 064/227] fix: Remove stray backtick in Russian table translation --- src/intl/ru/table.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/intl/ru/table.json b/src/intl/ru/table.json index c6537fc8d64..960b786897a 100644 --- a/src/intl/ru/table.json +++ b/src/intl/ru/table.json @@ -1,5 +1,5 @@ { - "table-active": "активные`", + "table-active": "активные", "table-filters": "Фильтры", "table-showing": "Показаны ", "table-reset-filters": "Сбросить", From 5fe68c63a03edd395325f1360966bb10cd535c61 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:49:00 +0100 Subject: [PATCH 065/227] Fix broken link to maci --- public/content/translations/zh/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/zh/zero-knowledge-proofs/index.md b/public/content/translations/zh/zero-knowledge-proofs/index.md index ac61a23880d..7bab93aac70 100644 --- a/public/content/translations/zh/zero-knowledge-proofs/index.md +++ b/public/content/translations/zh/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ lang: zh 在协调员保持诚实的情况下,MACI 代表了一个强大的工具,保证了链上投票的神圣性。 这解释了它为何在二次融资应用中如此受欢迎(例如 [clr.fund](https://clr.fund/#/about/maci)),二次融资严重依赖于每个人投票选择的完整性。 -[了解更多关于最小反串谋基础设施的信息](https://privacy-scaling-explorations.github.io/maci/)。 +[了解更多关于最小反串谋基础设施的信息](https://maci.pse.dev)。 ## 零知识证明如何运作? {#how-do-zero-knowledge-proofs-work} From 15584cdbe2b29848a9829d12b2283f4904df807a Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:49:34 +0100 Subject: [PATCH 066/227] Fixed dead link to maci --- public/content/translations/ms/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ms/zero-knowledge-proofs/index.md b/public/content/translations/ms/zero-knowledge-proofs/index.md index 47ab008b751..6a130d76dc8 100644 --- a/public/content/translations/ms/zero-knowledge-proofs/index.md +++ b/public/content/translations/ms/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Menggunakan MACI _ada_ memerlukan kepercayaan kepada penyelaras untuk tidak bers Tetapi dalam kes di mana penyelaras tetap jujur, MACI mewakili alat yang berkuasa untuk menjamin kesucian pengundian dalam rantaian. Ini menerangkan popularitinya dalam kalangan aplikasi pembiayaan kuadratik (cth., [clr.fund](https://clr.fund/#/about/maci)) yang sangat bergantung pada integriti pilihan pengundian setiap individu. -[Ketahui lebih lanjut tentang MACI](https://privacy-scaling-explorations.github.io/maci/). +[Ketahui lebih lanjut tentang MACI](https://maci.pse.dev/). ## Bagaimanakah bukti pengetahuan sifar berfungsi? {#how-do-zero-knowledge-proofs-work} From ccd8a5707eba33d7a06273a3c59760b6e0c6771e Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:50:26 +0100 Subject: [PATCH 067/227] Fixed dead link to maci --- public/content/translations/sk/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/sk/zero-knowledge-proofs/index.md b/public/content/translations/sk/zero-knowledge-proofs/index.md index b226168c879..2a7881611ab 100644 --- a/public/content/translations/sk/zero-knowledge-proofs/index.md +++ b/public/content/translations/sk/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Používanie MACI _vyžaduje_ vieru, že sa koordinátor nedohovorí s úplatká Ale v prípadoch, kedy je koordinátor čestný, MACI predstavuje mocný nástroj pre zaručenie poctivosti hlasovania v reťazci. To vysvetľuje jeho popularitu medzi aplikáciami kvadratického financovania (napr. [clr.fund](https://clr.fund/#/about/maci)), ktoré do značnej miery spoliehajú na nedotknuteľnosť voľby každého jednotlivca. -[Zistite viac o MACI](https://privacy-scaling-explorations.github.io/maci/). +[Zistite viac o MACI](https://maci.pse.dev/). ## Ako dôkazy s nulovou znalosťou fungujú? {#how-do-zero-knowledge-proofs-work} From 5f7fa14631cfe71060a5ace72c5d73e89048363d Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:51:04 +0100 Subject: [PATCH 068/227] Fixed dead link to maci --- public/content/translations/id/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/id/zero-knowledge-proofs/index.md b/public/content/translations/id/zero-knowledge-proofs/index.md index 3509daf5dd3..0754867f022 100644 --- a/public/content/translations/id/zero-knowledge-proofs/index.md +++ b/public/content/translations/id/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Menggunakan MACI _memerlukan_ kepercayaan pada koordinator untuk tidak berkolusi Namun dalam kasus di mana koordinator tetap jujur, MACI menjadi alat yang kuat untuk menjamin keadilan pemungutan suara di dalam rantai. Hal ini menjelaskan popularitasnya di antara aplikasi pendanaan kuadratik seperti ([clr.fund](https://clr.fund/#/about/maci)) yang sangat mengandalkan integritas dari setiap pilihan suara individu. -[Pelajari lebih lanjut tentang MACI](https://privacy-scaling-explorations.github.io/maci/). +[Pelajari lebih lanjut tentang MACI](https://maci.pse.dev/). ## Bagaimana bukti tanpa pengetahuan bekerja? {#how-do-zero-knowledge-proofs-work} From 814a84d9262daf3f0388e31d1d9cfdfc92fc6b93 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:51:32 +0100 Subject: [PATCH 069/227] Fixed dead link to maci --- public/content/translations/cs/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/cs/zero-knowledge-proofs/index.md b/public/content/translations/cs/zero-knowledge-proofs/index.md index b5faf29423b..56e89bde927 100644 --- a/public/content/translations/cs/zero-knowledge-proofs/index.md +++ b/public/content/translations/cs/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Používání MACI _vyžaduje_ víru, že se koordinátor nedomluví s úplatká Ale v případech, kdy je koordinátor čestný, MACI představuje mocný nástroj pro zaručení poctivosti hlasování na blockchainu. To vysvětluje jeho popularitu mezi aplikacemi kvadratického financování (např. [clr.fund](https://clr.fund/#/about/maci)), které do značné míry spoléhají na nedotknutelnost volby každého jednotlivce. -[Zjistěte více o MACI](https://privacy-scaling-explorations.github.io/maci/). +[Zjistěte více o MACI](https://maci.pse.dev/). ## Jak důkazy s nulovou znalostí fungují? {#how-do-zero-knowledge-proofs-work} From 3d13292e08e8025fe645be528da384417418a8a5 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:51:55 +0100 Subject: [PATCH 070/227] Fixed dead link to maci --- public/content/translations/nl/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/nl/zero-knowledge-proofs/index.md b/public/content/translations/nl/zero-knowledge-proofs/index.md index 8433f426461..f64ad486493 100644 --- a/public/content/translations/nl/zero-knowledge-proofs/index.md +++ b/public/content/translations/nl/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Om MACI te kunnen gebruiken, _moet_ je erop vertrouwen dat de coördinator niet Maar in gevallen waarin de coördinator eerlijk blijft, is MACI een krachtig instrument om de onschendbaarheid van on-chain stemmen te garanderen. Dit verklaart de populariteit ervan bij kwadratische financieringsaanvragen (bijv. [clr.fund](https://clr.fund/#/about/maci)), die sterk afhankelijk zijn van de integriteit van de stemkeuzes van elke individuele persoon. -[Meer informatie over MACI](https://privacy-scaling-explorations.github.io/maci/). +[Meer informatie over MACI](https://maci.pse.dev/). ## Hoe werken zero-knowledge bewijzen? {#how-do-zero-knowledge-proofs-work} From cf91635051f24eed2717554af6108a3d4b98bbb3 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:52:20 +0100 Subject: [PATCH 071/227] Fixed dead link to maci --- public/content/translations/tr/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/tr/zero-knowledge-proofs/index.md b/public/content/translations/tr/zero-knowledge-proofs/index.md index 77d00eefef4..a09491e34b4 100644 --- a/public/content/translations/tr/zero-knowledge-proofs/index.md +++ b/public/content/translations/tr/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ MACI kullanmak koordinatöre rüşvetçilerle tezgah çevirmemesi veya oy veren Ancak koordinatörün dürüst olduğu durumlarda, MACI zincir üzerinde oylamaların doğruluğunu garantilemek için güçlü bir aracı temsil eder. Bu onun büyük miktarda her bir kişinin oy seçimlerinin bütünlüğüne dayanan ikinci dereceden finansman uygulamalar (ör. [clr.fund](https://clr.fund/#/about/maci)) arasındaki popülerliğini açıklar. -[MACI hakkında daha fazla bilgi edinin](https://privacy-scaling-explorations.github.io/maci/). +[MACI hakkında daha fazla bilgi edinin](https://maci.pse.dev/). ## Sıfır bilgili ispatlar nasıl çalışır? {#how-do-zero-knowledge-proofs-work} From e98b19b783a9694e1672822ddd97a6bae594932d Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:52:48 +0100 Subject: [PATCH 072/227] Fixed dead link to maci --- public/content/translations/it/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/it/zero-knowledge-proofs/index.md b/public/content/translations/it/zero-knowledge-proofs/index.md index 6f2f1ea1176..4f3d1b252be 100644 --- a/public/content/translations/it/zero-knowledge-proofs/index.md +++ b/public/content/translations/it/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ L'utilizzo di MACI _richiede_ la fiducia nel fatto che il coordinatore sia collu Ma nei casi in cui il coordinatore rimane onesto, la MACI rappresenta un potente strumento a garanzia della legittimità del voto on-chain. Ciò spiega la sua popolarità tra le applicazioni di finanziamento quadratico (es., [clr.fund](https://clr.fund/#/about/maci)) che fanno molto affidamento sull'integrità delle scelte di voto di ogni individuo. -[Maggiori informazioni su MACI](https://privacy-scaling-explorations.github.io/maci/). +[Maggiori informazioni su MACI](https://maci.pse.dev/). ## Come funzionano le prove a conoscenza zero? {#how-do-zero-knowledge-proofs-work} From 9e675af07ba877c2aad681eec12b86af2e1b95de Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:53:15 +0100 Subject: [PATCH 073/227] Fixed dead link to maci --- public/content/translations/pl/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pl/zero-knowledge-proofs/index.md b/public/content/translations/pl/zero-knowledge-proofs/index.md index 875efb547f2..1424030e8a3 100644 --- a/public/content/translations/pl/zero-knowledge-proofs/index.md +++ b/public/content/translations/pl/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Korzystanie z MACI _wymaga_ zaufania koordynatorowi, że nie jest w zmowie z prz Jednak w przypadku, w którym koordynator pozostaje uczciwy, MACI stanowi potężne narzędzie gwarantujące uczciwość głosowania w łańcuchu. Wyjaśnia to jego popularność wśród aplikacji finansowania kwadratowego (np. [clr.fund](https://clr.fund/#/about/maci)), które polegają głównie na uczciwości wyboru każdej osoby w głosowaniu. -[Dowiedz się więcej o MACI](https://privacy-scaling-explorations.github.io/maci/). +[Dowiedz się więcej o MACI](https://maci.pse.dev/). ## Jak działają dowody wiedzy zerowej? {#how-do-zero-knowledge-proofs-work} From 9374cc330f0b22837a8ea9c25c029008395f2652 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:53:40 +0100 Subject: [PATCH 074/227] Fixed dead link to maci --- public/content/translations/hu/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/hu/zero-knowledge-proofs/index.md b/public/content/translations/hu/zero-knowledge-proofs/index.md index 26d1d2fb6ff..5ce326a6540 100644 --- a/public/content/translations/hu/zero-knowledge-proofs/index.md +++ b/public/content/translations/hu/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ A MACI használatához ugyanakkor _muszáj_ megbízni a koordinátorban, hogy ne Ha a koordinátor jóhiszeműen jár el, akkor a MACI egy kiváló eszköz arra, hogy garantálja a láncon belüli szavazás szentesítését. Ez megmagyarázza a népszerűségét a kvadratikus finanszírozási alkalmazásokban (mint amilyen a [clr.fund](https://clr.fund/#/about/maci)), ami nagy mértékben függ az egyének szavazásának integritásától. -[Bővebben a MACI-ról](https://privacy-scaling-explorations.github.io/maci/). +[Bővebben a MACI-ról](https://maci.pse.dev/). ## Hogyan működik a zero-knowledge bizonyíték? {#how-do-zero-knowledge-proofs-work} From ea800322fc5e9aeb14bd1e9a1da04b707f2ee284 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:54:04 +0100 Subject: [PATCH 075/227] Fixed dead link to maci --- public/content/translations/tl/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/tl/zero-knowledge-proofs/index.md b/public/content/translations/tl/zero-knowledge-proofs/index.md index e488352bd10..1692adfc8ff 100644 --- a/public/content/translations/tl/zero-knowledge-proofs/index.md +++ b/public/content/translations/tl/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Sa paggamit ng MACI, _talagang_ kailangang magtiwala na hindi makikipagsabwatan Ngunit kung mananatiling matapat ang coordinator, ang MACI ay isang mahusay na tool para sa pagtitiyak ng kalinisan ng on-chain na pagboto. Ito ang dahilan sa likod ng kasikatan nito sa mga quadratic funding application (hal., [clr.fund](https://clr.fund/#/about/maci)) na umaasa nang husto sa integridad ng pagboto ng bawat indibidwal. -[Magbasa pa tungkol sa MACI](https://privacy-scaling-explorations.github.io/maci/). +[Magbasa pa tungkol sa MACI](https://maci.pse.dev/). ## Paano gumagana ang mga zero-knowledge proof? {#how-do-zero-knowledge-proofs-work} From a55a322766957971a8fd6499e638412e7c981db0 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:54:28 +0100 Subject: [PATCH 076/227] Fixed dead link to maci --- public/content/translations/es/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/es/zero-knowledge-proofs/index.md b/public/content/translations/es/zero-knowledge-proofs/index.md index 2ba84123b50..511072d1b21 100644 --- a/public/content/translations/es/zero-knowledge-proofs/index.md +++ b/public/content/translations/es/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Usar la MACI _requiere_ confiar en que el coordinador no complote con los soborn Pero en los casos en que el coordinador sea honesto, la MACI representa una herramienta potente para garantizar la legalidad de la votación en cadena. Esto explica su popularidad entre las aplicaciones de financiación cuadrática (por ejemplo, [clr.fund](https://clr.fund/#/about/maci)) que dependen en gran medida de la integridad de las opciones de votación de cada individuo. -[Obtenga más información sobre la MACI](https://privacy-scaling-explorations.github.io/maci/). +[Obtenga más información sobre la MACI](https://maci.pse.dev/). ## ¿Cómo funcionan las pruebas de conocimiento cero? {#how-do-zero-knowledge-proofs-work} From cd6ae0c9cb77e898671ddfa55407be967c39f1ab Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:54:50 +0100 Subject: [PATCH 077/227] Fixed dead link to maci --- public/content/translations/ga/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ga/zero-knowledge-proofs/index.md b/public/content/translations/ga/zero-knowledge-proofs/index.md index 60752f08aa3..37f82095917 100644 --- a/public/content/translations/ga/zero-knowledge-proofs/index.md +++ b/public/content/translations/ga/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Mar sin, fiú gan miondealú ar na vótaí in aghaidh an úsáideora a roinnt (m But in cases where the coordinator remains honest, MACI represents a powerful tool for guaranteeing the sanctity of onchain voting. Míníonn sé seo an tóir atá air i measc feidhmchlár ar mhaoiniú cuadratach (m.sh., [clr.fund](https://clr.fund/#/about/maci)) a bhíonn ag brath go mór ar ionracas roghanna vótála gach duine. -[Foghlaim tuilleadh faoi MACI](https://privacy-scaling-explorations.github.io/maci/). +[Foghlaim tuilleadh faoi MACI](https://maci.pse.dev/). ## Conas a oibríonn cruthúnais nial-eolais? {#how-do-zero-knowledge-proofs-work} From 375ddc01e75e4a0656bb1ba251357e7db7cc86ef Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:55:11 +0100 Subject: [PATCH 078/227] Fixed dead link to maci --- public/content/translations/de/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/de/zero-knowledge-proofs/index.md b/public/content/translations/de/zero-knowledge-proofs/index.md index 258521d985b..54e585cd272 100644 --- a/public/content/translations/de/zero-knowledge-proofs/index.md +++ b/public/content/translations/de/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ Die Verwendung von MACI _erfordert_ das Vertrauen in den Koordinator, dass er si Aber in Fällen, in denen der Koordinator ehrlich bleibt, stellt MACI ein mächtiges Werkzeug dar, um die Unversehrtheit der Abstimmung in der Kette zu gewährleisten. Dies erklärt seine Beliebtheit bei quadratischen Finanzierungsanträgen (z. B. [clr.fund](https://clr.fund/#/about/maci)), die sich stark auf die Integrität der Abstimmungsentscheidungen jedes Einzelnen verlassen. -[Erfahren Sie mehr über MACI](https://privacy-scaling-explorations.github.io/maci/). +[Erfahren Sie mehr über MACI](https://maci.pse.dev/). ## Wie funktionieren Null-Wissen-Beweise? {#how-do-zero-knowledge-proofs-work} From b37eff6d1bb949d818215d82ae230037e72a637e Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:55:35 +0100 Subject: [PATCH 079/227] Fixed dead link to maci --- public/content/translations/fr/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/fr/zero-knowledge-proofs/index.md b/public/content/translations/fr/zero-knowledge-proofs/index.md index 73945b4096c..d0085e0e0c3 100644 --- a/public/content/translations/fr/zero-knowledge-proofs/index.md +++ b/public/content/translations/fr/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ L'utilisation de MACI _nécessite_ de faire confiance au coordinateur pour ne pa Mais dans les cas où le coordinateur reste honnête, MACI représente un outil puissant pour garantir le caractère inviolable du vote en chaîne. Ceci explique sa popularité parmi les demandes de financement quadratiques (par exemple, [clr.fund](https://clr.fund/#/about/maci)) qui dépendent fortement de l'intégrité des choix de vote de chaque individu. -[En savoir plus sur MACI](https://privacy-scaling-explorations.github.io/maci/). +[En savoir plus sur MACI](https://maci.pse.dev/). ## Comment fonctionnent les preuves à divulgation nulle de connaissance ? {#how-do-zero-knowledge-proofs-work} From 96c4ebbf556ac48988836ae7feb6d67093bb4e03 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:56:08 +0100 Subject: [PATCH 080/227] Fixed dead link to maci --- public/content/translations/ja/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ja/zero-knowledge-proofs/index.md b/public/content/translations/ja/zero-knowledge-proofs/index.md index 9e925d81ca7..97d8e9c9efb 100644 --- a/public/content/translations/ja/zero-knowledge-proofs/index.md +++ b/public/content/translations/ja/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ MACIでは、コーディネーターが贈賄者と共謀したり、贈賄し しかし、コーディネーターが公正である場合には、MACIはチェーン上の投票の不可侵性を保証する強力なツールとなります。 クアドラティックファンディング(例: [clr.fund](https://clr.fund/#/about/maci))では、個々人の投票選択の完全性に大きく依存するため、MACIが広く用いられています。 -[MACIに関する詳細](https://privacy-scaling-explorations.github.io/maci/) +[MACIに関する詳細](https://maci.pse.dev/) ## ゼロ知識証明のしくみ {#how-do-zero-knowledge-proofs-work} From 0ef4d45889bccdc6113142513bcf7378f4b06685 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:56:35 +0100 Subject: [PATCH 081/227] Fixed dead link to maci --- .../content/translations/zh-tw/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/zh-tw/zero-knowledge-proofs/index.md b/public/content/translations/zh-tw/zero-knowledge-proofs/index.md index af1ddecf097..4a4ef75466c 100644 --- a/public/content/translations/zh-tw/zero-knowledge-proofs/index.md +++ b/public/content/translations/zh-tw/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ lang: zh-tw 但在協調員保持誠實的情況下,最小反串謀基礎設施是確保鏈上投票之神聖性的強大工具。 這解釋了它在 [clr.fund](https://clr.fund/#/about/maci) 等平方募資應用程式中為何廣受歡迎,這些程式十分依賴每個個體之投票選擇的完整性。 -[深入了解最小反串謀基礎設施](https://privacy-scaling-explorations.github.io/maci/)。 +[深入了解最小反串謀基礎設施](https://maci.pse.dev/)。 ## 零知識證明如何運作? {#how-do-zero-knowledge-proofs-work} From 2c41d738b412366fd35da2afb446953da4d1fc61 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:57:00 +0100 Subject: [PATCH 082/227] Fixed dead link to maci --- public/content/translations/fa/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/fa/zero-knowledge-proofs/index.md b/public/content/translations/fa/zero-knowledge-proofs/index.md index 5e1408b84a7..af4682c13cc 100644 --- a/public/content/translations/fa/zero-knowledge-proofs/index.md +++ b/public/content/translations/fa/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ lang: fa اما در مواردی که هماهنگ‌کننده صادق است، MACI ابزاری قدرتمند برای تضمین سلامت رای‌گیری آنچین است. این امر بیان‌کنندۀ دلیل محبوبیت آن در میان برنامه‌های تامین مالی ثانویه (مانند [clr.fund](https://clr.fund/#/about/maci)) است که به‌شدت بر صحت آرای تک‌تک افراد متکی است. -[درباره MACI بیشتر بدانید](https://privacy-scaling-explorations.github.io/maci/). +[درباره MACI بیشتر بدانید](https://maci.pse.dev/). ## اثبات دانش صفر چگونه کار می‌کند؟ {#how-do-zero-knowledge-proofs-work} From 2be950f446b363e3d90bcf3c78233404b08b570f Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:57:29 +0100 Subject: [PATCH 083/227] Fixed dead link to maci --- .../content/translations/pt-br/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/pt-br/zero-knowledge-proofs/index.md b/public/content/translations/pt-br/zero-knowledge-proofs/index.md index 85997bfc6e1..26d220569fa 100644 --- a/public/content/translations/pt-br/zero-knowledge-proofs/index.md +++ b/public/content/translations/pt-br/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ O uso da MACI _faz_ requer confiança no coordenador para não conspirar com sub Porém, nos casos em que o coordenador seja honesto, a MACI representa uma ferramenta poderosa para garantir a inviolabilidade da votação em cadeia. Isso explica sua popularidade entre as aplicações de financiamento quadrático (por exemplo, [clr.fund](https://clr.fund/#/about/maci)) que dependem fortemente da integridade das escolhas de voto de cada indivíduo. -[Saiba mais sobre a MACI](https://privacy-scaling-explorations.github.io/maci/). +[Saiba mais sobre a MACI](https://maci.pse.dev/). ## Como funcionam as provas de conhecimento zero? {#how-do-zero-knowledge-proofs-work} From b518ebbc1f031a6fa5f63b40d32ec20b708cdf0a Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:57:54 +0100 Subject: [PATCH 084/227] Fixed dead link to maci --- public/content/translations/uk/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/uk/zero-knowledge-proofs/index.md b/public/content/translations/uk/zero-knowledge-proofs/index.md index b1b823a6d83..4a53bb92b26 100644 --- a/public/content/translations/uk/zero-knowledge-proofs/index.md +++ b/public/content/translations/uk/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ lang: uk Але в тих випадках, коли координатор залишається чесним, MACI є потужним інструментом, який гарантує чесність голосування в блокчейні. Це пояснює популярність його застосування для програм квадратичного фінансування (наприклад, [clr.fund](https://clr.fund/#/about/maci)), які значною мірою покладаються на чесне голосування кожної людини. -[Дізнайтеся більше про MACI](https://privacy-scaling-explorations.github.io/maci/). +[Дізнайтеся більше про MACI](https://maci.pse.dev/). ## Як працюють докази з нульовим розголошенням? {#how-do-zero-knowledge-proofs-work} From 6930908e1d0bb7699c24b7d3b49754faaa4eeacf Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:58:17 +0100 Subject: [PATCH 085/227] Fixed dead link to maci --- public/content/translations/ru/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ru/zero-knowledge-proofs/index.md b/public/content/translations/ru/zero-knowledge-proofs/index.md index 13dc40674c6..b2e9effc1c6 100644 --- a/public/content/translations/ru/zero-knowledge-proofs/index.md +++ b/public/content/translations/ru/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ lang: ru Но только в тех случаях, когда координатор остается честным, MACI является мощным инструментом для обеспечения неприкосновенности голосования в цепи. Это объясняет его популярность среди приложений квадратичного финансирования (например, [clr.fund](https://clr.fund/#/about/maci)), которые основываются на честности выбора каждого голосующего. -[Подробнее о MACI](https://privacy-scaling-explorations.github.io/maci/). +[Подробнее о MACI](https://maci.pse.dev/). ## Как работают доказательства с нулевым разглашением? {#how-do-zero-knowledge-proofs-work} From 13c6ae3e848bf420acec06a71179c15d3d038c24 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:58:43 +0100 Subject: [PATCH 086/227] Fixed dead link to maci --- public/content/translations/el/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/el/zero-knowledge-proofs/index.md b/public/content/translations/el/zero-knowledge-proofs/index.md index c818f351bfd..a94340f4646 100644 --- a/public/content/translations/el/zero-knowledge-proofs/index.md +++ b/public/content/translations/el/zero-knowledge-proofs/index.md @@ -116,7 +116,7 @@ lang: el Το MACI εξακολουθεί να αποτελεί ένα ισχυρό εργαλείο για την εξασφάλιση της ακεραιότητας των ψηφοφοριών εντός αλυσίδας, υπό την προϋπόθεση ότι ο συντονιστής παραμένει αξιόπιστος. Αυτό εξηγεί τη δημοτικότητά του μεταξύ των εφαρμογών τετραγωνικής χρηματοδότησης (π.χ., [clr.fund](https://clr.fund/#/about/maci)) που βασίζονται σε μεγάλο βαθμό στην ακεραιότητα των επιλογών ψηφοφορίας κάθε ατόμου. -[Μάθετε περισσότερα για το MACI](https://privacy-scaling-explorations.github.io/maci/). +[Μάθετε περισσότερα για το MACI](https://maci.pse.dev/). ## Πώς λειτουργεί η απόδειξη μηδενικής γνώσης; {#how-do-zero-knowledge-proofs-work} From 6808286cf1cdd94b44aaeae0863419f6dc65ba94 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 13:59:42 +0100 Subject: [PATCH 087/227] Fixed dead link to maci --- public/content/translations/hi/zero-knowledge-proofs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/hi/zero-knowledge-proofs/index.md b/public/content/translations/hi/zero-knowledge-proofs/index.md index 705270c5522..8fadb28e7c2 100644 --- a/public/content/translations/hi/zero-knowledge-proofs/index.md +++ b/public/content/translations/hi/zero-knowledge-proofs/index.md @@ -110,7 +110,7 @@ MACI का उपयोग करने के लिए समन्वयक लेकिन ऐसे मामलों में जहां समन्वयक ईमानदार रहता है, MACI ऑन-चेन वोटिंग की पवित्रता की गारंटी के लिए एक शक्तिशाली उपकरण का प्रतिनिधित्व करता है। यह द्विघात फंडिंग एप्लीकेशन (जैसे, [clr.fund](https://clr.fund/#/about/maci)) के बीच इसकी लोकप्रियता की व्याख्या करता है जो प्रत्येक व्यक्ति के मतदान विकल्पों की अखंडता पर बहुत अधिक निर्भर करता है। -[MACI के बारे में अधिक जानें](https://privacy-scaling-explorations.github.io/maci/)। +[MACI के बारे में अधिक जानें](https://maci.pse.dev/)। ## शून्य ज्ञान प्रमाण कैसे काम करते हैं? {#how-do-zero-knowledge-proofs-work} From a72ada516eaac228c4917bfc1f85600e7065c515 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 14:02:09 +0100 Subject: [PATCH 088/227] Fixed dead link to FlashLoan AAVE --- public/content/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/defi/index.md b/public/content/defi/index.md index e0bef3c5356..16c0e65257c 100644 --- a/public/content/defi/index.md +++ b/public/content/defi/index.md @@ -172,7 +172,7 @@ If exchange B's supply dropped suddenly and the user wasn't able to buy enough t To be able to do the above example in the traditional finance world, you'd need an enormous amount of money. These money-making strategies are only accessible to those with existing wealth. Flash loans are an example of a future where having money is not necessarily a prerequisite for making money. - + More on flash loans From f649fd8fbcf3ab15a9d3e05c92c876177765338f Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 14:02:50 +0100 Subject: [PATCH 089/227] Fixed dead link to FlashLoan AAVE --- public/content/translations/zh/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/zh/defi/index.md b/public/content/translations/zh/defi/index.md index 3a7d2763649..679662b44bf 100644 --- a/public/content/translations/zh/defi/index.md +++ b/public/content/translations/zh/defi/index.md @@ -172,7 +172,7 @@ Dai 或 USDC 等代币的价值和美元的差距通常保持在几美分以内 要想在传统金融世界实现上述操作,你需要大量的资金。 这些赚钱的策略仅供已经拥有财富的人士使用。 闪电贷款是一个未来的例子,在这里,拥有金钱不一定是赚钱的先决条件。 - + 关于闪电贷的更多信息 From 87e87d8645f19afe55511c8143a44a3cf9240cd9 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 14:03:18 +0100 Subject: [PATCH 090/227] Fixed dead link to FlashLoan AAVE --- public/content/translations/ga/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/ga/defi/index.md b/public/content/translations/ga/defi/index.md index 04e10b3e8ad..6c67e16828c 100644 --- a/public/content/translations/ga/defi/index.md +++ b/public/content/translations/ga/defi/index.md @@ -172,7 +172,7 @@ Dá dtitfeadh soláthar mhalartán B go tobann agus nach raibh an t-úsáideoir Le bheith in ann an sampla thuas a dhéanamh i saol an airgeadais thraidisiúnta, bheadh ​​méid ollmhór airgid uait. Níl teacht ar na straitéisí seo chun airgead a dhéanamh ach amháin dóibh siúd a bhfuil saibhreas acu cheana féin. Is sampla iad splanc‑iasachtaí de thodhchaí nuair nach gá go mbeidh airgead ina réamhriachtanas chun airgead a dhéanamh. - + Tuilleadh faoi splanc‑iasachtaí From 68128b05430317f28c0591120e36dc0aaea7e964 Mon Sep 17 00:00:00 2001 From: Poly Date: Sun, 14 Dec 2025 14:03:44 +0100 Subject: [PATCH 091/227] Fixed dead link to FlashLoan AAVE --- public/content/translations/el/defi/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/content/translations/el/defi/index.md b/public/content/translations/el/defi/index.md index 1983c921e15..39b7e6234ee 100644 --- a/public/content/translations/el/defi/index.md +++ b/public/content/translations/el/defi/index.md @@ -172,7 +172,7 @@ H DeFi είναι ένας γενικός όρος για οικονομικά Για να μπορέσετε να εφαρμόσετε το παραπάνω παράδειγμα στον παραδοσιακό χρηματοπιστωτικό κόσμο, θα χρειαστείτε ένα σεβαστό χρηματικό ποσό. Αυτές οι στρατηγικές κέρδους είναι προσβάσιμες μόνο σε εκείνους με τον υπάρχοντα πλούτο. Τα στιγμιαία δάνεια αποτελούν παράδειγμα ενός μέλλοντος όπου η κατοχή χρημάτων δεν αποτελεί απαραίτητα προϋπόθεση για κέρδος χρημάτων. - + Περισσότερα για τα στιγμιαία δάνεια From 5d01789befda2cb48b657106093ea0a2781eaa7d Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Mon, 15 Dec 2025 12:44:52 +0100 Subject: [PATCH 092/227] refactor(e2e): remove mock wallet and test to RainbowKit modal boundary --- src/config/rainbow-kit.ts | 11 ---------- tests/e2e/fixtures/mockWallet.ts | 35 -------------------------------- tests/e2e/pages/StartPage.ts | 22 +++++--------------- tests/e2e/start.spec.ts | 18 ++++++++++++---- 4 files changed, 19 insertions(+), 67 deletions(-) delete mode 100644 tests/e2e/fixtures/mockWallet.ts diff --git a/src/config/rainbow-kit.ts b/src/config/rainbow-kit.ts index 8b0e5e5ecb7..37c435e7417 100644 --- a/src/config/rainbow-kit.ts +++ b/src/config/rainbow-kit.ts @@ -10,10 +10,6 @@ import { zerionWallet, } from "@rainbow-me/rainbowkit/wallets" -import { IS_CI, IS_DEV } from "@/lib/utils/env" - -import { mockWallet } from "../../tests/e2e/fixtures/mockWallet" - const CHAIN_MAP = { hardhat, sepolia, @@ -78,13 +74,6 @@ const walletGroups = [ }, ] -if (IS_DEV || IS_CI) { - walletGroups.push({ - groupName: "Test", - wallets: [mockWallet], - }) -} - export const rainbowkitConfig = getDefaultConfig({ appName: "ethereum.org", projectId: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID!, diff --git a/tests/e2e/fixtures/mockWallet.ts b/tests/e2e/fixtures/mockWallet.ts deleted file mode 100644 index 9cb7c3fac63..00000000000 --- a/tests/e2e/fixtures/mockWallet.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Address } from "viem" -import { CreateConnectorFn, mock } from "wagmi" -import type { Wallet } from "@rainbow-me/rainbowkit" -import { WalletDetailsParams } from "@rainbow-me/rainbowkit" - -const defaultAnvilAccount: Address = - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" - -export const mockWallet = (): Wallet => { - return { - id: "mock", - name: "Mock Wallet", - shortName: "Mock", - installed: true, - iconBackground: "rgba(0, 255, 0, 0.5)", - iconUrl: "/images/assets/svgs/eth-glyph-colored.svg", - downloadUrls: {}, - createConnector: createMockConnector, - } -} - -function createMockConnector( - walletDetails: WalletDetailsParams -): CreateConnectorFn { - const mockConnector: CreateConnectorFn = (config) => { - return { - ...mock({ - accounts: [defaultAnvilAccount], - })(config), - rkDetails: walletDetails.rkDetails, - } - } - - return mockConnector -} diff --git a/tests/e2e/pages/StartPage.ts b/tests/e2e/pages/StartPage.ts index dadfbdb37c7..6097c86de18 100644 --- a/tests/e2e/pages/StartPage.ts +++ b/tests/e2e/pages/StartPage.ts @@ -1,4 +1,4 @@ -import { expect, Page } from "@playwright/test" +import { Page } from "@playwright/test" import { testData } from "../fixtures/testData" @@ -28,7 +28,10 @@ export class StartPage extends BasePage { await this.assertTitleContains(testData.content.headings.startPage) } - async connectWithExistingWallet() { + /** + * Navigate through the start flow and open the wallet connection modal. + */ + async openWalletConnectionModal() { await this.page .getByRole("paragraph") .filter({ hasText: "I have a wallet." }) @@ -37,20 +40,5 @@ export class StartPage extends BasePage { await this.page .getByRole("button", { name: "Sign in with Ethereum" }) .click() - // Choose mock wallet option in RainbowKit modal - await this.page.getByTestId("rk-wallet-option-mock").click() - // Verify wallet connected - await expect( - this.page - .getByRole("paragraph") - .filter({ hasText: "This is your account" }) - ).toBeVisible() - } - - async continueToUseAppsStep() { - await this.page.getByRole("button", { name: "Let's continue" }).click() - await expect( - this.page.getByRole("heading", { name: "Let's use some apps" }) - ).toBeVisible() } } diff --git a/tests/e2e/start.spec.ts b/tests/e2e/start.spec.ts index 6dc1f2944ee..1753ae3b450 100644 --- a/tests/e2e/start.spec.ts +++ b/tests/e2e/start.spec.ts @@ -1,15 +1,25 @@ -import { test } from "@playwright/test" +import { expect, test } from "@playwright/test" import { StartPage } from "./pages" test.describe("Start Page", () => { - test("Connect wallet", async ({ page }) => { + test("loads successfully", async ({ page }) => { + const startPage = new StartPage(page) + await startPage.goto() + await startPage.verifyPageLoaded() + }) + + test("wallet modal opens with wallet options", async ({ page }) => { const startPage = new StartPage(page) await startPage.goto() await startPage.verifyPageLoaded() - await startPage.connectWithExistingWallet() + await startPage.openWalletConnectionModal() - await startPage.continueToUseAppsStep() + const walletModal = page.getByRole("dialog") + await expect(walletModal.getByText("Connect a Wallet")).toBeVisible() + await expect(walletModal.getByText("MetaMask")).toBeVisible() + await expect(walletModal.getByText("Coinbase Wallet")).toBeVisible() + await expect(walletModal.getByText("Rainbow")).toBeVisible() }) }) From 94f5455d3bd05735cc38eef13a652630500bdaa6 Mon Sep 17 00:00:00 2001 From: Joshua <62268199+minimalsm@users.noreply.github.com> Date: Mon, 15 Dec 2025 12:48:24 +0000 Subject: [PATCH 093/227] Fix EthPriceSimple translations and add homepage section divider - Add namespace to getTranslations call in EthPriceSimple to fix missing translations - Add horizontal divider between hero CTAs and What is Ethereum section --- app/[locale]/page.tsx | 4 +++- src/components/EthPriceSimple.tsx | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index a6d3dc229bf..c6ca7f38c51 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -465,6 +465,8 @@ const Page = async ({ params }: { params: PageParams }) => { )}
+
+ {/* What is Ethereum */}
{ {t("page-index-activity-tag")} {t("page-index-activity-header")} -
+

{t("page-index-activity-description")}

diff --git a/src/components/EthPriceSimple.tsx b/src/components/EthPriceSimple.tsx index b995af9a828..1f9d4a35434 100644 --- a/src/components/EthPriceSimple.tsx +++ b/src/components/EthPriceSimple.tsx @@ -19,7 +19,7 @@ const EthPriceSimple = async ({ ...props }: EthPriceSimpleProps) => { const locale = await getLocale() - const t = await getTranslations() + const t = await getTranslations({ locale, namespace: "common" }) const hasError = "error" in ethPrice From 3c71612c3545846c50d38bf07a0834bb520ada54 Mon Sep 17 00:00:00 2001 From: Fredrik Date: Mon, 15 Dec 2025 14:31:48 +0100 Subject: [PATCH 094/227] adding fadam to consensus bount hunters --- src/data/consensus-bounty-hunters.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/data/consensus-bounty-hunters.json b/src/data/consensus-bounty-hunters.json index bd7ec7fd179..3f6abe80c51 100644 --- a/src/data/consensus-bounty-hunters.json +++ b/src/data/consensus-bounty-hunters.json @@ -118,7 +118,12 @@ "username": "0xpulp", "name": "0xPulp", "score": 1000 - }, + }, + { + "username": "0xfadam", + "name": "fadam", + "score": 1000 + }, { "username": "mcdee", "name": "Jim McDonald", From 5eac42e7caa2637b031c3d7c3df78e7af8f427b8 Mon Sep 17 00:00:00 2001 From: pruger <84763939+pruger@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:25:29 +0100 Subject: [PATCH 095/227] Add multiple community events for 2026 Added multiple ETHGlobal Hackathons and Pragma Conferences. --- src/data/community-events.json | 63 ++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/data/community-events.json b/src/data/community-events.json index f33b5aaedd1..36cf6a387d7 100644 --- a/src/data/community-events.json +++ b/src/data/community-events.json @@ -250,6 +250,24 @@ "description": "ETH Riyadh 2025 will reconvene as the Middle East’s premier Web3 summit, uniting global luminaries from the Ethereum and blockchain ecosystems in Riyadh. February 2026, details TBD.", "imageUrl": "https://d1u25r3n8sm37o.cloudfront.net/wrold3ai/riyadh2025.jpg" }, + { + "title": "Pragma Cannes 2026", + "startDate": "2026-04-02", + "endDate": "2026-04-02", + "href": "https://ethglobal.com/events/pragma-cannes2026", + "location": "Cannes, FRA", + "description": "Pragma is designed to be a different kind of event. We bring together a small group of founders and builders to discuss the future of web3 and reflect on the past.", + "imageUrl": "https://ethglobal.b-cdn.net/events/pragma-cannes2026/images/p1uij/default.jpg" + }, + { + "title": "ETHGlobal Cannes 2026", + "startDate": "2026-04-03", + "endDate": "2026-04-05", + "href": "https://ethglobal.com/events/cannes2026", + "location": "Cannes, FRA", + "description": "ETHGlobal hackathons enable you to experiment with cutting edge web3 technologies and develop an idea you're passionate about. This is your opportunity to learn about crypto, expand your network, meet industry professionals, and find like-minded people who are collectively creating a new kind of web.", + "imageUrl": "https://s1.directupload.eu/images/251215/cuamhj9c.png" + }, { "title": "ETHConf", "startDate": "2026-06-08", @@ -258,5 +276,50 @@ "location": "New York, USA", "description": "Join 5,000+ founders, speakers, industry leaders, companies, and builders shaping the future of Ethereum in New York City", "imageUrl": "https://ethconf.com/ethconf-og.jpg" + }, + { + "title": "ETHGlobal New York 2026", + "startDate": "2026-06-12", + "endDate": "2026-06-14", + "href": "https://ethglobal.com/events/newyork2026", + "location": "New York, USA", + "description": "ETHGlobal hackathons enable you to experiment with cutting edge web3 technologies and develop an idea you're passionate about. This is your opportunity to learn about crypto, expand your network, meet industry professionals, and find like-minded people who are collectively creating a new kind of web.", + "imageUrl": "https://s1.directupload.eu/images/251215/lzimboua.png" + }, + { + "title": "Pragma Lisbon 2026", + "startDate": "2026-07-23", + "endDate": "2026-07-23", + "href": "https://ethglobal.com/events/pragma-lisbon2026", + "location": "Lisbon, PRT", + "description": "Pragma is designed to be a different kind of event. We bring together a small group of founders and builders to discuss the future of web3 and reflect on the past.", + "imageUrl": "https://ethglobal.b-cdn.net/events/pragma-lisbon2026/images/um0uw/default.jpg" + }, + { + "title": "ETHGlobal Lisbon 2026", + "startDate": "2026-07-24", + "endDate": "2026-07-26", + "href": "https://ethglobal.com/events/lisbon2026", + "location": "Lisbon, PRT", + "description": "ETHGlobal hackathons enable you to experiment with cutting edge web3 technologies and develop an idea you're passionate about. This is your opportunity to learn about crypto, expand your network, meet industry professionals, and find like-minded people who are collectively creating a new kind of web.", + "imageUrl": "https://s1.directupload.eu/images/251215/j7hwvdg4.png" + }, + { + "title": "Pragma Tokyo 2026", + "startDate": "2026-09-24", + "endDate": "2026-09-24", + "href": "https://ethglobal.com/events/pragma-tokyo2026", + "location": "Tokyo, JPN", + "description": "Pragma is designed to be a different kind of event. We bring together a small group of founders and builders to discuss the future of web3 and reflect on the past.", + "imageUrl": "https://ethglobal.b-cdn.net/events/pragma-tokyo2026/images/wz3ri/default.jpg" + }, + { + "title": "ETHGlobal Tokyo 2026", + "startDate": "2026-09-25", + "endDate": "2026-09-27", + "href": "https://ethglobal.com/events/tokyo2026", + "location": "Tokyo, JPN", + "description": "ETHGlobal hackathons enable you to experiment with cutting edge web3 technologies and develop an idea you're passionate about. This is your opportunity to learn about crypto, expand your network, meet industry professionals, and find like-minded people who are collectively creating a new kind of web.", + "imageUrl": "https://s1.directupload.eu/images/251215/arnyosxw.png" } ] From fe082c3efdc816318b6a10148efe8f4a9576f81c Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Mon, 15 Dec 2025 16:12:08 +0100 Subject: [PATCH 096/227] fix: remove published check from Netlify deploy script --- src/scripts/get-netlify-branch-deploy.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/scripts/get-netlify-branch-deploy.ts b/src/scripts/get-netlify-branch-deploy.ts index 8533e2c4bd6..f49fbca8a1f 100644 --- a/src/scripts/get-netlify-branch-deploy.ts +++ b/src/scripts/get-netlify-branch-deploy.ts @@ -1,4 +1,4 @@ -// Fetches the latest published Netlify deploy for the current branch and outputs its URL for GitHub Actions +// Fetches the latest ready Netlify deploy for the current branch and outputs its URL for GitHub Actions import fs from "fs" const siteId = process.env.NETLIFY_SITE_ID @@ -13,7 +13,6 @@ if (!siteId || !branch || !token) { type NetlifyDeploy = { state: string branch: string - published: boolean deploy_ssl_url?: string deploy_url?: string } @@ -31,12 +30,10 @@ type NetlifyDeploy = { process.exit(1) } const deploys: NetlifyDeploy[] = await res.json() - // Find the latest published deploy for this branch - const latest = deploys.find( - (d) => d.state === "ready" && d.branch === branch && d.published - ) + // Find the latest ready deploy for this branch + const latest = deploys.find((d) => d.state === "ready" && d.branch === branch) if (!latest) { - console.error("No published deploy found for branch:", branch) + console.error("No ready deploy found for branch:", branch) process.exit(1) } // Use GitHub Actions recommended output syntax (GITHUB_OUTPUT) From 292febab49f95f5d7fe581aaa11a78011b2969d8 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Mon, 15 Dec 2025 17:42:53 +0100 Subject: [PATCH 097/227] fix(tests): fix mobile browser e2e test failures (wallet text, dialog aria-label) --- src/components/Nav/MobileMenu/MobileMenuClient.tsx | 3 +++ src/components/ui/persistent-panel.tsx | 4 ++++ tests/e2e/start.spec.ts | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/MobileMenu/MobileMenuClient.tsx b/src/components/Nav/MobileMenu/MobileMenuClient.tsx index 33d9b9b0d4d..941cad2132c 100644 --- a/src/components/Nav/MobileMenu/MobileMenuClient.tsx +++ b/src/components/Nav/MobileMenu/MobileMenuClient.tsx @@ -10,6 +10,7 @@ import { cn } from "@/lib/utils/cn" import HamburgerButton from "./HamburgerButton" import { useCloseOnNavigate } from "@/hooks/useCloseOnNavigate" +import { useTranslation } from "@/hooks/useTranslation" type MobileMenuClientProps = { className?: string @@ -22,6 +23,7 @@ const MobileMenuClient = ({ side, children, }: MobileMenuClientProps) => { + const { t } = useTranslation("common") const [open, setOpen] = useCloseOnNavigate() const triggerRef = React.useRef(null) @@ -41,6 +43,7 @@ const MobileMenuClient = ({ className="flex flex-col" onOpenChange={setOpen} triggerRef={triggerRef} + aria-label={t("site-title")} > {children} diff --git a/src/components/ui/persistent-panel.tsx b/src/components/ui/persistent-panel.tsx index dffdd8c8796..7b9d342a78b 100644 --- a/src/components/ui/persistent-panel.tsx +++ b/src/components/ui/persistent-panel.tsx @@ -12,6 +12,8 @@ interface PersistentPanelProps { onOpenChange?: (open: boolean) => void /** Ref to the trigger element - focus returns here on close */ triggerRef?: React.RefObject + /** Accessible label for the dialog */ + "aria-label"?: string } /** @@ -34,6 +36,7 @@ const PersistentPanel = ({ children, onOpenChange, triggerRef, + "aria-label": ariaLabel, }: PersistentPanelProps) => { // Track if component should be in DOM (lazy mount, stays mounted after first open) const [isMounted, setIsMounted] = React.useState(false) @@ -161,6 +164,7 @@ const PersistentPanel = ({ className={contentClasses} role="dialog" aria-modal="true" + aria-label={ariaLabel} > {children}
diff --git a/tests/e2e/start.spec.ts b/tests/e2e/start.spec.ts index 1753ae3b450..77287a60831 100644 --- a/tests/e2e/start.spec.ts +++ b/tests/e2e/start.spec.ts @@ -19,7 +19,7 @@ test.describe("Start Page", () => { const walletModal = page.getByRole("dialog") await expect(walletModal.getByText("Connect a Wallet")).toBeVisible() await expect(walletModal.getByText("MetaMask")).toBeVisible() - await expect(walletModal.getByText("Coinbase Wallet")).toBeVisible() + await expect(walletModal.getByText("Coinbase")).toBeVisible() await expect(walletModal.getByText("Rainbow")).toBeVisible() }) }) From 37bb7bfcf24d2fa3ca6e4a3490ae3bd69189650f Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Mon, 15 Dec 2025 17:25:46 +0100 Subject: [PATCH 098/227] fix(e2e): use toHaveText assertion to fix race condition in persona filter test --- tests/e2e/pages/FindWalletPage.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/e2e/pages/FindWalletPage.ts b/tests/e2e/pages/FindWalletPage.ts index cc4ce5da183..ef92e73264f 100644 --- a/tests/e2e/pages/FindWalletPage.ts +++ b/tests/e2e/pages/FindWalletPage.ts @@ -219,9 +219,9 @@ export class FindWalletPage extends BasePage { * Verify the row counter displays the provided expected count */ async verifyRowCounterEquals(expectedCount: number) { - const counterText = await this.rowCounter.textContent() - - expect(counterText).toBe(`Showing all wallets (${expectedCount})`) + await expect(this.rowCounter).toHaveText( + `Showing all wallets (${expectedCount})` + ) } /** From c5ba2788d85a478f7c63cc4f3109071a8b849e61 Mon Sep 17 00:00:00 2001 From: wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 15 Dec 2025 14:28:14 -0300 Subject: [PATCH 099/227] patch: updated link --- app/[locale]/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index c6ca7f38c51..e1490dffbec 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -587,7 +587,7 @@ const Page = async ({ params }: { params: PageParams }) => {
Date: Mon, 15 Dec 2025 18:29:42 +0100 Subject: [PATCH 100/227] fix(e2e): wait for filter checkboxes to render before extracting text --- tests/e2e/pages/FindWalletPage.ts | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/tests/e2e/pages/FindWalletPage.ts b/tests/e2e/pages/FindWalletPage.ts index ef92e73264f..b17a2a5b1db 100644 --- a/tests/e2e/pages/FindWalletPage.ts +++ b/tests/e2e/pages/FindWalletPage.ts @@ -134,11 +134,12 @@ export class FindWalletPage extends BasePage { const desktopCheckbox = desktopLabelParent.locator("button") await desktopCheckbox.click() + const itemContainer = desktopLabelParent.locator("..") + const osOptionLabels = itemContainer.locator("label span.select-none") + await expect(osOptionLabels.first()).toBeVisible() + // Get OS options - const osOptions = await desktopLabelParent - .locator("..") - .locator("label span.select-none") - .allTextContents() + const osOptions = await osOptionLabels.allTextContents() return { initialCount, osOptions } } @@ -168,11 +169,12 @@ export class FindWalletPage extends BasePage { const mobileCheckbox = mobileLabelParent.locator("button") await mobileCheckbox.click() + const itemContainer = mobileLabelParent.locator("..") + const osOptionLabels = itemContainer.locator("label span.select-none") + await expect(osOptionLabels.first()).toBeVisible() + // Get OS options - const osOptions = await mobileLabelParent - .locator("..") - .locator("label span.select-none") - .allTextContents() + const osOptions = await osOptionLabels.allTextContents() // Close filters await this.mobileFiltersSubmitButton.click() From 1d787313fe970f5d298ec317ec7566832d47fe33 Mon Sep 17 00:00:00 2001 From: Pablo Pettinari Date: Mon, 15 Dec 2025 18:30:36 +0100 Subject: [PATCH 101/227] fix(e2e): fix mobile menu dialog locator in language picker test --- src/components/Nav/MobileMenu/MobileMenuClient.tsx | 1 + src/components/ui/persistent-panel.tsx | 4 ++++ tests/e2e/pages/BasePage.ts | 4 +++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/Nav/MobileMenu/MobileMenuClient.tsx b/src/components/Nav/MobileMenu/MobileMenuClient.tsx index 941cad2132c..44db390bb4b 100644 --- a/src/components/Nav/MobileMenu/MobileMenuClient.tsx +++ b/src/components/Nav/MobileMenu/MobileMenuClient.tsx @@ -44,6 +44,7 @@ const MobileMenuClient = ({ onOpenChange={setOpen} triggerRef={triggerRef} aria-label={t("site-title")} + data-testid="mobile-menu-dialog" > {children} diff --git a/src/components/ui/persistent-panel.tsx b/src/components/ui/persistent-panel.tsx index 7b9d342a78b..59b48611a4e 100644 --- a/src/components/ui/persistent-panel.tsx +++ b/src/components/ui/persistent-panel.tsx @@ -14,6 +14,8 @@ interface PersistentPanelProps { triggerRef?: React.RefObject /** Accessible label for the dialog */ "aria-label"?: string + /** Test ID for the dialog */ + "data-testid"?: string } /** @@ -37,6 +39,7 @@ const PersistentPanel = ({ onOpenChange, triggerRef, "aria-label": ariaLabel, + "data-testid": dataTestId, }: PersistentPanelProps) => { // Track if component should be in DOM (lazy mount, stays mounted after first open) const [isMounted, setIsMounted] = React.useState(false) @@ -165,6 +168,7 @@ const PersistentPanel = ({ role="dialog" aria-modal="true" aria-label={ariaLabel} + data-testid={dataTestId} > {children}
diff --git a/tests/e2e/pages/BasePage.ts b/tests/e2e/pages/BasePage.ts index 41b5f392a80..b0fb8e87da2 100644 --- a/tests/e2e/pages/BasePage.ts +++ b/tests/e2e/pages/BasePage.ts @@ -26,7 +26,7 @@ export class BasePage { this.mobileMenuButton = this.primaryNav.getByRole("button", { name: /toggle menu button/i, }) - this.mobileSidebar = page.getByRole("dialog", { name: /ethereum.org/i }) + this.mobileSidebar = page.getByRole("dialog") } /** @@ -118,6 +118,8 @@ export class BasePage { */ async openLanguagePickerMobile(): Promise { await this.mobileMenuButton.click() + // Wait for the dialog to be visible before trying to find elements inside it + await expect(this.mobileSidebar).toBeVisible() await this.mobileSidebar.getByTestId("mobile-menu-language-picker").click() } From c0fef093f39ade234f898120109c193ebbe62559 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:35:12 -0300 Subject: [PATCH 102/227] patch: apply suggestions from code review - Fixes divider coloring - Fixes "Layer 2" punctuation - Adds padding under subtext --- app/[locale]/page.tsx | 6 ++---- src/intl/en/page-index.json | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index e1490dffbec..4968c3a2a0a 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -426,7 +426,7 @@ const Page = async ({ params }: { params: PageParams }) => {
-
+
{subHeroCTAs.map( ({ label, description, href, className, Svg }, idx) => { const Link = ( @@ -465,8 +465,6 @@ const Page = async ({ params }: { params: PageParams }) => { )}
-
- {/* What is Ethereum */}
{

{t("page-index-activity-description")}

-

+

{t("page-index-activity-subtitle")}

diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index 60f347d4b8d..1ed211db97a 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -1,6 +1,6 @@ { "page-index-activity-description": "Ethereum is the leading platform for issuing, managing, and settling digital assets. From tokenized money and financial instruments to real-world assets and emerging markets, Ethereum provides a secure, neutral foundation for the digital economy.", - "page-index-activity-subtitle": "Activity on Ethereum Mainnet and Layer-2 networks", + "page-index-activity-subtitle": "Activity on Ethereum Mainnet and Layer 2 networks", "page-index-activity-tag": "Activity", "page-index-activity-header": "The strongest ecosystem", "page-index-activity-action": "More ecosystem resources", From 2fdf583af263cd41b1a5f71e9b0c2a3fc7297165 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:40:47 -0300 Subject: [PATCH 103/227] patch: casing --- src/intl/en/page-index.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/intl/en/page-index.json b/src/intl/en/page-index.json index 1ed211db97a..664db018280 100644 --- a/src/intl/en/page-index.json +++ b/src/intl/en/page-index.json @@ -4,7 +4,7 @@ "page-index-activity-tag": "Activity", "page-index-activity-header": "The strongest ecosystem", "page-index-activity-action": "More ecosystem resources", - "page-index-activity-action-primary": "Ethereum for Institutions", + "page-index-activity-action-primary": "Ethereum for institutions", "page-index-bento-header": "A new way to use the internet", "page-index-bento-assets-action": "More on NFTs", "page-index-bento-assets-content": "From art to real estate to stocks, any asset can be tokenized on Ethereum to prove and verify ownership digitally. Buy, sell, trade, and create assets and collectibles—anytime, anywhere.", @@ -21,7 +21,7 @@ "page-index-bento-stablecoins-action": "Discover stablecoins", "page-index-bento-stablecoins-content": "Stablecoins are currencies that maintain a stable price, matched to steady assets like the U.S. dollar. Access global payments instantly or store value in digital dollars on Ethereum.", "page-index-bento-stablecoins-title": "Digital cash for everyday use", - "page-index-builders-action-primary": "Builder's Portal", + "page-index-builders-action-primary": "Builder's portal", "page-index-builders-action-secondary": "Documentation", "page-index-builders-description": "Ethereum is home to Web3's largest and most vibrant developer ecosystem. Use JavaScript and Python, or learn a smart contract language like Solidity or Vyper to write your own app.", "page-index-builders-tag": "Builders", @@ -73,7 +73,7 @@ "page-index-what-is-ether-title": "What is ETH?", "page-index-what-is-ether-description-1": "Ether (ETH) is the native cryptocurrency that powers the Ethereum network, used to pay transaction fees and secure the blockchain through staking.", "page-index-what-is-ether-description-2": "Beyond its technical role, ETH is open, programmable digital money. It is used for global payments, as collateral for loans, and as a store of value that doesn't rely on any central entity.", - "page-index-what-is-ether-action": "Learn more about Ether", + "page-index-what-is-ether-action": "Learn more about ether", "page-index-learn-tag": "Learn", "page-index-network-tag": "Network", "page-index-token-tag": "Token", From 5ef8f91570c1df9766a25be27ececb75a0bff22f Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 15 Dec 2025 15:49:32 -0300 Subject: [PATCH 104/227] feat: remove fusaka banner and hero image --- app/[locale]/page.tsx | 5 +- .../Banners/FusakaBanner/FusakaCountdown.tsx | 178 ------------------ src/components/Banners/FusakaBanner/index.tsx | 44 ----- 3 files changed, 1 insertion(+), 226 deletions(-) delete mode 100644 src/components/Banners/FusakaBanner/FusakaCountdown.tsx delete mode 100644 src/components/Banners/FusakaBanner/index.tsx diff --git a/app/[locale]/page.tsx b/app/[locale]/page.tsx index ec1513556dd..6c2d67056f9 100644 --- a/app/[locale]/page.tsx +++ b/app/[locale]/page.tsx @@ -12,7 +12,6 @@ import type { import { CodeExample } from "@/lib/interfaces" import ActivityStats from "@/components/ActivityStats" -import FusakaBanner from "@/components/Banners/FusakaBanner" import { ChevronNext } from "@/components/Chevron" import HomeHero from "@/components/Hero/HomeHero" import BentoCard from "@/components/Homepage/BentoCard" @@ -96,7 +95,6 @@ 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" const BentoCardSwiper = dynamic( () => import("@/components/Homepage/BentoCardSwiper"), @@ -437,8 +435,7 @@ const Page = async ({ params }: { params: PageParams }) => { <> - - +
{subHeroCTAs.map( diff --git a/src/components/Banners/FusakaBanner/FusakaCountdown.tsx b/src/components/Banners/FusakaBanner/FusakaCountdown.tsx deleted file mode 100644 index 48d1de09042..00000000000 --- a/src/components/Banners/FusakaBanner/FusakaCountdown.tsx +++ /dev/null @@ -1,178 +0,0 @@ -"use client" - -import { useEffect, useState } from "react" -import humanizeDuration from "humanize-duration" -import { useLocale } from "next-intl" - -const fusakaDate = new Date("2025-12-03T21:49:11.000Z") -const fusakaDateTime = fusakaDate.getTime() -const SECONDS = 1000 - -type TimeUnits = { - days: number - hours: number - minutes: number - seconds: number | null - isExpired: boolean -} - -type TimeLabels = { - days: string - hours: string - minutes: string - seconds: string -} - -const getTimeUnits = (): TimeUnits => { - const now = Date.now() - const timeLeft = fusakaDateTime - now - - if (timeLeft < 0) { - return { - days: 0, - hours: 0, - minutes: 0, - seconds: null, - isExpired: true, - } - } - - const days = Math.floor(timeLeft / (24 * 60 * 60 * 1000)) - const hours = Math.floor( - (timeLeft % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000) - ) - const minutes = Math.floor((timeLeft % (60 * 60 * 1000)) / (60 * 1000)) - const seconds = - days === 0 ? Math.floor((timeLeft % (60 * 1000)) / 1000) : null - - return { - days, - hours, - minutes, - seconds, - isExpired: false, - } -} - -const getTimeLabels = (locale: string): TimeLabels => { - const baseOptions = { - round: true, - language: locale, - } - - try { - // Use humanizeDuration to get translated unit names (plural forms) - // Format 2 units of each type to get plural forms - const twoDays = humanizeDuration(2 * 24 * 60 * 60 * 1000, { - ...baseOptions, - units: ["d"], - }) - const twoHours = humanizeDuration(2 * 60 * 60 * 1000, { - ...baseOptions, - units: ["h"], - }) - const twoMinutes = humanizeDuration(2 * 60 * 1000, { - ...baseOptions, - units: ["m"], - }) - const twoSeconds = humanizeDuration(2 * 1000, { - ...baseOptions, - units: ["s"], - }) - - // Extract unit names (remove the number) - const extractUnit = (str: string): string => { - // Remove leading numbers, whitespace, and any separators - // Handles formats like "1 day", "1d", "1 jour", etc. - return str - .replace(/^\d+\s*/, "") // Remove leading number and space - .replace(/^\d+/, "") // Remove any remaining leading number (for formats like "1d") - .trim() - .split(/\s+/)[0] // Take first word in case of multiple words - } - - return { - days: extractUnit(twoDays), - hours: extractUnit(twoHours), - minutes: extractUnit(twoMinutes), - seconds: extractUnit(twoSeconds), - } - } catch { - // Fallback to English if translation fails - return { - days: "days", - hours: "hours", - minutes: "minutes", - seconds: "seconds", - } - } -} - -const FusakaCountdown = ({ liveNowText }: { liveNowText: string }) => { - const locale = useLocale() - const [timeUnits, setTimeUnits] = useState(() => getTimeUnits()) - const [labels, setLabels] = useState(() => getTimeLabels(locale)) - - useEffect(() => { - setLabels(getTimeLabels(locale)) - }, [locale]) - - useEffect(() => { - const updateCountdown = () => { - setTimeUnits(getTimeUnits()) - } - - const interval = setInterval(updateCountdown, SECONDS) - - return () => clearInterval(interval) - }, []) - - if (timeUnits.isExpired) { - return ( -

- {liveNowText} -

- ) - } - - return ( -
- {timeUnits.days > 0 && ( -
-

- {String(timeUnits.days).padStart(2, "0")} -

-

- {labels.days} -

-
- )} -
-

- {String(timeUnits.hours).padStart(2, "0")} -

-

{labels.hours}

-
-
-

- {String(timeUnits.minutes).padStart(2, "0")} -

-

- {labels.minutes} -

-
- {timeUnits.seconds !== null && ( -
-

- {String(timeUnits.seconds).padStart(2, "0")} -

-

- {labels.seconds} -

-
- )} -
- ) -} - -export default FusakaCountdown diff --git a/src/components/Banners/FusakaBanner/index.tsx b/src/components/Banners/FusakaBanner/index.tsx deleted file mode 100644 index 17d1b1f0cad..00000000000 --- a/src/components/Banners/FusakaBanner/index.tsx +++ /dev/null @@ -1,44 +0,0 @@ -import { getLocale, getTranslations } from "next-intl/server" - -import { LinkBox, LinkOverlay } from "@/components/ui/link-box" - -import FusakaCountdown from "./FusakaCountdown" - -const FusakaBanner = async () => { - const locale = getLocale() - const t = await getTranslations({ locale, namespace: "page-index" }) - - return ( - -
-
-

- FUSAKA -

-

- {t("page-index-fusaka-network-upgrade")} -

-
-

- {t("page-index-fusaka-description")}{" "} - - {t("page-index-fusaka-read-more")} - -

-
-

- {t.rich("page-index-fusaka-going-live-in", { - br: () =>
, - })} -

- -
-
-
- ) -} - -export default FusakaBanner From d197d2a9be6dfd13460999e4643353623b3dfbfe Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 19:15:52 +0000 Subject: [PATCH 105/227] docs: update README.md [skip ci] --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5c37316d5f2..b376f916f1c 100644 --- a/README.md +++ b/README.md @@ -2156,6 +2156,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d Ivan Manchev
Ivan Manchev

🚧 Cypher Pepe
Cypher Pepe

🚧 Ankita Virani (ankita.eth)
Ankita Virani (ankita.eth)

🖋 + Mikhail
Mikhail

🔧 From a04795de602ab43fc27ee2f869f5ec79a4dace4c Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 19:15:53 +0000 Subject: [PATCH 106/227] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 7501f55fccf..276e5063756 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -13943,6 +13943,15 @@ "contributions": [ "content" ] + }, + { + "login": "mikhaildobs", + "name": "Mikhail", + "avatar_url": "https://avatars.githubusercontent.com/u/4770810?v=4", + "profile": "http://linkdrop.io", + "contributions": [ + "tool" + ] } ], "contributorsPerLine": 7, From 8d5b4179e2fd66f6b162065cf1530118838415ba Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 15 Dec 2025 13:21:41 -0700 Subject: [PATCH 107/227] update organization structured data --- app/[locale]/10years/page-jsonld.tsx | 47 ++----------- app/[locale]/[...slug]/page-jsonld.tsx | 49 ++------------ .../apps/[application]/page-jsonld.tsx | 29 ++------ .../[catetgoryName]/page-jsonld.tsx | 29 ++------ app/[locale]/apps/page-jsonld.tsx | 21 +----- app/[locale]/assets/page-jsonld.tsx | 45 ++----------- app/[locale]/bug-bounty/page-jsonld.tsx | 29 ++------ app/[locale]/collectibles/page-jsonld.tsx | 45 ++----------- app/[locale]/community/page-jsonld.tsx | 29 ++------ .../acknowledgements/page-jsonld.tsx | 29 ++------ .../contributors/page-jsonld.tsx | 29 ++------ .../translatathon/leaderboard/page-jsonld.tsx | 29 ++------ .../developers/learning-tools/page-jsonld.tsx | 29 ++------ .../local-environment/page-jsonld.tsx | 45 ++----------- app/[locale]/developers/page-jsonld.tsx | 29 ++------ .../developers/tutorials/page-jsonld.tsx | 67 +++---------------- app/[locale]/enterprise/page-jsonld.tsx | 29 ++------ .../page-jsonld.tsx | 49 ++------------ .../ethereum-vs-bitcoin/page-jsonld.tsx | 49 ++------------ app/[locale]/founders/page-jsonld.tsx | 29 ++------ app/[locale]/gas/page-jsonld.tsx | 49 ++------------ app/[locale]/get-eth/page-jsonld.tsx | 49 ++------------ app/[locale]/layer-2/learn/page-jsonld.tsx | 49 ++------------ app/[locale]/layer-2/networks/page-jsonld.tsx | 29 ++------ app/[locale]/layer-2/page-jsonld.tsx | 49 ++------------ app/[locale]/learn/page-jsonld.tsx | 29 ++------ app/[locale]/page-jsonld.tsx | 34 ++++------ app/[locale]/quizzes/page-jsonld.tsx | 25 ++----- app/[locale]/resources/page-jsonld.tsx | 25 ++----- app/[locale]/roadmap/_vision/page-jsonld.tsx | 49 ++------------ app/[locale]/roadmap/page-jsonld.tsx | 49 ++------------ app/[locale]/run-a-node/page-jsonld.tsx | 49 ++------------ app/[locale]/stablecoins/page-jsonld.tsx | 49 ++------------ app/[locale]/staking/page-jsonld.tsx | 49 ++------------ app/[locale]/start/page-jsonld.tsx | 49 ++------------ .../trillion-dollar-security/page-jsonld.tsx | 33 ++------- .../wallets/find-wallet/page-jsonld.tsx | 49 ++------------ app/[locale]/wallets/page-jsonld.tsx | 49 ++------------ app/[locale]/what-is-ether/page-jsonld.tsx | 29 ++------ app/[locale]/what-is-ethereum/page-jsonld.tsx | 49 ++------------ .../page-jsonld.tsx | 33 ++------- src/lib/utils/jsonld.ts | 48 +++++++++++++ 42 files changed, 283 insertions(+), 1375 deletions(-) create mode 100644 src/lib/utils/jsonld.ts diff --git a/app/[locale]/10years/page-jsonld.tsx b/app/[locale]/10years/page-jsonld.tsx index 7eac36b6c13..ea9d339c763 100644 --- a/app/[locale]/10years/page-jsonld.tsx +++ b/app/[locale]/10years/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function TenYearJsonLD({ @@ -33,13 +34,7 @@ export default async function TenYearJsonLD({ description: t("page-10-year-anniversary-meta-description"), url: url, inLanguage: locale, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], contributor: contributorList, breadcrumb: { "@type": "BreadcrumbList", @@ -58,26 +53,8 @@ export default async function TenYearJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/assets/eth-logo.png", - width: "256", - height: "417", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, mainEntity: { "@type": "Event", "@id": `${url}#ethereum-10-year-anniversary`, @@ -93,20 +70,8 @@ export default async function TenYearJsonLD({ uploadDate: "2024-07-30T00:00:00Z", duration: "PT5M30S", embedUrl: "https://www.youtube.com/embed/gjwr-7PgpTC", - publisher: { - "@type": "Organization", - name: "Ethereum Foundation", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/[...slug]/page-jsonld.tsx b/app/[locale]/[...slug]/page-jsonld.tsx index 64ca2bd856a..7174df9bc72 100644 --- a/app/[locale]/[...slug]/page-jsonld.tsx +++ b/app/[locale]/[...slug]/page-jsonld.tsx @@ -2,6 +2,7 @@ import { FileContributor, Frontmatter } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function SlugJsonLD({ @@ -57,13 +58,7 @@ export default async function SlugJsonLD({ description: frontmatter.description, url: url, inLanguage: locale, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], contributor: contributorList, isPartOf: { "@type": "WebSite", @@ -74,20 +69,8 @@ export default async function SlugJsonLD({ "@type": "BreadcrumbList", itemListElement: breadcrumbItems, }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the article content @@ -99,28 +82,10 @@ export default async function SlugJsonLD({ image: frontmatter.image ? `https://ethereum.org${frontmatter.image}` : undefined, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], contributor: contributorList, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, dateModified: frontmatter.published, mainEntityOfPage: url, about: { diff --git a/app/[locale]/apps/[application]/page-jsonld.tsx b/app/[locale]/apps/[application]/page-jsonld.tsx index c34fcb207f0..70cf881df94 100644 --- a/app/[locale]/apps/[application]/page-jsonld.tsx +++ b/app/[locale]/apps/[application]/page-jsonld.tsx @@ -2,6 +2,7 @@ import { AppData, FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd, slugify } from "@/lib/utils/url" export default async function AppsAppJsonLD({ @@ -31,13 +32,7 @@ export default async function AppsAppJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -61,24 +56,8 @@ export default async function AppsAppJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const softwareApplicationJsonLd = { diff --git a/app/[locale]/apps/categories/[catetgoryName]/page-jsonld.tsx b/app/[locale]/apps/categories/[catetgoryName]/page-jsonld.tsx index 9164f052b1d..b87b6dc8419 100644 --- a/app/[locale]/apps/categories/[catetgoryName]/page-jsonld.tsx +++ b/app/[locale]/apps/categories/[catetgoryName]/page-jsonld.tsx @@ -4,6 +4,7 @@ import { AppCategoryData, AppData, FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function AppsCategoryJsonLD({ @@ -41,13 +42,7 @@ export default async function AppsCategoryJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -71,24 +66,8 @@ export default async function AppsCategoryJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const categoryAppsJsonLd = { diff --git a/app/[locale]/apps/page-jsonld.tsx b/app/[locale]/apps/page-jsonld.tsx index ad7ab9d949e..23798e10447 100644 --- a/app/[locale]/apps/page-jsonld.tsx +++ b/app/[locale]/apps/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" import { appsCategories } from "@/data/apps/categories" @@ -59,24 +60,8 @@ export default async function AppsJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const appCategoriesJsonLd = { diff --git a/app/[locale]/assets/page-jsonld.tsx b/app/[locale]/assets/page-jsonld.tsx index ef376770bb3..9876f54845a 100644 --- a/app/[locale]/assets/page-jsonld.tsx +++ b/app/[locale]/assets/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function AssetsJsonLD({ @@ -33,13 +34,7 @@ export default async function AssetsJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -57,24 +52,8 @@ export default async function AssetsJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const creativeWorkJsonLd = { @@ -108,20 +87,8 @@ export default async function AssetsJsonLD({ url: normalizeUrlForJsonLd(locale, "/assets/#brand"), }, ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/bug-bounty/page-jsonld.tsx b/app/[locale]/bug-bounty/page-jsonld.tsx index 74c597e4b77..c1b54150709 100644 --- a/app/[locale]/bug-bounty/page-jsonld.tsx +++ b/app/[locale]/bug-bounty/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function BugBountyJsonLD({ @@ -33,13 +34,7 @@ export default async function BugBountyJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -57,24 +52,8 @@ export default async function BugBountyJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/collectibles/page-jsonld.tsx b/app/[locale]/collectibles/page-jsonld.tsx index 30231bb5b09..0aa3bf552e2 100644 --- a/app/[locale]/collectibles/page-jsonld.tsx +++ b/app/[locale]/collectibles/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" import { COLLECTIBLES_BASE_URL } from "./constants" @@ -40,13 +41,7 @@ export default async function CollectiblesJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -64,24 +59,8 @@ export default async function CollectiblesJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const collectiblesCollectionJsonLd = { @@ -99,20 +78,8 @@ export default async function CollectiblesJsonLD({ url: badge.link || `${COLLECTIBLES_BASE_URL}/badge/${badge.id}`, image: badge.image, })), - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, additionalProperty: [ { "@type": "PropertyValue", diff --git a/app/[locale]/community/page-jsonld.tsx b/app/[locale]/community/page-jsonld.tsx index ce14986275f..5cbf2966c41 100644 --- a/app/[locale]/community/page-jsonld.tsx +++ b/app/[locale]/community/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function CommunityJsonLD({ @@ -33,13 +34,7 @@ export default async function CommunityJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -57,24 +52,8 @@ export default async function CommunityJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const communityResourcesJsonLd = { diff --git a/app/[locale]/contributing/translation-program/acknowledgements/page-jsonld.tsx b/app/[locale]/contributing/translation-program/acknowledgements/page-jsonld.tsx index 55b9cb048b4..688bb316d3f 100644 --- a/app/[locale]/contributing/translation-program/acknowledgements/page-jsonld.tsx +++ b/app/[locale]/contributing/translation-program/acknowledgements/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function AcknowledgementsJsonLD({ @@ -42,13 +43,7 @@ export default async function AcknowledgementsJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -83,24 +78,8 @@ export default async function AcknowledgementsJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/contributing/translation-program/contributors/page-jsonld.tsx b/app/[locale]/contributing/translation-program/contributors/page-jsonld.tsx index f6567850a42..797cf40d96b 100644 --- a/app/[locale]/contributing/translation-program/contributors/page-jsonld.tsx +++ b/app/[locale]/contributing/translation-program/contributors/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function ContributorsJsonLD({ @@ -40,13 +41,7 @@ export default async function ContributorsJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -81,24 +76,8 @@ export default async function ContributorsJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/contributing/translation-program/translatathon/leaderboard/page-jsonld.tsx b/app/[locale]/contributing/translation-program/translatathon/leaderboard/page-jsonld.tsx index e3a9eb26d44..1985b3490d7 100644 --- a/app/[locale]/contributing/translation-program/translatathon/leaderboard/page-jsonld.tsx +++ b/app/[locale]/contributing/translation-program/translatathon/leaderboard/page-jsonld.tsx @@ -2,6 +2,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function TranslatathonLeaderboardJsonLD({ @@ -33,13 +34,7 @@ export default async function TranslatathonLeaderboardJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -81,24 +76,8 @@ export default async function TranslatathonLeaderboardJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/developers/learning-tools/page-jsonld.tsx b/app/[locale]/developers/learning-tools/page-jsonld.tsx index 41a72fa6e1c..ee2ec440c8e 100644 --- a/app/[locale]/developers/learning-tools/page-jsonld.tsx +++ b/app/[locale]/developers/learning-tools/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function LearningToolsJsonLD({ @@ -35,13 +36,7 @@ export default async function LearningToolsJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -65,24 +60,8 @@ export default async function LearningToolsJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/developers/local-environment/page-jsonld.tsx b/app/[locale]/developers/local-environment/page-jsonld.tsx index b540579a324..eac49a00afd 100644 --- a/app/[locale]/developers/local-environment/page-jsonld.tsx +++ b/app/[locale]/developers/local-environment/page-jsonld.tsx @@ -5,6 +5,7 @@ import { Framework } from "@/lib/interfaces" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function LocalEnvironmentJsonLD({ @@ -38,13 +39,7 @@ export default async function LocalEnvironmentJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -68,24 +63,8 @@ export default async function LocalEnvironmentJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const developmentFrameworksJsonLd = { @@ -113,20 +92,8 @@ export default async function LocalEnvironmentJsonLD({ downloadUrl: framework.url, sameAs: framework.githubUrl, })), - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return ( diff --git a/app/[locale]/developers/page-jsonld.tsx b/app/[locale]/developers/page-jsonld.tsx index ae9d15b45cc..4858b6d7db3 100644 --- a/app/[locale]/developers/page-jsonld.tsx +++ b/app/[locale]/developers/page-jsonld.tsx @@ -4,6 +4,7 @@ import { CommunityConference, FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" import { DevelopersPath, VideoCourse } from "./types" @@ -41,13 +42,7 @@ export default async function DevelopersPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -65,24 +60,8 @@ export default async function DevelopersPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const learningResourcesJsonLd = { diff --git a/app/[locale]/developers/tutorials/page-jsonld.tsx b/app/[locale]/developers/tutorials/page-jsonld.tsx index 29a842dddc7..df19538aa55 100644 --- a/app/[locale]/developers/tutorials/page-jsonld.tsx +++ b/app/[locale]/developers/tutorials/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, ITutorial } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function TutorialsPageJsonLD({ @@ -35,13 +36,7 @@ export default async function TutorialsPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -65,24 +60,8 @@ export default async function TutorialsPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const tutorialCollectionJsonLd = { @@ -99,20 +78,8 @@ export default async function TutorialsPageJsonLD({ description: tutorial.description, url: tutorial.href, })), - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } const courseListJsonLd = { @@ -127,11 +94,7 @@ export default async function TutorialsPageJsonLD({ name: tutorial.title, description: tutorial.description, url: tutorial.href, - provider: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + provider: ethereumFoundationOrganization, courseMode: "online", educationalLevel: "beginner-intermediate", inLanguage: locale, @@ -144,20 +107,8 @@ export default async function TutorialsPageJsonLD({ ], position: index + 1, })), - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return ( diff --git a/app/[locale]/enterprise/page-jsonld.tsx b/app/[locale]/enterprise/page-jsonld.tsx index 15c2fee4bc7..350def286b3 100644 --- a/app/[locale]/enterprise/page-jsonld.tsx +++ b/app/[locale]/enterprise/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function EnterprisePageJsonLD({ @@ -35,13 +36,7 @@ export default async function EnterprisePageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -59,24 +54,8 @@ export default async function EnterprisePageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return } diff --git a/app/[locale]/ethereum-history-founder-and-ownership/page-jsonld.tsx b/app/[locale]/ethereum-history-founder-and-ownership/page-jsonld.tsx index 136a5c98fab..9626909a189 100644 --- a/app/[locale]/ethereum-history-founder-and-ownership/page-jsonld.tsx +++ b/app/[locale]/ethereum-history-founder-and-ownership/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function EthereumHistoryFounderAndOwnershipPageJsonLD({ @@ -42,13 +43,7 @@ export default async function EthereumHistoryFounderAndOwnershipPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -66,20 +61,8 @@ export default async function EthereumHistoryFounderAndOwnershipPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the history and founder article content @@ -92,28 +75,10 @@ export default async function EthereumHistoryFounderAndOwnershipPageJsonLD({ ), image: "https://ethereum.org/images/ethereum-history-founder-and-ownership/ethereum-history-founder-and-ownership-hero.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, about: [ { "@type": "Thing", diff --git a/app/[locale]/ethereum-vs-bitcoin/page-jsonld.tsx b/app/[locale]/ethereum-vs-bitcoin/page-jsonld.tsx index 5544ac1cf3a..e340f74ce3d 100644 --- a/app/[locale]/ethereum-vs-bitcoin/page-jsonld.tsx +++ b/app/[locale]/ethereum-vs-bitcoin/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function EthereumVsBitcoinPageJsonLD({ @@ -37,13 +38,7 @@ export default async function EthereumVsBitcoinPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -61,20 +56,8 @@ export default async function EthereumVsBitcoinPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the comparison article content @@ -85,28 +68,10 @@ export default async function EthereumVsBitcoinPageJsonLD({ description: t("page-ethereum-vs-bitcoin-meta-description"), image: "https://ethereum.org/images/ethereum-vs-bitcoin/bitcoin-vs-ethereum-robots.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, about: [ { "@type": "Thing", diff --git a/app/[locale]/founders/page-jsonld.tsx b/app/[locale]/founders/page-jsonld.tsx index e47b6880f20..293721e393d 100644 --- a/app/[locale]/founders/page-jsonld.tsx +++ b/app/[locale]/founders/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function FoundersPageJsonLD({ @@ -35,13 +36,7 @@ export default async function FoundersPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -59,24 +54,8 @@ export default async function FoundersPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/gas/page-jsonld.tsx b/app/[locale]/gas/page-jsonld.tsx index a7972dc3bb3..3622b5970d3 100644 --- a/app/[locale]/gas/page-jsonld.tsx +++ b/app/[locale]/gas/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function GasPageJsonLD({ @@ -37,13 +38,7 @@ export default async function GasPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -61,20 +56,8 @@ export default async function GasPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the article content about gas @@ -84,27 +67,9 @@ export default async function GasPageJsonLD({ headline: t("page-gas-hero-title"), description: t("page-gas-meta-description"), contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, dateModified: lastEditLocaleTimestamp, mainEntityOfPage: { "@type": "WebPage", diff --git a/app/[locale]/get-eth/page-jsonld.tsx b/app/[locale]/get-eth/page-jsonld.tsx index 4ed5c49f0fb..5e0b26d7fbc 100644 --- a/app/[locale]/get-eth/page-jsonld.tsx +++ b/app/[locale]/get-eth/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function GetEthPageJsonLD({ @@ -37,13 +38,7 @@ export default async function GetEthPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -61,20 +56,8 @@ export default async function GetEthPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the article content about getting ETH @@ -85,27 +68,9 @@ export default async function GetEthPageJsonLD({ description: t("page-get-eth-meta-description"), image: "https://ethereum.org/images/get-eth.png", // TODO: adjust value when the old theme breakpoints are removed (src/theme.ts) contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, dateModified: lastEditLocaleTimestamp, } diff --git a/app/[locale]/layer-2/learn/page-jsonld.tsx b/app/[locale]/layer-2/learn/page-jsonld.tsx index ca37ab0cfd9..be41cc321da 100644 --- a/app/[locale]/layer-2/learn/page-jsonld.tsx +++ b/app/[locale]/layer-2/learn/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function Layer2LearnPageJsonLD({ @@ -37,13 +38,7 @@ export default async function Layer2LearnPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -67,20 +62,8 @@ export default async function Layer2LearnPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the article content about learning Layer 2 @@ -90,28 +73,10 @@ export default async function Layer2LearnPageJsonLD({ headline: t("page-layer-2-learn-title"), description: t("page-layer-2-learn-description"), image: "https://ethereum.org/images/layer-2/learn-hero.png", // TODO: adjust value when the old theme breakpoints are removed (src/theme.ts) - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, dateModified: lastEditLocaleTimestamp, } diff --git a/app/[locale]/layer-2/networks/page-jsonld.tsx b/app/[locale]/layer-2/networks/page-jsonld.tsx index f246208efb7..95402af4be2 100644 --- a/app/[locale]/layer-2/networks/page-jsonld.tsx +++ b/app/[locale]/layer-2/networks/page-jsonld.tsx @@ -2,6 +2,7 @@ import { getTranslations } from "next-intl/server" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function Layer2NetworksPageJsonLD({ @@ -31,13 +32,7 @@ export default async function Layer2NetworksPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -61,24 +56,8 @@ export default async function Layer2NetworksPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for Layer 2 Networks listing diff --git a/app/[locale]/layer-2/page-jsonld.tsx b/app/[locale]/layer-2/page-jsonld.tsx index 0a081f83cc9..0f875c203f0 100644 --- a/app/[locale]/layer-2/page-jsonld.tsx +++ b/app/[locale]/layer-2/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function Layer2PageJsonLD({ @@ -35,13 +36,7 @@ export default async function Layer2PageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -59,20 +54,8 @@ export default async function Layer2PageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the article content about Layer 2 @@ -82,28 +65,10 @@ export default async function Layer2PageJsonLD({ headline: t("page-layer-2-hero-title"), description: t("page-layer-2-meta-description"), image: "https://ethereum.org/images/layer-2/learn-hero.png", // TODO: adjust value when the old theme breakpoints are removed (src/theme.ts) - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], contributor: contributorList, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for FAQ section diff --git a/app/[locale]/learn/page-jsonld.tsx b/app/[locale]/learn/page-jsonld.tsx index d5ea98aa5e6..7fa0bc8b8d3 100644 --- a/app/[locale]/learn/page-jsonld.tsx +++ b/app/[locale]/learn/page-jsonld.tsx @@ -2,6 +2,7 @@ import { getTranslations } from "next-intl/server" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function LearnPageJsonLD({ locale, contributors }) { @@ -27,13 +28,7 @@ export default async function LearnPageJsonLD({ locale, contributors }) { url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -51,24 +46,8 @@ export default async function LearnPageJsonLD({ locale, contributors }) { }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/page-jsonld.tsx b/app/[locale]/page-jsonld.tsx index 1801fde995e..66cf5819c29 100644 --- a/app/[locale]/page-jsonld.tsx +++ b/app/[locale]/page-jsonld.tsx @@ -4,6 +4,11 @@ import { Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { + ethereumCommunityOrganization, + ethereumFoundationOrganization, + ethereumFoundationReference, +} from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function IndexPageJsonLD({ @@ -24,40 +29,25 @@ export default async function IndexPageJsonLD({ url: url, name: "ethereum.org", description: t("page-index-meta-description"), - educationalUse: "instruction", + educationalUse: "Independent Study", keywords: "Ethereum, Blockchain, Smart Contracts, Web3, Open Source, Protocol, Documentation, Education", inLanguage: locale, license: "https://opensource.org/licenses/MIT", audience: { "@type": "EducationalAudience", - educationalRole: "developer", + educationalRole: ["developer", "student"], audienceType: "public", }, - publisher: { - "@type": "Organization", - name: "Ethereum Foundation", - url: "https://ethereum.foundation", - ownershipFundingInfo: "https://ethereum.foundation/ef", - logo: "https://cdn.jsdelivr.net/gh/ethereum/ethereum-foundation-website@master/src/assets/images/ef-logo.svg", - sameAs: [ - "https://www.wikidata.org/wiki/Q114736857", - "https://github.com/ethereum/ethereum-foundation-website", - "https://x.com/ethereumfndn", - ], - }, - maintainer: { - "@type": "Organization", - name: "Ethereum Community", - url: "https://github.com/ethereum/ethereum-org-website/graphs/contributors", - }, + publisher: ethereumFoundationOrganization, + maintainer: ethereumFoundationReference, + contributor: ethereumCommunityOrganization, about: { - "@type": "SoftwareApplication", + "@type": "Thing", name: "Ethereum", - applicationCategory: "Blockchain Protocol", - operatingSystem: "Cross-platform", description: "A decentralized, open-source blockchain with smart contract functionality.", + image: "https://ethereum.org/images/assets/eth-diamond-glyph.png", sameAs: [ "https://www.wikidata.org/wiki/Q16783523", "https://en.wikipedia.org/wiki/Ethereum", diff --git a/app/[locale]/quizzes/page-jsonld.tsx b/app/[locale]/quizzes/page-jsonld.tsx index 308f644ed14..2742c395c17 100644 --- a/app/[locale]/quizzes/page-jsonld.tsx +++ b/app/[locale]/quizzes/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function QuizzesPageJsonLD({ @@ -35,13 +36,7 @@ export default async function QuizzesPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -59,20 +54,8 @@ export default async function QuizzesPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/resources/page-jsonld.tsx b/app/[locale]/resources/page-jsonld.tsx index 35794ae91e0..9e1355ff44c 100644 --- a/app/[locale]/resources/page-jsonld.tsx +++ b/app/[locale]/resources/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function ResourcesPageJsonLD({ @@ -35,13 +36,7 @@ export default async function ResourcesPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -59,20 +54,8 @@ export default async function ResourcesPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } return diff --git a/app/[locale]/roadmap/_vision/page-jsonld.tsx b/app/[locale]/roadmap/_vision/page-jsonld.tsx index 9a1e8284776..bd3061e2eb6 100644 --- a/app/[locale]/roadmap/_vision/page-jsonld.tsx +++ b/app/[locale]/roadmap/_vision/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function RoadmapVisionPageJsonLD({ @@ -37,13 +38,7 @@ export default async function RoadmapVisionPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -67,20 +62,8 @@ export default async function RoadmapVisionPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the vision article content @@ -90,28 +73,10 @@ export default async function RoadmapVisionPageJsonLD({ headline: t("page-roadmap-vision-title"), description: t("page-roadmap-vision-subtitle"), image: "https://ethereum.org/images/upgrades/oldship.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Ethereum Vision", diff --git a/app/[locale]/roadmap/page-jsonld.tsx b/app/[locale]/roadmap/page-jsonld.tsx index 9546d4712a5..98f576bb706 100644 --- a/app/[locale]/roadmap/page-jsonld.tsx +++ b/app/[locale]/roadmap/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function RoadmapPageJsonLD({ @@ -35,13 +36,7 @@ export default async function RoadmapPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -59,20 +54,8 @@ export default async function RoadmapPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the roadmap article content @@ -82,28 +65,10 @@ export default async function RoadmapPageJsonLD({ headline: t("page-roadmap-title"), description: t("page-roadmap-meta-description"), image: "https://ethereum.org/images/heroes/roadmap-hub-hero.jpg", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Ethereum Roadmap", diff --git a/app/[locale]/run-a-node/page-jsonld.tsx b/app/[locale]/run-a-node/page-jsonld.tsx index 2385e13360c..364e902773a 100644 --- a/app/[locale]/run-a-node/page-jsonld.tsx +++ b/app/[locale]/run-a-node/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function RunANodePageJsonLD({ @@ -37,13 +38,7 @@ export default async function RunANodePageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -61,20 +56,8 @@ export default async function RunANodePageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the run a node article content @@ -84,28 +67,10 @@ export default async function RunANodePageJsonLD({ headline: t("page-run-a-node-title"), description: t("page-run-a-node-hero-subtitle"), image: "https://ethereum.org/images/run-a-node/ethereum-inside.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], contributor: contributorList, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Running an Ethereum Node", diff --git a/app/[locale]/stablecoins/page-jsonld.tsx b/app/[locale]/stablecoins/page-jsonld.tsx index d6ae3c01c2d..61cc2496ca0 100644 --- a/app/[locale]/stablecoins/page-jsonld.tsx +++ b/app/[locale]/stablecoins/page-jsonld.tsx @@ -2,6 +2,7 @@ import { getTranslations } from "next-intl/server" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function StablecoinsPageJsonLD({ locale, contributors }) { @@ -27,13 +28,7 @@ export default async function StablecoinsPageJsonLD({ locale, contributors }) { url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -51,20 +46,8 @@ export default async function StablecoinsPageJsonLD({ locale, contributors }) { }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the stablecoins article content @@ -74,28 +57,10 @@ export default async function StablecoinsPageJsonLD({ locale, contributors }) { headline: t("page-stablecoins-title"), description: t("page-stablecoins-meta-description"), image: "https://ethereum.org/images/stablecoins/hero.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], contributor: contributorList, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Stablecoins", diff --git a/app/[locale]/staking/page-jsonld.tsx b/app/[locale]/staking/page-jsonld.tsx index 37bb723e903..c61f9e9cf59 100644 --- a/app/[locale]/staking/page-jsonld.tsx +++ b/app/[locale]/staking/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function StakingPageJsonLD({ @@ -37,13 +38,7 @@ export default async function StakingPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -61,20 +56,8 @@ export default async function StakingPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the staking article content @@ -84,28 +67,10 @@ export default async function StakingPageJsonLD({ headline: t("page-staking-hero-title"), description: t("page-staking-meta-description"), image: "https://ethereum.org/images/upgrades/upgrade_rhino.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], contributor: contributorList, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Ethereum Staking", diff --git a/app/[locale]/start/page-jsonld.tsx b/app/[locale]/start/page-jsonld.tsx index 5a86a796cc6..3262a888dc9 100644 --- a/app/[locale]/start/page-jsonld.tsx +++ b/app/[locale]/start/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function StartPageJsonLD({ @@ -35,13 +36,7 @@ export default async function StartPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -59,20 +54,8 @@ export default async function StartPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the start guide article content @@ -82,28 +65,10 @@ export default async function StartPageJsonLD({ headline: t("page-start-title"), description: t("page-start-meta-description"), image: "https://ethereum.org/images/heroes/developers-hub-hero.jpg", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Getting Started with Ethereum", diff --git a/app/[locale]/trillion-dollar-security/page-jsonld.tsx b/app/[locale]/trillion-dollar-security/page-jsonld.tsx index 2dafb0560ed..fe36ea4ad7e 100644 --- a/app/[locale]/trillion-dollar-security/page-jsonld.tsx +++ b/app/[locale]/trillion-dollar-security/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function TrillionDollarSecurityPageJsonLD({ @@ -59,20 +60,8 @@ export default async function TrillionDollarSecurityPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the security report article content @@ -90,20 +79,8 @@ export default async function TrillionDollarSecurityPageJsonLD({ }, ], contributor: contributorList, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Ethereum Security", diff --git a/app/[locale]/wallets/find-wallet/page-jsonld.tsx b/app/[locale]/wallets/find-wallet/page-jsonld.tsx index 38520ed0819..3d36c6932cc 100644 --- a/app/[locale]/wallets/find-wallet/page-jsonld.tsx +++ b/app/[locale]/wallets/find-wallet/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function FindWalletPageJsonLD({ @@ -35,13 +36,7 @@ export default async function FindWalletPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -65,20 +60,8 @@ export default async function FindWalletPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the wallet finder article content @@ -88,28 +71,10 @@ export default async function FindWalletPageJsonLD({ headline: t("page-find-wallet-title"), description: t("page-find-wallet-meta-description"), image: "https://ethereum.org/images/wallets/wallet-hero.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Ethereum Wallet Finder", diff --git a/app/[locale]/wallets/page-jsonld.tsx b/app/[locale]/wallets/page-jsonld.tsx index c29fb7f818f..41e53ac49ef 100644 --- a/app/[locale]/wallets/page-jsonld.tsx +++ b/app/[locale]/wallets/page-jsonld.tsx @@ -2,6 +2,7 @@ import { getTranslations } from "next-intl/server" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function WalletsPageJsonLD({ @@ -31,13 +32,7 @@ export default async function WalletsPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -55,20 +50,8 @@ export default async function WalletsPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the wallets guide article content @@ -78,28 +61,10 @@ export default async function WalletsPageJsonLD({ headline: t("page-wallets-title"), description: t("page-wallets-meta-description"), image: "https://ethereum.org/images/wallets/wallet-hero.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], contributor: contributorList, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Ethereum Wallets", diff --git a/app/[locale]/what-is-ether/page-jsonld.tsx b/app/[locale]/what-is-ether/page-jsonld.tsx index e1e6afb9531..d34b918ebdf 100644 --- a/app/[locale]/what-is-ether/page-jsonld.tsx +++ b/app/[locale]/what-is-ether/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function WhatIsEtherPageJsonLD({ @@ -37,13 +38,7 @@ export default async function WhatIsEtherPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -61,11 +56,7 @@ export default async function WhatIsEtherPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + publisher: ethereumFoundationOrganization, reviewedBy: { "@type": "Organization", name: "ethereum.org", @@ -84,18 +75,8 @@ export default async function WhatIsEtherPageJsonLD({ headline: t("page-what-is-ether-title"), description: t("page-what-is-ether-meta-description"), image: "https://ethereum.org/images/eth.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, reviewedBy: { "@type": "Organization", diff --git a/app/[locale]/what-is-ethereum/page-jsonld.tsx b/app/[locale]/what-is-ethereum/page-jsonld.tsx index 6bc74e97e6e..d5480661b44 100644 --- a/app/[locale]/what-is-ethereum/page-jsonld.tsx +++ b/app/[locale]/what-is-ethereum/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function WhatIsEthereumPageJsonLD({ @@ -37,13 +38,7 @@ export default async function WhatIsEthereumPageJsonLD({ url: url, inLanguage: locale, contributor: contributorList, - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], + author: [ethereumFoundationOrganization], breadcrumb: { "@type": "BreadcrumbList", itemListElement: [ @@ -67,20 +62,8 @@ export default async function WhatIsEthereumPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the what is ethereum article content @@ -90,28 +73,10 @@ export default async function WhatIsEthereumPageJsonLD({ headline: t("page-what-is-ethereum-title"), description: t("page-what-is-ethereum-meta-description"), image: "https://ethereum.org/images/what-is-ethereum.png", - author: [ - { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + author: [ethereumFoundationOrganization], + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Ethereum", diff --git a/app/[locale]/what-is-the-ethereum-network/page-jsonld.tsx b/app/[locale]/what-is-the-ethereum-network/page-jsonld.tsx index 4fda7c13109..d9ec5f3ffc0 100644 --- a/app/[locale]/what-is-the-ethereum-network/page-jsonld.tsx +++ b/app/[locale]/what-is-the-ethereum-network/page-jsonld.tsx @@ -4,6 +4,7 @@ import { FileContributor, Lang } from "@/lib/types" import PageJsonLD from "@/components/PageJsonLD" +import { ethereumFoundationOrganization } from "@/lib/utils/jsonld" import { normalizeUrlForJsonLd } from "@/lib/utils/url" export default async function WhatIsTheEthereumNetworkPageJsonLD({ @@ -67,20 +68,8 @@ export default async function WhatIsTheEthereumNetworkPageJsonLD({ }, ], }, - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + publisher: ethereumFoundationOrganization, + reviewedBy: ethereumFoundationOrganization, } // JSON-LD for the ethereum network article content @@ -97,21 +86,9 @@ export default async function WhatIsTheEthereumNetworkPageJsonLD({ url: "https://ethereum.org", }, ], - publisher: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - }, + publisher: ethereumFoundationOrganization, contributor: contributorList, - reviewedBy: { - "@type": "Organization", - name: "ethereum.org", - url: "https://ethereum.org", - logo: { - "@type": "ImageObject", - url: "https://ethereum.org/images/eth-home-icon.png", - }, - }, + reviewedBy: ethereumFoundationOrganization, about: { "@type": "Thing", name: "Ethereum Network", diff --git a/src/lib/utils/jsonld.ts b/src/lib/utils/jsonld.ts new file mode 100644 index 00000000000..334cccccc48 --- /dev/null +++ b/src/lib/utils/jsonld.ts @@ -0,0 +1,48 @@ +/** + * Shared JSON-LD structured data definitions + * These can be imported and reused across page-jsonld.tsx files + */ + +/** + * Ethereum Foundation organization definition + * Can be used as publisher, maintainer, author, etc. + */ +export const ethereumFoundationOrganization = { + "@type": "Organization" as const, + "@id": "https://ethereum.foundation/#organization", + name: "Ethereum Foundation", + url: "https://ethereum.foundation", + ownershipFundingInfo: "https://ethereum.org/images/ef-logo.png", + sameAs: [ + "https://www.wikidata.org/wiki/Q114736857", + "https://www.crunchbase.com/organization/ethereum", + "https://x.com/ethereumfndn", + "https://www.linkedin.com/company/ethereum-foundation", + ], +} + +/** + * Reference to Ethereum Foundation organization (for use when the full object is already defined elsewhere) + */ +export const ethereumFoundationReference = { + "@id": "https://ethereum.foundation/#organization", +} + +/** + * Ethereum Community contributor organization + */ +export const ethereumCommunityOrganization = { + "@type": "Organization" as const, + name: "Ethereum Community", + url: "https://github.com/ethereum/ethereum-org-website/graphs/contributors", + description: "A global collective of open-source contributors.", +} + +/** + * Ethereum.org website organization (simpler version used in some pages) + */ +export const ethereumOrgOrganization = { + "@type": "Organization" as const, + name: "ethereum.org", + url: "https://ethereum.org", +} From 6d5e34b2289d7b537cc292fc532a30ec44a7cbba Mon Sep 17 00:00:00 2001 From: Corwin Smith Date: Mon, 15 Dec 2025 13:47:18 -0700 Subject: [PATCH 108/227] refactor: simplify date handling in parseAppsOfTheWeek by utilizing isValidDate utility --- src/lib/utils/apps.ts | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/lib/utils/apps.ts b/src/lib/utils/apps.ts index dacda4b035a..85b0d1b4f58 100644 --- a/src/lib/utils/apps.ts +++ b/src/lib/utils/apps.ts @@ -2,6 +2,8 @@ import { AppCategory, AppCategoryEnum, AppData } from "@/lib/types" import { TagProps } from "@/components/ui/tag" +import { isValidDate } from "@/lib/utils/date" + // Get highlighted apps (apps with highlight=true) export const getHighlightedApps = ( appsData: Record, @@ -51,18 +53,20 @@ export const parseAppsOfTheWeek = ( .flatMap((categoryApps) => categoryApps) .filter((app) => { // Handle both Date objects and date strings (for mock data) - const startDate = + const startDate = isValidDate( app.appOfTheWeekStartDate instanceof Date - ? app.appOfTheWeekStartDate - : app.appOfTheWeekStartDate - ? new Date(app.appOfTheWeekStartDate as unknown as string) - : null - const endDate = + ? app.appOfTheWeekStartDate.toISOString() + : (app.appOfTheWeekStartDate ?? undefined) + ) + ? new Date(app.appOfTheWeekStartDate!) + : null + const endDate = isValidDate( app.appOfTheWeekEndDate instanceof Date - ? app.appOfTheWeekEndDate - : app.appOfTheWeekEndDate - ? new Date(app.appOfTheWeekEndDate as unknown as string) - : null + ? app.appOfTheWeekEndDate.toISOString() + : (app.appOfTheWeekEndDate ?? undefined) + ) + ? new Date(app.appOfTheWeekEndDate!) + : null return ( startDate && From 0fe7b4c628aded91eb0c883fc52dd8209f8dcf56 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 15 Dec 2025 18:17:47 -0300 Subject: [PATCH 109/227] refactor: use getValidDate --- src/lib/utils/apps.ts | 19 ++++--------------- src/lib/utils/date.ts | 12 +++++++++++- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/lib/utils/apps.ts b/src/lib/utils/apps.ts index 85b0d1b4f58..22c48d2a144 100644 --- a/src/lib/utils/apps.ts +++ b/src/lib/utils/apps.ts @@ -2,7 +2,7 @@ import { AppCategory, AppCategoryEnum, AppData } from "@/lib/types" import { TagProps } from "@/components/ui/tag" -import { isValidDate } from "@/lib/utils/date" +import { getValidDate } from "@/lib/utils/date" // Get highlighted apps (apps with highlight=true) export const getHighlightedApps = ( @@ -49,24 +49,13 @@ export const parseAppsOfTheWeek = ( appsData: Record ) => { const currentDate = new Date() + const appsOfTheWeek = Object.values(appsData) .flatMap((categoryApps) => categoryApps) .filter((app) => { // Handle both Date objects and date strings (for mock data) - const startDate = isValidDate( - app.appOfTheWeekStartDate instanceof Date - ? app.appOfTheWeekStartDate.toISOString() - : (app.appOfTheWeekStartDate ?? undefined) - ) - ? new Date(app.appOfTheWeekStartDate!) - : null - const endDate = isValidDate( - app.appOfTheWeekEndDate instanceof Date - ? app.appOfTheWeekEndDate.toISOString() - : (app.appOfTheWeekEndDate ?? undefined) - ) - ? new Date(app.appOfTheWeekEndDate!) - : null + const startDate = getValidDate(app.appOfTheWeekStartDate) + const endDate = getValidDate(app.appOfTheWeekEndDate) return ( startDate && diff --git a/src/lib/utils/date.ts b/src/lib/utils/date.ts index c5259b85ffb..486120200b3 100644 --- a/src/lib/utils/date.ts +++ b/src/lib/utils/date.ts @@ -1,12 +1,22 @@ export const dateToString = (published: Date | string) => new Date(published).toISOString().split("T")[0] -export const isValidDate = (dateString?: string | number): boolean => { +export const isValidDate = ( + dateString?: Date | string | number | null +): boolean => { if (!dateString) return false const date = new Date(dateString) return !isNaN(date.getTime()) } +export const getValidDate = ( + dateValue: Date | string | number | null | undefined +): Date | null => { + const dateString = + dateValue instanceof Date ? dateValue.toISOString() : dateValue + return isValidDate(dateString) ? new Date(dateValue as Date | string) : null +} + export const formatDate = (date: string, locale: string = "en-US") => { if (/^\d{4}$/.test(date)) { return date From 16ee822ea179a468cff4739d6a7ee1aa51f85c91 Mon Sep 17 00:00:00 2001 From: Paul Wackerow <54227730+wackerow@users.noreply.github.com> Date: Mon, 15 Dec 2025 19:58:26 -0300 Subject: [PATCH 110/227] deprecate: enterprise pages - /[locale]/enterprise page - /content/translations/**/enterprise markdown page - /enterprise/use-cases markdown page - /api/enterprise-contract route - /icons/enterprise/*.svg - page-enterprise.json --- .../enterprise/_components/CaseCard.tsx | 27 - .../enterprise/_components/CasesColumn.tsx | 21 - .../enterprise/_components/CasesSwiper.tsx | 34 - .../_components/ContactForm/index.tsx | 295 --------- .../_components/ContactForm/lazy.tsx | 5 - .../_components/ContactForm/loading.tsx | 10 - .../enterprise/_components/FeatureCard.tsx | 59 -- .../enterprise/_components/FeaturesSwiper.tsx | 31 - app/[locale]/enterprise/constants.ts | 4 - app/[locale]/enterprise/page-jsonld.tsx | 82 --- app/[locale]/enterprise/page.tsx | 591 ------------------ app/[locale]/enterprise/types.ts | 16 - app/[locale]/enterprise/utils.ts | 105 ---- app/api/enterprise-contact/route.ts | 135 ---- public/content/enterprise/use-cases/index.md | 169 ----- .../translations/ar/enterprise/index.md | 86 --- .../translations/bn/enterprise/index.md | 87 --- .../translations/cs/enterprise/index.md | 87 --- .../translations/de/enterprise/index.md | 162 ----- .../translations/el/enterprise/index.md | 161 ----- .../translations/es/enterprise/index.md | 161 ----- .../translations/fa/enterprise/index.md | 161 ----- .../translations/fi/enterprise/index.md | 87 --- .../translations/fr/enterprise/index.md | 161 ----- .../translations/hi/enterprise/index.md | 161 ----- .../translations/hu/enterprise/index.md | 161 ----- .../translations/id/enterprise/index.md | 161 ----- .../translations/it/enterprise/index.md | 161 ----- .../translations/ja/enterprise/index.md | 161 ----- .../translations/ko/enterprise/index.md | 87 --- .../translations/lt/enterprise/index.md | 87 --- .../translations/ml/enterprise/index.md | 86 --- .../translations/nb/enterprise/index.md | 86 --- .../translations/pl/enterprise/index.md | 155 ----- .../translations/pt-br/enterprise/index.md | 161 ----- .../translations/ro/enterprise/index.md | 161 ----- .../translations/ru/enterprise/index.md | 161 ----- .../translations/sk/enterprise/index.md | 86 --- .../translations/sv/enterprise/index.md | 86 --- .../translations/tr/enterprise/index.md | 161 ----- .../translations/uk/enterprise/index.md | 87 --- .../translations/vi/enterprise/index.md | 87 --- .../translations/zh-tw/enterprise/index.md | 161 ----- .../translations/zh/enterprise/index.md | 161 ----- .../heroes/enterprise-hero-transparent.png | Bin 316817 -> 0 bytes .../images/heroes/enterprise-hero-white.png | Bin 1423250 -> 0 bytes src/components/icons/enterprise/adidas.svg | 11 - src/components/icons/enterprise/azure.svg | 10 - .../icons/enterprise/banco-santander.svg | 10 - src/components/icons/enterprise/basf.svg | 15 - src/components/icons/enterprise/blackrock.svg | 3 - src/components/icons/enterprise/bmw.svg | 13 - src/components/icons/enterprise/coca-cola.svg | 10 - .../enterprise/european-investment-bank.svg | 31 - src/components/icons/enterprise/ey.svg | 11 - src/components/icons/enterprise/fox.svg | 12 - .../icons/enterprise/franklin-templeton.svg | 10 - src/components/icons/enterprise/jpmorgan.svg | 10 - .../icons/enterprise/lamborghini.svg | 16 - .../icons/enterprise/louis-vuitton.svg | 21 - .../icons/enterprise/mastercard.svg | 13 - .../icons/enterprise/mediledger.svg | 35 -- src/components/icons/enterprise/nike.svg | 18 - src/components/icons/enterprise/opera.svg | 9 - src/components/icons/enterprise/paypal.svg | 13 - src/components/icons/enterprise/samsung.svg | 3 - src/components/icons/enterprise/sap.svg | 15 - src/components/icons/enterprise/siemens.svg | 9 - src/components/icons/enterprise/sony.svg | 10 - src/components/icons/enterprise/sothebys.svg | 11 - src/components/icons/enterprise/swarm.svg | 10 - src/components/icons/enterprise/tmobile.svg | 16 - src/components/icons/enterprise/verizon.svg | 11 - src/components/icons/enterprise/visa.svg | 7 - src/components/icons/enterprise/walmart.svg | 16 - src/components/icons/enterprise/wfp.svg | 10 - src/data/crowdin/file-ids.json | 4 - src/intl/en/page-enterprise.json | 62 -- 78 files changed, 5810 deletions(-) delete mode 100644 app/[locale]/enterprise/_components/CaseCard.tsx delete mode 100644 app/[locale]/enterprise/_components/CasesColumn.tsx delete mode 100644 app/[locale]/enterprise/_components/CasesSwiper.tsx delete mode 100644 app/[locale]/enterprise/_components/ContactForm/index.tsx delete mode 100644 app/[locale]/enterprise/_components/ContactForm/lazy.tsx delete mode 100644 app/[locale]/enterprise/_components/ContactForm/loading.tsx delete mode 100644 app/[locale]/enterprise/_components/FeatureCard.tsx delete mode 100644 app/[locale]/enterprise/_components/FeaturesSwiper.tsx delete mode 100644 app/[locale]/enterprise/constants.ts delete mode 100644 app/[locale]/enterprise/page-jsonld.tsx delete mode 100644 app/[locale]/enterprise/page.tsx delete mode 100644 app/[locale]/enterprise/types.ts delete mode 100644 app/[locale]/enterprise/utils.ts delete mode 100644 app/api/enterprise-contact/route.ts delete mode 100644 public/content/enterprise/use-cases/index.md delete mode 100644 public/content/translations/ar/enterprise/index.md delete mode 100644 public/content/translations/bn/enterprise/index.md delete mode 100644 public/content/translations/cs/enterprise/index.md delete mode 100644 public/content/translations/de/enterprise/index.md delete mode 100644 public/content/translations/el/enterprise/index.md delete mode 100644 public/content/translations/es/enterprise/index.md delete mode 100644 public/content/translations/fa/enterprise/index.md delete mode 100644 public/content/translations/fi/enterprise/index.md delete mode 100644 public/content/translations/fr/enterprise/index.md delete mode 100644 public/content/translations/hi/enterprise/index.md delete mode 100644 public/content/translations/hu/enterprise/index.md delete mode 100644 public/content/translations/id/enterprise/index.md delete mode 100644 public/content/translations/it/enterprise/index.md delete mode 100644 public/content/translations/ja/enterprise/index.md delete mode 100644 public/content/translations/ko/enterprise/index.md delete mode 100644 public/content/translations/lt/enterprise/index.md delete mode 100644 public/content/translations/ml/enterprise/index.md delete mode 100644 public/content/translations/nb/enterprise/index.md delete mode 100644 public/content/translations/pl/enterprise/index.md delete mode 100644 public/content/translations/pt-br/enterprise/index.md delete mode 100644 public/content/translations/ro/enterprise/index.md delete mode 100644 public/content/translations/ru/enterprise/index.md delete mode 100644 public/content/translations/sk/enterprise/index.md delete mode 100644 public/content/translations/sv/enterprise/index.md delete mode 100644 public/content/translations/tr/enterprise/index.md delete mode 100644 public/content/translations/uk/enterprise/index.md delete mode 100644 public/content/translations/vi/enterprise/index.md delete mode 100644 public/content/translations/zh-tw/enterprise/index.md delete mode 100644 public/content/translations/zh/enterprise/index.md delete mode 100644 public/images/heroes/enterprise-hero-transparent.png delete mode 100644 public/images/heroes/enterprise-hero-white.png delete mode 100644 src/components/icons/enterprise/adidas.svg delete mode 100644 src/components/icons/enterprise/azure.svg delete mode 100644 src/components/icons/enterprise/banco-santander.svg delete mode 100644 src/components/icons/enterprise/basf.svg delete mode 100644 src/components/icons/enterprise/blackrock.svg delete mode 100644 src/components/icons/enterprise/bmw.svg delete mode 100644 src/components/icons/enterprise/coca-cola.svg delete mode 100644 src/components/icons/enterprise/european-investment-bank.svg delete mode 100644 src/components/icons/enterprise/ey.svg delete mode 100644 src/components/icons/enterprise/fox.svg delete mode 100644 src/components/icons/enterprise/franklin-templeton.svg delete mode 100644 src/components/icons/enterprise/jpmorgan.svg delete mode 100644 src/components/icons/enterprise/lamborghini.svg delete mode 100644 src/components/icons/enterprise/louis-vuitton.svg delete mode 100644 src/components/icons/enterprise/mastercard.svg delete mode 100644 src/components/icons/enterprise/mediledger.svg delete mode 100644 src/components/icons/enterprise/nike.svg delete mode 100644 src/components/icons/enterprise/opera.svg delete mode 100644 src/components/icons/enterprise/paypal.svg delete mode 100644 src/components/icons/enterprise/samsung.svg delete mode 100644 src/components/icons/enterprise/sap.svg delete mode 100644 src/components/icons/enterprise/siemens.svg delete mode 100644 src/components/icons/enterprise/sony.svg delete mode 100644 src/components/icons/enterprise/sothebys.svg delete mode 100644 src/components/icons/enterprise/swarm.svg delete mode 100644 src/components/icons/enterprise/tmobile.svg delete mode 100644 src/components/icons/enterprise/verizon.svg delete mode 100644 src/components/icons/enterprise/visa.svg delete mode 100644 src/components/icons/enterprise/walmart.svg delete mode 100644 src/components/icons/enterprise/wfp.svg delete mode 100644 src/intl/en/page-enterprise.json diff --git a/app/[locale]/enterprise/_components/CaseCard.tsx b/app/[locale]/enterprise/_components/CaseCard.tsx deleted file mode 100644 index 1d2336f985e..00000000000 --- a/app/[locale]/enterprise/_components/CaseCard.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Card } from "@/components/ui/card" - -import { cn } from "@/lib/utils/cn" - -import type { Case } from "../types" - -type CaseCardProps = { - caseStudy: Case - className?: string -} - -const CaseCard = ({ - caseStudy: { name, content }, - className, -}: CaseCardProps) => ( - -

{name}

-

{content}

-
-) - -export default CaseCard diff --git a/app/[locale]/enterprise/_components/CasesColumn.tsx b/app/[locale]/enterprise/_components/CasesColumn.tsx deleted file mode 100644 index 2aa1c1a51c1..00000000000 --- a/app/[locale]/enterprise/_components/CasesColumn.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { cn } from "@/lib/utils/cn" - -import type { Case } from "../types" - -import CaseCard from "./CaseCard" - -const CasesColumn = ({ - cases, - className, -}: { - cases: Case[] - className?: string -}) => ( -
- {cases.map((caseStudy, index) => ( - - ))} -
-) - -export default CasesColumn diff --git a/app/[locale]/enterprise/_components/CasesSwiper.tsx b/app/[locale]/enterprise/_components/CasesSwiper.tsx deleted file mode 100644 index 5100e3cf630..00000000000 --- a/app/[locale]/enterprise/_components/CasesSwiper.tsx +++ /dev/null @@ -1,34 +0,0 @@ -"use client" - -import { Swiper, SwiperSlide } from "@/components/ui/swiper" - -import type { Case } from "../types" - -import CaseCard from "./CaseCard" - -import { useBreakpointValue } from "@/hooks/useBreakpointValue" - -const CasesSwiper = ({ cases }: { cases: Case[] }) => { - const slidesPerView = useBreakpointValue({ - base: 1.2, - sm: 2.2, - }) - - return ( - - {cases.map((caseStudy) => ( - - - - ))} - - ) -} - -export default CasesSwiper diff --git a/app/[locale]/enterprise/_components/ContactForm/index.tsx b/app/[locale]/enterprise/_components/ContactForm/index.tsx deleted file mode 100644 index 37fb3932595..00000000000 --- a/app/[locale]/enterprise/_components/ContactForm/index.tsx +++ /dev/null @@ -1,295 +0,0 @@ -"use client" - -import React, { useState } from "react" -import { HeartHandshake, TriangleAlert } from "lucide-react" - -import { Button } from "@/components/ui/buttons/Button" -import Input from "@/components/ui/input" -import { Spinner } from "@/components/ui/spinner" -import { Textarea } from "@/components/ui/textarea" - -import { cn } from "@/lib/utils/cn" -import { sanitizeInput } from "@/lib/utils/sanitize" - -import { MAX_EMAIL_LENGTH, MAX_MESSAGE_LENGTH } from "../../constants" - -type EnterpriseContactFormProps = { - strings: { - error: { - domain: React.ReactNode // Link injected - emailInvalid: string - emailTooLong: string - general: React.ReactNode // Link injected - messageTooLong: string - required: string - } - placeholder: { - input: string - textarea: string - } - button: { - label: string - loading: string - } - success: { - heading: string - message: string - } - } -} - -type FormState = { - email: string - message: string -} - -type FormErrors = { - email?: React.ReactNode - message?: React.ReactNode - general?: React.ReactNode -} - -type SubmissionState = "idle" | "submitting" | "success" | "error" - -// Consumer email domains to block -const CONSUMER_DOMAINS = [ - "gmail.com", - "yahoo.com", - "hotmail.com", - "outlook.com", - "icloud.com", - "protonmail.com", - "proton.me", - "pm.me", - "aol.com", - "mail.com", - "yandex.com", - "tutanota.com", - "fastmail.com", - "zoho.com", - "gmx.com", - "live.com", - "msn.com", - "me.com", - "mac.com", - "rocketmail.com", - "yahoo.co.uk", - "googlemail.com", - "mailinator.com", - "10minutemail.com", - "guerrillamail.com", -] - -const EnterpriseContactForm = ({ strings }: EnterpriseContactFormProps) => { - const getCharacterCountClasses = (currentLength: number, maxLength: number) => - cn( - currentLength >= Math.floor(maxLength * 0.9) && "flex", // Show char count when within 10% remaining to limit - currentLength > maxLength - 64 && "text-warning-border", // Warning color within 64 chars (border version for proper contrast ratio), - currentLength > maxLength && "text-error [&_svg]:inline" // Error color over limit - ) - - const [formData, setFormData] = useState({ - email: "", - message: "", - }) - const [errors, setErrors] = useState({}) - const [submissionState, setSubmissionState] = - useState("idle") - - const handleInputChange = - (field: keyof FormState) => - (e: React.ChangeEvent) => { - const value = e.target.value - setFormData((prev) => ({ ...prev, [field]: value })) - - // Clear error when user starts typing - if (errors[field]) { - setErrors((prev) => ({ ...prev, [field]: undefined })) - } - } - - const handleBlur = - (field: keyof FormState) => - (e: React.FocusEvent) => { - const value = e.target.value - - if (field === "email") { - const emailError = validateEmail(value) - if (emailError) setErrors((prev) => ({ ...prev, email: emailError })) - return - } - if (field === "message") { - const messageError = validateMessage(value) - if (messageError) - setErrors((prev) => ({ ...prev, message: messageError })) - return - } - } - - const validateEmail = (email: string): React.ReactNode | undefined => { - const sanitized = sanitizeInput(email) - - if (!sanitized) return strings.error.required - - if (sanitized.length > MAX_EMAIL_LENGTH) return strings.error.emailTooLong - - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ - if (!emailRegex.test(sanitized)) return strings.error.emailInvalid - - const domain = sanitized.toLowerCase().split("@")[1] - if (CONSUMER_DOMAINS.includes(domain)) return strings.error.domain - - return undefined - } - - const validateMessage = ( - message: string - ): React.ReactNode | string | undefined => { - const sanitized = sanitizeInput(message) - - if (!sanitized) return strings.error.required - - if (sanitized.length > MAX_MESSAGE_LENGTH) - return strings.error.messageTooLong - - return undefined - } - - const validateForm = (): boolean => { - const newErrors: FormErrors = {} - - const emailError = validateEmail(formData.email) - if (emailError) newErrors.email = emailError - - const messageError = validateMessage(formData.message) - if (messageError) newErrors.message = messageError - - setErrors(newErrors) - return Object.keys(newErrors).length === 0 - } - - const handleSubmit = async () => { - if (!validateForm()) return - - setSubmissionState("submitting") - setErrors({}) - - try { - const sanitizedData = { - email: sanitizeInput(formData.email), - message: sanitizeInput(formData.message), - } - - const response = await fetch("/api/enterprise-contact", { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify(sanitizedData), - }) - - if (!response.ok) throw new Error(`Server error: ${response.status}`) - - setSubmissionState("success") - } catch (error) { - console.error("Form submission error:", error) - setSubmissionState("error") - setErrors({ general: strings.error.general }) - } - } - - if (submissionState === "success") - return ( -
-
- -

{strings.success.heading}

-
-

{strings.success.message}

-
- ) - - return ( -
-
- - {errors.email && ( -

- {errors.email} -

- )} -
- -
-
-